From 7cd45e17138ef10eaf1d5e038b3c7ff42ae9f9c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Fri, 29 Jun 2018 15:11:27 +0100 Subject: Rename "guide" curves to "fiber" curves. Guide curves should be a higher-level concept. All fibers should have their own curve control points, with subdivision on the GPU. --- source/blender/draw/engines/workbench/workbench_deferred.c | 4 ++-- source/blender/draw/engines/workbench/workbench_forward.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'source/blender/draw/engines/workbench') diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index d35cd3b8ba6..929c8a13ed3 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -85,7 +85,7 @@ static struct { /* Shaders */ extern char datatoc_common_hair_lib_glsl[]; -extern char datatoc_common_hair_guides_lib_glsl[]; +extern char datatoc_common_hair_fibers_lib_glsl[]; extern char datatoc_workbench_prepass_vert_glsl[]; extern char datatoc_workbench_prepass_frag_glsl[]; @@ -150,7 +150,7 @@ static char *workbench_build_prepass_vert(void) DynStr *ds = BLI_dynstr_new(); BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl); - BLI_dynstr_append(ds, datatoc_common_hair_guides_lib_glsl); + BLI_dynstr_append(ds, datatoc_common_hair_fibers_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index daeb2cb1ffa..4fdb0f4ecce 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -67,7 +67,7 @@ static struct { /* Shaders */ extern char datatoc_common_hair_lib_glsl[]; -extern char datatoc_common_hair_guides_lib_glsl[]; +extern char datatoc_common_hair_fibers_lib_glsl[]; extern char datatoc_workbench_forward_composite_frag_glsl[]; extern char datatoc_workbench_forward_depth_frag_glsl[]; @@ -102,7 +102,7 @@ static char *workbench_build_forward_vert(void) DynStr *ds = BLI_dynstr_new(); BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl); - BLI_dynstr_append(ds, datatoc_common_hair_guides_lib_glsl); + BLI_dynstr_append(ds, datatoc_common_hair_fibers_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); -- cgit v1.2.3 From 7ad71174fe9a55227cbcdfdbd793248a416d59c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Sat, 30 Jun 2018 15:07:03 +0100 Subject: Remove the parent interpolation hair shader and use the transform-feedback shader instead. --- .../workbench/shaders/workbench_prepass_vert.glsl | 46 ++++++--------------- .../draw/engines/workbench/workbench_deferred.c | 34 ++++++--------- .../draw/engines/workbench/workbench_forward.c | 48 ++++++++-------------- .../draw/engines/workbench/workbench_materials.c | 20 +++------ .../draw/engines/workbench/workbench_private.h | 17 ++------ 5 files changed, 52 insertions(+), 113 deletions(-) (limited to 'source/blender/draw/engines/workbench') diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl index 03d9b02a654..66b529fcf5e 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl @@ -2,7 +2,6 @@ uniform mat4 ModelViewProjectionMatrix; uniform mat4 ProjectionMatrix; uniform mat4 ViewProjectionMatrix; uniform mat4 ViewMatrixInverse; -uniform mat4 ModelViewMatrixInverse; uniform mat3 NormalMatrix; #ifndef HAIR_SHADER @@ -14,10 +13,6 @@ in vec2 uv; uniform samplerBuffer u; /* active texture layer */ # endif flat out float hair_rand; -# ifdef HAIR_SHADER_FIBERS -in int fiber_index; -in float curve_param; -# endif #endif /* HAIR_SHADER */ #ifdef NORMAL_VIEWPORT_PASS_ENABLED @@ -39,42 +34,27 @@ float integer_noise(int n) void main() { #ifdef HAIR_SHADER - bool is_persp = (ProjectionMatrix[3][3] == 0.0); - -# ifdef HAIR_SHADER_FIBERS - vec2 uv = vec2(0.0); /* TODO */ - float time, thick_time, thickness; - vec3 pos, tang, binor; - hair_fiber_get_vertex( - fiber_index, curve_param, - is_persp, ModelViewMatrixInverse[3].xyz, ModelViewMatrixInverse[2].xyz, - pos, tang, binor, - time, thickness, thick_time); - gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); - hair_rand = integer_noise(fiber_index); -# else -# ifdef V3D_SHADING_TEXTURE_COLOR +# ifdef V3D_SHADING_TEXTURE_COLOR vec2 uv = hair_get_customdata_vec2(u); -# endif +# endif float time, thick_time, thickness; - vec3 pos, tang, binor; + vec3 pos, tan, binor; hair_get_pos_tan_binor_time( - is_persp, ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz, - pos, tang, binor, time, thickness, thick_time); - gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); - hair_rand = integer_noise(hair_get_strand_id()); -# endif + (ProjectionMatrix[3][3] == 0.0), + ViewMatrixInverse[3].xyz, ViewMatrixInverse[2].xyz, + pos, tan, binor, time, thickness, thick_time); /* To "simulate" anisotropic shading, randomize hair normal per strand. */ - tang = normalize(tang); - vec3 nor = normalize(cross(binor, tang)); - nor = normalize(mix(nor, -tang, hair_rand * 0.10)); + hair_rand = integer_noise(hair_get_strand_id()); + tan = normalize(tan); + vec3 nor = normalize(cross(binor, tan)); + nor = normalize(mix(nor, -tan, hair_rand * 0.10)); float cos_theta = (hair_rand*2.0 - 1.0) * 0.20; float sin_theta = sqrt(max(0.0, 1.0f - cos_theta*cos_theta)); nor = nor * sin_theta + binor * cos_theta; -#else /* HAIR_SHADER */ + gl_Position = ViewProjectionMatrix * vec4(pos, 1.0); +#else gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0); -#endif /* HAIR_SHADER */ - +#endif #ifdef V3D_SHADING_TEXTURE_COLOR uv_interp = uv; #endif diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 929c8a13ed3..c9bb0dd9947 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -85,7 +85,6 @@ static struct { /* Shaders */ extern char datatoc_common_hair_lib_glsl[]; -extern char datatoc_common_hair_fibers_lib_glsl[]; extern char datatoc_workbench_prepass_vert_glsl[]; extern char datatoc_workbench_prepass_frag_glsl[]; @@ -150,7 +149,6 @@ static char *workbench_build_prepass_vert(void) DynStr *ds = BLI_dynstr_new(); BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl); - BLI_dynstr_append(ds, datatoc_common_hair_fibers_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); @@ -173,17 +171,17 @@ static char *workbench_build_cavity_frag(void) return str; } -static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, DRWShaderHairType hair_type) +static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair) { if (e_data.prepass_sh_cache[index] == NULL) { - char *defines = workbench_material_build_defines(wpd, use_textures, hair_type); + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *composite_frag = workbench_build_composite_frag(wpd); char *prepass_vert = workbench_build_prepass_vert(); char *prepass_frag = workbench_build_prepass_frag(); e_data.prepass_sh_cache[index] = DRW_shader_create( prepass_vert, NULL, prepass_frag, defines); - if (!use_textures && hair_type == DRW_SHADER_HAIR_NONE) { + if (!use_textures && !is_hair) { e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); } MEM_freeN(prepass_vert); @@ -195,26 +193,20 @@ static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool static void select_deferred_shaders(WORKBENCH_PrivateData *wpd) { - int index_solid = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_NONE); - int index_solid_hair = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_PARTICLES); - int index_solid_hair_fibers = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_FIBERS); - int index_texture = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_NONE); - int index_texture_hair = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_PARTICLES); - int index_texture_hair_fibers = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_FIBERS); - - ensure_deferred_shaders(wpd, index_solid, false, DRW_SHADER_HAIR_NONE); - ensure_deferred_shaders(wpd, index_solid_hair, false, DRW_SHADER_HAIR_PARTICLES); - ensure_deferred_shaders(wpd, index_solid_hair_fibers, false, DRW_SHADER_HAIR_FIBERS); - ensure_deferred_shaders(wpd, index_texture, true, DRW_SHADER_HAIR_NONE); - ensure_deferred_shaders(wpd, index_texture_hair, true, DRW_SHADER_HAIR_PARTICLES); - ensure_deferred_shaders(wpd, index_texture_hair_fibers, true, DRW_SHADER_HAIR_FIBERS); + int index_solid = workbench_material_get_shader_index(wpd, false, false); + int index_solid_hair = workbench_material_get_shader_index(wpd, false, true); + int index_texture = workbench_material_get_shader_index(wpd, true, false); + int index_texture_hair = workbench_material_get_shader_index(wpd, true, true); + + ensure_deferred_shaders(wpd, index_solid, false, false); + ensure_deferred_shaders(wpd, index_solid_hair, false, true); + ensure_deferred_shaders(wpd, index_texture, true, false); + ensure_deferred_shaders(wpd, index_texture_hair, true, true); wpd->prepass_solid_sh = e_data.prepass_sh_cache[index_solid]; wpd->prepass_solid_hair_sh = e_data.prepass_sh_cache[index_solid_hair]; - wpd->prepass_solid_hair_fibers_sh = e_data.prepass_sh_cache[index_solid_hair_fibers]; wpd->prepass_texture_sh = e_data.prepass_sh_cache[index_texture]; wpd->prepass_texture_hair_sh = e_data.prepass_sh_cache[index_texture_hair]; - wpd->prepass_texture_hair_fibers_sh = e_data.prepass_sh_cache[index_texture_hair_fibers]; wpd->composite_sh = e_data.composite_sh_cache[index_solid]; } @@ -643,7 +635,7 @@ static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *o struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR) ? wpd->prepass_solid_hair_sh : wpd->prepass_texture_hair_sh; - DRWShadingGroup *shgrp = DRW_shgroup_hair_create( + DRWShadingGroup *shgrp = DRW_shgroup_particle_hair_create( ob, psys, md, psl->prepass_hair_pass, shader); diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 4fdb0f4ecce..ee579dd6d44 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -52,7 +52,6 @@ static struct { struct GPUShader *transparent_accum_sh_cache[MAX_SHADERS]; struct GPUShader *object_outline_sh; struct GPUShader *object_outline_hair_sh; - struct GPUShader *object_outline_hair_fibers_sh; struct GPUShader *checker_depth_sh; struct GPUTexture *object_id_tx; /* ref only, not alloced */ @@ -67,7 +66,6 @@ static struct { /* Shaders */ extern char datatoc_common_hair_lib_glsl[]; -extern char datatoc_common_hair_fibers_lib_glsl[]; extern char datatoc_workbench_forward_composite_frag_glsl[]; extern char datatoc_workbench_forward_depth_frag_glsl[]; @@ -102,7 +100,6 @@ static char *workbench_build_forward_vert(void) DynStr *ds = BLI_dynstr_new(); BLI_dynstr_append(ds, datatoc_common_hair_lib_glsl); - BLI_dynstr_append(ds, datatoc_common_hair_fibers_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); @@ -210,10 +207,10 @@ static WORKBENCH_MaterialData *get_or_create_material_data( return material; } -static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, DRWShaderHairType hair_type) +static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair) { - if (e_data.composite_sh_cache[index] == NULL && !use_textures && hair_type == DRW_SHADER_HAIR_NONE) { - char *defines = workbench_material_build_defines(wpd, use_textures, hair_type); + if (e_data.composite_sh_cache[index] == NULL && !use_textures && !is_hair) { + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *composite_frag = workbench_build_forward_composite_frag(); e_data.composite_sh_cache[index] = DRW_shader_create_fullscreen(composite_frag, defines); MEM_freeN(composite_frag); @@ -221,7 +218,7 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool u } if (e_data.transparent_accum_sh_cache[index] == NULL) { - char *defines = workbench_material_build_defines(wpd, use_textures, hair_type); + char *defines = workbench_material_build_defines(wpd, use_textures, is_hair); char *transparent_accum_vert = workbench_build_forward_vert(); char *transparent_accum_frag = workbench_build_forward_transparent_accum_frag(); e_data.transparent_accum_sh_cache[index] = DRW_shader_create( @@ -235,27 +232,21 @@ static void ensure_forward_shaders(WORKBENCH_PrivateData *wpd, int index, bool u static void select_forward_shaders(WORKBENCH_PrivateData *wpd) { - int index_solid = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_NONE); - int index_solid_hair = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_PARTICLES); - int index_solid_hair_fibers = workbench_material_get_shader_index(wpd, false, DRW_SHADER_HAIR_FIBERS); - int index_texture = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_NONE); - int index_texture_hair = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_PARTICLES); - int index_texture_hair_fibers = workbench_material_get_shader_index(wpd, true, DRW_SHADER_HAIR_FIBERS); - - ensure_forward_shaders(wpd, index_solid, false, DRW_SHADER_HAIR_NONE); - ensure_forward_shaders(wpd, index_solid_hair, false, DRW_SHADER_HAIR_PARTICLES); - ensure_forward_shaders(wpd, index_solid_hair_fibers, false, DRW_SHADER_HAIR_FIBERS); - ensure_forward_shaders(wpd, index_texture, true, DRW_SHADER_HAIR_NONE); - ensure_forward_shaders(wpd, index_texture_hair, true, DRW_SHADER_HAIR_PARTICLES); - ensure_forward_shaders(wpd, index_texture_hair_fibers, true, DRW_SHADER_HAIR_FIBERS); + int index_solid = workbench_material_get_shader_index(wpd, false, false); + int index_solid_hair = workbench_material_get_shader_index(wpd, false, true); + int index_texture = workbench_material_get_shader_index(wpd, true, false); + int index_texture_hair = workbench_material_get_shader_index(wpd, true, true); + + ensure_forward_shaders(wpd, index_solid, false, false); + ensure_forward_shaders(wpd, index_solid_hair, false, true); + ensure_forward_shaders(wpd, index_texture, true, false); + ensure_forward_shaders(wpd, index_texture_hair, true, true); wpd->composite_sh = e_data.composite_sh_cache[index_solid]; wpd->transparent_accum_sh = e_data.transparent_accum_sh_cache[index_solid]; wpd->transparent_accum_hair_sh = e_data.transparent_accum_sh_cache[index_solid_hair]; - wpd->transparent_accum_hair_fibers_sh = e_data.transparent_accum_sh_cache[index_solid_hair_fibers]; wpd->transparent_accum_texture_sh = e_data.transparent_accum_sh_cache[index_texture]; wpd->transparent_accum_texture_hair_sh = e_data.transparent_accum_sh_cache[index_texture_hair]; - wpd->transparent_accum_texture_hair_fibers_sh = e_data.transparent_accum_sh_cache[index_texture_hair_fibers]; } /* public functions */ @@ -285,9 +276,8 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) memset(e_data.composite_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS); memset(e_data.transparent_accum_sh_cache, 0x00, sizeof(struct GPUShader *) * MAX_SHADERS); - char *defines = workbench_material_build_defines(wpd, OB_SOLID, DRW_SHADER_HAIR_NONE); - char *defines_hair = workbench_material_build_defines(wpd, OB_SOLID, DRW_SHADER_HAIR_PARTICLES); - char *defines_hair_fibers = workbench_material_build_defines(wpd, OB_SOLID, DRW_SHADER_HAIR_FIBERS); + char *defines = workbench_material_build_defines(wpd, OB_SOLID, false); + char *defines_hair = workbench_material_build_defines(wpd, OB_SOLID, true); char *forward_vert = workbench_build_forward_vert(); char *forward_depth_frag = workbench_build_forward_depth_frag(); e_data.object_outline_sh = DRW_shader_create( @@ -296,9 +286,6 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) e_data.object_outline_hair_sh = DRW_shader_create( forward_vert, NULL, forward_depth_frag, defines_hair); - e_data.object_outline_hair_fibers_sh = DRW_shader_create( - forward_vert, NULL, - forward_depth_frag, defines_hair_fibers); workbench_fxaa_engine_init(); @@ -393,7 +380,6 @@ void workbench_forward_engine_free() } DRW_SHADER_FREE_SAFE(e_data.object_outline_sh); DRW_SHADER_FREE_SAFE(e_data.object_outline_hair_sh); - DRW_SHADER_FREE_SAFE(e_data.object_outline_hair_fibers_sh); DRW_SHADER_FREE_SAFE(e_data.checker_depth_sh); workbench_fxaa_engine_free(); @@ -437,7 +423,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O struct GPUShader *shader = (color_type != V3D_SHADING_TEXTURE_COLOR) ? wpd->transparent_accum_hair_sh : wpd->transparent_accum_texture_hair_sh; - DRWShadingGroup *shgrp = DRW_shgroup_hair_create( + DRWShadingGroup *shgrp = DRW_shgroup_particle_hair_create( ob, psys, md, psl->transparent_accum_pass, shader); @@ -460,7 +446,7 @@ static void workbench_forward_cache_populate_particles(WORKBENCH_Data *vedata, O if (SPECULAR_HIGHLIGHT_ENABLED(wpd) || MATCAP_ENABLED(wpd)) { DRW_shgroup_uniform_vec2(shgrp, "invertedViewportSize", DRW_viewport_invert_size_get(), 1); } - shgrp = DRW_shgroup_hair_create(ob, psys, md, + shgrp = DRW_shgroup_particle_hair_create(ob, psys, md, vedata->psl->object_outline_pass, e_data.object_outline_hair_sh); DRW_shgroup_uniform_int(shgrp, "object_id", &material->object_id, 1); diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index 17f402ff4f3..76599fdce99 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -40,7 +40,7 @@ void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Mate } } -char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, DRWShaderHairType hair_type) +char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair) { char *str = NULL; @@ -85,16 +85,8 @@ char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_text if (NORMAL_ENCODING_ENABLED()) { BLI_dynstr_appendf(ds, "#define WORKBENCH_ENCODE_NORMALS\n"); } - - switch (hair_type) { - case DRW_SHADER_HAIR_NONE: - break; - case DRW_SHADER_HAIR_PARTICLES: - BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n"); - break; - case DRW_SHADER_HAIR_FIBERS: - BLI_dynstr_append(ds, DRW_hair_shader_defines()); - break; + if (is_hair) { + BLI_dynstr_appendf(ds, "#define HAIR_SHADER\n"); } #if STUDIOLIGHT_SPHERICAL_HARMONICS_LEVEL == 0 @@ -138,7 +130,7 @@ uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template) return result; } -int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, DRWShaderHairType hair_type) +int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair) { /* NOTE: change MAX_SHADERS accordingly when modifying this function. */ int index = 0; @@ -154,8 +146,8 @@ int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_tex /* 2 bits STUDIOLIGHT_ORIENTATION */ SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_WORLD, 1 << 7); SET_FLAG_FROM_TEST(index, wpd->studio_light->flag & STUDIOLIGHT_ORIENTATION_VIEWNORMAL, 1 << 8); - /* 2 bits for hair */ - SET_FLAG_FROM_TEST(index, hair_type, hair_type << 9); + /* 1 bit for hair */ + SET_FLAG_FROM_TEST(index, is_hair, 1 << 9); return index; } diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index f832657cc5c..404ec50fd97 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -39,7 +39,7 @@ #define WORKBENCH_ENGINE "BLENDER_WORKBENCH" #define M_GOLDEN_RATION_CONJUGATE 0.618033988749895 -#define MAX_SHADERS (1 << 11) +#define MAX_SHADERS (1 << 10) #define TEXTURE_DRAWING_ENABLED(wpd) (wpd->color_type & V3D_SHADING_TEXTURE_COLOR) #define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT) @@ -154,17 +154,13 @@ typedef struct WORKBENCH_PrivateData { struct GHash *material_hash; struct GPUShader *prepass_solid_sh; struct GPUShader *prepass_solid_hair_sh; - struct GPUShader *prepass_solid_hair_fibers_sh; struct GPUShader *prepass_texture_sh; struct GPUShader *prepass_texture_hair_sh; - struct GPUShader *prepass_texture_hair_fibers_sh; struct GPUShader *composite_sh; struct GPUShader *transparent_accum_sh; struct GPUShader *transparent_accum_hair_sh; - struct GPUShader *transparent_accum_hair_fibers_sh; struct GPUShader *transparent_accum_texture_sh; struct GPUShader *transparent_accum_texture_hair_sh; - struct GPUShader *transparent_accum_texture_hair_fibers_sh; View3DShading shading; StudioLight *studio_light; UserDef *user_preferences; @@ -280,18 +276,11 @@ void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata); void workbench_taa_view_updated(WORKBENCH_Data *vedata); /* workbench_materials.c */ -typedef enum DRWShaderHairType -{ - DRW_SHADER_HAIR_NONE = 0, - DRW_SHADER_HAIR_PARTICLES = 1, - DRW_SHADER_HAIR_FIBERS = 2, -} DRWShaderHairType; - int workbench_material_determine_color_type(WORKBENCH_PrivateData *wpd, Image *ima); -char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, DRWShaderHairType hair_type); +char *workbench_material_build_defines(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair); void workbench_material_update_data(WORKBENCH_PrivateData *wpd, Object *ob, Material *mat, WORKBENCH_MaterialData *data); uint workbench_material_get_hash(WORKBENCH_MaterialData *material_template); -int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, DRWShaderHairType hair_type); +int workbench_material_get_shader_index(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair); void workbench_material_set_normal_world_matrix( DRWShadingGroup *grp, WORKBENCH_PrivateData *wpd, float persistent_matrix[3][3]); -- cgit v1.2.3 From f854fefa1796429907c2574ba414335eb5519714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Sun, 12 Aug 2018 10:33:21 +0100 Subject: Separate buffer texture for hair index for each vertex. This is needed for allowing variable length hair strands, where the hair index can not simply be calculated from the vertex index based on a fixed-length strand. --- .../blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source/blender/draw/engines/workbench') diff --git a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl index 66b529fcf5e..dfc45c8d04c 100644 --- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl +++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl @@ -23,6 +23,8 @@ out vec3 normal_viewport; out vec2 uv_interp; #endif +out int DEBUG; + /* From http://libnoise.sourceforge.net/noisegen/index.html */ float integer_noise(int n) { @@ -34,6 +36,7 @@ float integer_noise(int n) void main() { #ifdef HAIR_SHADER + DEBUG = hair_get_strand_id(); # ifdef V3D_SHADING_TEXTURE_COLOR vec2 uv = hair_get_customdata_vec2(u); # endif -- cgit v1.2.3