ソースを参照

ability to change shadow color in light2d

Juan Linietsky 10 年 前
コミット
52308aba68

+ 1 - 0
drivers/gles2/rasterizer_gles2.cpp

@@ -9536,6 +9536,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list,int p_z,const
 						canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_TEXTURE,max_texture_units-3);
 						canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_MATRIX,light->shadow_matrix_cache);
 						canvas_shader.set_uniform(CanvasShaderGLES2::SHADOW_ESM_MULTIPLIER,light->shadow_esm_mult);
+						canvas_shader.set_uniform(CanvasShaderGLES2::LIGHT_SHADOW_COLOR,light->shadow_color);
 
 					}
 

+ 3 - 1
drivers/gles2/shaders/canvas.glsl

@@ -152,6 +152,7 @@ uniform vec4 modulate;
 
 uniform sampler2D light_texture;
 uniform vec4 light_color;
+uniform vec4 light_shadow_color;
 uniform float light_height;
 varying vec4 light_uv_interp;
 
@@ -379,7 +380,8 @@ LIGHT_SHADER_CODE
 #if defined(USE_LIGHT_SHADOW_COLOR)
 	color=mix(shadow_color,color,shadow_attenuation);
 #else
-	color*=shadow_attenuation;
+	//color*=shadow_attenuation;
+	color=mix(light_shadow_color,color,shadow_attenuation);
 #endif
 //use shadows
 #endif

+ 16 - 0
scene/2d/light_2d.cpp

@@ -237,6 +237,16 @@ float Light2D::get_shadow_esm_multiplier() const{
 	return shadow_esm_multiplier;
 }
 
+void Light2D::set_shadow_color( const Color& p_shadow_color) {
+	shadow_color=p_shadow_color;
+	VS::get_singleton()->canvas_light_set_shadow_color(canvas_light,shadow_color);
+}
+
+Color Light2D::get_shadow_color() const {
+	return shadow_color;
+}
+
+
 
 void Light2D::_notification(int p_what) {
 
@@ -313,6 +323,10 @@ void Light2D::_bind_methods() {
 	ObjectTypeDB::bind_method(_MD("set_shadow_esm_multiplier","multiplier"),&Light2D::set_shadow_esm_multiplier);
 	ObjectTypeDB::bind_method(_MD("get_shadow_esm_multiplier"),&Light2D::get_shadow_esm_multiplier);
 
+	ObjectTypeDB::bind_method(_MD("set_shadow_color","shadow_color"),&Light2D::set_shadow_color);
+	ObjectTypeDB::bind_method(_MD("get_shadow_color"),&Light2D::get_shadow_color);
+
+
 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"enabled"),_SCS("set_enabled"),_SCS("is_enabled"));
 	ADD_PROPERTY( PropertyInfo(Variant::OBJECT,"texture",PROPERTY_HINT_RESOURCE_TYPE,"Texture"),_SCS("set_texture"),_SCS("get_texture"));
 	ADD_PROPERTY( PropertyInfo(Variant::VECTOR2,"offset"),_SCS("set_texture_offset"),_SCS("get_texture_offset"));
@@ -327,6 +341,7 @@ void Light2D::_bind_methods() {
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"range/layer_max",PROPERTY_HINT_RANGE,"-512,512,1"),_SCS("set_layer_range_max"),_SCS("get_layer_range_max"));
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"range/item_mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_item_mask"),_SCS("get_item_mask"));
 	ADD_PROPERTY( PropertyInfo(Variant::BOOL,"shadow/enabled"),_SCS("set_shadow_enabled"),_SCS("is_shadow_enabled"));
