[Bf-blender-cvs] [36bbf809290] blender2.8: Armature: Envelope: Small cleanup + don't smooth the distance display.

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


Commit: 36bbf8092903f55a317db94c4f7ca48c216b1a89
Author: Clément Foucault
Date:   Wed May 2 08:58:29 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB36bbf8092903f55a317db94c4f7ca48c216b1a89

Armature: Envelope: Small cleanup + don't smooth the distance display.

The actual weighting calculation is not smooth as the bone display.

The bone itself can be smooth for esthetic purpose but the distance display
should match the underlying weighting formula.

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

M	source/blender/draw/intern/draw_armature.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/modes/shaders/armature_envelope_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index ec2751d661b..6405cff86e7 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -175,7 +175,7 @@ static void drw_shgroup_bone_envelope_distance(
 {
 	if (g_data.pass_bone_envelope != NULL) {
 		if (g_data.bone_envelope_distance == NULL) {
-			g_data.bone_envelope_distance = shgroup_instance_bone_envelope_solid(g_data.pass_bone_envelope);
+			g_data.bone_envelope_distance = shgroup_instance_bone_envelope_distance(g_data.pass_bone_envelope);
 			/* pass_bone_envelope should have the DRW_STATE_CULL_FRONT state enabled. */
 		}
 		float head_sphere[4] = {0.0f, 0.0f, 0.0f, 1.0f}, tail_sphere[4] = {0.0f, 1.0f, 0.0f, 1.0f};
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index be4c1783aff..909e577bd4f 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1897,7 +1897,7 @@ Gwn_Batch *DRW_cache_bone_envelope_solid_get(void)
 		static Gwn_VertFormat format = { 0 };
 		static struct { uint pos; } attr_id;
 		if (format.attrib_ct == 0) {
-			attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 4, GWN_FETCH_FLOAT);
+			attr_id.pos = GWN_vertformat_attr_add(&format, "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
 		}
 
 		/* Vertices */
@@ -1907,8 +1907,7 @@ Gwn_Batch *DRW_cache_bone_envelope_solid_get(void)
 		float lon = 0.0f;
 		for (int i = 0; i < lon_res; i++, lon += lon_inc) {
 			float lat = 0.0f;
-			float co1[4], co2[4];
-			co1[3] = co2[3] = 0.0f;
+			float co1[3], co2[3];
 
 			/* Note: the poles are duplicated on purpose, to restart the strip. */
 
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index f108b129feb..5019f28e4cf 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -169,6 +169,7 @@ extern char datatoc_gpu_shader_flat_color_frag_glsl[];
 static struct {
 	struct GPUShader *shape_outline;
 	struct GPUShader *bone_envelope;
+	struct GPUShader *bone_envelope_distance;
 	struct GPUShader *bone_envelope_outline;
 	struct GPUShader *bone_sphere;
 	struct GPUShader *bone_sphere_outline;
@@ -448,12 +449,34 @@ DRWShadingGroup *shgroup_instance_bone_envelope_outline(DRWPass *pass)
 	return grp;
 }
 
+DRWShadingGroup *shgroup_instance_bone_envelope_distance(DRWPass *pass)
+{
+	if (g_armature_shaders.bone_envelope_distance == NULL) {
+		g_armature_shaders.bone_envelope_distance = DRW_shader_create(
+		            datatoc_armature_envelope_vert_glsl, NULL,
+		            datatoc_armature_envelope_frag_glsl, NULL);
+	}
+
+	DRW_shgroup_instance_format(g_formats.instance_bone_envelope, {
+		{"headSphere"          , DRW_ATTRIB_FLOAT, 4},
+		{"tailSphere"          , DRW_ATTRIB_FLOAT, 4},
+		{"color"               , DRW_ATTRIB_FLOAT, 4},
+		{"xAxis"               , DRW_ATTRIB_FLOAT, 3}
+	});
+
+	DRWShadingGroup *grp = DRW_shgroup_instance_create(g_armature_shaders.bone_envelope_distance,
+	                                                   pass, DRW_cache_bone_envelope_solid_get(),
+	                                                   g_formats.instance_bone_envelope);
+
+	return grp;
+}
+
 DRWShadingGroup *shgroup_instance_bone_envelope_solid(DRWPass *pass)
 {
 	if (g_armature_shaders.bone_envelope == NULL) {
 		g_armature_shaders.bone_envelope = DRW_shader_create(
 		            datatoc_armature_envelope_vert_glsl, NULL,
-		            datatoc_armature_envelope_frag_glsl, NULL);
+		            datatoc_armature_envelope_frag_glsl, "#define SMOOTH_ENVELOPE\n");
 	}
 
 	DRW_shgroup_instance_format(g_formats.instance_bone_envelope, {
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index 656a4d7303d..7b40596ad10 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -118,6 +118,7 @@ struct DRWShadingGroup *shgroup_instance_outline(struct DRWPass *pass, struct Gw
 struct DRWShadingGroup *shgroup_camera_instance(struct DRWPass *pass, struct Gwn_Batch *geom);
 struct DRWShadingGroup *shgroup_distance_lines_instance(struct DRWPass *pass, struct Gwn_Batch *geom);
 struct DRWShadingGroup *shgroup_spot_instance(struct DRWPass *pass, struct Gwn_Batch *geom);
+struct DRWShadingGroup *shgroup_instance_bone_envelope_distance(struct DRWPass *pass);
 struct DRWShadingGroup *shgroup_instance_bone_envelope_outline(struct DRWPass *pass);
 struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass);
 struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass, struct Gwn_Batch *geom);
diff --git a/source/blender/draw/modes/shaders/armature_envelope_vert.glsl b/source/blender/draw/modes/shaders/armature_envelope_vert.glsl
index 6de842fdcb2..f4d7a32ce07 100644
--- a/source/blender/draw/modes/shaders/armature_envelope_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_envelope_vert.glsl
@@ -4,7 +4,7 @@ uniform mat4 ViewMatrixInverse;
 uniform mat4 ViewProjectionMatrix;
 
 /* ---- Instanciated Attribs ---- */
-in vec4 pos;  /* w encodes head (== 0.0f), tail (== 1.0f). */
+in vec3 pos;
 
 /* ---- Per instance Attribs ---- */
 /* Assumed to be in world coordinate already. */
@@ -21,7 +21,11 @@ void main()
 	vec3 bone_vec = tailSphere.xyz - headSphere.xyz;
 	float bone_len = max(1e-8, sqrt(dot(bone_vec, bone_vec)));
 	float bone_lenrcp = 1.0 / bone_len;
+#ifdef SMOOTH_ENVELOPE
 	float sinb = (tailSphere.w - headSphere.w) * bone_lenrcp;
+#else
+	const float sinb = 0.0;
+#endif
 
 	vec3 y_axis = bone_vec * bone_lenrcp;
 	vec3 z_axis = normalize(cross(xAxis, -y_axis));



More information about the Bf-blender-cvs mailing list