You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-01 16:38:31 +00:00
Add shadow_caster_mask to Light3D.
This commit is contained in:
@@ -78,6 +78,8 @@ public:
|
||||
virtual void light_set_cull_mask(RID p_light, uint32_t p_mask) override {}
|
||||
virtual void light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) override {}
|
||||
virtual void light_set_reverse_cull_face_mode(RID p_light, bool p_enabled) override {}
|
||||
virtual void light_set_shadow_caster_mask(RID p_light, uint32_t p_caster_mask) override {}
|
||||
virtual uint32_t light_get_shadow_caster_mask(RID p_light) const override { return 0xFFFFFFFF; }
|
||||
virtual void light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) override {}
|
||||
virtual void light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade) override {}
|
||||
|
||||
|
||||
@@ -285,6 +285,23 @@ void LightStorage::light_set_reverse_cull_face_mode(RID p_light, bool p_enabled)
|
||||
light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
|
||||
}
|
||||
|
||||
void LightStorage::light_set_shadow_caster_mask(RID p_light, uint32_t p_caster_mask) {
|
||||
Light *light = light_owner.get_or_null(p_light);
|
||||
ERR_FAIL_NULL(light);
|
||||
|
||||
light->shadow_caster_mask = p_caster_mask;
|
||||
|
||||
light->version++;
|
||||
light->dependency.changed_notify(Dependency::DEPENDENCY_CHANGED_LIGHT);
|
||||
}
|
||||
|
||||
uint32_t LightStorage::light_get_shadow_caster_mask(RID p_light) const {
|
||||
Light *light = light_owner.get_or_null(p_light);
|
||||
ERR_FAIL_NULL_V(light, 0);
|
||||
|
||||
return light->shadow_caster_mask;
|
||||
}
|
||||
|
||||
void LightStorage::light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) {
|
||||
Light *light = light_owner.get_or_null(p_light);
|
||||
ERR_FAIL_NULL(light);
|
||||
|
||||
@@ -72,6 +72,7 @@ private:
|
||||
RS::LightBakeMode bake_mode = RS::LIGHT_BAKE_DYNAMIC;
|
||||
uint32_t max_sdfgi_cascade = 2;
|
||||
uint32_t cull_mask = 0xFFFFFFFF;
|
||||
uint32_t shadow_caster_mask = 0xFFFFFFFF;
|
||||
bool distance_fade = false;
|
||||
real_t distance_fade_begin = 40.0;
|
||||
real_t distance_fade_shadow = 50.0;
|
||||
@@ -474,6 +475,8 @@ public:
|
||||
virtual void light_set_cull_mask(RID p_light, uint32_t p_mask) override;
|
||||
virtual void light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) override;
|
||||
virtual void light_set_reverse_cull_face_mode(RID p_light, bool p_enabled) override;
|
||||
virtual void light_set_shadow_caster_mask(RID p_light, uint32_t p_caster_mask) override;
|
||||
virtual uint32_t light_get_shadow_caster_mask(RID p_light) const override;
|
||||
virtual void light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) override;
|
||||
virtual void light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade) override;
|
||||
|
||||
|
||||
@@ -2139,6 +2139,7 @@ void RendererSceneCull::_light_instance_setup_directional_shadow(int p_shadow_in
|
||||
cull.shadow_count = p_shadow_index + 1;
|
||||
cull.shadows[p_shadow_index].cascade_count = splits;
|
||||
cull.shadows[p_shadow_index].light_instance = light->instance;
|
||||
cull.shadows[p_shadow_index].caster_mask = RSG::light_storage->light_get_shadow_caster_mask(p_instance->base);
|
||||
|
||||
for (int i = 0; i < splits; i++) {
|
||||
RENDER_TIMESTAMP("Cull DirectionalLight3D, Split " + itos(i));
|
||||
@@ -2369,7 +2370,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
|
||||
for (int j = 0; j < (int)instance_shadow_cull_result.size(); j++) {
|
||||
Instance *instance = instance_shadow_cull_result[j];
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask)) {
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask & RSG::light_storage->light_get_shadow_caster_mask(p_instance->base))) {
|
||||
continue;
|
||||
} else {
|
||||
if (static_cast<InstanceGeometryData *>(instance->base_data)->material_is_animated) {
|
||||
@@ -2451,7 +2452,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
|
||||
for (int j = 0; j < (int)instance_shadow_cull_result.size(); j++) {
|
||||
Instance *instance = instance_shadow_cull_result[j];
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask)) {
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask & RSG::light_storage->light_get_shadow_caster_mask(p_instance->base))) {
|
||||
continue;
|
||||
} else {
|
||||
if (static_cast<InstanceGeometryData *>(instance->base_data)->material_is_animated) {
|
||||
@@ -2518,7 +2519,7 @@ bool RendererSceneCull::_light_instance_update_shadow(Instance *p_instance, cons
|
||||
|
||||
for (int j = 0; j < (int)instance_shadow_cull_result.size(); j++) {
|
||||
Instance *instance = instance_shadow_cull_result[j];
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask)) {
|
||||
if (!instance->visible || !((1 << instance->base_type) & RS::INSTANCE_GEOMETRY_MASK) || !static_cast<InstanceGeometryData *>(instance->base_data)->can_cast_shadows || !(p_visible_layers & instance->layer_mask & RSG::light_storage->light_get_shadow_caster_mask(p_instance->base))) {
|
||||
continue;
|
||||
} else {
|
||||
if (static_cast<InstanceGeometryData *>(instance->base_data)->material_is_animated) {
|
||||
@@ -2978,7 +2979,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
if (IN_FRUSTUM(cull_data.cull->shadows[j].cascades[k].frustum) && VIS_CHECK) {
|
||||
uint32_t base_type = idata.flags & InstanceData::FLAG_BASE_TYPE_MASK;
|
||||
|
||||
if (((1 << base_type) & RS::INSTANCE_GEOMETRY_MASK) && idata.flags & InstanceData::FLAG_CAST_SHADOWS && LAYER_CHECK) {
|
||||
if (((1 << base_type) & RS::INSTANCE_GEOMETRY_MASK) && idata.flags & InstanceData::FLAG_CAST_SHADOWS && (LAYER_CHECK & cull_data.cull->shadows[j].caster_mask)) {
|
||||
cull_result.directional_shadows[j].cascade_geometry_instances[k].push_back(idata.instance_geometry);
|
||||
mesh_visible = true;
|
||||
}
|
||||
|
||||
@@ -1084,6 +1084,7 @@ public:
|
||||
struct Cull {
|
||||
struct Shadow {
|
||||
RID light_instance;
|
||||
uint32_t caster_mask;
|
||||
struct Cascade {
|
||||
Frustum frustum;
|
||||
|
||||
|
||||
@@ -377,6 +377,7 @@ public:
|
||||
FUNC2(light_set_cull_mask, RID, uint32_t)
|
||||
FUNC5(light_set_distance_fade, RID, bool, float, float, float)
|
||||
FUNC2(light_set_reverse_cull_face_mode, RID, bool)
|
||||
FUNC2(light_set_shadow_caster_mask, RID, uint32_t)
|
||||
FUNC2(light_set_bake_mode, RID, LightBakeMode)
|
||||
FUNC2(light_set_max_sdfgi_cascade, RID, uint32_t)
|
||||
|
||||
|
||||
@@ -59,6 +59,8 @@ public:
|
||||
virtual void light_set_cull_mask(RID p_light, uint32_t p_mask) = 0;
|
||||
virtual void light_set_distance_fade(RID p_light, bool p_enabled, float p_begin, float p_shadow, float p_length) = 0;
|
||||
virtual void light_set_reverse_cull_face_mode(RID p_light, bool p_enabled) = 0;
|
||||
virtual void light_set_shadow_caster_mask(RID p_light, uint32_t p_caster_mask) = 0;
|
||||
virtual uint32_t light_get_shadow_caster_mask(RID p_light) const = 0;
|
||||
virtual void light_set_bake_mode(RID p_light, RS::LightBakeMode p_bake_mode) = 0;
|
||||
virtual void light_set_max_sdfgi_cascade(RID p_light, uint32_t p_cascade) = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user