[Bf-blender-cvs] [38ef4c02e1a] tmp-overlay-engine: Overlay Engine: Empties

Clément Foucault noreply at git.blender.org
Fri Nov 15 01:35:04 CET 2019


Commit: 38ef4c02e1a696e56add58b22021025d0d994cee
Author: Clément Foucault
Date:   Fri Nov 8 02:51:58 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB38ef4c02e1a696e56add58b22021025d0d994cee

Overlay Engine: Empties

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

M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/shaders/extra_vert.glsl
M	source/blender/draw/intern/draw_cache.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index 908d9870f91..0bc65809f29 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -164,10 +164,6 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
     cb->mball_handle = buffer_instance_mball_handles(cb->non_meshes, draw_ctx->sh_cfg);
 
 #endif
-    /* Lights */
-    /* TODO
-     * for now we create multiple times the same VBO with only light center coordinates
-     * but ideally we would only create it once */
 
 #define BUF_INSTANCE DRW_shgroup_call_buffer_instance
 #define BUF_POINT(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_POINTS)
@@ -194,6 +190,18 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
       cb->camera_tria[1] = BUF_INSTANCE(grp_sub, format, DRW_cache_camera_tria_get());
       cb->camera_distances = BUF_INSTANCE(grp_sub, format, DRW_cache_camera_distances_get());
 
+      cb->empty_axes = BUF_INSTANCE(grp_sub, format, DRW_cache_bone_arrows_get());
+      cb->empty_capsule_body = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_capsule_body_get());
+      cb->empty_capsule_cap = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_capsule_cap_get());
+      cb->empty_circle = BUF_INSTANCE(grp_sub, format, DRW_cache_circle_get());
+      cb->empty_cone = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cone_get());
+      cb->empty_cube = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cube_get());
+      cb->empty_cylinder = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_cylinder_get());
+      cb->empty_plain_axes = BUF_INSTANCE(grp_sub, format, DRW_cache_plain_axes_get());
+      cb->empty_single_arrow = BUF_INSTANCE(grp_sub, format, DRW_cache_single_arrow_get());
+      cb->empty_sphere = BUF_INSTANCE(grp_sub, format, DRW_cache_empty_sphere_get());
+      cb->empty_sphere_solid = BUF_INSTANCE(grp_sub, format, DRW_cache_sphere_get());
+
       /* TODO Own move to transparent pass. */
       grp_sub = DRW_shgroup_create_sub(grp);
       DRW_shgroup_state_enable(grp_sub, DRW_STATE_CULL_BACK | DRW_STATE_BLEND_ALPHA);
@@ -301,6 +309,71 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
   }
 }
 
+/* -------------------------------------------------------------------- */
+/** \name Empties
+ * \{ */
+
+static void DRW_shgroup_empty_ex(OVERLAY_ExtraCallBuffers *cb,
+                                 const float mat[4][4],
+                                 const float *draw_size,
+                                 char draw_type,
+                                 const float color[4])
+{
+  float instdata[4][4];
+  copy_m4_m4(instdata, mat);
+  instdata[3][3] = *draw_size;
+
+  switch (draw_type) {
+    case OB_PLAINAXES:
+      DRW_buffer_add_entry(cb->empty_plain_axes, color, instdata);
+      break;
+    case OB_SINGLE_ARROW:
+      DRW_buffer_add_entry(cb->empty_single_arrow, color, instdata);
+      break;
+    case OB_CUBE:
+      DRW_buffer_add_entry(cb->empty_cube, color, instdata);
+      break;
+    case OB_CIRCLE:
+      DRW_buffer_add_entry(cb->empty_circle, color, instdata);
+      break;
+    case OB_EMPTY_SPHERE:
+      DRW_buffer_add_entry(cb->empty_sphere, color, instdata);
+      break;
+    case OB_EMPTY_CONE:
+      DRW_buffer_add_entry(cb->empty_cone, color, instdata);
+      break;
+    case OB_ARROWS:
+      DRW_buffer_add_entry(cb->empty_axes, color, instdata);
+      break;
+    case OB_EMPTY_IMAGE:
+      BLI_assert(!"Should never happen, use DRW_shgroup_empty instead.");
+      break;
+  }
+}
+
+static void DRW_shgroup_empty(OVERLAY_ExtraCallBuffers *cb, Object *ob, ViewLayer *view_layer)
+{
+  float *color;
+  DRW_object_wire_theme_get(ob, view_layer, &color);
+
+  switch (ob->empty_drawtype) {
+    case OB_PLAINAXES:
+    case OB_SINGLE_ARROW:
+    case OB_CUBE:
+    case OB_CIRCLE:
+    case OB_EMPTY_SPHERE:
+    case OB_EMPTY_CONE:
+    case OB_ARROWS:
+      DRW_shgroup_empty_ex(cb, ob->obmat, &ob->empty_drawsize, ob->empty_drawtype, color);
+      break;
+    case OB_EMPTY_IMAGE:
+      // DRW_shgroup_empty_image(sh_data, sgl, ob, color, rv3d, sh_cfg);
+      break;
+  }
+}
+
+/** \} */
+
 /* -------------------------------------------------------------------- */
 /** \name Lights
  * \{ */
