diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_material.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_material.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/source/blender/gpu/intern/gpu_material.c b/source/blender/gpu/intern/gpu_material.c index 79d11ae0972..ba78c347e99 100644 --- a/source/blender/gpu/intern/gpu_material.c +++ b/source/blender/gpu/intern/gpu_material.c @@ -88,6 +88,7 @@ static struct GPUWorld { float mistcol[4]; float horicol[3]; float ambcol[4]; + float zencol[3]; } GPUWorld; struct GPUMaterial { @@ -1648,6 +1649,11 @@ void GPU_ambient_update_color(float color[3]) GPUWorld.ambcol[3] = 1.0f; } +void GPU_zenith_update_color(float color[3]) +{ + copy_v3_v3(GPUWorld.zencol, color); +} + void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) { GPUMaterial *mat = shi->gpumat; @@ -1704,6 +1710,37 @@ void GPU_shaderesult_set(GPUShadeInput *shi, GPUShadeResult *shr) ulinfac, ulogfac, &shr->spec); } + /* environment lighting */ + if (!(mat->scene->gm.flag & GAME_GLSL_NO_ENV_LIGHTING) && + (world->mode & WO_ENV_LIGHT) && + (mat->scene->r.mode & R_SHADOW) && + !BKE_scene_use_new_shading_nodes(mat->scene)) + { + if ((world->ao_env_energy != 0.0f) && (GPU_link_changed(shi->amb) || ma->amb != 0.0f) && + (GPU_link_changed(shi->refl) || ma->ref != 0.0f)) + { + if (world->aocolor != WO_AOPLAIN) { + if (!(is_zero_v3(&world->horr) & is_zero_v3(&world->zenr))) + { + GPUNodeLink *fcol, *f; + GPU_link(mat, "math_multiply", shi->amb, shi->refl, &f); + GPU_link(mat, "math_multiply", f, GPU_uniform(&world->ao_env_energy), &f); + GPU_link(mat, "shade_mul_value", f, shi->rgb, &fcol); + GPU_link(mat, "env_apply", shr->combined, + GPU_dynamic_uniform(GPUWorld.horicol, GPU_DYNAMIC_HORIZON_COLOR, NULL), + GPU_dynamic_uniform(GPUWorld.zencol, GPU_DYNAMIC_ZENITH_COLOR, NULL), fcol, + GPU_builtin(GPU_VIEW_MATRIX), shi->vn, &shr->combined); + } + } + else { + GPUNodeLink *f; + GPU_link(mat, "math_multiply", shi->amb, shi->refl, &f); + GPU_link(mat, "math_multiply", f, GPU_uniform(&world->ao_env_energy), &f); + GPU_link(mat, "shade_maddf", shr->combined, f, shi->rgb, &shr->combined); + } + } + } + /* ambient color */ if (GPU_link_changed(shi->amb) || ma->amb != 0.0f) { GPU_link(mat, "shade_maddf", shr->combined, GPU_uniform(&ma->amb), @@ -2527,7 +2564,7 @@ int GPU_lamp_shadow_bind_code(GPULamp *lamp) float *GPU_lamp_dynpersmat(GPULamp *lamp) { - return lamp->dynpersmat ? (float *)lamp->dynpersmat : NULL; + return &lamp->dynpersmat[0][0]; } int GPU_lamp_shadow_layer(GPULamp *lamp) |