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

Reply via email to