Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/drawobject.c
| Show First 20 Lines • Show All 2,427 Lines • ▼ Show 20 Lines | static int draw_dm_test_freestyle_face_mark(BMesh *bm, BMFace *efa) | ||||
| if (!ffa) | if (!ffa) | ||||
| return 0; | return 0; | ||||
| return (ffa->flag & FREESTYLE_FACE_MARK) != 0; | return (ffa->flag & FREESTYLE_FACE_MARK) != 0; | ||||
| } | } | ||||
| #endif | #endif | ||||
| /* Draw loop normals. */ | /* Draw loop normals. */ | ||||
| static void draw_dm_loop_normals(BMEditMesh *em, Scene *scene, Object *ob, DerivedMesh *dm) | static void draw_dm_loop_normals__mapFunc(void *userData, int vertex_index, int face_index, | ||||
| const float co[3], const float no[3]) | |||||
| { | { | ||||
| /* XXX Would it be worth adding a dm->foreachMappedLoop func just for this? I doubt it... */ | if (no) { | ||||
| const drawDMNormal_userData *data = userData; | |||||
| const BMVert *eve = BM_vert_at_index(data->bm, vertex_index); | |||||
| const BMFace *efa = BM_face_at_index(data->bm, face_index); | |||||
| float vec[3]; | |||||
| /* We can't use dm->getLoopDataLayout(dm) here, we want to always access dm->loopData, EditDerivedBMesh would | if (!(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) || BM_elem_flag_test(efa, BM_ELEM_HIDDEN))) { | ||||
| * return loop data from bmesh itself. */ | if (!data->uniform_scale) { | ||||
| float (*lnors)[3] = DM_get_loop_data_layer(dm, CD_NORMAL); | mul_v3_m3v3(vec, data->tmat, no); | ||||
| normalize_v3(vec); | |||||
| mul_m3_v3(data->imat, vec); | |||||
| } | |||||
| else { | |||||
| copy_v3_v3(vec, no); | |||||
| } | |||||
| mul_v3_fl(vec, data->normalsize); | |||||
| add_v3_v3(vec, co); | |||||
| glVertex3fv(co); | |||||
| glVertex3fv(vec); | |||||
| } | |||||
| } | |||||
| } | |||||
| if (lnors) { | static void draw_dm_loop_normals(BMEditMesh *em, Scene *scene, Object *ob, DerivedMesh *dm) | ||||
| { | |||||
| drawDMNormal_userData data; | drawDMNormal_userData data; | ||||
| const MLoop *mloops = dm->getLoopArray(dm); | |||||
| const MVert *mverts = dm->getVertArray(dm); | |||||
| int i, totloops = dm->getNumLoops(dm); | |||||
| data.bm = em->bm; | data.bm = em->bm; | ||||
| data.normalsize = scene->toolsettings->normalsize; | data.normalsize = scene->toolsettings->normalsize; | ||||
| calcDrawDMNormalScale(ob, &data); | calcDrawDMNormalScale(ob, &data); | ||||
| glBegin(GL_LINES); | glBegin(GL_LINES); | ||||
| for (i = 0; i < totloops; i++, mloops++, lnors++) { | dm->foreachMappedLoop(dm, draw_dm_loop_normals__mapFunc, &data, DM_FOREACH_USE_NORMAL); | ||||
| float no[3]; | |||||
| const float *co = mverts[mloops->v].co; | |||||
| if (!data.uniform_scale) { | |||||
| mul_v3_m3v3(no, data.tmat, (float *)lnors); | |||||
| normalize_v3(no); | |||||
| mul_m3_v3(data.imat, no); | |||||
| } | |||||
| else { | |||||
| copy_v3_v3(no, (float *)lnors); | |||||
| } | |||||
| mul_v3_fl(no, data.normalsize); | |||||
| add_v3_v3(no, co); | |||||
| glVertex3fv(co); | |||||
| glVertex3fv(no); | |||||
| } | |||||
| glEnd(); | glEnd(); | ||||
| } | } | ||||
| } | |||||
| /* Draw faces with color set based on selection | /* Draw faces with color set based on selection | ||||
| * return 2 for the active face so it renders with stipple enabled */ | * return 2 for the active face so it renders with stipple enabled */ | ||||
| static DMDrawOption draw_dm_faces_sel__setDrawOptions(void *userData, int index) | static DMDrawOption draw_dm_faces_sel__setDrawOptions(void *userData, int index) | ||||
| { | { | ||||
| drawDMFacesSel_userData *data = userData; | drawDMFacesSel_userData *data = userData; | ||||
| BMFace *efa = BM_face_at_index(data->bm, index); | BMFace *efa = BM_face_at_index(data->bm, index); | ||||
| unsigned char *col; | unsigned char *col; | ||||
| ▲ Show 20 Lines • Show All 5,496 Lines • Show Last 20 Lines | |||||