Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2018-05-02 09:58:29 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-05-02 21:49:38 +0300
commit36bbf8092903f55a317db94c4f7ca48c216b1a89 (patch)
tree4c110e3735a52c8c0d485cd8653215b0415be9b1
parent46662a289b53f79b9e6fa9c0ed07db8368982b12 (diff)
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.
-rw-r--r--source/blender/draw/intern/draw_armature.c2
-rw-r--r--source/blender/draw/intern/draw_cache.c5
-rw-r--r--source/blender/draw/intern/draw_common.c25
-rw-r--r--source/blender/draw/intern/draw_common.h1
-rw-r--r--source/blender/draw/modes/shaders/armature_envelope_vert.glsl6
5 files changed, 33 insertions, 6 deletions
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));