[Bf-blender-cvs] [44935fdfa34] blender2.8: Armature: Make Custom bone have the same appearance as other bones.

Clément Foucault noreply at git.blender.org
Sat May 26 23:23:30 CEST 2018


Commit: 44935fdfa342307259c4f7163738d5e74374e70a
Author: Clément Foucault
Date:   Mon May 21 00:15:19 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB44935fdfa342307259c4f7163738d5e74374e70a

Armature: Make Custom bone have the same appearance as other bones.

I had to correct some errors in the winding order of the normal bones.

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

M	source/blender/draw/intern/draw_armature.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
M	source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl
M	source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index 46122af257c..05c7d3892ed 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -313,19 +313,32 @@ static void drw_shgroup_bone_envelope(
 
 /* Custom (geometry) */
 
-static void drw_shgroup_bone_custom_solid(const float (*bone_mat)[4], const float color[4], Object *custom)
+static void drw_shgroup_bone_custom_solid(
+        const float (*bone_mat)[4],
+        const float bone_color[4], const float hint_color[4], const float outline_color[4],
+        Object *custom)
 {
 	/* grr, not re-using instances! */
 	struct Gwn_Batch *geom = DRW_cache_object_surface_get(custom);
 	if (geom) {
-		DRWShadingGroup *shgrp_geom_solid = shgroup_instance_solid(g_data.passes.bone_solid, geom);
+		DRWShadingGroup *shgrp_geom_solid = shgroup_instance_bone_shape_solid(g_data.passes.bone_solid, geom);
 		float final_bonemat[4][4];
 		mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
-		DRW_shgroup_call_dynamic_add(shgrp_geom_solid, final_bonemat, color);
+		DRW_shgroup_call_dynamic_add(shgrp_geom_solid, final_bonemat, bone_color, hint_color);
+	}
+
+	geom = DRW_cache_object_edge_detection_get(custom);
+	if (geom && outline_color[3] > 0.0f) {
+		DRWShadingGroup *shgrp_geom_wire = shgroup_instance_bone_shape_outline(g_data.passes.bone_outline, geom);
+		float final_bonemat[4][4], final_color[4];
+		mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
+		DRW_shgroup_call_dynamic_add(shgrp_geom_wire, final_bonemat, outline_color);
 	}
 }
 
-static void drw_shgroup_bone_custom_wire(const float (*bone_mat)[4], const float color[4], Object *custom)
+static void drw_shgroup_bone_custom_wire(
+        const float (*bone_mat)[4],
+        const float color[4], Object *custom)
 {
 	/* grr, not re-using instances! */
 	struct Gwn_Batch *geom = DRW_cache_object_wire_outline_get(custom);
@@ -1169,6 +1182,7 @@ static void draw_bone_custom_shape(
 {
 	const float *col_solid = get_bone_solid_color(eBone, pchan, arm, boneflag, constflag);
 	const float *col_wire = get_bone_wire_color(eBone, pchan, arm, boneflag, constflag);
+	const float *col_hint = get_bone_hint_color(eBone, pchan, arm, boneflag, constflag);
 	const float (*disp_mat)[4] = pchan->disp_mat;
 
 	if (select_id != -1) {
@@ -1176,9 +1190,11 @@ static void draw_bone_custom_shape(
 	}
 
 	if ((boneflag & BONE_DRAWWIRE) == 0) {
-		drw_shgroup_bone_custom_solid(disp_mat, col_solid, pchan->custom);
+		drw_shgroup_bone_custom_solid(disp_mat, col_solid, col_hint, col_wire, pchan->custom);
+	}
+	else {
+		drw_shgroup_bone_custom_wire(disp_mat, col_wire, pchan->custom);
 	}
-	drw_shgroup_bone_custom_wire(disp_mat, col_wire, pchan->custom);
 
 	if (select_id != -1) {
 		DRW_select_load_id(-1);
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c
index cd73ec4e674..b34955aef6d 100644
--- a/source/blender/draw/intern/draw_cache.c
+++ b/source/blender/draw/intern/draw_cache.c
@@ -1633,9 +1633,9 @@ static const uint bone_octahedral_solid_tris[8][3] = {
  * {0, 12, 1, 10, 2, 3}
  **/
 static const uint bone_octahedral_wire_lines_adjacency[12][4] = {
-	{ 0, 2, 1, 6}, { 0, 1, 12, 6}, { 6, 12, 3, 0}, { 6, 3, 2, 0},
-	{ 1, 2, 6, 3}, { 1, 6, 12, 3}, { 3, 12, 0, 1}, { 3, 0, 2, 1},
-	{ 2, 1, 0, 12}, { 2, 0, 3, 12}, { 2, 3, 6, 12}, { 2, 6, 1, 12},
+	{ 0, 1, 2,  6}, { 0, 12, 1,  6}, { 0, 3, 12,  6}, { 0, 2, 3,  6},
+	{ 1, 6, 2,  3}, { 1, 12, 6,  3}, { 1, 0, 12,  3}, { 1, 2, 0,  3},
+	{ 2, 0, 1, 12}, { 2,  3, 0, 12}, { 2, 6,  3, 12}, { 2, 1, 6, 12},
 };
 
 #if 0 /* UNUSED */
@@ -1682,18 +1682,14 @@ Gwn_Batch *DRW_cache_bone_octahedral_get(void)
 		GWN_vertbuf_data_alloc(vbo, 24);
 
 		for (int i = 0; i < 8; i++) {
-			GWN_vertbuf_attr_set(vbo, attr_id.nor, v_idx, bone_octahedral_solid_normals[i]);
-			GWN_vertbuf_attr_set(vbo, attr_id.snor, v_idx, bone_octahedral_smooth_normals[bone_octahedral_solid_tris[i][0]]);
-			GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, bone_octahedral_verts[bone_octahedral_solid_tris[i][0]]);
-			GWN_vertbuf_attr_set(vbo, attr_id.nor, v_idx, bone_octahedral_solid_normals[i]);
-			GWN_vertbuf_attr_set(vbo, attr_id.snor, v_idx, bone_octahedral_smooth_normals[bone_octahedral_solid_tris[i][1]]);
-			GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, bone_octahedral_verts[bone_octahedral_solid_tris[i][1]]);
-			GWN_vertbuf_attr_set(vbo, attr_id.nor, v_idx, bone_octahedral_solid_normals[i]);
-			GWN_vertbuf_attr_set(vbo, attr_id.snor, v_idx, bone_octahedral_smooth_normals[bone_octahedral_solid_tris[i][2]]);
-			GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, bone_octahedral_verts[bone_octahedral_solid_tris[i][2]]);
-		}
-
-		SHC.drw_bone_octahedral = GWN_batch_create_ex(GWN_PRIM_TRIS_ADJ, vbo, NULL,
+			for (int j = 0; j < 3; ++j) {
+				GWN_vertbuf_attr_set(vbo, attr_id.nor, v_idx, bone_octahedral_solid_normals[i]);
+				GWN_vertbuf_attr_set(vbo, attr_id.snor, v_idx, bone_octahedral_smooth_normals[bone_octahedral_solid_tris[i][j]]);
+				GWN_vertbuf_attr_set(vbo, attr_id.pos, v_idx++, bone_octahedral_verts[bone_octahedral_solid_tris[i][j]]);
+			}
+		}
+
+		SHC.drw_bone_octahedral = GWN_batch_create_ex(GWN_PRIM_TRIS, vbo, NULL,
 		                                              GWN_BATCH_OWNS_VBO);
 	}
 	return SHC.drw_bone_octahedral;
@@ -1786,9 +1782,9 @@ static const uint bone_box_solid_tris[12][3] = {
  * See bone_octahedral_solid_tris for more infos.
  **/
 static const uint bone_box_wire_lines_adjacency[12][4] = {
-	{ 4,  0, 2, 11}, { 0, 2,  1,  8}, { 2, 1,  4,  14}, {  1,  4, 0, 20}, /* bottom */
-	{ 0, 11, 8, 14}, { 2, 8, 14, 20}, { 1, 14, 20, 11}, {  4, 20, 11, 8}, /* top */
-	{ 20, 0, 11, 2}, { 11, 2, 8,  1}, { 8, 1,  14,  4}, { 14, 4, 20, 0}, /* sides */
+	{ 4,  2,  0, 11}, { 0,  1, 2,  8}, { 2, 4,  1,  14}, {  1,  0,  4, 20}, /* bottom */
+	{ 0,  8, 11, 14}, { 2, 14, 8, 20}, { 1, 20, 14, 11}, {  4, 11, 20,  8}, /* top */
+	{ 20, 0, 11,  2}, { 11, 2, 8,  1}, { 8, 1,  14,  4}, { 14,  4, 20,  0}, /* sides */
 };
 
 #if 0 /* UNUSED */
@@ -1859,7 +1855,7 @@ Gwn_Batch *DRW_cache_bone_box_get(void)
 			}
 		}
 
-		SHC.drw_bone_box = GWN_batch_create_ex(GWN_PRIM_TRIS_ADJ, vbo, NULL,
+		SHC.drw_bone_box = GWN_batch_create_ex(GWN_PRIM_TRIS, vbo, NULL,
 		                                       GWN_BATCH_OWNS_VBO);
 	}
 	return SHC.drw_bone_box;
diff --git a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl b/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
index 4fb6fe5a245..11924b19cf8 100644
--- a/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
@@ -57,12 +57,19 @@ void main(void)
 	vec3 v12 = vPos[2] - vPos[1];
 	vec3 v13 = vPos[3] - vPos[1];
 
-	float fac1 = dot(view_vec, cross(v10, v12));
-	float fac2 = dot(view_vec, cross(v12, v13));
+	vec3 n0 = cross(v12, v10);
+	vec3 n3 = cross(v13, v12);
+
+	float fac0 = dot(view_vec, n0);
+	float fac3 = dot(view_vec, n3);
 
 	/* If both adjacent verts are facing the camera the same way,
 	 * then it isn't an outline edge. */
-	if (sign(fac1) == sign(fac2))
+	if (sign(fac0) == sign(fac3))
+		return;
+
+	/* Don't outline if concave edge. */
+	if (dot(n0, v13) > 0.0)
 		return;
 
 	vec2 thick = vColSize[0].w * (lineThickness / viewportSize);
diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl
index 248281f4e79..89f4d97f29b 100644
--- a/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_solid_frag.glsl
@@ -1,5 +1,5 @@
 
-flat in vec4 finalColor;
+in vec4 finalColor;
 
 out vec4 fragColor;
 
diff --git a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
index 701fc9c38ab..505868c9dcf 100644
--- a/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
+++ b/source/blender/draw/modes/shaders/armature_shape_solid_vert.glsl
@@ -16,7 +16,7 @@ in mat4 InstanceModelMatrix;
 in vec3 boneColor;
 in vec3 stateColor;
 
-flat out vec4 finalColor;
+out vec4 finalColor;
 
 void main()
 {



More information about the Bf-blender-cvs mailing list