Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_lights.c')
-rw-r--r--source/blender/draw/engines/eevee/eevee_lights.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 3b781db90c2..9d2523ada6b 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -91,7 +91,7 @@ void EEVEE_lights_update(EEVEE_StorageList *stl)
EEVEE_Light *evli = stl->lights_data + i;
Object *ob = stl->lights_ref[i];
Lamp *la = (Lamp *)ob->data;
- float mat[4][4], scale[3];
+ float mat[4][4], scale[3], power;
/* Position */
copy_v3_v3(evli->position, ob->obmat[3]);
@@ -124,13 +124,35 @@ void EEVEE_lights_update(EEVEE_StorageList *stl)
evli->spotblend = (1.0f - evli->spotsize) * la->spotblend;
}
else if (la->type == LA_AREA) {
- evli->sizex = la->area_size * scale[0] * 0.5f;
- evli->sizey = la->area_sizey * scale[1] * 0.5f;
+ evli->sizex = MAX2(0.0001f, la->area_size * scale[0] * 0.5f);
+ if (la->area_shape == LA_AREA_RECT) {
+ evli->sizey = MAX2(0.0001f, la->area_sizey * scale[1] * 0.5f);
+ }
+ else {
+ evli->sizey = evli->sizex;
+ }
}
else {
- evli->sizex = la->area_size * scale[0] * 0.5f;
+ evli->sizex = MAX2(0.0001f, la->area_size);
}
+ /* Make illumination power constant */
+ if (la->type == LA_AREA) {
+ power = 1.0f / (evli->sizex * evli->sizey * 4.0f * M_PI) /* 1/(w*h*Pi) */
+ * M_PI * 10.0f; /* XXX : Empirical, Fit cycles power */
+ }
+ else if (la->type == LA_SPOT || la->type == LA_LOCAL) {
+ power = 1.0f / (4.0f * evli->sizex * evli->sizex * M_PI * M_PI) /* 1/(4*r²*Pi²) */
+ * M_PI * 100.0; /* XXX : Empirical, Fit cycles power */
+
+ /* for point lights (a.k.a radius == 0.0) */
+ // power = M_PI * M_PI * 0.78; /* XXX : Empirical, Fit cycles power */
+ }
+ else {
+ power = 1.0f;
+ }
+ mul_v3_fl(evli->color, power);
+
/* Lamp Type */
evli->lamptype = (float)la->type;
}