diff options
-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)); |