Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/transform/transform_manipulator.c
| Context not available. | |||||
| #include "BKE_pointcache.h" | #include "BKE_pointcache.h" | ||||
| #include "BKE_editmesh.h" | #include "BKE_editmesh.h" | ||||
| #include "BKE_lattice.h" | #include "BKE_lattice.h" | ||||
| #include "BKE_DerivedMesh.h" | |||||
| #include "BKE_key.h" | |||||
| #include "BKE_crazyspace.h" | |||||
| #include "MEM_guardedalloc.h" | |||||
| #include "BIF_gl.h" | #include "BIF_gl.h" | ||||
| Context not available. | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| void calc_tw_center_dm(Scene *scene, BMVert *eve, MVert *dm_verts, int edit_vert_index, int *index_map) | |||||
mont29: Should be static (triggers warning under linux/gcc). | |||||
| { | |||||
| int derived_index; | |||||
| if (index_map) | |||||
| derived_index = index_map[edit_vert_index]; | |||||
| else | |||||
| derived_index = edit_vert_index; | |||||
Not Done Inline ActionsAgain, this can be done in one line: const int derived_index = index_map ? index_map[edit_vert_index] : edit_vert_index; As a side note, might be good to have a consistent naming for that index_map stuff. ;) mont29: Again, this can be done in one line:
const int derived_index = index_map ? index_map… | |||||
| calc_tw_center(scene, dm_verts[derived_index].co); | |||||
| } | |||||
| /* centroid, boundbox, of selection */ | /* centroid, boundbox, of selection */ | ||||
| /* returns total items selected */ | /* returns total items selected */ | ||||
| Context not available. | |||||
| RegionView3D *rv3d = ar->regiondata; | RegionView3D *rv3d = ar->regiondata; | ||||
| Base *base; | Base *base; | ||||
| Object *ob = OBACT; | Object *ob = OBACT; | ||||
| DerivedMesh *dm = NULL; | |||||
| MVert *dmverts = NULL; | |||||
| int a, totsel = 0; | int a, totsel = 0; | ||||
| /* transform widget matrix */ | /* transform widget matrix */ | ||||
| Context not available. | |||||
| if ((ob->lay & v3d->lay) == 0) return 0; | if ((ob->lay & v3d->lay) == 0) return 0; | ||||
| if (obedit->type == OB_MESH) { | if (obedit->type == OB_MESH) { | ||||
| BMEditMesh *em = BKE_editmesh_from_object(obedit); | |||||
| BMEditSelection ese; | BMEditSelection ese; | ||||
| float vec[3] = {0, 0, 0}; | BMEditMesh *em = BKE_editmesh_from_object(obedit); | ||||
| DerivedMesh *dm = editbmesh_get_derived_cage(scene, ob, em, scene->customdata_mask); | |||||
| dmverts = dm->getVertArray(dm); | |||||
| float vec[3] = { 0, 0, 0 }; | |||||
| int *derived_index_map = NULL; | |||||
mont29Unsubmitted Not Done Inline ActionsDeclarations of vars after code - errors in gcc too (C90 forbids this ;) ). mont29: Declarations of vars after code - errors in gcc too (C90 forbids this ;) ). | |||||
| if (!BKE_crazyspace_cageindexes_in_sync(ob)) { | |||||
| derived_index_map = BKE_crazyspace_map_em_to_cage(ob, em, dm); | |||||
| } | |||||
| /* USE LAST SELECTE WITH ACTIVE */ | |||||
| if ((v3d->around == V3D_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) { | if ((v3d->around == V3D_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) { | ||||
| BM_editselection_center(&ese, vec); | BKE_crazyspace_cage_active_sel_center(&ese, dm, derived_index_map, scene->twcent); | ||||
| calc_tw_center(scene, vec); | /* these two are to prevent anything from messing with twcent */ | ||||
| copy_v3_v3(scene->twmin, scene->twcent); | |||||
| copy_v3_v3(scene->twmax, scene->twcent); | |||||
| totsel = 1; | totsel = 1; | ||||
| } | } | ||||
| else { | else { | ||||
| BMesh *bm = em->bm; | BMesh *bm = em->bm; | ||||
| BMVert *eve; | BMVert *eve; | ||||
| BMIter iter; | BMIter iter; | ||||
| /* do vertices/edges/faces for center depending on selection | /* do vertices/edges/faces for center depending on selection | ||||
| * mode. note we can't use just vertex selection flag because | * mode. note we can't use just vertex selection flag because | ||||
| * it is not flush down on changes */ | * it is not flush down on changes */ | ||||
| if (ts->selectmode & SCE_SELECT_VERTEX) { | if (ts->selectmode & SCE_SELECT_VERTEX) { | ||||
| BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) { | ||||
| if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | ||||
| if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { | if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) { | ||||
| totsel++; | totsel++; | ||||
| calc_tw_center(scene, eve->co); | calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| else if (ts->selectmode & SCE_SELECT_EDGE) { | else if (ts->selectmode & SCE_SELECT_EDGE) { | ||||
| BMIter itersub; | BMIter itersub; | ||||
| BMEdge *eed; | BMEdge *eed; | ||||
| BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, a) { | ||||
| if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | ||||
| /* check the vertex has a selected edge, only add it once */ | /* check the vertex has a selected edge, only add it once */ | ||||
| BM_ITER_ELEM (eed, &itersub, eve, BM_EDGES_OF_VERT) { | BM_ITER_ELEM (eed, &itersub, eve, BM_EDGES_OF_VERT) { | ||||
| if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { | if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) { | ||||
| totsel++; | totsel++; | ||||
| calc_tw_center(scene, eve->co); | calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| else { | else { | ||||
| BMIter itersub; | BMIter itersub; | ||||
| BMFace *efa; | BMFace *efa; | ||||
| BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) { | ||||
| if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) { | ||||
| /* check the vertex has a selected face, only add it once */ | /* check the vertex has a selected face, only add it once */ | ||||
| BM_ITER_ELEM (efa, &itersub, eve, BM_FACES_OF_VERT) { | BM_ITER_ELEM (efa, &itersub, eve, BM_FACES_OF_VERT) { | ||||
| if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) { | ||||
| totsel++; | totsel++; | ||||
| calc_tw_center(scene, eve->co); | calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map); | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (derived_index_map) | |||||
| MEM_freeN(derived_index_map); | |||||
| } /* end editmesh */ | } /* end editmesh */ | ||||
| else if (obedit->type == OB_ARMATURE) { | else if (obedit->type == OB_ARMATURE) { | ||||
| bArmature *arm = obedit->data; | bArmature *arm = obedit->data; | ||||
| Context not available. | |||||
Should be static (triggers warning under linux/gcc).