Skip to content

Commit

Permalink
fix: shadow casting cases
Browse files Browse the repository at this point in the history
  • Loading branch information
laurentsenta committed Feb 6, 2025
1 parent 4b3d7a9 commit 4b3c0de
Showing 1 changed file with 13 additions and 3 deletions.
16 changes: 13 additions & 3 deletions src/terrain_3d_mesh_asset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,10 @@ GeometryInstance3D::ShadowCastingSetting Terrain3DMeshAsset::get_lod_cast_shadow
if (_cast_shadows == GeometryInstance3D::SHADOW_CASTING_SETTING_OFF) {
return GeometryInstance3D::SHADOW_CASTING_SETTING_OFF;
}
// We never cast shadows
if (_cast_shadows == GeometryInstance3D::SHADOW_CASTING_SETTING_SHADOWS_ONLY) {
return GeometryInstance3D::SHADOW_CASTING_SETTING_SHADOWS_ONLY;
}
// This lod id is for the shadow impostor and is set to cast shadows only
if (p_lod_id == SHADOW_LOD_ID) {
return GeometryInstance3D::SHADOW_CASTING_SETTING_SHADOWS_ONLY;
Expand All @@ -407,17 +411,16 @@ GeometryInstance3D::ShadowCastingSetting Terrain3DMeshAsset::get_lod_cast_shadow
if (p_lod_id < _first_shadow_lod) {
return GeometryInstance3D::SHADOW_CASTING_SETTING_OFF;
}
// This lod is too far to get a shadow
// This lod is too far to cast a shadow
if (p_lod_id > _last_shadow_lod) {
return GeometryInstance3D::SHADOW_CASTING_SETTING_OFF;
}
return _cast_shadows;
}

Ref<Mesh> Terrain3DMeshAsset::get_lod_mesh(const int p_lod_id) {
// Requesting the shadow impostor
if (p_lod_id == SHADOW_LOD_ID) {
// we don't use a shadow lod because we're in case where each lod uses its own shadow
// Each lod uses its own shadow
if (_first_shadow_lod == 0) {
return Ref<Mesh>();
}
Expand All @@ -429,10 +432,17 @@ Ref<Mesh> Terrain3DMeshAsset::get_lod_mesh(const int p_lod_id) {
return get_mesh(_first_shadow_lod);
}

// This lod is too far to get a mesh
if (p_lod_id > _last_lod) {
return Ref<Mesh>();
}

// In the case where we're rendering shadows only,
// This lod is also too far to get a mesh
if (_cast_shadows == GeometryInstance3D::SHADOW_CASTING_SETTING_SHADOWS_ONLY && p_lod_id >= _last_shadow_lod) {
return Ref<Mesh>();
}

return get_mesh(p_lod_id);
}

Expand Down

0 comments on commit 4b3c0de

Please sign in to comment.