Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / intern / gpu_material.c
index 79d11ae09722a2961a365a3da6b8eed4d90f62ec..ba78c347e998a721c966ce297eccf63ada3140fe 100644 (file)
@@ -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)