diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_material.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index a2fc1eb05ec..9731d7a6b3a 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -1506,6 +1506,52 @@ static GPUNodeLink *gpu_material_diffuse_bsdf(GPUMaterial *mat, Material *ma) return outlink; } +static GPUNodeLink *gpu_material_preview_matcap(GPUMaterial *mat, Material *ma) +{ + GPUNodeLink *outlink; + + GPU_link(mat, "material_preview_matcap", GPU_uniform(&ma->r), GPU_image_preview(ma->preview), GPU_builtin(GPU_VIEW_NORMAL), &outlink); + + return outlink; +} + +/* new solid draw mode with glsl matcaps */ +GPUMaterial *GPU_material_matcap(Scene *scene, Material *ma) +{ + GPUMaterial *mat; + GPUNodeLink *outlink; + LinkData *link; + + for (link=ma->gpumaterial.first; link; link=link->next) + if (((GPUMaterial*)link->data)->scene == scene) + return link->data; + + /* allocate material */ + mat = GPU_material_construct_begin(ma); + mat->scene = scene; + + if (ma->preview && ma->preview->rect[0]) { + outlink = gpu_material_preview_matcap(mat, ma); + } + else { + outlink = gpu_material_diffuse_bsdf(mat, ma); + } + + GPU_material_output_link(mat, outlink); + + GPU_material_construct_end(mat); + + /* note that even if building the shader fails in some way, we still keep + * it to avoid trying to compile again and again, and simple do not use + * the actual shader on drawing */ + + link = MEM_callocN(sizeof(LinkData), "GPUMaterialLink"); + link->data = mat; + BLI_addtail(&ma->gpumaterial, link); + + return mat; +} + GPUMaterial *GPU_material_from_blender(Scene *scene, Material *ma) { GPUMaterial *mat; @@ -1882,6 +1928,11 @@ void GPU_lamp_shadow_buffer_unbind(GPULamp *lamp) glEnable(GL_SCISSOR_TEST); } +int GPU_lamp_shadow_buffer_type(GPULamp *lamp) +{ + return lamp->la->shadowmap_type; +} + int GPU_lamp_shadow_layer(GPULamp *lamp) { if (lamp->fb && lamp->tex && (lamp->mode & (LA_LAYER|LA_LAYER_SHADOW))) |