@@ -733,10 +806,10 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata,
       // DRW_shgroup_lightprobe(sh_data, stl, psl, ob, view_layer, draw_ctx->sh_cfg);
       break;
     case OB_EMPTY:
-      // if (!(((ob->base_flag & BASE_FROM_DUPLI) != 0) &&
-      //       ((ob->transflag & OB_DUPLICOLLECTION) != 0) && ob->instance_collection)) {
-      //   DRW_shgroup_empty(sh_data, sgl, ob, view_layer, rv3d, draw_ctx->sh_cfg);
-      // }
+      if (!(((ob->base_flag & BASE_FROM_DUPLI) != 0) &&
+            ((ob->transflag & OB_DUPLICOLLECTION) != 0) && ob->instance_collection)) {
+        DRW_shgroup_empty(cb, ob, view_layer);
+      }
       break;
   }
 
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index fc1e2284dfb..6bc4423548c 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -87,6 +87,19 @@ typedef struct OVERLAY_ShadingData {
 typedef struct OVERLAY_ExtraCallBuffers {
   DRWCallBuffer *groundline;
 
+  DRWCallBuffer *empty_axes;
+  DRWCallBuffer *empty_capsule_body;
+  DRWCallBuffer *empty_capsule_cap;
+  DRWCallBuffer *empty_circle;
+  DRWCallBuffer *empty_cone;
+  DRWCallBuffer *empty_cube;
+  DRWCallBuffer *empty_cylinder;
+  DRWCallBuffer *empty_plain_axes;
+  DRWCallBuffer *empty_single_arrow_line;
+  DRWCallBuffer *empty_single_arrow;
+  DRWCallBuffer *empty_sphere;
+  DRWCallBuffer *empty_sphere_solid;
+
   DRWCallBuffer *light_point;
   DRWCallBuffer *light_sun;
   DRWCallBuffer *light_spot;
diff --git a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
index 59a7cb91732..210beb1cddf 100644
--- a/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/extra_vert.glsl
@@ -23,6 +23,8 @@ in vec4 color;
 #define camera_dist_end inst_data.w
 #define camera_distance_color inst_data.x
 
+#define empty_scale inst_data.w
+
 #define VCLASS_LIGHT_AREA_SHAPE (1 << 0)
 #define VCLASS_LIGHT_SPOT_SHAPE (1 << 1)
 #define VCLASS_LIGHT_SPOT_BLEND (1 << 2)
@@ -36,6 +38,11 @@ in vec4 color;
 #define VCLASS_SCREENSPACE (1 << 8)
 #define VCLASS_SCREENALIGNED (1 << 9)
 
+#define VCLASS_EMPTY_SCALED (1 << 10)
+#define VCLASS_EMPTY_AXES (1 << 11)
+#define VCLASS_EMPTY_AXES_NAME (1 << 12)
+#define VCLASS_EMPTY_AXES_SHADOW (1 << 13)
+
 flat out vec4 finalColor;
 
 float mul_project_m4_v3_zfac(in vec3 co)
@@ -126,7 +133,20 @@ void main()
       }
     }
   }
