summaryrefslogtreecommitdiff
path: root/intermediate
diff options
context:
space:
mode:
Diffstat (limited to 'intermediate')
-rw-r--r--intermediate/forward.h13
-rw-r--r--intermediate/surface.glsl21
2 files changed, 30 insertions, 4 deletions
diff --git a/intermediate/forward.h b/intermediate/forward.h
index 7c4c9d3..377a3cb 100644
--- a/intermediate/forward.h
+++ b/intermediate/forward.h
@@ -5,7 +5,7 @@
[struct]
name: Light
[variable]
-name: dir
+name: pos
type: vec3
[variable]
name: brightness
@@ -16,6 +16,12 @@ type: vec3
[variable]
name: caster_id
type: int
+[variable]
+name: type
+type: int
+[variable]
+name: range
+type: float
[struct]
name: Caster
@@ -41,4 +47,9 @@ type: Globals
stage: fragment
#endif
+
+/* match Light::Type in lighting.hpp */
+#define LT_SUN 0
+#define LT_POINT 1
+
#endif
diff --git a/intermediate/surface.glsl b/intermediate/surface.glsl
index 71a4307..79f5f65 100644
--- a/intermediate/surface.glsl
+++ b/intermediate/surface.glsl
@@ -244,8 +244,23 @@ void main() {
vec3 light = 0.0.xxx;
for (i = 0; i < globals.light_count; i++) {
Light l = lights[i];
- vec3 light_dir = l.dir;
- float cos_theta_i = max(dot(nrm, light_dir), 0.0);
+ vec3 light_dir;
+ float cos_theta_i, atten;
+ switch (l.type) {
+ case LT_SUN:
+ light_dir = l.pos;
+ cos_theta_i = max(dot(nrm, light_dir), 0.0);
+ atten = 1.0;
+ break;
+ case LT_POINT: {
+ float d;
+ light_dir = p - l.pos;
+ d = length(light_dir);
+ atten = max(d, 0.01);
+ atten = 1.0 / (atten * atten);
+ light_dir /= d;
+ } break;
+ }
vec3 diffuse = base_diffuse * cos_theta_i;
vec3 spec =
spec_col *
@@ -254,7 +269,7 @@ void main() {
float shadow = 1.0f;
if (l.caster_id >= 0)
shadow = get_shadow(l, p);
- light += (diffuse + spec) * l.brightness * l.colour * shadow;
+ light += (diffuse + spec) * atten * l.brightness * l.colour * shadow;
}
colour = vec4(ambient + light, 1.0);