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-04-22 23:49:36 +0300
committerClément Foucault <foucault.clem@gmail.com>2018-05-02 21:49:38 +0300
commite493a1a1aedcd6bc00f0f016aa6ef707742e3825 (patch)
treee479cb1f54c0029e92446dc6b0cfc263fe1bfb56 /source/blender/draw/intern/draw_common.c
parent77b481fd5ae2e8b503aed714ae3335ba637c84b6 (diff)
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.
Diffstat (limited to 'source/blender/draw/intern/draw_common.c')
-rw-r--r--source/blender/draw/intern/draw_common.c39
1 files changed, 39 insertions, 0 deletions
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 *********************************************** */