diff options
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 683 |
1 files changed, 416 insertions, 267 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 055afda189f..8eae1571933 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -88,6 +88,7 @@ #include "ED_types.h" #include "UI_resources.h" +#include "UI_interface_icons.h" #include "WM_api.h" #include "BLF_api.h" @@ -101,7 +102,7 @@ typedef enum eWireDrawMode { } eWireDrawMode; typedef struct drawDMVerts_userData { - BMEditMesh *em; /* BMESH BRANCH ONLY */ + BMEditMesh *em; int sel; BMVert *eve_act; @@ -119,17 +120,21 @@ typedef struct drawDMVerts_userData { } drawDMVerts_userData; typedef struct drawDMEdgesSel_userData { - BMEditMesh *em; /* BMESH BRANCH ONLY */ + BMEditMesh *em; unsigned char *baseCol, *selCol, *actCol; BMEdge *eed_act; } drawDMEdgesSel_userData; typedef struct drawDMFacesSel_userData { +#ifdef WITH_FREESTYLE + unsigned char *cols[4]; +#else unsigned char *cols[3]; +#endif - DerivedMesh *dm; /* BMESH BRANCH ONLY */ - BMEditMesh *em; /* BMESH BRANCH ONLY */ + DerivedMesh *dm; + BMEditMesh *em; BMFace *efa_act; int *orig_index_mf_to_mpoly; @@ -168,70 +173,83 @@ static void ob_wire_color_blend_theme_id(const unsigned char ob_wire_col[4], con } /* this condition has been made more complex since editmode can draw textures */ -static int check_object_draw_texture(Scene *scene, View3D *v3d, int drawtype) +static bool check_object_draw_texture(Scene *scene, View3D *v3d, int drawtype) { /* texture and material draw modes */ - if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID) - return TRUE; + if (ELEM(v3d->drawtype, OB_TEXTURE, OB_MATERIAL) && drawtype > OB_SOLID) { + return true; + } /* textured solid */ - if (v3d->drawtype == OB_SOLID && (v3d->flag2 & V3D_SOLID_TEX) && !BKE_scene_use_new_shading_nodes(scene)) - return TRUE; + if ((v3d->drawtype == OB_SOLID) && + (v3d->flag2 & V3D_SOLID_TEX) && + (BKE_scene_use_new_shading_nodes(scene) == false)) + { + return true; + } - return FALSE; + if (v3d->flag2 & V3D_SHOW_SOLID_MATCAP) { + return true; + } + + return false; } -static int check_ob_drawface_dot(Scene *sce, View3D *vd, char dt) +static bool check_ob_drawface_dot(Scene *sce, View3D *vd, char dt) { if ((sce->toolsettings->selectmode & SCE_SELECT_FACE) == 0) - return 0; + return false; if (G.f & G_BACKBUFSEL) - return 0; + return false; if ((vd->flag & V3D_ZBUF_SELECT) == 0) - return 1; + return true; /* if its drawing textures with zbuf sel, then don't draw dots */ if (dt == OB_TEXTURE && vd->drawtype == OB_TEXTURE) - return 0; + return false; if ((vd->drawtype >= OB_SOLID) && (vd->flag2 & V3D_SOLID_TEX)) - return 0; + return false; - return 1; + return true; } /* ************************ */ /* check for glsl drawing */ -int draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, const short dt) +bool draw_glsl_material(Scene *scene, Object *ob, View3D *v3d, const char dt) { if (!GPU_glsl_support()) - return 0; + return false; if (G.f & G_PICKSEL) - return 0; + return false; if (!check_object_draw_texture(scene, v3d, dt)) - return 0; + return false; if (ob == OBACT && (ob && ob->mode & OB_MODE_WEIGHT_PAINT)) - return 0; + return false; + + if (v3d->flag2 & V3D_SHOW_SOLID_MATCAP) + return true; + if (BKE_scene_use_new_shading_nodes(scene)) - return 0; + return false; return (scene->gm.matmode == GAME_MAT_GLSL) && (dt > OB_SOLID); } -static int check_alpha_pass(Base *base) +static bool check_alpha_pass(Base *base) { if (base->flag & OB_FROMDUPLI) - return 0; + return false; if (G.f & G_PICKSEL) - return 0; + return false; if (base->object->mode & OB_MODE_ALL_PAINT) - return 0; + return false; return (base->object->dtx & OB_DRAWTRANSP); } @@ -589,32 +607,44 @@ static void draw_empty_image(Object *ob, const short dflag, const unsigned char glScalef(scale * sca_x, scale * sca_y, 1.0f); if (ibuf && ibuf->rect) { + const bool use_clip = (U.glalphaclip != 1.0f); /* Setup GL params */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + if (use_clip) { + glEnable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, U.glalphaclip); + } + /* Use the object color and alpha */ glColor4fv(ob->col); /* Draw the Image on the screen */ - glaDrawPixelsTex(ofs_x, ofs_y, ima_x, ima_y, GL_UNSIGNED_BYTE, ibuf->rect); + glaDrawPixelsTex(ofs_x, ofs_y, ima_x, ima_y, GL_UNSIGNED_BYTE, GL_LINEAR, ibuf->rect); glPixelTransferf(GL_ALPHA_SCALE, 1.0f); glDisable(GL_BLEND); + + if (use_clip) { + glDisable(GL_ALPHA_TEST); + glAlphaFunc(GL_GREATER, 0.0f); + } } if ((dflag & DRAW_CONSTCOLOR) == 0) { glColor3ubv(ob_wire_col); - - /* Calculate the outline vertex positions */ - glBegin(GL_LINE_LOOP); - glVertex2f(ofs_x, ofs_y); - glVertex2f(ofs_x + ima_x, ofs_y); - glVertex2f(ofs_x + ima_x, ofs_y + ima_y); - glVertex2f(ofs_x, ofs_y + ima_y); - glEnd(); } + /* Calculate the outline vertex positions */ + glBegin(GL_LINE_LOOP); + glVertex2f(ofs_x, ofs_y); + glVertex2f(ofs_x + ima_x, ofs_y); + glVertex2f(ofs_x + ima_x, ofs_y + ima_y); + glVertex2f(ofs_x, ofs_y + ima_y); + glEnd(); + + /* Reset GL settings */ glMatrixMode(GL_MODELVIEW); glPopMatrix(); @@ -739,7 +769,7 @@ void view3d_cached_text_draw_add(const float co[3], memcpy(++vos, str, alloc_len); } -void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, float mat[4][4]) +void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, bool depth_write, float mat[4][4]) { RegionView3D *rv3d = ar->regiondata; ListBase *strings = &CachedText[CachedTextLevel - 1]; @@ -755,7 +785,7 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa (vos->flag & V3D_CACHE_TEXT_GLOBALSPACE) ? rv3d->persmat : rv3d->persmatob, (vos->flag & V3D_CACHE_TEXT_LOCALCLIP) != 0, vos->vec, vos->sco, - V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN) == V3D_PROJ_RET_OK) + V3D_PROJ_TEST_CLIP_BB | V3D_PROJ_TEST_CLIP_WIN | V3D_PROJ_TEST_CLIP_NEAR) == V3D_PROJ_RET_OK) { tot++; } @@ -793,17 +823,6 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa } for (vos = strings->first; vos; vos = vos->next) { - /* too slow, reading opengl info while drawing is very bad, - * better to see if we can use the zbuffer while in pixel space - campbell */ -#if 0 - if (v3d->zbuf && (vos->flag & V3D_CACHE_TEXT_ZBUF)) { - gluProject(vos->vec[0], vos->vec[1], vos->vec[2], mats.modelview, mats.projection, (GLint *)mats.viewport, &ux, &uy, &uz); - glReadPixels(ar->winrct.xmin + vos->mval[0] + vos->xoffs, ar->winrct.ymin + vos->mval[1], 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); - - if (uz > depth) - continue; - } -#endif if (vos->sco[0] != IS_CLIPPED) { const char *str = (char *)(vos + 1); @@ -1077,7 +1096,7 @@ static void draw_transp_spot_volume(Lamp *la, float x, float z) } static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const short dflag, const unsigned char ob_wire_col[4]) + const char dt, const short dflag, const unsigned char ob_wire_col[4]) { Object *ob = base->object; const float pixsize = ED_view3d_pixel_size(rv3d, ob->obmat[3]); @@ -1090,13 +1109,13 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, unsigned char col[4]; /* cone can't be drawn for duplicated lamps, because duplilist would be freed to */ /* the moment of view3d_draw_transp() call */ - const short is_view = (rv3d->persp == RV3D_CAMOB && v3d->camera == base->object); - const short drawcone = ((dt > OB_WIRE) && - !(G.f & G_PICKSEL) && - (la->type == LA_SPOT) && - (la->mode & LA_SHOW_CONE) && - !(base->flag & OB_FROMDUPLI) && - !is_view); + const bool is_view = (rv3d->persp == RV3D_CAMOB && v3d->camera == base->object); + const bool drawcone = ((dt > OB_WIRE) && + !(G.f & G_PICKSEL) && + (la->type == LA_SPOT) && + (la->mode & LA_SHOW_CONE) && + !(base->flag & OB_FROMDUPLI) && + !is_view); if (drawcone && !v3d->transp) { /* in this case we need to draw delayed */ @@ -1286,6 +1305,13 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, glVertex3fv(vvec_clip); glEnd(); } + /* Else, draw spot direction (using distance as end limit, same as for Area lamp). */ + else { + glBegin(GL_LINE_STRIP); + glVertex3f(0.0, 0.0, -circrad); + glVertex3f(0.0, 0.0, -la->dist); + glEnd(); + } } else if (ELEM(la->type, LA_HEMI, LA_SUN)) { @@ -1355,7 +1381,7 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, setlinestyle(0); - if ((la->type == LA_SPOT) && (la->mode & LA_SHAD_BUF) && (is_view == FALSE)) { + if ((la->type == LA_SPOT) && (la->mode & LA_SHAD_BUF) && (is_view == false)) { drawshadbuflimits(la, ob->obmat); } @@ -1387,20 +1413,22 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, } } -static void draw_limit_line(float sta, float end, unsigned int col) +static void draw_limit_line(float sta, float end, const short dflag, unsigned int col) { glBegin(GL_LINES); glVertex3f(0.0, 0.0, -sta); glVertex3f(0.0, 0.0, -end); glEnd(); - glPointSize(3.0); - glBegin(GL_POINTS); - cpack(col); - glVertex3f(0.0, 0.0, -sta); - glVertex3f(0.0, 0.0, -end); - glEnd(); - glPointSize(1.0); + if (!(dflag & DRAW_PICKING)) { + glPointSize(3.0); + glBegin(GL_POINTS); + cpack(col); + glVertex3f(0.0, 0.0, -sta); + glVertex3f(0.0, 0.0, -end); + glEnd(); + glPointSize(1.0); + } } @@ -1418,7 +1446,7 @@ static void draw_focus_cross(float dist, float size) #ifdef VIEW3D_CAMERA_BORDER_HACK unsigned char view3d_camera_border_hack_col[3]; -short view3d_camera_border_hack_test = FALSE; +bool view3d_camera_border_hack_test = false; #endif /* ****************** draw clip data *************** */ @@ -1449,7 +1477,7 @@ static void draw_bundle_sphere(void) static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, MovieTrackingObject *tracking_object, const short dflag, const unsigned char ob_wire_col[4], - int *global_track_index, int draw_selected) + int *global_track_index, bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingTrack *track; @@ -1604,7 +1632,7 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, const short dflag, const unsigned char ob_wire_col[4], - int draw_selected) + const bool draw_selected) { MovieTracking *tracking = &clip->tracking; MovieTrackingObject *tracking_object; @@ -1653,13 +1681,13 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base float vec[4][3], asp[2], shift[2], scale[3]; int i; float drawsize; - const short is_view = (rv3d->persp == RV3D_CAMOB && ob == v3d->camera); + const bool is_view = (rv3d->persp == RV3D_CAMOB && ob == v3d->camera); MovieClip *clip = BKE_object_movieclip_get(scene, base->object, 0); /* draw data for movie clip set as active for scene */ if (clip) { - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, FALSE); - draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, TRUE); + draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, false); + draw_viewport_reconstruction(scene, base, v3d, clip, dflag, ob_wire_col, true); } #ifdef VIEW3D_CAMERA_BORDER_HACK @@ -1674,7 +1702,7 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base glGetFloatv(GL_CURRENT_COLOR, col); rgb_float_to_uchar(view3d_camera_border_hack_col, col); } - view3d_camera_border_hack_test = TRUE; + view3d_camera_border_hack_test = true; return; } #endif @@ -1741,10 +1769,9 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base glEnd(); } - if (dflag == 0) { - if (cam->flag & (CAM_SHOWLIMITS + CAM_SHOWMIST)) { + if ((dflag & DRAW_SCENESET) == 0) { + if (cam->flag & (CAM_SHOWLIMITS | CAM_SHOWMIST)) { float nobmat[4][4]; - World *wrld; /* draw in normalized object matrix space */ copy_m4_m4(nobmat, ob->obmat); @@ -1755,15 +1782,17 @@ static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base glMultMatrixf(nobmat); if (cam->flag & CAM_SHOWLIMITS) { - draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF); + draw_limit_line(cam->clipsta, cam->clipend, dflag, 0x77FFFF); /* qdn: was yafray only, now also enabled for Blender to be used with defocus composite node */ draw_focus_cross(BKE_camera_object_dof_distance(ob), cam->drawsize); } - wrld = scene->world; - if (cam->flag & CAM_SHOWMIST) - if (wrld) draw_limit_line(wrld->miststa, wrld->miststa + wrld->mistdist, 0xFFFFFF); - + if (cam->flag & CAM_SHOWMIST) { + World *world = scene->world; + if (world) { + draw_limit_line(world->miststa, world->miststa + world->mistdist, dflag, 0xFFFFFF); + } + } glPopMatrix(); } } @@ -1842,13 +1871,13 @@ static void lattice_draw_verts(Lattice *lt, DispList *dl, short sel) bglEnd(); } -static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w, int use_wcol) +static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w, int actdef_wcol) { int index = ((w * lt->pntsv + v) * lt->pntsu) + u; - if (use_wcol) { + if (actdef_wcol) { float col[3]; - MDeformWeight *mdw = defvert_find_index(lt->dvert + index, use_wcol - 1); + MDeformWeight *mdw = defvert_find_index(lt->dvert + index, actdef_wcol - 1); weight_to_rgb(col, mdw ? mdw->weight : 0.0f); glColor3fv(col); @@ -1869,7 +1898,8 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) Lattice *lt = ob->data; DispList *dl; int u, v, w; - int use_wcol = FALSE, is_edit = (lt->editlatt != NULL); + int actdef_wcol = 0; + const bool is_edit = (lt->editlatt != NULL); /* now we default make displist, this will modifiers work for non animated case */ if (ob->disp.first == NULL) @@ -1882,7 +1912,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) cpack(0x004000); if (ob->defbase.first && lt->dvert) { - use_wcol = ob->actdef; + actdef_wcol = ob->actdef; glShadeModel(GL_SMOOTH); } } @@ -1896,16 +1926,16 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) int uxt = (u == 0 || u == lt->pntsu - 1); if (w && ((uxt || vxt) || !(lt->flag & LT_OUTSIDE))) { - drawlattice__point(lt, dl, u, v, w - 1, use_wcol); - drawlattice__point(lt, dl, u, v, w, use_wcol); + drawlattice__point(lt, dl, u, v, w - 1, actdef_wcol); + drawlattice__point(lt, dl, u, v, w, actdef_wcol); } if (v && ((uxt || wxt) || !(lt->flag & LT_OUTSIDE))) { - drawlattice__point(lt, dl, u, v - 1, w, use_wcol); - drawlattice__point(lt, dl, u, v, w, use_wcol); + drawlattice__point(lt, dl, u, v - 1, w, actdef_wcol); + drawlattice__point(lt, dl, u, v, w, actdef_wcol); } if (u && ((vxt || wxt) || !(lt->flag & LT_OUTSIDE))) { - drawlattice__point(lt, dl, u - 1, v, w, use_wcol); - drawlattice__point(lt, dl, u, v, w, use_wcol); + drawlattice__point(lt, dl, u - 1, v, w, actdef_wcol); + drawlattice__point(lt, dl, u, v, w, actdef_wcol); } } } @@ -1913,7 +1943,7 @@ static void drawlattice(Scene *scene, View3D *v3d, Object *ob) glEnd(); /* restoration for weight colors */ - if (use_wcol) + if (actdef_wcol) glShadeModel(GL_FLAT); if (is_edit) { @@ -2280,6 +2310,44 @@ static void draw_dm_edges_sharp(BMEditMesh *em, DerivedMesh *dm) dm->drawMappedEdges(dm, draw_dm_edges_sharp__setDrawOptions, em); } +#ifdef WITH_FREESTYLE + +static int draw_dm_test_freestyle_edge_mark(BMEditMesh *em, BMEdge *eed) +{ + FreestyleEdge *fed = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_FREESTYLE_EDGE); + if (!fed) + return 0; + return (fed->flag & FREESTYLE_EDGE_MARK) != 0; +} + +/* Draw only Freestyle feature edges */ +static DMDrawOption draw_dm_edges_freestyle__setDrawOptions(void *userData, int index) +{ + BMEdge *eed = EDBM_edge_at_index(userData, index); + + if (!eed) + return DM_DRAW_OPTION_SKIP; + + if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && draw_dm_test_freestyle_edge_mark(userData, eed)) + return DM_DRAW_OPTION_NORMAL; + else + return DM_DRAW_OPTION_SKIP; +} + +static void draw_dm_edges_freestyle(BMEditMesh *em, DerivedMesh *dm) +{ + dm->drawMappedEdges(dm, draw_dm_edges_freestyle__setDrawOptions, em); +} + +static int draw_dm_test_freestyle_face_mark(BMEditMesh *em, BMFace *efa) +{ + FreestyleFace *ffa = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_FREESTYLE_FACE); + if (!ffa) + return 0; + return (ffa->flag & FREESTYLE_FACE_MARK) != 0; +} + +#endif /* Draw faces with color set based on selection * return 2 for the active face so it renders with stipple enabled */ @@ -2298,7 +2366,11 @@ static DMDrawOption draw_dm_faces_sel__setDrawOptions(void *userData, int index) return DM_DRAW_OPTION_STIPPLE; } else { +#ifdef WITH_FREESTYLE + col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : draw_dm_test_freestyle_face_mark(data->em, efa) ? 3 : 0]; +#else col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : 0]; +#endif if (col[3] == 0) return DM_DRAW_OPTION_SKIP; glColor4ubv(col); @@ -2329,8 +2401,13 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int if (efa == data->efa_act || next_efa == data->efa_act) return 0; +#ifdef WITH_FREESTYLE + col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : draw_dm_test_freestyle_face_mark(data->em, efa) ? 3 : 0]; + next_col = data->cols[BM_elem_flag_test(next_efa, BM_ELEM_SELECT) ? 1 : draw_dm_test_freestyle_face_mark(data->em, efa) ? 3 : 0]; +#else col = data->cols[BM_elem_flag_test(efa, BM_ELEM_SELECT) ? 1 : 0]; next_col = data->cols[BM_elem_flag_test(next_efa, BM_ELEM_SELECT) ? 1 : 0]; +#endif if (col[3] == 0 || next_col[3] == 0) return 0; @@ -2339,8 +2416,13 @@ static int draw_dm_faces_sel__compareDrawOptions(void *userData, int index, int } /* also draws the active face */ +#ifdef WITH_FREESTYLE +static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, + unsigned char *selCol, unsigned char *actCol, unsigned char *markCol, BMFace *efa_act) +#else static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, BMFace *efa_act) +#endif { drawDMFacesSel_userData data; data.dm = dm; @@ -2348,11 +2430,14 @@ static void draw_dm_faces_sel(BMEditMesh *em, DerivedMesh *dm, unsigned char *ba data.em = em; data.cols[1] = selCol; data.cols[2] = actCol; +#ifdef WITH_FREESTYLE + data.cols[3] = markCol; +#endif data.efa_act = efa_act; /* double lookup */ data.orig_index_mf_to_mpoly = DM_get_tessface_data_layer(dm, CD_ORIGINDEX); data.orig_index_mp_to_orig = DM_get_poly_data_layer(dm, CD_ORIGINDEX); - if ((data.orig_index_mf_to_mpoly && data.orig_index_mp_to_orig) == FALSE) { + if ((data.orig_index_mf_to_mpoly && data.orig_index_mp_to_orig) == false) { data.orig_index_mf_to_mpoly = data.orig_index_mp_to_orig = NULL; } @@ -2584,10 +2669,10 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS /* make the precision of the display value proportionate to the gridsize */ - if (grid < 0.01f) conv_float = "%.6g"; - else if (grid < 0.1f) conv_float = "%.5g"; - else if (grid < 1.0f) conv_float = "%.4g"; - else if (grid < 10.0f) conv_float = "%.3g"; + if (grid <= 0.01f) conv_float = "%.6g"; + else if (grid <= 0.1f) conv_float = "%.5g"; + else if (grid <= 1.0f) conv_float = "%.4g"; + else if (grid <= 10.0f) conv_float = "%.3g"; else conv_float = "%.2g"; if (me->drawflag & ME_DRAWEXTRA_EDGELEN) { @@ -2615,7 +2700,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS if (unit->system) { bUnit_AsString(numstr, sizeof(numstr), len_v3v3(v1, v2) * unit->scale_length, 3, - unit->system, B_UNIT_LENGTH, do_split, FALSE); + unit->system, B_UNIT_LENGTH, do_split, false); } else { sprintf(numstr, conv_float, len_v3v3(v1, v2)); @@ -2632,16 +2717,21 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS BMFace *f; int n; -#define DRAW_EM_MEASURE_STATS_FACEAREA() \ - if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { \ - mul_v3_fl(vmid, 1.0f / (float)n); \ - if (unit->system) \ - bUnit_AsString(numstr, sizeof(numstr), \ - (double)(area * unit->scale_length), \ - 3, unit->system, B_UNIT_LENGTH, do_split, FALSE); \ - else \ - BLI_snprintf(numstr, sizeof(numstr), conv_float, area); \ - view3d_cached_text_draw_add(vmid, numstr, 0, txt_flag, col); \ +#define DRAW_EM_MEASURE_STATS_FACEAREA() \ + if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { \ + mul_v3_fl(vmid, 1.0f / (float)n); \ + if (unit->system) { \ + bUnit_AsString(numstr, sizeof(numstr), \ + (double)(area * unit->scale_length * unit->scale_length), \ + 3, unit->system, B_UNIT_AREA, do_split, false); \ + view3d_cached_text_draw_add(vmid, numstr, 0, \ + /* Metric system uses unicode "squared" sign! */ \ + txt_flag ^ V3D_CACHE_TEXT_ASCII, col); \ + } \ + else { \ + BLI_snprintf(numstr, sizeof(numstr), conv_float, area); \ + view3d_cached_text_draw_add(vmid, numstr, 0, txt_flag, col); \ + } \ } (void)0 UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col); @@ -2694,7 +2784,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS if (is_face_sel || do_moving) { BMIter liter; BMLoop *loop; - int is_first = TRUE; + bool is_first = true; BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) { if (is_face_sel || (do_moving && BM_elem_flag_test(loop->v, BM_ELEM_SELECT))) { @@ -2710,7 +2800,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS mul_mat3_m4_v3(ob->obmat, v1); mul_mat3_m4_v3(ob->obmat, v2); } - is_first = FALSE; + is_first = false; } if (do_global) { @@ -2813,11 +2903,11 @@ static DMDrawOption draw_em_fancy__setGLSLFaceOpts(void *userData, int index) } static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, - Object *ob, BMEditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, const short dt) + Object *ob, BMEditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, const char dt) { Mesh *me = ob->data; - BMFace *efa_act = BM_active_face_get(em->bm, FALSE, FALSE); /* annoying but active faces is stored differently */ + BMFace *efa_act = BM_active_face_get(em->bm, false, false); /* annoying but active faces is stored differently */ BMEdge *eed_act = NULL; BMVert *eve_act = NULL; @@ -2838,7 +2928,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, } } - EDBM_index_arrays_init(em, 1, 1, 1); + EDBM_index_arrays_ensure(em, BM_VERT | BM_EDGE | BM_FACE); if (dt > OB_WIRE) { if (check_object_draw_texture(scene, v3d, dt)) { @@ -2885,10 +2975,16 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, if (me->drawflag & ME_DRAWFACES) { /* transp faces */ unsigned char col1[4], col2[4], col3[4]; +#ifdef WITH_FREESTYLE + unsigned char col4[4]; +#endif UI_GetThemeColor4ubv(TH_FACE, col1); UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); +#ifdef WITH_FREESTYLE + UI_GetThemeColor4ubv(TH_FREESTYLE_FACE_MARK, col4); +#endif glEnable(GL_BLEND); glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ @@ -2897,7 +2993,14 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, if (check_object_draw_texture(scene, v3d, dt)) col1[3] = 0; +#ifdef WITH_FREESTYLE + if (!(me->drawflag & ME_DRAW_FREESTYLE_FACE) || !CustomData_has_layer(&em->bm->pdata, CD_FREESTYLE_FACE)) + col4[3] = 0; + + draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); +#else draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); +#endif glDisable(GL_BLEND); glDepthMask(1); /* restore write in zbuffer */ @@ -2906,14 +3009,19 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, /* even if draw faces is off it would be nice to draw the stipple face * Make all other faces zero alpha except for the active * */ - unsigned char col1[4], col2[4], col3[4]; - col1[3] = col2[3] = 0; /* don't draw */ + /* col4 is only used by WITH_FREESTYLE, but keeping it here spares some #ifdef's... */ + unsigned char col1[4], col2[4], col3[4], col4[4]; + col1[3] = col2[3] = col4[3] = 0; /* don't draw */ UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, col3); glEnable(GL_BLEND); glDepthMask(0); /* disable write in zbuffer, needed for nice transp */ +#ifdef WITH_FREESTYLE + draw_dm_faces_sel(em, cageDM, col1, col2, col3, col4, efa_act); +#else draw_dm_faces_sel(em, cageDM, col1, col2, col3, efa_act); +#endif glDisable(GL_BLEND); glDepthMask(1); /* restore write in zbuffer */ @@ -2949,6 +3057,18 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, glLineWidth(1); } +#ifdef WITH_FREESTYLE + if (me->drawflag & ME_DRAW_FREESTYLE_EDGE && CustomData_has_layer(&em->bm->edata, CD_FREESTYLE_EDGE)) { + UI_ThemeColor(TH_FREESTYLE_EDGE_MARK); + glLineWidth(2); + + draw_dm_edges_freestyle(em, cageDM); + + glColor3ub(0,0,0); + glLineWidth(1); + } +#endif + if (me->drawflag & ME_DRAWCREASES && CustomData_has_layer(&em->bm->edata, CD_CREASE)) { draw_dm_creases(em, cageDM); } @@ -2989,16 +3109,14 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, bglPolygonOffset(rv3d->dist, 0.0); GPU_disable_material(); } - - EDBM_index_arrays_free(em); } /* Mesh drawing routines */ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm) { - if ((v3d->transp == FALSE) && /* not when we draw the transparent pass */ - (ob->mode & OB_MODE_ALL_PAINT) == FALSE) /* not when painting (its distracting) - campbell */ + if ((v3d->transp == false) && /* not when we draw the transparent pass */ + (ob->mode & OB_MODE_ALL_PAINT) == false) /* not when painting (its distracting) - campbell */ { glLineWidth(UI_GetThemeValuef(TH_OUTLINE_WIDTH) * 2.0f); glDepthMask(0); @@ -3021,7 +3139,7 @@ static void draw_mesh_object_outline(View3D *v3d, Object *ob, DerivedMesh *dm) } static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const unsigned char ob_wire_col[4], const short dflag) + const char dt, const unsigned char ob_wire_col[4], const short dflag) { Object *ob = base->object; Mesh *me = ob->data; @@ -3230,7 +3348,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D glDepthMask(0); /* disable write in zbuffer, selected edge wires show better */ } - dm->drawEdges(dm, (dt == OB_WIRE || totface == 0), me->drawflag & ME_ALLEDGES); + dm->drawEdges(dm, (dt == OB_WIRE || totface == 0), (ob->dtx & OB_DRAW_ALL_EDGES)); if (dt != OB_WIRE && (draw_wire == OBDRAW_WIRE_ON_DEPTH)) { glDepthMask(1); @@ -3239,11 +3357,15 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } if (is_obact && paint_vertsel_test(ob)) { - + const int use_depth = (v3d->flag & V3D_ZBUF_SELECT); glColor3f(0.0f, 0.0f, 0.0f); glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - + + if (!use_depth) glDisable(GL_DEPTH_TEST); + else bglPolygonOffset(rv3d->dist, 1.0); drawSelectedVertices(dm, ob->data); + if (!use_depth) glEnable(GL_DEPTH_TEST); + else bglPolygonOffset(rv3d->dist, 0.0); glPointSize(1.0f); } @@ -3251,14 +3373,15 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D } /* returns 1 if nothing was drawn, for detecting to draw an object center */ -static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const unsigned char ob_wire_col[4], const short dflag) +static bool draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base, + const char dt, const unsigned char ob_wire_col[4], const short dflag) { Object *ob = base->object; Object *obedit = scene->obedit; Mesh *me = ob->data; BMEditMesh *em = me->edit_btmesh; - int do_alpha_after = FALSE, drawlinked = 0, retval = 0, glsl, check_alpha, i; + int i; + bool do_alpha_after = false, drawlinked = false, retval = false; /* If we are drawing shadows and any of the materials don't cast a shadow, * then don't draw the object */ @@ -3266,7 +3389,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D for (i = 0; i < ob->totcol; ++i) { Material *ma = give_current_material(ob, i); if (ma && !(ma->mode & MA_SHADBUF)) { - return 1; + return true; } } } @@ -3274,7 +3397,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D if (obedit && ob != obedit && ob->data == obedit->data) { if (BKE_key_from_object(ob) || BKE_key_from_object(obedit)) {} else if (ob->modifiers.first || obedit->modifiers.first) {} - else drawlinked = 1; + else drawlinked = true; } /* backface culling */ @@ -3293,7 +3416,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D scene->customdata_mask); if (dt > OB_WIRE) { - glsl = draw_glsl_material(scene, ob, v3d, dt); + const bool glsl = draw_glsl_material(scene, ob, v3d, dt); GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, NULL); } @@ -3308,8 +3431,8 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D else { /* ob->bb was set by derived mesh system, do NULL check just to be sure */ if (me->totpoly <= 4 || (!ob->bb || ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb))) { - glsl = draw_glsl_material(scene, ob, v3d, dt); - check_alpha = check_alpha_pass(base); + const bool glsl = draw_glsl_material(scene, ob, v3d, dt); + const bool check_alpha = check_alpha_pass(base); if (dt == OB_SOLID || glsl) { GPU_begin_object_materials(v3d, rv3d, scene, ob, glsl, @@ -3320,7 +3443,7 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D GPU_end_object_materials(); - if (me->totvert == 0) retval = 1; + if (me->totvert == 0) retval = true; } } @@ -3350,11 +3473,11 @@ static int draw_mesh_object(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D /* ************** DRAW DISPLIST ****************** */ -static int draw_index_wire = 1; -static int index3_nors_incr = 1; +static bool draw_index_wire = true; +static bool index3_nors_incr = true; /* returns 1 when nothing was drawn */ -static int drawDispListwire(ListBase *dlbase) +static bool drawDispListwire(ListBase *dlbase) { DispList *dl; int parts, nr; @@ -3416,7 +3539,7 @@ static int drawDispListwire(ListBase *dlbase) #if 0 /* (ton) this code crashes for me when resolv is 86 or higher... no clue */ - glVertexPointer(3, GL_FLOAT, sizeof(float) * 3 * dl->nr, data + 3*nr); + glVertexPointer(3, GL_FLOAT, sizeof(float) * 3 * dl->nr, data + 3 * nr); if (dl->flag & DL_CYCL_V) glDrawArrays(GL_LINE_LOOP, 0, dl->parts); else @@ -3444,11 +3567,11 @@ static int drawDispListwire(ListBase *dlbase) glDisableClientState(GL_VERTEX_ARRAY); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - return 0; + return false; } static void drawDispListsolid(ListBase *lb, Object *ob, const short dflag, - const unsigned char ob_wire_col[4], int use_glsl) + const unsigned char ob_wire_col[4], const bool use_glsl) { DispList *dl; GPUVertexAttribs gattribs; @@ -3573,14 +3696,14 @@ static void drawCurveDMWired(Object *ob) dm->drawEdges(dm, 1, 0); } -/* return 1 when nothing was drawn */ -static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, const short dt) +/* return true when nothing was drawn */ +static bool drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, const char dt) { Object *ob = base->object; DerivedMesh *dm = ob->derivedFinal; if (!dm) { - return 1; + return true; } if (dt > OB_WIRE && dm->getNumTessFaces(dm)) { @@ -3602,15 +3725,15 @@ static int drawCurveDerivedMesh(Scene *scene, View3D *v3d, RegionView3D *rv3d, B drawCurveDMWired(ob); } - return 0; + return false; } /** * Only called by #drawDispList * \return 1 when nothing was drawn */ -static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const short dflag, const unsigned char ob_wire_col[4]) +static bool drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, + const char dt, const short dflag, const unsigned char ob_wire_col[4]) { Object *ob = base->object; ListBase *lb = NULL; @@ -3619,8 +3742,8 @@ static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d const short render_only = (v3d->flag2 & V3D_RENDER_OVERRIDE); const short solid = (dt > OB_WIRE); - if (drawCurveDerivedMesh(scene, v3d, rv3d, base, dt) == 0) { - return FALSE; + if (drawCurveDerivedMesh(scene, v3d, rv3d, base, dt) == false) { + return false; } switch (ob->type) { @@ -3633,45 +3756,45 @@ static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d if (solid) { dl = lb->first; if (dl == NULL) { - return TRUE; + return true; } if (dl->nors == NULL) BKE_displist_normals_add(lb); - index3_nors_incr = 0; + index3_nors_incr = false; - if (BKE_displist_has_faces(lb) == 0) { + if (BKE_displist_has_faces(lb) == false) { if (!render_only) { - draw_index_wire = 0; + draw_index_wire = false; drawDispListwire(lb); - draw_index_wire = 1; + draw_index_wire = true; } } else { if (draw_glsl_material(scene, ob, v3d, dt)) { GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, TRUE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, true); GPU_end_object_materials(); } else { GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, FALSE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, false); GPU_end_object_materials(); } if (cu->editnurb && cu->bevobj == NULL && cu->taperobj == NULL && cu->ext1 == 0.0f && cu->ext2 == 0.0f) { cpack(0); - draw_index_wire = 0; + draw_index_wire = false; drawDispListwire(lb); - draw_index_wire = 1; + draw_index_wire = true; } } - index3_nors_incr = 1; + index3_nors_incr = true; } else { if (!render_only || (render_only && BKE_displist_has_faces(lb))) { int retval; - draw_index_wire = 0; + draw_index_wire = false; retval = drawDispListwire(lb); - draw_index_wire = 1; + draw_index_wire = true; return retval; } } @@ -3683,19 +3806,19 @@ static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d if (solid) { dl = lb->first; if (dl == NULL) { - return TRUE; + return true; } if (dl->nors == NULL) BKE_displist_normals_add(lb); if (draw_glsl_material(scene, ob, v3d, dt)) { GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, TRUE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, true); GPU_end_object_materials(); } else { GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, FALSE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, false); GPU_end_object_materials(); } } @@ -3709,19 +3832,19 @@ static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d lb = &ob->disp; if (lb->first == NULL) BKE_displist_make_mball(scene, ob); if (lb->first == NULL) { - return TRUE; + return true; } if (solid) { if (draw_glsl_material(scene, ob, v3d, dt)) { GPU_begin_object_materials(v3d, rv3d, scene, ob, 1, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, TRUE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, true); GPU_end_object_materials(); } else { GPU_begin_object_materials(v3d, rv3d, scene, ob, 0, NULL); - drawDispListsolid(lb, ob, dflag, ob_wire_col, FALSE); + drawDispListsolid(lb, ob, dflag, ob_wire_col, false); GPU_end_object_materials(); } } @@ -3735,16 +3858,16 @@ static int drawDispList_nobackface(Scene *scene, View3D *v3d, RegionView3D *rv3d return FALSE; } -static int drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const short dflag, const unsigned char ob_wire_col[4]) +static bool drawDispList(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, + const char dt, const short dflag, const unsigned char ob_wire_col[4]) { - int retval; + bool retval; /* backface culling */ if (v3d->flag2 & V3D_BACKFACE_CULLING) { /* not all displists use same in/out normal direction convention */ glEnable(GL_CULL_FACE); - glCullFace((base->object->type == OB_MBALL) ? GL_BACK : GL_FRONT); + glCullFace((base->object->type == OB_MBALL || base->object->derivedFinal) ? GL_BACK : GL_FRONT); } retval = drawDispList_nobackface(scene, v3d, rv3d, base, dt, dflag, ob_wire_col); @@ -3850,7 +3973,9 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix if (draw_as == PART_DRAW_AXIS) { copy_v3_v3(vec2, state->co); } - else sub_v3_v3v3(vec2, state->co, vec); + else { + sub_v3_v3v3(vec2, state->co, vec); + } add_v3_v3(vec, state->co); copy_v3_v3(pdd->vd, vec); pdd->vd += 3; @@ -3862,7 +3987,9 @@ static void draw_particle(ParticleKey *state, int draw_as, short draw, float pix if (draw_as == PART_DRAW_AXIS) { copy_v3_v3(vec2, state->co); } - else sub_v3_v3v3(vec2, state->co, vec); + else { + sub_v3_v3v3(vec2, state->co, vec); + } add_v3_v3(vec, state->co); @@ -4659,9 +4786,11 @@ static void draw_ptcache_edit(Scene *scene, View3D *v3d, PTCacheEdit *edit) if (!(point->flag & PEP_HIDE)) totkeys += point->totkey; - if (edit->points && !(edit->points->keys->flag & PEK_USE_WCO)) - pd = pdata = MEM_callocN(totkeys * 3 * sizeof(float), "particle edit point data"); - cd = cdata = MEM_callocN(totkeys * (timed ? 4 : 3) * sizeof(float), "particle edit color data"); + if (totkeys) { + if (edit->points && !(edit->points->keys->flag & PEK_USE_WCO)) + pd = pdata = MEM_callocN(totkeys * 3 * sizeof(float), "particle edit point data"); + cd = cdata = MEM_callocN(totkeys * (timed ? 4 : 3) * sizeof(float), "particle edit color data"); + } for (i = 0, point = edit->points; i < totpoint; i++, point++) { if (point->flag & PEP_HIDE) @@ -4898,9 +5027,9 @@ static void ob_draw_RE_motion(float com[3], float rotscale[3][3], float itw, flo glEnd(); } -/*place to add drawers */ +/* place to add drawers */ -static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) +static void drawhandlesN(Nurb *nu, short sel, short hide_handles) { BezTriple *bezt; float *fp; @@ -4960,7 +5089,7 @@ static void tekenhandlesN(Nurb *nu, short sel, short hide_handles) glEnd(); } -static void tekenhandlesN_active(Nurb *nu) +static void drawhandlesN_active(Nurb *nu) { BezTriple *bezt; float *fp; @@ -4995,7 +5124,7 @@ static void tekenhandlesN_active(Nurb *nu) glLineWidth(1); } -static void tekenvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel) +static void drawvertsN(Nurb *nu, short sel, short hide_handles, void *lastsel) { BezTriple *bezt; BPoint *bp; @@ -5251,7 +5380,7 @@ static void draw_editnurb(Object *ob, Nurb *nurb, int sel) } static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, Nurb *nurb, - const short dt, const short dflag, const unsigned char ob_wire_col[4]) + const char dt, const short dflag, const unsigned char ob_wire_col[4]) { ToolSettings *ts = scene->toolsettings; Object *ob = base->object; @@ -5275,8 +5404,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, for (nu = nurb; nu; nu = nu->next) { if (nu->type == CU_BEZIER) { if (index == cu->actnu && !hide_handles) - tekenhandlesN_active(nu); - tekenhandlesN(nu, 0, hide_handles); + drawhandlesN_active(nu); + drawhandlesN(nu, 0, hide_handles); } index++; } @@ -5285,8 +5414,8 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, /* selected handles */ for (nu = nurb; nu; nu = nu->next) { if (nu->type == CU_BEZIER && (cu->drawflag & CU_HIDE_HANDLES) == 0) - tekenhandlesN(nu, 1, hide_handles); - tekenvertsN(nu, 0, hide_handles, NULL); + drawhandlesN(nu, 1, hide_handles); + drawvertsN(nu, 0, hide_handles, NULL); } if (v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -5337,7 +5466,7 @@ static void drawnurb(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, if (v3d->zbuf) glDisable(GL_DEPTH_TEST); for (nu = nurb; nu; nu = nu->next) { - tekenvertsN(nu, 1, hide_handles, cu->lastsel); + drawvertsN(nu, 1, hide_handles, cu->lastsel); } if (v3d->zbuf) glEnable(GL_DEPTH_TEST); @@ -5399,43 +5528,10 @@ static void draw_empty_cone(float size) gluDeleteQuadric(qobj); } -/* draw points on curve speed handles */ -#if 0 /* XXX old animation system stuff */ -static void curve_draw_speed(Scene *scene, Object *ob) -{ - Curve *cu = ob->data; - IpoCurve *icu; - BezTriple *bezt; - float loc[4], dir[3]; - int a; - - if (cu->ipo == NULL) - return; - - icu = cu->ipo->curve.first; - if (icu == NULL || icu->totvert < 2) - return; - - glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE)); - bglBegin(GL_POINTS); - - for (a = 0, bezt = icu->bezt; a < icu->totvert; a++, bezt++) { - if (where_on_path(ob, bezt->vec[1][1], loc, dir)) { - UI_ThemeColor((bezt->f2 & SELECT) && ob == OBACT ? TH_VERTEX_SELECT : TH_VERTEX); - bglVertex3fv(loc); - } - } - - glPointSize(1.0); - bglEnd(); -} -#endif /* XXX old animation system stuff */ - - -static void draw_textcurs(float textcurs[4][2]) +static void draw_textcurs(RegionView3D *rv3d, float textcurs[4][2]) { cpack(0); - + bglPolygonOffset(rv3d->dist, -1.0); set_inverted_drawing(1); glBegin(GL_QUADS); glVertex2fv(textcurs[0]); @@ -5444,6 +5540,7 @@ static void draw_textcurs(float textcurs[4][2]) glVertex2fv(textcurs[3]); glEnd(); set_inverted_drawing(0); + bglPolygonOffset(rv3d->dist, 0.0); } static void drawspiral(const float cent[3], float rad, float tmat[4][4], int start) @@ -5451,11 +5548,11 @@ static void drawspiral(const float cent[3], float rad, float tmat[4][4], int sta float vec[3], vx[3], vy[3]; const float tot_inv = (1.0f / (float)CIRCLE_RESOL); int a; - char inverse = FALSE; + bool inverse = false; float x, y, fac; if (start < 0) { - inverse = TRUE; + inverse = true; start = -start; } @@ -5534,7 +5631,7 @@ static void drawcircle_size(float size) } -/* needs fixing if non-identity matrice used */ +/* needs fixing if non-identity matrix used */ static void drawtube(const float vec[3], float radius, float height, float tmat[4][4]) { float cur[3]; @@ -5556,7 +5653,8 @@ static void drawtube(const float vec[3], float radius, float height, float tmat[ glVertex3f(cur[0], cur[1] - radius, cur[2]); glEnd(); } -/* needs fixing if non-identity matrice used */ + +/* needs fixing if non-identity matrix used */ static void drawcone(const float vec[3], float radius, float height, float tmat[4][4]) { float cur[3]; @@ -5577,9 +5675,10 @@ static void drawcone(const float vec[3], float radius, float height, float tmat[ glVertex3f(cur[0], cur[1] - radius, cur[2]); glEnd(); } -/* return TRUE if nothing was drawn */ -static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, - const short dt, const short dflag, const unsigned char ob_wire_col[4]) + +/* return true if nothing was drawn */ +static bool drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, + const char dt, const short dflag, const unsigned char ob_wire_col[4]) { Object *ob = base->object; MetaBall *mb; @@ -5607,11 +5706,11 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, } if (ml == NULL) { - return TRUE; + return true; } if (v3d->flag2 & V3D_RENDER_OVERRIDE) { - return FALSE; + return false; } invert_m4_m4(imat, rv3d->viewmatob); @@ -5625,7 +5724,6 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, } while (ml) { - /* draw radius */ if (mb->editelems) { if ((dflag & DRAW_CONSTCOLOR) == 0) { @@ -5656,7 +5754,7 @@ static int drawmball(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, ml = ml->next; } - return FALSE; + return false; } static void draw_forcefield(Object *ob, RegionView3D *rv3d, @@ -5910,6 +6008,15 @@ static void draw_bb_quadric(BoundBox *bb, char type) glScalef(radius, radius, 2.0f * size[2]); gluCylinder(qobj, 1.0, 0.0, 1.0, 8, 1); } + else if (type == OB_BOUND_CAPSULE) { + float radius = size[0] > size[1] ? size[0] : size[1]; + float length = size[2] > radius ? 2.0f * (size[2] - radius) : 0.0f; + glTranslatef(cent[0], cent[1], cent[2] - length * 0.5f); + gluCylinder(qobj, radius, radius, length, 8, 1); + gluSphere(qobj, radius, 8, 4); + glTranslatef(0.0, 0.0, length); + gluSphere(qobj, radius, 8, 4); + } glPopMatrix(); gluDeleteQuadric(qobj); @@ -5966,8 +6073,10 @@ static void drawtexspace(Object *ob) copy_v3_v3(size, mb->size); copy_v3_v3(loc, mb->loc); } - else return; - + else { + return; + } + vec[0][0] = vec[1][0] = vec[2][0] = vec[3][0] = loc[0] - size[0]; vec[4][0] = vec[5][0] = vec[6][0] = vec[7][0] = loc[0] + size[0]; @@ -5997,24 +6106,24 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base, if (ELEM3(ob->type, OB_FONT, OB_CURVE, OB_SURF)) { Curve *cu = ob->data; DerivedMesh *dm = ob->derivedFinal; - int hasfaces = 0; + bool has_faces = false; if (dm) { - hasfaces = dm->getNumTessFaces(dm); + has_faces = dm->getNumTessFaces(dm); } else { - hasfaces = BKE_displist_has_faces(&ob->disp); + has_faces = BKE_displist_has_faces(&ob->disp); } - if (hasfaces && ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { - draw_index_wire = 0; + if (has_faces && ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { + draw_index_wire = false; if (dm) { draw_mesh_object_outline(v3d, ob, dm); } else { drawDispListwire(&ob->disp); } - draw_index_wire = 1; + draw_index_wire = true; } } else if (ob->type == OB_MBALL) { @@ -6025,7 +6134,7 @@ static void drawObjectSelect(Scene *scene, View3D *v3d, ARegion *ar, Base *base, } else if (ob->type == OB_ARMATURE) { if (!(ob->mode & OB_MODE_POSE && base == scene->basact)) - draw_armature(scene, v3d, ar, base, OB_WIRE, FALSE, ob_wire_col, TRUE); + draw_armature(scene, v3d, ar, base, OB_WIRE, 0, ob_wire_col, true); } glLineWidth(1.0); @@ -6050,7 +6159,7 @@ static void draw_wire_extra(Scene *scene, RegionView3D *rv3d, Object *ob, unsign Curve *cu = ob->data; if (ED_view3d_boundbox_clip(rv3d, ob->obmat, ob->bb ? ob->bb : cu->bb)) { if (ob->type == OB_CURVE) - draw_index_wire = 0; + draw_index_wire = false; if (ob->derivedFinal) { drawCurveDMWired(ob); @@ -6060,7 +6169,7 @@ static void draw_wire_extra(Scene *scene, RegionView3D *rv3d, Object *ob, unsign } if (ob->type == OB_CURVE) - draw_index_wire = 1; + draw_index_wire = true; } } else if (ob->type == OB_MBALL) { @@ -6212,6 +6321,34 @@ static void draw_object_wire_color(Scene *scene, Base *base, unsigned char r_ob_ r_ob_wire_col[3] = 255; } +static void draw_object_matcap_check(Scene *scene, View3D *v3d, Object *ob) +{ + /* fixed rule, active object draws as matcap */ + if (ob == OBACT) { + if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT)) + return; + + if (v3d->defmaterial == NULL) { + extern Material defmaterial; + + v3d->defmaterial = MEM_mallocN(sizeof(Material), "matcap material"); + *(v3d->defmaterial) = defmaterial; + v3d->defmaterial->gpumaterial.first = v3d->defmaterial->gpumaterial.last = NULL; + v3d->defmaterial->preview = NULL; + } + /* first time users */ + if (v3d->matcap_icon == 0) + v3d->matcap_icon = ICON_MATCAP_01; + + if (v3d->defmaterial->preview == NULL) + v3d->defmaterial->preview = UI_icon_to_preview(v3d->matcap_icon); + + /* signal to all material checks, gets cleared below */ + v3d->flag2 |= V3D_SHOW_SOLID_MATCAP; + } + +} + /** * main object drawing function, draws in selection * \param dflag (draw flag) can be DRAW_PICKING and/or DRAW_CONSTCOLOR, DRAW_SCENESET @@ -6228,7 +6365,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short unsigned char _ob_wire_col[4]; /* dont initialize this */ unsigned char *ob_wire_col = NULL; /* dont initialize this, use NULL crashes as a way to find invalid use */ int i, selstart, selend, empty_object = 0; - short dt, dtx, zbufoff = 0; + short dtx; + char dt; + short zbufoff = 0; const short is_obact = (ob == OBACT); /* only once set now, will be removed too, should become a global standard */ @@ -6299,6 +6438,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short dt = MIN2(dt, ob->dt); if (v3d->zbuf == 0 && dt > OB_WIRE) dt = OB_WIRE; dtx = 0; + + /* matcap check */ + if (dt == OB_SOLID && (v3d->flag2 & V3D_SOLID_MATCAP)) + draw_object_matcap_check(scene, v3d, ob); /* faceselect exception: also draw solid when (dt == wire), except in editmode */ if (is_obact && (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_WEIGHT_PAINT | OB_MODE_TEXTURE_PAINT))) { @@ -6364,7 +6507,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short case OB_FONT: cu = ob->data; if (cu->editfont) { - draw_textcurs(cu->editfont->textcurs); + draw_textcurs(rv3d, cu->editfont->textcurs); if (cu->flag & CU_FAST) { cpack(0xFFFFFF); @@ -6530,7 +6673,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short else { if (dt > OB_WIRE) GPU_enable_material(0, NULL); /* we use default material */ - empty_object = draw_armature(scene, v3d, ar, base, dt, dflag, ob_wire_col, FALSE); + empty_object = draw_armature(scene, v3d, ar, base, dt, dflag, ob_wire_col, false); if (dt > OB_WIRE) GPU_disable_material(); } @@ -6742,7 +6885,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short } if (ob->gameflag & OB_BOUNDS) { - if (ob->boundtype != ob->collision_boundtype || (dtx & OB_BOUNDBOX) == 0) { + if (ob->boundtype != ob->collision_boundtype || (dtx & OB_DRAWBOUNDOX) == 0) { setlinestyle(2); draw_bounding_volume(scene, ob, ob->collision_boundtype); @@ -6756,7 +6899,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short if (dtx & OB_AXIS) { drawaxes(1.0f, OB_ARROWS); } - if (dtx & OB_BOUNDBOX) { + if (dtx & OB_DRAWBOUNDOX) { draw_bounding_volume(scene, ob, ob->boundtype); } if (dtx & OB_TEXSPACE) { @@ -6799,7 +6942,9 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short /* return warning, this is cached text draw */ invert_m4_m4(ob->imat, ob->obmat); view3d_cached_text_draw_end(v3d, ar, 1, NULL); - + /* return warning, clear temp flag */ + v3d->flag2 &= ~V3D_SHOW_SOLID_MATCAP; + glLoadMatrixf(rv3d->viewmat); if (zbufoff) { @@ -6873,10 +7018,10 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short UI_make_axis_color(col1, col2, 'Z'); glColor3ubv(col2); - cob = constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT); + cob = BKE_constraints_make_evalob(scene, ob, NULL, CONSTRAINT_OBTYPE_OBJECT); for (curcon = list->first; curcon; curcon = curcon->next) { - bConstraintTypeInfo *cti = constraint_get_typeinfo(curcon); + bConstraintTypeInfo *cti = BKE_constraint_get_typeinfo(curcon); ListBase targets = {NULL, NULL}; bConstraintTarget *ct; @@ -6930,7 +7075,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short } } - constraints_clear_evalob(cob); + BKE_constraints_clear_evalob(cob); } } @@ -7091,14 +7236,28 @@ static DMDrawOption bbs_mesh_solid_hide2__setDrawOpts(void *userData, int index) return DM_DRAW_OPTION_SKIP; } } -static void bbs_mesh_solid(Scene *scene, Object *ob) + +static void bbs_mesh_solid_verts(Scene *scene, Object *ob) +{ + Mesh *me = ob->data; + DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask); + glColor3ub(0, 0, 0); + + dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, GPU_enable_material, NULL, me, 0); + + bbs_obmode_mesh_verts(ob, dm, 1); + bm_vertoffs = me->totvert + 1; + dm->release(dm); +} + +static void bbs_mesh_solid_faces(Scene *scene, Object *ob) { DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask); Mesh *me = (Mesh *)ob->data; glColor3ub(0, 0, 0); - if ((me->editflag & ME_EDIT_PAINT_MASK)) + if ((me->editflag & ME_EDIT_PAINT_FACE_SEL)) dm->drawMappedFaces(dm, bbs_mesh_solid_hide__setDrawOpts, GPU_enable_material, NULL, me, 0); else dm->drawMappedFaces(dm, bbs_mesh_solid__setDrawOpts, GPU_enable_material, NULL, me, 0); @@ -7123,7 +7282,7 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec DerivedMesh *dm = editbmesh_get_derived_cage(scene, ob, em, CD_MASK_BAREMESH); - EDBM_index_arrays_init(em, 1, 1, 1); + EDBM_index_arrays_ensure(em, BM_VERT | BM_EDGE | BM_FACE); bbs_mesh_solid_EM(em, scene, v3d, ob, dm, ts->selectmode & SCE_SELECT_FACE); if (ts->selectmode & SCE_SELECT_FACE) @@ -7149,27 +7308,17 @@ void draw_object_backbufsel(Scene *scene, View3D *v3d, RegionView3D *rv3d, Objec bglPolygonOffset(rv3d->dist, 0.0); dm->release(dm); - - EDBM_index_arrays_free(em); } else { Mesh *me = ob->data; - if ((me->editflag & ME_EDIT_VERT_SEL) && + if ((me->editflag & ME_EDIT_PAINT_VERT_SEL) && /* currently vertex select only supports weight paint */ (ob->mode & OB_MODE_WEIGHT_PAINT)) { - DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask); - glColor3ub(0, 0, 0); - - dm->drawMappedFaces(dm, bbs_mesh_solid_hide2__setDrawOpts, GPU_enable_material, NULL, me, 0); - - - bbs_obmode_mesh_verts(ob, dm, 1); - bm_vertoffs = me->totvert + 1; - dm->release(dm); + bbs_mesh_solid_verts(scene, ob); } else { - bbs_mesh_solid(scene, ob); + bbs_mesh_solid_faces(scene, ob); } } break; @@ -7235,7 +7384,7 @@ static void draw_object_mesh_instance(Scene *scene, View3D *v3d, RegionView3D *r if (dm) dm->release(dm); } -void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, const short dt, int outline) +void draw_object_instance(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, const char dt, int outline) { if (ob == NULL) return; |