[Bf-blender-cvs] [e493a1a1aed] blender2.8: DRW: Armature: New bone outline shader.
Clément Foucault
noreply at git.blender.org
Wed May 2 20:54:19 CEST 2018
Commit: e493a1a1aedcd6bc00f0f016aa6ef707742e3825
Author: Clément Foucault
Date: Sun Apr 22 22:49:36 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBe493a1a1aedcd6bc00f0f016aa6ef707742e3825
DRW: Armature: New bone outline shader.
This fix the issue with the zfighting we were getting at bones edges.
Moreover, this enables us to render arbitrarly large outline with
varying thickness.
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/intern/draw_armature.c
M source/blender/draw/intern/draw_common.c
M source/blender/draw/intern/draw_common.h
M source/blender/draw/modes/edit_armature_mode.c
M source/blender/draw/modes/object_mode.c
M source/blender/draw/modes/pose_mode.c
A source/blender/draw/modes/shaders/armature_shape_outline_geom.glsl
A source/blender/draw/modes/shaders/armature_shape_outline_vert.glsl
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index cffd135369a..27daab90234 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -221,6 +221,8 @@ data_to_c_simple(modes/shaders/common_globals_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_view_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_fxaa_lib.glsl SRC)
data_to_c_simple(modes/shaders/common_fullscreen_vert.glsl SRC)
+data_to_c_simple(modes/shaders/armature_shape_outline_vert.glsl SRC)
+data_to_c_simple(modes/shaders/armature_shape_outline_geom.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_frag.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_mesh_overlay_geom_tri.glsl SRC)
diff --git a/source/blender/draw/intern/draw_armature.c b/source/blender/draw/intern/draw_armature.c
index fe87e7f17fd..195acfb7c1f 100644
--- a/source/blender/draw/intern/draw_armature.c
+++ b/source/blender/draw/intern/draw_armature.c
@@ -75,8 +75,10 @@ static struct {
/* Reset when changing current_armature */
DRWShadingGroup *bone_octahedral_solid;
DRWShadingGroup *bone_octahedral_wire;
+ DRWShadingGroup *bone_octahedral_outline;
DRWShadingGroup *bone_box_solid;
DRWShadingGroup *bone_box_wire;
+ DRWShadingGroup *bone_box_outline;
DRWShadingGroup *bone_wire_wire;
DRWShadingGroup *bone_envelope_solid;
DRWShadingGroup *bone_envelope_distance;
@@ -88,6 +90,7 @@ static struct {
DRWShadingGroup *relationship_lines;
DRWPass *pass_bone_solid;
+ DRWPass *pass_bone_outline;
DRWPass *pass_bone_wire;
DRWPass *pass_bone_envelope;
} g_data = {NULL};
@@ -114,10 +117,13 @@ static void drw_shgroup_bone_octahedral_wire(const float (*bone_mat)[4], const f
if (g_data.bone_octahedral_wire == NULL) {
struct Gwn_Batch *geom = DRW_cache_bone_octahedral_wire_outline_get();
g_data.bone_octahedral_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
+ geom = DRW_cache_bone_octahedral_get();
+ g_data.bone_octahedral_outline = shgroup_instance_armature_shape_outline(g_data.pass_bone_outline, geom);
}
float final_bonemat[4][4];
mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_wire, final_bonemat, color);
+ DRW_shgroup_call_dynamic_add(g_data.bone_octahedral_outline, final_bonemat, color);
}
/* Box / B-Bone */
@@ -137,10 +143,13 @@ static void drw_shgroup_bone_box_wire(const float (*bone_mat)[4], const float co
if (g_data.bone_box_wire == NULL) {
struct Gwn_Batch *geom = DRW_cache_bone_box_wire_outline_get();
g_data.bone_box_wire = shgroup_instance_wire(g_data.pass_bone_wire, geom);
+ geom = DRW_cache_bone_box_get();
+ g_data.bone_box_outline = shgroup_instance_armature_shape_outline(g_data.pass_bone_outline, geom);
}
float final_bonemat[4][4];
mul_m4_m4m4(final_bonemat, g_data.ob->obmat, bone_mat);
DRW_shgroup_call_dynamic_add(g_data.bone_box_wire, final_bonemat, color);
+ DRW_shgroup_call_dynamic_add(g_data.bone_box_outline, final_bonemat, color);
}
/* Wire */
@@ -1416,13 +1425,16 @@ static void draw_armature_pose(Object *ob, const float const_color[4])
* This function set the object space to use for all subsequent `DRW_shgroup_bone_*` calls.
*/
static void drw_shgroup_armature(
- Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+ Object *ob,
+ DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+ DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
DRWShadingGroup *shgrp_relationship_lines)
{
memset(&g_data, 0x0, sizeof(g_data));
g_data.ob = ob;
g_data.pass_bone_solid = pass_bone_solid;
+ g_data.pass_bone_outline = pass_bone_outline;
g_data.pass_bone_wire = pass_bone_wire;
g_data.pass_bone_envelope = pass_bone_envelope;
g_data.relationship_lines = shgrp_relationship_lines;
@@ -1431,29 +1443,35 @@ static void drw_shgroup_armature(
}
void DRW_shgroup_armature_object(
- Object *ob, ViewLayer *view_layer, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *UNUSED(pass_bone_envelope),
+ Object *ob, ViewLayer *view_layer,
+ DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+ DRWPass *pass_bone_wire, DRWPass *UNUSED(pass_bone_envelope),
DRWShadingGroup *shgrp_relationship_lines)
{
float *color;
DRW_object_wire_theme_get(ob, view_layer, &color);
- drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, NULL, shgrp_relationship_lines);
+ drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, NULL, shgrp_relationship_lines);
draw_armature_pose(ob, color);
}
void DRW_shgroup_armature_pose(
- Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+ Object *ob,
+ DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+ DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
DRWShadingGroup *shgrp_relationship_lines)
{
- drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
+ drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
draw_armature_pose(ob, NULL);
}
void DRW_shgroup_armature_edit(
- Object *ob, DRWPass *pass_bone_solid, DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
+ Object *ob,
+ DRWPass *pass_bone_solid, DRWPass *pass_bone_outline,
+ DRWPass *pass_bone_wire, DRWPass *pass_bone_envelope,
DRWShadingGroup *shgrp_relationship_lines)
{
- drw_shgroup_armature(ob, pass_bone_solid, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
+ drw_shgroup_armature(ob, pass_bone_solid, pass_bone_outline, pass_bone_wire, pass_bone_envelope, shgrp_relationship_lines);
draw_armature_edit(ob);
}
diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 6bcf7fd6531..3a2aa970a9b 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -156,6 +156,14 @@ void DRW_globals_update(void)
/* ********************************* SHGROUP ************************************* */
+extern char datatoc_armature_shape_outline_vert_glsl[];
+extern char datatoc_armature_shape_outline_geom_glsl[];
+extern char datatoc_gpu_shader_flat_color_frag_glsl[];
+
+static struct {
+ struct GPUShader *shape_outline;
+} g_armature_shaders = {NULL};
+
static struct {
struct Gwn_VertFormat *instance_screenspace;
struct Gwn_VertFormat *instance_color;
@@ -178,6 +186,11 @@ void DRW_globals_free(void)
for (int i = 0; i < sizeof(g_formats) / sizeof(void *); ++i, ++format) {
MEM_SAFE_FREE(*format);
}
+
+ struct GPUShader **shader = &g_armature_shaders.shape_outline;
+ for (int i = 0; i < sizeof(g_armature_shaders) / sizeof(void *); ++i, ++shader) {
+ DRW_SHADER_FREE_SAFE(*shader);
+ }
}
DRWShadingGroup *shgroup_dynlines_uniform_color(DRWPass *pass, float color[4])
@@ -454,6 +467,32 @@ DRWShadingGroup *shgroup_instance_mball_handles(DRWPass *pass, struct Gwn_Batch
return grp;
}
+/* Only works with batches with adjacency infos. */
+DRWShadingGroup *shgroup_instance_armature_shape_outline(DRWPass *pass, struct Gwn_Batch *geom)
+{
+ if (g_armature_shaders.shape_outline == NULL) {
+ g_armature_shaders.shape_outline = DRW_shader_create(
+ datatoc_armature_shape_outline_vert_glsl,
+ datatoc_armature_shape_outline_geom_glsl,
+ datatoc_gpu_shader_flat_color_frag_glsl,
+ NULL);
+ }
+
+ /* TODO own format? */
+ DRW_shgroup_instance_format(g_formats.instance_color, {
+ {"InstanceModelMatrix", DRW_ATTRIB_FLOAT, 16},
+ {"color" , DRW_ATTRIB_FLOAT, 4}
+ });
+
+ DRWShadingGroup *grp = DRW_shgroup_instance_create(g_armature_shaders.shape_outline,
+ pass, geom, g_formats.instance_color);
+ DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
+
+ return grp;
+}
+
+
+
/* ******************************************** COLOR UTILS *********************************************** */
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index c70a1a38e62..8b418135342 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -121,6 +121,7 @@ struct DRWShadingGroup *shgroup_spot_instance(struct DRWPass *pass, struct Gwn_B
struct DRWShadingGroup *shgroup_instance_bone_envelope_wire(struct DRWPass *pass, struct Gwn_Batch *geom);
struct DRWShadingGroup *shgroup_instance_bone_envelope_solid(struct DRWPass *pass, struct Gwn_Batch *geom);
struct DRWShadingGroup *shgroup_instance_mball_handles(struct DRWPass *pass, struct Gwn_Batch *geom);
+struct DRWShadingGroup *shgroup_instance_armature_shape_outline(struct DRWPass *pass, struct Gwn_Batch *geom);
int DRW_object_wire_theme_get(
struct Object *ob, struct ViewLayer *view_layer, float **r_color);
@@ -129,17 +130,20 @@ float *DRW_color_background_blend_get(int theme_id);
/* draw_armature.c */
void DRW_shgroup_armature_object(
struct Object *ob, struct ViewLayer *view_layer,
- struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+ struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_outline,
+ struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
struct DRWShadingGroup *shgrp_relationship_lines);
void DRW_shgroup_armature_pose(
struct Object *ob,
- struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+ struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_outline,
+ struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
struct DRWShadingGroup *shgrp_relationship_lines);
void DRW_shgroup_armature_edit(
struct Object *ob,
- struct DRWPass *pass_bone_solid, struct DRWPass *pass_bone_wire, struct DRWPass *pass_bone_envelope,
+ struct DRWPass *pass_bone_so
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list