diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-05-02 09:58:29 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-05-02 21:49:38 +0300 |
commit | 36bbf8092903f55a317db94c4f7ca48c216b1a89 (patch) | |
tree | 4c110e3735a52c8c0d485cd8653215b0415be9b1 | |
parent | 46662a289b53f79b9e6fa9c0ed07db8368982b12 (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.c | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.c | 25 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_common.h | 1 | ||||
-rw-r--r-- | source/blender/draw/modes/shaders/armature_envelope_vert.glsl | 6 |
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)); |