+	ADD_PROPERTY( PropertyInfo(Variant::COLOR,"shadow/color"),_SCS("set_shadow_color"),_SCS("get_shadow_color"));
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow/buffer_size",PROPERTY_HINT_RANGE,"32,16384,1"),_SCS("set_shadow_buffer_size"),_SCS("get_shadow_buffer_size"));
 	ADD_PROPERTY( PropertyInfo(Variant::REAL,"shadow/esm_multiplier",PROPERTY_HINT_RANGE,"1,4096,0.1"),_SCS("set_shadow_esm_multiplier"),_SCS("get_shadow_esm_multiplier"));
 	ADD_PROPERTY( PropertyInfo(Variant::INT,"shadow/item_mask",PROPERTY_HINT_ALL_FLAGS),_SCS("set_item_shadow_mask"),_SCS("get_item_shadow_mask"));
@@ -356,6 +371,7 @@ Light2D::Light2D() {
 	shadow_buffer_size=2048;
 	shadow_esm_multiplier=80;
 	energy=1.0;
+	shadow_color=Color(0,0,0,0);
 
 }
 

+ 5 - 0
scene/2d/light_2d.h

@@ -18,6 +18,7 @@ private:
 	bool enabled;
 	bool shadow;
 	Color color;
+	Color shadow_color;
 	float height;
 	float _scale;
 	float energy;
@@ -95,6 +96,10 @@ public:
 	void set_shadow_esm_multiplier( float p_multiplier);
 	float get_shadow_esm_multiplier() const;
 
+	void set_shadow_color( const Color& p_shadow_color);
+	Color get_shadow_color() const;
+
+
 	virtual Rect2 get_item_rect() const;
 
 	Light2D();

+ 2 - 0
servers/visual/rasterizer.h

@@ -592,6 +592,7 @@ public:
 		RID shadow_buffer;
 		int shadow_buffer_size;
 		float shadow_esm_mult;
+		Color shadow_color;
 
 
 		void *texture_cache; // implementation dependent
@@ -610,6 +611,7 @@ public:
 		CanvasLight() {
 			enabled=true;			
 			color=Color(1,1,1);
+			shadow_color=Color(0,0,0,0);
 			height=0;
 			z_min=-1024;
 			z_max=1024;

+ 9 - 0
servers/visual/visual_server_raster.cpp

@@ -4071,6 +4071,15 @@ void VisualServerRaster::canvas_light_set_shadow_esm_multiplier(RID p_light, flo
 
 }
 
+void VisualServerRaster::canvas_light_set_shadow_color(RID p_light, const Color& p_color) {
+
+	Rasterizer::CanvasLight *clight = canvas_light_owner.get(p_light);
+	ERR_FAIL_COND(!clight);
+	clight->shadow_color=p_color;
+
+}
+
+
 /****** CANVAS LIGHT OCCLUDER ******/
 
 RID VisualServerRaster::canvas_light_occluder_create() {

+ 2 - 0
servers/visual/visual_server_raster.h

@@ -1180,6 +1180,8 @@ public:
 	virtual void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled);
 	virtual void canvas_light_set_shadow_buffer_size(RID p_light, int p_size);
 	virtual void canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier);
+	virtual void canvas_light_set_shadow_color(RID p_light, const Color& p_color);
+
 
 
 	virtual RID canvas_light_occluder_create();

+ 2 - 0
servers/visual/visual_server_wrap_mt.h

@@ -626,6 +626,8 @@ public:
 	FUNC2(canvas_light_set_shadow_enabled,RID,bool);
 	FUNC2(canvas_light_set_shadow_buffer_size,RID,int);
 	FUNC2(canvas_light_set_shadow_esm_multiplier,RID,float);
+	FUNC2(canvas_light_set_shadow_color,RID,const Color&);
+
 
 
 	/* CANVAS OCCLUDER */

+ 1 - 0
servers/visual_server.h

@@ -1032,6 +1032,7 @@ public:
 	virtual void canvas_light_set_shadow_enabled(RID p_light, bool p_enabled)=0;
 	virtual void canvas_light_set_shadow_buffer_size(RID p_light, int p_size)=0;
 	virtual void canvas_light_set_shadow_esm_multiplier(RID p_light, float p_multiplier)=0;
+	virtual void canvas_light_set_shadow_color(RID p_light, const Color& p_color)=0;