[Bf-blender-cvs] [846056de6b2] master: Fix T64510 Armature: Empty Not Visible as Bone custom shape

Clément Foucault noreply at git.blender.org
Thu May 30 19:35:46 CEST 2019


Commit: 846056de6b272d1da087c5ad133f612eecc722af
Author: Clément Foucault
Date:   Thu May 30 19:34:54 2019 +0200
Branches: master
https://developer.blender.org/rB846056de6b272d1da087c5ad133f612eecc722af

Fix T64510 Armature: Empty Not Visible as Bone custom shape

===================================================================

M	source/blender/draw/intern/draw_armature.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/modes/object_mode.c

===================================================================

diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index 3f651b27dd0..4f387de16a8 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -80,6 +80,8 @@ static struct {
   DRWCallBuffer *lines_ik_no_target;
   DRWCallBuffer *lines_ik_spline;
 
+  DRWEmptiesBufferList empties;
+
   DRWArmaturePasses passes;
 
   bool transparent;
@@ -435,6 +437,50 @@ static void drw_shgroup_bone_custom_wire(const float (*bone_mat)[4],
   }
 }
 
+static void drw_shgroup_bone_custom_empty(const float (*bone_mat)[4],
+                                          const float color[4],
+                                          const eGPUShaderConfig sh_cfg,
+                                          Object *custom)
+{
+  DRWEmptiesBufferList *buffers = &g_data.empties;
+  const float *draw_size = &custom->empty_drawsize;
+
+  if (g_data.empties.plain_axes == NULL) {
+    empties_callbuffers_create(g_data.passes.bone_wire, buffers, sh_cfg);
+  }
+
+  float final_color[4] = {color[0], color[1], color[2], 1.0f};
+  float final_bonemat[4][4];
+  mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
+
+  switch (custom->empty_drawtype) {
+    case OB_PLAINAXES:
+      DRW_buffer_add_entry(buffers->plain_axes, final_color, draw_size, final_bonemat);
+      break;
+    case OB_SINGLE_ARROW:
+      DRW_buffer_add_entry(buffers->single_arrow, final_color, draw_size, final_bonemat);
+      DRW_buffer_add_entry(buffers->single_arrow_line, final_color, draw_size, final_bonemat);
+      break;
+    case OB_CUBE:
+      DRW_buffer_add_entry(buffers->cube, final_color, draw_size, final_bonemat);
+      break;
+    case OB_CIRCLE:
+      DRW_buffer_add_entry(buffers->circle, final_color, draw_size, final_bonemat);
+      break;
+    case OB_EMPTY_SPHERE:
+      DRW_buffer_add_entry(buffers->sphere, final_color, draw_size, final_bonemat);
+      break;
+    case OB_EMPTY_CONE:
+      DRW_buffer_add_entry(buffers->cone, final_color, draw_size, final_bonemat);
+      break;
+    case OB_ARROWS:
+      DRW_buffer_add_entry(buffers->empty_axes, final_color, draw_size, final_bonemat);
+      break;
+    case OB_EMPTY_IMAGE:
+      break;
+  }
+}
+
 /* Head and tail sphere */
 static void drw_shgroup_bone_point(const float (*bone_mat)[4],
                                    const float bone_color[4],
@@ -1394,6 +1440,12 @@ static void draw_bone_custom_shape(EditBone *eBone,
     DRW_select_load_id(select_id | BONESEL_BONE);
   }
 
+  if (pchan->custom->type == OB_EMPTY) {
+    Object *ob = pchan->custom;
+    if (ob->empty_drawtype != OB_EMPTY_IMAGE) {
+      drw_shgroup_bone_custom_empty(disp_mat, col_wire, sh_cfg, pchan->custom);
+    }
+  }
   if ((boneflag & BONE_DRAWWIRE) == 0) {
     drw_shgroup_bone_custom_solid(disp_mat, col_solid, col_hint, col_wire, sh_cfg, pchan->custom);
   }
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index e9c3607f4c5..866fd57b9a8 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -981,6 +981,49 @@ struct DRWCallBuffer *buffer_instance_bone_dof(struct DRWPass *pass,
   return DRW_shgroup_call_buffer_instance(grp, g_formats.instance_bone_dof, geom);
 }
 
+void empties_callbuffers_create(struct DRWPass *pass,
+                                DRWEmptiesBufferList *buffers,
+                                eGPUShaderConfig sh_cfg)
+{
+  struct GPUBatch *geom;
+
+  geom = DRW_cache_plain_axes_get();
+  buffers->plain_axes = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_empty_cube_get();
+  buffers->cube = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_circle_get();
+  buffers->circle = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_empty_sphere_get();
+  buffers->sphere = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_sphere_get();
+  buffers->sphere_solid = buffer_instance_solid(pass, geom);
+
+  geom = DRW_cache_empty_cylinder_get();
+  buffers->cylinder = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_empty_capsule_cap_get();
+  buffers->capsule_cap = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_empty_capsule_body_get();
+  buffers->capsule_body = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_empty_cone_get();
+  buffers->cone = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_single_arrow_get();
+  buffers->single_arrow = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_single_line_get();
+  buffers->single_arrow_line = buffer_instance(pass, geom, sh_cfg);
+
+  geom = DRW_cache_bone_arrows_get();
+  buffers->empty_axes = buffer_instance_empty_axes(pass, geom, sh_cfg);
+}
+
 struct GPUShader *mpath_line_shader_get(void)
 {
   COMMON_Shaders *sh_data = &g_shaders[GPU_SHADER_CFG_DEFAULT];
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index 9c9e3a9b93e..05d7bafa00d 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -123,6 +123,21 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
 void DRW_globals_update(void);
 void DRW_globals_free(void);
 
+typedef struct DRWEmptiesBufferList {
+  struct DRWCallBuffer *plain_axes;
+  struct DRWCallBuffer *cube;
+  struct DRWCallBuffer *circle;
+  struct DRWCallBuffer *sphere;
+  struct DRWCallBuffer *sphere_solid;
+  struct DRWCallBuffer *cylinder;
+  struct DRWCallBuffer *capsule_cap;
+  struct DRWCallBuffer *capsule_body;
+  struct DRWCallBuffer *cone;
+  struct DRWCallBuffer *single_arrow;
+  struct DRWCallBuffer *single_arrow_line;
+  struct DRWCallBuffer *empty_axes;
+} DRWEmptiesBufferList;
+
 /* TODO(fclem) ideally, most of the DRWCallBuffer functions shouldn't create a shgroup. */
 struct DRWCallBuffer *buffer_dynlines_flat_color(struct DRWPass *pass, eGPUShaderConfig sh_cfg);
 struct DRWCallBuffer *buffer_dynlines_dashed_uniform_color(struct DRWPass *pass,
@@ -193,6 +208,10 @@ struct DRWCallBuffer *buffer_instance_bone_dof(struct DRWPass *pass,
                                                struct GPUBatch *geom,
                                                bool blend);
 
+void empties_callbuffers_create(struct DRWPass *pass,
+                                struct DRWEmptiesBufferList *buffers,
+                                eGPUShaderConfig sh_cfg);
+
 struct GPUShader *mpath_line_shader_get(void);
 struct GPUShader *mpath_points_shader_get(void);
 
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 9f5268500e8..8dae160682a 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -172,18 +172,7 @@ typedef struct OBJECT_ShadingGroupList {
   struct DRWPass *bone_axes;
 
   /* Empties */
-  DRWCallBuffer *plain_axes;
-  DRWCallBuffer *cube;
-  DRWCallBuffer *circle;
-  DRWCallBuffer *sphere;
-  DRWCallBuffer *sphere_solid;
-  DRWCallBuffer *cylinder;
-  DRWCallBuffer *capsule_cap;
-  DRWCallBuffer *capsule_body;
-  DRWCallBuffer *cone;
-  DRWCallBuffer *single_arrow;
-  DRWCallBuffer *single_arrow_line;
-  DRWCallBuffer *empty_axes;
+  DRWEmptiesBufferList empties;
 
   /* Force Field */
   DRWCallBuffer *field_wind;
@@ -1252,41 +1241,7 @@ static void OBJECT_cache_init(void *vedata)
     sgl->image_empties = psl->image_empties[i] = DRW_pass_create("Image Empties", state);
 
     /* Empties */
-    geom = DRW_cache_plain_axes_get();
-    sgl->plain_axes = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_empty_cube_get();
-    sgl->cube = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_circle_get();
-    sgl->circle = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_empty_sphere_get();
-    sgl->sphere = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_sphere_get();
-    sgl->sphere_solid = buffer_instance_solid(sgl->non_meshes, geom);
-
-    geom = DRW_cache_empty_cylinder_get();
-    sgl->cylinder = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_empty_capsule_cap_get();
-    sgl->capsule_cap = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_empty_capsule_body_get();
-    sgl->capsule_body = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_empty_cone_get();
-    sgl->cone = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_single_arrow_get();
-    sgl->single_arrow = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_single_line_get();
-    sgl->single_arrow_line = buffer_instance(sgl->non_meshes, geom, draw_ctx->sh_cfg);
-
-    geom = DRW_cache_bone_arrows_get();
-    sgl->empty_axes = buffer_instance_empty_axes(sgl->non_meshes, geom, draw_ctx->sh_cfg);
+    empties_callbuffers_create(sgl->non_meshes, &sgl->empties, draw_ctx->sh_cfg);
 
     /* Force Field */
     geom = DRW_cache_field_wind_get();
@@ -2035,7 +1990,7 @@ static void camera_view3d_reconstruction(OBJECT_ShadingGroupList *sgl,
         };
 
         mul_m4_m4m4(bundle_mat, bundle_mat, bundle_scale_mat);
-        DRW_buffer_add_entry(sgl->sphere_solid, bundle_mat, bundle_color_v4);
+        DRW_buffer_add_entry(sgl->empties.sphere_solid, bundle_mat, bundle_color_v4);
       }
       else {
         DRW_shgroup_empty_ex(
@@ -2237,28 +2192,29 @@ static void DRW_shgroup_empty_ex(OBJECT_ShadingGroupList *sgl,
                                  char draw_type,
                                  const float color[4])
 {
+  DRWEmptiesBufferList *buffers = &sgl->empties;
   switch (draw_type) {
     case OB_PLAINAXES:
-      DRW_buffer_add_entry(sgl->plain_axes, color, draw_size, mat);
+      DRW_buffer_add_entry(buffers->plain_axes, color, draw_size, mat);
       break;
     case OB_SINGLE_ARROW:
-      DRW_buffer_add_entry(sgl->single_arrow, color, draw_size, mat);
-      DRW_buffer_add_entry(sgl->single_arrow_line, color, draw_size, mat);
+      DRW_buffer_add_entry(buffers->single_arrow, color, draw_size, mat);
+      DRW_buffer_add_entry(buffers->single_arrow_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list