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:
-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));