Commit: 7dcc7bd5eee89ebaba7fb036bb2f2970d1532804 Author: Clément Foucault Date: Tue Jul 17 11:36:07 2018 +0200 Branches: blender2.8 https://developer.blender.org/rB7dcc7bd5eee89ebaba7fb036bb2f2970d1532804
Object Mode: Add back object bound display =================================================================== M source/blender/draw/intern/draw_cache.c M source/blender/draw/intern/draw_cache.h M source/blender/draw/modes/object_mode.c =================================================================== diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index 0d2317199fc..707aadbc229 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -63,6 +63,9 @@ static struct DRWShapeCache { Gwn_Batch *drw_line_endpoints; Gwn_Batch *drw_empty_cube; Gwn_Batch *drw_empty_sphere; + Gwn_Batch *drw_empty_cylinder; + Gwn_Batch *drw_empty_capsule_body; + Gwn_Batch *drw_empty_capsule_cap; Gwn_Batch *drw_empty_cone; Gwn_Batch *drw_arrows; Gwn_Batch *drw_axis_names; @@ -784,6 +787,144 @@ Gwn_Batch *DRW_cache_empty_cone_get(void) #undef NSEGMENTS } +Gwn_Batch *DRW_cache_empty_cylinder_get(void) +{ +#define NSEGMENTS 12 + if (!SHC.drw_empty_cylinder) { + /* a single ring of vertices */ + float p[NSEGMENTS][2]; + for (int i = 0; i < NSEGMENTS; ++i) { + float angle = 2 * M_PI * ((float)i / (float)NSEGMENTS); + p[i][0] = cosf(angle); + p[i][1] = sinf(angle); + } + + /* Position Only 3D format */ + static Gwn_VertFormat format = { 0 }; + static struct { uint pos; } attr_id; + if (format.attr_len == 0) { + attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT); + } + + Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(vbo, NSEGMENTS * 6); + + for (int i = 0; i < NSEGMENTS; ++i) { + float cv[2], pv[2], v[3]; + cv[0] = p[(i) % NSEGMENTS][0]; + cv[1] = p[(i) % NSEGMENTS][1]; + pv[0] = p[(i + 1) % NSEGMENTS][0]; + pv[1] = p[(i + 1) % NSEGMENTS][1]; + + /* cylinder sides */ + copy_v3_fl3(v, cv[0], cv[1], -1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6, v); + copy_v3_fl3(v, cv[0], cv[1], 1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 1, v); + + /* top ring */ + copy_v3_fl3(v, cv[0], cv[1], 1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 2, v); + copy_v3_fl3(v, pv[0], pv[1], 1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 3, v); + + /* bottom ring */ + copy_v3_fl3(v, cv[0], cv[1], -1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 4, v); + copy_v3_fl3(v, pv[0], pv[1], -1.0f); + GWN_vertbuf_attr_set(vbo, attr_id.pos, i * 6 + 5, v); + } + + SHC.drw_empty_cylinder = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); + } + return SHC.drw_empty_cylinder; +#undef NSEGMENTS +} + +Gwn_Batch *DRW_cache_empty_capsule_body_get(void) +{ + if (!SHC.drw_empty_capsule_body) { + const float pos[8][3] = { + { 1.0f, 0.0f, 1.0f}, + { 1.0f, 0.0f, 0.0f}, + { 0.0f, 1.0f, 1.0f}, + { 0.0f, 1.0f, 0.0f}, + {-1.0f, 0.0f, 1.0f}, + {-1.0f, 0.0f, 0.0f}, + { 0.0f, -1.0f, 1.0f}, + { 0.0f, -1.0f, 0.0f} + }; + + /* Position Only 3D format */ + static Gwn_VertFormat format = { 0 }; + static struct { uint pos; } attr_id; + if (format.attr_len == 0) { + attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT); + } + + Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(vbo, 8); + GWN_vertbuf_attr_fill(vbo, attr_id.pos, pos); + + SHC.drw_empty_capsule_body = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); + } + return SHC.drw_empty_capsule_body; +} + +Gwn_Batch *DRW_cache_empty_capsule_cap_get(void) +{ +#define NSEGMENTS 24 /* Must be multiple of 2. */ + if (!SHC.drw_empty_capsule_cap) { + /* a single ring of vertices */ + float p[NSEGMENTS][2]; + for (int i = 0; i < NSEGMENTS; ++i) { + float angle = 2 * M_PI * ((float)i / (float)NSEGMENTS); + p[i][0] = cosf(angle); + p[i][1] = sinf(angle); + } + + /* Position Only 3D format */ + static Gwn_VertFormat format = { 0 }; + static struct { uint pos; } attr_id; + if (format.attr_len == 0) { + attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT); + } + + Gwn_VertBuf *vbo = GWN_vertbuf_create_with_format(&format); + GWN_vertbuf_data_alloc(vbo, (NSEGMENTS * 2) * 2); + + /* Base circle */ + int vidx = 0; + for (int i = 0; i < NSEGMENTS; ++i) { + float v[3] = {0.0f, 0.0f, 0.0f}; + copy_v2_v2(v, p[(i) % NSEGMENTS]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + copy_v2_v2(v, p[(i+1) % NSEGMENTS]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + } + + for (int i = 0; i < NSEGMENTS / 2; ++i) { + float v[3] = {0.0f, 0.0f, 0.0f}; + int ci = i % NSEGMENTS; + int pi = (i + 1) % NSEGMENTS; + /* Y half circle */ + copy_v3_fl3(v, p[ci][0], 0.0f, p[ci][1]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + copy_v3_fl3(v, p[pi][0], 0.0f, p[pi][1]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + /* X half circle */ + copy_v3_fl3(v, 0.0f, p[ci][0], p[ci][1]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + copy_v3_fl3(v, 0.0f, p[pi][0], p[pi][1]); + GWN_vertbuf_attr_set(vbo, attr_id.pos, vidx++, v); + } + + SHC.drw_empty_capsule_cap = GWN_batch_create_ex(GWN_PRIM_LINES, vbo, NULL, GWN_BATCH_OWNS_VBO); + } + return SHC.drw_empty_capsule_cap; +#undef NSEGMENTS +} + Gwn_Batch *DRW_cache_arrows_get(void) { if (!SHC.drw_arrows) { diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 9114a4d872d..c1c80d2c5bf 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -66,7 +66,10 @@ struct Gwn_Batch *DRW_cache_empty_cube_get(void); struct Gwn_Batch *DRW_cache_circle_get(void); struct Gwn_Batch *DRW_cache_square_get(void); struct Gwn_Batch *DRW_cache_empty_sphere_get(void); +struct Gwn_Batch *DRW_cache_empty_cylinder_get(void); struct Gwn_Batch *DRW_cache_empty_cone_get(void); +struct Gwn_Batch *DRW_cache_empty_capsule_cap_get(void); +struct Gwn_Batch *DRW_cache_empty_capsule_body_get(void); struct Gwn_Batch *DRW_cache_arrows_get(void); struct Gwn_Batch *DRW_cache_axis_names_get(void); struct Gwn_Batch *DRW_cache_image_plane_get(void); diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 2e41dbfd529..43400b3bac0 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -145,6 +145,9 @@ typedef struct OBJECT_PrivateData { DRWShadingGroup *cube; DRWShadingGroup *circle; DRWShadingGroup *sphere; + DRWShadingGroup *cylinder; + DRWShadingGroup *capsule_cap; + DRWShadingGroup *capsule_body; DRWShadingGroup *cone; DRWShadingGroup *single_arrow; DRWShadingGroup *single_arrow_line; @@ -1093,6 +1096,15 @@ static void OBJECT_cache_init(void *vedata) geom = DRW_cache_empty_sphere_get(); stl->g_data->sphere = shgroup_instance(psl->non_meshes, geom); + geom = DRW_cache_empty_cylinder_get(); + stl->g_data->cylinder = shgroup_instance(psl->non_meshes, geom); + + geom = DRW_cache_empty_capsule_cap_get(); + stl->g_data->capsule_cap = shgroup_instance(psl->non_meshes, geom); + + geom = DRW_cache_empty_capsule_body_get(); + stl->g_data->capsule_body = shgroup_instance(psl->non_meshes, geom); + geom = DRW_cache_empty_cone_get(); stl->g_data->cone = shgroup_instance(psl->non_meshes, geom); @@ -2146,6 +2158,82 @@ static void DRW_shgroup_texture_space(OBJECT_StorageList *stl, Object *ob, int t DRW_shgroup_call_dynamic_add(stl->g_data->texspace, color, &one, tmp); } +static void DRW_shgroup_bounds(OBJECT_StorageList *stl, Object *ob, int theme_id) +{ + float color[4], center[3], size[3], tmp[4][4], final_mat[4][4], one = 1.0f; + BoundBox bb_local; + + if (ob->type == OB_MBALL && !BKE_mball_is_basis(ob)) { + return; + } + + BoundBox *bb = BKE_object_boundbox_get(ob); + + if (!ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, + OB_MBALL, OB_ARMATURE, OB_LATTICE)) + { + const float min[3] = {-1.0f, -1.0f, -1.0f}, max[3] = {1.0f, 1.0f, 1.0f}; + bb = &bb_local; + BKE_boundbox_init_from_minmax(bb, min, max); + } + + UI_GetThemeColor4fv(theme_id, color); + BKE_boundbox_calc_center_aabb(bb, center); + BKE_boundbox_calc_size_aabb(bb, size); + + switch (ob->boundtype) { + case OB_BOUND_BOX: + size_to_mat4(tmp, size); + copy_v3_v3(tmp[3], center); + mul_m4_m4m4(tmp, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->cube, color, &one, tmp); + break; + case OB_BOUND_SPHERE: + size[0] = max_fff(size[0], size[1], size[2]); + size[1] = size[2] = size[0]; + size_to_mat4(tmp, size); + copy_v3_v3(tmp[3], center); + mul_m4_m4m4(tmp, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->sphere, color, &one, tmp); + break; + case OB_BOUND_CYLINDER: + size[0] = max_ff(size[0], size[1]); + size[1] = size[0]; + size_to_mat4(tmp, size); + copy_v3_v3(tmp[3], center); + mul_m4_m4m4(tmp, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->cylinder, color, &one, tmp); + break; + case OB_BOUND_CONE: + size[0] = max_ff(size[0], size[1]); + size[1] = size[0]; + size_to_mat4(tmp, size); + copy_v3_v3(tmp[3], center); + /* Cone batch has base at 0 and is pointing towards +Y. */ + swap_v3_v3(tmp[1], tmp[2]); + tmp[3][2] -= size[2]; + mul_m4_m4m4(tmp, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->cone, color, &one, tmp); + break; + case OB_BOUND_CAPSULE: + size[0] = max_ff(size[0], size[1]); + size[1] = size[0]; + scale_m4_fl(tmp, size[0]); + copy_v2_v2(tmp[3], center); + tmp[3][2] = center[2] + max_ff(0.0f, size[2] - size[0]); + mul_m4_m4m4(final_mat, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->capsule_cap, color, &one, final_mat); + negate_v3(tmp[2]); + tmp[3][2] = center[2] - max_ff(0.0f, size[2] - size[0]); + mul_m4_m4m4(final_mat, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->capsule_cap, color, &one, final_mat); + tmp[2][2] = max_ff(0.0f, size[2] * 2.0f - size[0] * 2.0f); + mul_m4_m4m4(final_mat, ob->obmat, tmp); + DRW_shgroup_call_dynamic_add(stl->g_data->capsule_body, color, &one, final_mat); + break; + } +} + static void OBJECT_cache_populate_particles(Object *ob, OBJECT_PassList *psl) { @@ -2398,17 +2486,8 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) DRW_shgroup_forcefield(stl, ob, view_layer); } - if (((ob->base_flag & BAS @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs