From bd58475bf836824c64399522766bc8582f224fff Mon Sep 17 00:00:00 2001 From: Known-NetCode Date: Thu, 17 Jul 2025 23:01:07 -0400 Subject: [PATCH] testing RectLight --- scene/3d/light_3d.cpp | 28 ++++++++++++++++++++++++++++ scene/3d/light_3d.h | 23 +++++++++++++++++++++++ servers/rendering_server.cpp | 1 + servers/rendering_server.h | 4 +++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/scene/3d/light_3d.cpp b/scene/3d/light_3d.cpp index f4e9b11d5024..f04c3e009120 100644 --- a/scene/3d/light_3d.cpp +++ b/scene/3d/light_3d.cpp @@ -459,6 +459,9 @@ Light3D::Light3D(RenderingServer::LightType p_type) { case RS::LIGHT_SPOT: light = RenderingServer::get_singleton()->spot_light_create(); break; + case RS::LIGHT_RECT: + light = RenderingServer::get_singleton()->rect_light_create(); + break; default: { }; } @@ -650,6 +653,31 @@ OmniLight3D::OmniLight3D() : set_shadow_mode(SHADOW_CUBE); } +RectLight3D::RectLight3D() : + Light3D(RenderingServer::LIGHT_RECT) { + set_width(1.0); + set_height(1.0); + } + +void RectLight3D::_bind_methods() { + + ADD_GROUP("Rect", "rect_"); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "rect_width", PROPERTY_HINT_RANGE, "0,4069,0.001,or_grater,exp,suffix:m"), "set_param", "get_param", PARAM_RANGE); + ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "rect_height", PROPERTY_HINT_RANGE, "0,4069,0.001,or_grater,exp,suffix:m"), "set_param", "get_param", PARAM_RANGE); +} + +void RectLight3D::set_width(float p_width) { + width = p_width; +} + +float RectLight3D::get_width() const { + return width; +} + +float RectLight3D::get_height() const { + return height; +} + PackedStringArray SpotLight3D::get_configuration_warnings() const { PackedStringArray warnings = Light3D::get_configuration_warnings(); diff --git a/scene/3d/light_3d.h b/scene/3d/light_3d.h index d412350c47df..6d3c367598bf 100644 --- a/scene/3d/light_3d.h +++ b/scene/3d/light_3d.h @@ -200,6 +200,29 @@ class DirectionalLight3D : public Light3D { VARIANT_ENUM_CAST(DirectionalLight3D::ShadowMode) VARIANT_ENUM_CAST(DirectionalLight3D::SkyMode) +class RectLight3D : public Light3D { + GDCLASS(RectLight3D, Light3D); + +private: + // rect light parameters + float width, height; + +protected: + static void _bind_methods(); + +public: + + void set_width(float p_width); + void set_height(float p_height); + + float get_width() const; + float get_height() const; + + PackedStringArray get_configuration_warnings() const override; + + RectLight3D(); +}; + class OmniLight3D : public Light3D { GDCLASS(OmniLight3D, Light3D); diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 8202dff8cbe2..87a07478b391 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2506,6 +2506,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("directional_light_create"), &RenderingServer::directional_light_create); ClassDB::bind_method(D_METHOD("omni_light_create"), &RenderingServer::omni_light_create); ClassDB::bind_method(D_METHOD("spot_light_create"), &RenderingServer::spot_light_create); + ClassDB::bind_method(D_METHOD("rect_light_create"), &RenderingServer::rect_light_create); ClassDB::bind_method(D_METHOD("light_set_color", "light", "color"), &RenderingServer::light_set_color); ClassDB::bind_method(D_METHOD("light_set_param", "light", "param", "value"), &RenderingServer::light_set_param); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index a5a62b9653f4..b04506b104a6 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -532,7 +532,8 @@ class RenderingServer : public Object { enum LightType { LIGHT_DIRECTIONAL, LIGHT_OMNI, - LIGHT_SPOT + LIGHT_SPOT, + LIGHT_RECT }; enum LightParam { @@ -563,6 +564,7 @@ class RenderingServer : public Object { virtual RID directional_light_create() = 0; virtual RID omni_light_create() = 0; virtual RID spot_light_create() = 0; + virtual RID rect_light_create() = 0; virtual void light_set_color(RID p_light, const Color &p_color) = 0; virtual void light_set_param(RID p_light, LightParam p_param, float p_value) = 0;