[Bf-blender-cvs] [e493a1a1aed] blender2.8: DRW: Armature: New bone outline shader.

Clément Foucault noreply at git.blender.org
Wed May 2 20:54:19 CEST 2018


Commit: e493a1a1aedcd6bc00f0f016aa6ef707742e3825
Author: Clément Foucault
Date:   Sun Apr 22 22:49:36 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe493a1a1aedcd6bc00f0f016aa6ef707742e3825

DRW: Armature: New bone outline shader.

This fix the issue with the zfighting we were getting at bones edges.

Moreover, this enables us to render arbitrarly large outline with
varying thickness.

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

M	source/blender/draw/CMakeLists.txt
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/edit_armature_mode.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/pose_mode.c
A	source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
A	source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index cffd135369a..27daab90234 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -221,6 +221,8 @@ data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
 data_to_c_simple(modes/shaders/common_fullscreen_vert.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/edit_mesh_overlay_frag.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
 data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_tri.glsl SRC)
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index fe87e7f17fd..195acfb7c1f 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -75,8 +75,10 @@ static struct {
 	/* Reset when changing current_armature */
 	DRWShadingGroup *bone_octahedral_solid;
 	DRWShadingGroup *bone_octahedral_wire;
+	DRWShadingGroup *bone_octahedral_outline;
 	DRWShadingGroup *bone_box_solid;
 	DRWShadingGroup *bone_box_wire;
+	DRWShadingGroup *bone_box_outline;
 	DRWShadingGroup *bone_wire_wire;
 	DRWShadingGroup *bone_envelope_solid;
 	DRWShadingGroup *bone_envelope_distance;
@@ -88,6 +90,7 @@ static struct {
 	DRWShadingGroup *relationship_lines;
 
 	DRWPass *pass_bone_solid;
+	DRWPass *pass_bone_outline;
 	DRWPass *pass_bone_wire;
 	DRWPass *pass_bone_envelope;
 } g_data = {NULL};
@@ -114,10 +117,13 @@ static void drw_shgroup_bone_octahedral_wire(const float (*bone_mat)[4], const f
 	if (g_data.bone_octahedral_wire == NULL) {
 		struct Gwn_Batch *geom = DRW_cache_bone_octahedral_wire_outline_get();
 		g_data.bone_octahedral_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
+		geom = DRW_cache_bone_octahedral_get();
+		g_data.bone_octahedral_outline = shgroup_instance_armature_shape_outline(g_data.pass_bone_outline, geom);
 	}
 	float final_bonemat[4][4];
 	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
 	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_wire, final_bonemat, color);
+	DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_outline, final_bonemat, color);
 }
 
 /* Box / B-Bone */
@@ -137,10 +143,13 @@ static void drw_shgroup_bone_box_wire(const float (*bone_mat)[4], const float co
 	if (g_data.bone_box_wire == NULL) {
 		struct Gwn_Batch *geom = DRW_cache_bone_box_wire_outline_get();
 		g_data.bone_box_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
+		geom = DRW_cache_bone_box_get();
+		g_data.bone_box_outline = shgroup_instance_armature_shape_outline(g_data.pass_bone_outline, geom);
 	}
 	float final_bonemat[4][4];
 	mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
 	DRW_shgroup_call_dynamic_add(g_data.bone_box_wire, final_bonemat, color);
+	DRW_shgroup_call_dynamic_add(g_data.bone_box_outline, final_bonemat, color);
 }
 
 /* Wire */
@@ -1416,13 +1425,16 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
  * This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls.
  */
 static void drw_shgroup_armature(
-        Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+        Object *ob,
+        DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+        DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
         DRWShadingGroup *shgrp_relationship_lines)
 {
 	memset(&g_data, 0x0, sizeof(g_data));
 	g_data.ob = ob;
 
 	g_data.pass_bone_solid = pass_bone_solid;
+	g_data.pass_bone_outline = pass_bone_outline;
 	g_data.pass_bone_wire = pass_bone_wire;
 	g_data.pass_bone_envelope = pass_bone_envelope;
 	g_data.relationship_lines = shgrp_relationship_lines;
@@ -1431,29 +1443,35 @@ static void drw_shgroup_armature(
 }
 
 void DRW_shgroup_armature_object(
-        Object *ob, ViewLayer *view_layer, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *UNUSED(pass_bone_envelope),
+        Object *ob, ViewLayer *view_layer,
+        DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+        DRWPass *pass_bone_wire, DRWPass *UNUSED(pass_bone_envelope),
         DRWShadingGroup *shgrp_relationship_lines)
 {
 	float *color;
 	DRW_object_wire_theme_get(ob, view_layer, &color);
 
-	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, NULL, shgrp_relationship_lines);
+	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, NULL, shgrp_relationship_lines);
 	draw_armature_pose(ob, color);
 }
 
 void DRW_shgroup_armature_pose(
-        Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+        Object *ob,
+        DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+        DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
         DRWShadingGroup *shgrp_relationship_lines)
 {
-	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
+	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
 	draw_armature_pose(ob, NULL);
 }
 
 void DRW_shgroup_armature_edit(
-        Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+        Object *ob,
+        DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+        DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
         DRWShadingGroup *shgrp_relationship_lines)
 {
-	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
+	drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
 	draw_armature_edit(ob);
 }
 
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 6bcf7fd6531..3a2aa970a9b 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -156,6 +156,14 @@ void DRW_globals_update(void)
 
 /* ********************************* SHGROUP ************************************* */
 
