[Bf-blender-cvs] [632b00aeadb] tmp-overlay-engine: Overlay Engine: Armatures

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


Commit: 632b00aeadbeda605120872a3084a16e4efdcf5d
Author: Clément Foucault
Date:   Tue Nov 12 02:36:24 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB632b00aeadbeda605120872a3084a16e4efdcf5d

Overlay Engine: Armatures

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

M	source/blender/draw/CMakeLists.txt
A	source/blender/draw/engines/overlay/overlay_armature.c
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/overlay/overlay_extra.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
A	source/blender/draw/engines/overlay/shaders/armature_dof_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_envelope_outline_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_envelope_solid_frag.glsl
A	source/blender/draw/engines/overlay/shaders/armature_envelope_solid_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_shape_outline_geom.glsl
A	source/blender/draw/engines/overlay/shaders/armature_shape_outline_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_shape_solid_frag.glsl
A	source/blender/draw/engines/overlay/shaders/armature_shape_solid_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_sphere_outline_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_sphere_solid_frag.glsl
A	source/blender/draw/engines/overlay/shaders/armature_sphere_solid_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_stick_frag.glsl
A	source/blender/draw/engines/overlay/shaders/armature_stick_vert.glsl
A	source/blender/draw/engines/overlay/shaders/armature_wire_vert.glsl
M	source/blender/draw/engines/overlay/shaders/extra_vert.glsl
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/shaders/common_view_lib.glsl
M	source/blender/draw/modes/shaders/object_color_axes_vert.glsl
M	source/blender/draw/modes/shaders/object_empty_axes_vert.glsl
M	source/blender/draw/modes/shaders/object_grid_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 6d33d237123..0139d452baa 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -134,6 +134,7 @@ set(SRC
   engines/gpencil/gpencil_shader_fx.c
   engines/select/select_draw_utils.c
   engines/select/select_engine.c
+  engines/overlay/overlay_armature.c
   engines/overlay/overlay_engine.c
   engines/overlay/overlay_edit_mesh.c
   engines/overlay/overlay_extra.c
@@ -279,20 +280,7 @@ data_to_c_simple(modes/shaders/animviz_mpath_lines_vert.glsl SRC)
 data_to_c_simple(modes/shaders/animviz_mpath_lines_geom.glsl SRC)
 data_to_c_simple(modes/shaders/animviz_mpath_points_vert.glsl SRC)
 data_to_c_simple(modes/shaders/armature_axes_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_sphere_solid_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_sphere_solid_frag.glsl SRC)
-data_to_c_simple(modes/shaders/armature_sphere_outline_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_envelope_solid_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_envelope_solid_frag.glsl SRC)
-data_to_c_simple(modes/shaders/armature_envelope_outline_vert.glsl SRC)
 data_to_c_simple(modes/shaders/armature_envelope_distance_frag.glsl SRC)
-data_to_c_simple(modes/shaders/armature_shape_solid_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_shape_solid_frag.glsl SRC)
-data_to_c_simple(modes/shaders/armature_shape_outline_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_shape_outline_geom.glsl SRC)
-data_to_c_simple(modes/shaders/armature_stick_vert.glsl SRC)
-data_to_c_simple(modes/shaders/armature_stick_frag.glsl SRC)
-data_to_c_simple(modes/shaders/armature_dof_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_common_lib.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
@@ -382,6 +370,20 @@ data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_wave_frag.glsl SRC)
 data_to_c_simple(engines/select/shaders/selection_id_3D_vert.glsl SRC)
 data_to_c_simple(engines/select/shaders/selection_id_frag.glsl SRC)
 
+data_to_c_simple(engines/overlay/shaders/armature_dof_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_envelope_outline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_envelope_solid_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_envelope_solid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_shape_outline_geom.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_shape_outline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_shape_solid_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_shape_solid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_sphere_outline_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_sphere_solid_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_stick_frag.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_stick_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/armature_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/depth_only_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_common_lib.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_facefill_frag.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
new file mode 100644
index 00000000000..eb6dc695415
--- /dev/null
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -0,0 +1,2215 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Copyright 2019, Blender Foundation.
+ */
+
+/** \file
+ * \ingroup draw_engine
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "DNA_armature_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_object_types.h"
+
+#include "DRW_render.h"
+
+#include "BLI_math.h"
+#include "BLI_utildefines.h"
+
+#include "BKE_armature.h"
+
+#include "DEG_depsgraph_query.h"
+
+#include "ED_armature.h"
+#include "ED_view3d.h"
+
+#include "UI_resources.h"
+
+#include "draw_common.h"
+#include "draw_manager_text.h"
+
+#include "overlay_private.h"
+
+#define BONE_VAR(eBone, pchan, var) ((eBone) ? (eBone->var) : (pchan->var))
+#define BONE_FLAG(eBone, pchan) ((eBone) ? (eBone->flag) : (pchan->bone->flag))
+
+#define PT_DEFAULT_RAD 0.05f /* radius of the point batch. */
+
+typedef struct ArmatureDrawContext {
+  /* Current armature object */
+  Object *ob;
+  /* bArmature *arm; */ /* TODO */
+
+  union {
+    struct {
+      DRWCallBuffer *outline;
+      DRWCallBuffer *solid;
+      DRWCallBuffer *wire;
+    };
+    struct {
+      DRWCallBuffer *envelope_outline;
+      DRWCallBuffer *envelope_solid;
+      DRWCallBuffer *envelope_distance;
+    };
+    struct {
+      DRWCallBuffer *stick;
+    };
+  };
+
+  DRWCallBuffer *dof_lines;
+  DRWCallBuffer *dof_sphere;
+  DRWCallBuffer *point_solid;
+  DRWCallBuffer *point_outline;
+  DRWShadingGroup *custom_solid;
+  DRWShadingGroup *custom_outline;
+  DRWShadingGroup *custom_wire;
+
+  OVERLAY_ExtraCallBuffers *extras;
+
+  /**
+   * Follow `TH_*` naming except for mixed colors.
+   */
+  struct {
+    float select[4];
+    float edge_select[4];
+    float bone_select[4]; /* tint */
+    float wire[4];
+    float wire_edit[4];
+    float bone_solid[4];
+    float bone_active_unselect[4]; /* mix */
+    float bone_pose[4];
+    float bone_pose_active[4];
+    float bone_pose_active_unselect[4]; /* mix */
+    float text_hi[4];
+    float text[4];
+    float vertex_select[4];
+    float vertex[4];
+  } color;
+
+  /* not a theme, this is an override */
+  const float *const_color;
+  float const_wire;
+
+  bool do_relations;
+  bool transparent;
+  bool show_relations;
+
+  const ThemeWireColor *bcolor; /* pchan color */
+} ArmatureDrawContext;
+
+void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  OVERLAY_PrivateData *pd = vedata->stl->pd;
+
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  pd->armature.transparent = (draw_ctx->v3d->shading.type == OB_WIRE) ||
+                             XRAY_FLAG_ENABLED(draw_ctx->v3d);
+  pd->armature.show_relations = ((draw_ctx->v3d->flag & V3D_HIDE_HELPLINES) == 0);
+
+  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ADD;
+  DRW_PASS_CREATE(psl->armature_transp_ps, state | pd->clipping_state);
+
+  for (int i = 0; i < 2; i++) {
+    struct GPUShader *sh;
+    struct GPUVertFormat *format;
+    DRWShadingGroup *grp = NULL, *grp_sub = NULL;
+
+    OVERLAY_InstanceFormats *formats = OVERLAY_shader_instance_formats_get();
+    OVERLAY_ArmatureCallBuffers *cb = &pd->armature_call_buffers[i];
+    DRWPass **p_armature_ps = &psl->armature_ps[i];
+
+    state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK |
+            (pd->armature.transparent ? DRW_STATE_BLEND_ALPHA : DRW_STATE_WRITE_DEPTH);
+    DRW_PASS_CREATE(*p_armature_ps, state | pd->clipping_state);
+
+    DRWPass *armature_ps = *p_armature_ps;
+
+#define BUF_INSTANCE DRW_shgroup_call_buffer_instance
+#define BUF_LINE(grp, format) DRW_shgroup_call_buffer(grp, format, GPU_PRIM_LINES)
+
+    {
+      format = formats->instance_bone;
+
+      sh = OVERLAY_shader_armature_sphere(false);
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+      cb->point_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_point_get());
+
+      sh = OVERLAY_shader_armature_sphere(true);
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+      DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+      cb->point_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_point_wire_outline_get());
+
+      sh = OVERLAY_shader_armature_shape(false);
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+      DRW_shgroup_uniform_bool_copy(grp, "customShape", false);
+      cb->box_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_box_get());
+      cb->octa_solid = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_get());
+
+      cb->custom_solid = grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_uniform_bool_copy(grp_sub, "customShape", true);
+
+      sh = OVERLAY_shader_armature_shape(true);
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_state_disable(grp, DRW_STATE_CULL_BACK);
+      DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+      DRW_shgroup_uniform_bool_copy(grp, "customShape", false);
+      cb->box_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_box_wire_get());
+      cb->octa_outline = BUF_INSTANCE(grp, format, DRW_cache_bone_octahedral_wire_get());
+
+      cb->custom_outline = grp_sub = DRW_shgroup_create_sub(grp);
+      DRW_shgroup_state_disable(grp_sub, DRW_STATE_CULL_BACK);
+      DRW_shgroup_uniform_bool_copy(grp_sub, "customShape", true);
+    }
+    {
+      format = formats->instance_extra;
+
+      sh = OVERLAY_shader_armature_degrees_of_freedom();
+      grp = DRW_shgroup_create(sh, armature_ps);
+      DRW_shgroup_uniform_block(grp, "globalsBlock"

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list