+  /* Empties */
+  else if ((vclass & VCLASS_EMPTY_SCALED) != 0) {
+    /* This is a bit silly but we avoid scalling the object matrix on CPU (saving a mat4 mul) */
+    vpos *= empty_scale;
+  }
+  else if ((vclass & VCLASS_EMPTY_AXES) != 0) {
+    float axis = vpos.z;
+    vec3 chosen_axis = obmat[int(axis)].xyz;
+    vofs = chosen_axis * (1.0 + fract(axis)) * empty_scale;
+    /* Scale uniformly by axis length */
+    vpos *= length(chosen_axis) * empty_scale;
+  }
 
+  /* Not exclusive with previous flags. */
   if ((vclass & VCLASS_CAMERA_VOLUME) != 0) {
     /* Unpack final color. */
     int color_class = int(floor(color.r));
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index d22458d9e9e..20a11d27cb5 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -57,6 +57,11 @@
 #define VCLASS_SCREENSPACE (1 << 8)
 #define VCLASS_SCREENALIGNED (1 << 9)
 
+#define VCLASS_EMPTY_SCALED (1 << 10)
+#define VCLASS_EMPTY_AXES (1 << 11)
+#define VCLASS_EMPTY_AXES_NAME (1 << 12)
+#define VCLASS_EMPTY_AXES_SHADOW (1 << 13)
+
 typedef struct Vert {
   float pos[3];
   int class;
@@ -308,21 +313,16 @@ static GPUVertBuf *fill_arrows_vbo(const float scale)
 }
 #endif /* UNUSED */
 
-static GPUVertBuf *sphere_wire_vbo(const float rad)
+static GPUVertBuf *sphere_wire_vbo(const float rad, int flag)
 {
 #define NSEGMENTS 32
   /* Position Only 3D format */
-  static GPUVertFormat format = {0};
-  static struct {
-    uint pos;
-  } attr_id;
-  if (format.attr_len == 0) {
-    attr_id.pos = GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-  }
+  GPUVertFormat format = extra_vert_format();
 
   GPUVertBuf *vbo = GPU_vertbuf_create_with_format(&format);
   GPU_vertbuf_data_alloc(vbo, NSEGMENTS * 2 * 3);
 
+  int v = 0;
   /* a single ring of vertices */
   float p[NSEGMENTS][2];
   for (int i = 0; i < NSEGMENTS; i++) {
@@ -334,21 +334,20 @@ static GPUVertBuf *sphere_wire_vbo(const float rad)
   for (int axis = 0; axis < 3; axis++) {
     for (int i = 0; i < NSEGMENTS; i++) {
       for (int j = 0; j < 2; j++) {
-        float cv[2], v[3];
+        float cv[2];
 
         cv[0] = p[(i + j) % NSEGMENTS][0];
         cv[1] = p[(i + j) % NSEGMENTS][1];
 
         if (axis == 0) {
-          ARRAY_SET_ITEMS(v, cv[0], cv[1], 0.0f);
+          GPU_vertbuf_vert_set(vbo, v++, &(Vert){{cv[0], cv[1], 0.0f}, flag});
         }
         else if (axis == 1) {
-          ARRAY_SET_ITEMS(v, cv[0], 0.0f, cv[1]);
+          GPU_vertbuf_vert_set(vbo, v++, &(Vert){{cv[0], 0.0f, cv[1]}, flag});
         }
         else {
-          ARRAY_SET_ITEMS(v, 0.0f, cv[0], cv[1]);
+          GPU_vertbuf_vert_set(vbo, v++, &(Vert){{0.0f, cv[0], cv[1]}, flag});
         }
-        GPU_vertbuf_attr_set(vbo, attr_id.pos, i * 2 + j + (NSEGMENTS * 2 * axis), v);
       }
     }
   }
@@ -509,111 +508,164 @@ GPUBatch *DRW_cache_sphere_get(void)
 /** \name Common
  * \{ */
 
-GPUBatch *DRW_cache_cube_get(void)
-{
-  if (!SHC.drw_cube) {
-    const GLfloat verts[8][3] = {
-        {-1.0f, -1.0f, -1.0f},
-        {-1.0f, -1.0f, 1.0f},
-        {-1.0f, 1.0f, -1.0f},
-        {-1.0f, 1.0f, 1.0f},
-        {1.0f, -1.0f, -1.0f},
-        {1.0f, -1.0f, 1.0f},
-        {1.0f, 1.0f, -1.0f},
-        {1.0f, 1.0f, 1.0f},
-    };
+/* 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list