+extern char datatoc_armature_shape_outline_vert_glsl[];
+extern char datatoc_armature_shape_outline_geom_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+
+static struct {
+	struct GPUShader *shape_outline;
+} g_armature_shaders = {NULL};
+
 static struct {
 	struct Gwn_VertFormat *instance_screenspace;
 	struct Gwn_VertFormat *instance_color;
@@ -178,6 +186,11 @@ void DRW_globals_free(void)
 	for (int i = 0; i < sizeof(g_formats) / sizeof(void *); ++i, ++format) {
 		MEM_SAFE_FREE(*format);
 	}
+
+	struct GPUShader **shader = &g_armature_shaders.shape_outline;
+	for (int i = 0; i < sizeof(g_armature_shaders) / sizeof(void *); ++i, ++shader) {
+		DRW_SHADER_FREE_SAFE(*shader);
+	}
 }
 
 DRWShadingGroup *shgroup_dynlines_uniform_color(DRWPass *pass, float color[4])
@@ -454,6 +467,32 @@ DRWShadingGroup *shgroup_instance_mball_handles(DRWPass *pass, struct Gwn_Batch
 	return grp;
 }
 
+/* Only works with batches with adjacency infos. */
+DRWShadingGroup *shgroup_instance_armature_shape_outline(DRWPass *pass, struct Gwn_Batch *geom)
+{
+	if (g_armature_shaders.shape_outline == NULL) {
+		g_armature_shaders.shape_outline = DRW_shader_create(
+		            datatoc_armature_shape_outline_vert_glsl,
+		            datatoc_armature_shape_outline_geom_glsl,
+		            datatoc_gpu_shader_flat_color_frag_glsl,
+		            NULL);
+	}
+
+	/* TODO own format? */
+	DRW_shgroup_instance_format(g_formats.instance_color, {
+		{"InstanceModelMatrix", DRW_ATTRIB_FLOAT, 16},
+		{"color"              , DRW_ATTRIB_FLOAT, 4}
+	});
+
+	DRWShadingGroup *grp = DRW_shgroup_instance_create(g_armature_shaders.shape_outline,
+	                                                   pass, geom, g_formats.instance_color);
+	DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
+
+	return grp;
+}
+
+
+
 
 /* ******************************************** COLOR UTILS *********************************************** */
 
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index c70a1a38e62..8b418135342 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -121,6 +121,7 @@ struct DRWShadingGroup *shgroup_spot_instance(struct DRWPass *pass, struct Gwn_B
 struct DRWShadingGroup *shgroup_instance_bone_envelope_wire(struct DRWPass *pass, struct Gwn_Batch *geom);
 struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass, struct Gwn_Batch *geom);
 struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass, struct Gwn_Batch *geom);
+struct DRWShadingGroup *shgroup_instance_armature_shape_outline(struct DRWPass *pass, struct Gwn_Batch *geom);
 
 int DRW_object_wire_theme_get(
         struct Object *ob, struct ViewLayer *view_layer, float **r_color);
@@ -129,17 +130,20 @@ float *DRW_color_background_blend_get(int theme_id);
 /* draw_armature.c */
 void DRW_shgroup_armature_object(
         struct Object *ob, struct ViewLayer *view_layer,
-        struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+        struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_outline,
+        struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
         struct DRWShadingGroup *shgrp_relationship_lines);
 
 void DRW_shgroup_armature_pose(
         struct Object *ob,
-        struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+        struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_outline,
+        struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
         struct DRWShadingGroup *shgrp_relationship_lines);
 
 void DRW_shgroup_armature_edit(
         struct Object *ob,
-        struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+        struct DRWPass *pass_bone_so

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list