diff options
author | Lukas Tönne <lukas.toenne@gmail.com> | 2018-08-12 13:05:36 +0300 |
---|---|---|
committer | Lukas Tönne <lukas.toenne@gmail.com> | 2018-08-12 13:05:36 +0300 |
commit | 27b28e437d974ebbafa234205941c07aa0ab546c (patch) | |
tree | 9b05345e464e13352def8a25abafe246c451a9e1 /source/blender/draw/engines/workbench | |
parent | 4a920429161083c54805762298786a27a0d99e1c (diff) | |
parent | f854fefa1796429907c2574ba414335eb5519714 (diff) |
Merge branch 'tmp_hair_curves' into hair_guides
Diffstat (limited to 'source/blender/draw/engines/workbench')
5 files changed, 56 insertions, 114 deletions
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..dfc45c8d04c 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 @@ -28,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) { @@ -39,42 +36,28 @@ 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 + DEBUG = hair_get_strand_id(); +# 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 d6ecbd98b94..7625d9d1e48 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -84,7 +84,6 @@ static struct { /* Shaders */ extern char datatoc_common_hair_lib_glsl[]; -extern char datatoc_common_hair_guides_lib_glsl[]; extern char datatoc_workbench_prepass_vert_glsl[]; extern char datatoc_workbench_prepass_frag_glsl[]; @@ -149,7 +148,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_guides_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); @@ -172,17 +170,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); @@ -194,26 +192,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]; } @@ -628,7 +620,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 af5ba3dc357..3cc04d7936a 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -53,7 +53,6 @@ static struct { struct GPUShader *object_outline_sh; struct GPUShader *object_outline_texture_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_guides_lib_glsl[]; extern char datatoc_workbench_forward_composite_frag_glsl[]; extern char datatoc_workbench_forward_depth_frag_glsl[]; @@ -88,7 +86,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_guides_lib_glsl); BLI_dynstr_append(ds, datatoc_workbench_prepass_vert_glsl); str = BLI_dynstr_get_cstring(ds); @@ -196,10 +193,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); @@ -207,7 +204,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( @@ -221,27 +218,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 */ @@ -271,10 +262,9 @@ 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, false, DRW_SHADER_HAIR_NONE); - char *defines_texture = workbench_material_build_defines(wpd, true, DRW_SHADER_HAIR_NONE); - char *defines_hair = workbench_material_build_defines(wpd, false, DRW_SHADER_HAIR_PARTICLES); - char *defines_hair_fibers = workbench_material_build_defines(wpd, false, DRW_SHADER_HAIR_FIBERS); + char *defines = workbench_material_build_defines(wpd, false, false); + char *defines_texture = workbench_material_build_defines(wpd, true, false); + char *defines_hair = workbench_material_build_defines(wpd, false, true); char *forward_vert = workbench_build_forward_vert(); e_data.object_outline_sh = DRW_shader_create( forward_vert, NULL, @@ -285,9 +275,6 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata) e_data.object_outline_hair_sh = DRW_shader_create( forward_vert, NULL, datatoc_workbench_forward_depth_frag_glsl, defines_hair); - e_data.object_outline_hair_fibers_sh = DRW_shader_create( - forward_vert, NULL, - forward_vert, defines_hair_fibers); e_data.checker_depth_sh = DRW_shader_create_fullscreen( @@ -383,7 +370,6 @@ void workbench_forward_engine_free() DRW_SHADER_FREE_SAFE(e_data.object_outline_sh); DRW_SHADER_FREE_SAFE(e_data.object_outline_texture_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(); @@ -427,7 +413,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); @@ -446,7 +432,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 e2131db30c0..54e8aa1c3b3 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -42,7 +42,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; @@ -87,16 +87,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 @@ -144,7 +136,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; @@ -160,8 +152,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 fb5bcfd432f..4210e03f470 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->shading.color_type & V3D_SHADING_TEXTURE_COLOR) #define FLAT_ENABLED(wpd) (wpd->shading.light == V3D_LIGHTING_FLAT) @@ -142,17 +142,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; @@ -261,18 +257,11 @@ void workbench_taa_view_updated(WORKBENCH_Data *vedata); int workbench_taa_calculate_num_iterations(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]); void workbench_material_shgroup_uniform(WORKBENCH_PrivateData *wpd, DRWShadingGroup *grp, WORKBENCH_MaterialData *material); |