diff options
Diffstat (limited to 'lighting.cpp')
| -rw-r--r-- | lighting.cpp | 32 | 
1 files changed, 29 insertions, 3 deletions
diff --git a/lighting.cpp b/lighting.cpp index 0e41ddd..bf01831 100644 --- a/lighting.cpp +++ b/lighting.cpp @@ -1,6 +1,7 @@  #include "lighting.hpp"  #include "model.hpp"  #include "renderer.hpp" +#include "scene.hpp"  #include "world.hpp"  extern "C" { @@ -10,10 +11,13 @@ extern "C" {  /* needs to match surface shader */  struct GPU_Light { -	v3f dir; +	v3f pos;  	float brightness;  	v3f colour;  	int caster_id; +	int type; +	float range; +	int pad[2];  };  struct GPU_Caster { @@ -102,11 +106,12 @@ void Lighting::write_bufs(  		Sun_Light& l = v.get<Sun_Light>();  		if (count >= max_lights) {  			print_war("Over light limit.\n"); -			return; +			goto cancel;  		} +		gl.type = (int)Light::Type::sun;  		gl.brightness = l.brightness;  		gl.colour = l.colour; -		gl.dir = l.dir; +		gl.pos = l.dir;  		if (l.caster && ccount < max_shadows) {  			int cid = ccount++;  			GPU_Caster& c = cdst[cid]; @@ -122,6 +127,27 @@ void Lighting::write_bufs(  			gl.caster_id = -1;  		ldst[count++] = gl;  	} +	for (auto v : w.view<Transform, Point_Light>()) { +		GPU_Light gl; +		Transform& t = v.get<Transform>(); +		Point_Light& l = v.get<Point_Light>(); +		if (count >= max_lights) { +			print_war("Over light limit.\n"); +			goto cancel; +		} +		gl.type = (int)Light::Type::point; +		gl.brightness = l.brightness; +		gl.colour = l.colour; +		gl.pos = v3f( +			t.mat.m[3][0], +			t.mat.m[3][1], +			t.mat.m[3][2] +		); +		gl.caster_id = -1; +		gl.range = l.range; +		ldst[count++] = gl; +	} +cancel:  	light_count = count;  	caster_count = ccount;  }  |