refactor: formalize directional shadow planning settings

This commit is contained in:
2026-04-10 02:14:45 +08:00
parent f476890116
commit 54eb2415ff
3 changed files with 164 additions and 26 deletions

View File

@@ -200,3 +200,74 @@ TEST(SceneRenderRequestPlanner_Test, SkipsDirectionalShadowPlanForOverlayCameraW
EXPECT_FALSE(requests[1].directionalShadow.enabled);
EXPECT_FALSE(requests[1].shadowCaster.hasCameraDataOverride);
}
TEST(SceneRenderRequestPlanner_Test, AppliesConfiguredDirectionalShadowPlanningSettings) {
Scene scene("SceneRenderRequestPlannerCustomDirectionalShadow");
GameObject* cameraObject = scene.CreateGameObject("Camera");
auto* camera = cameraObject->AddComponent<CameraComponent>();
camera->SetStackType(CameraStackType::Base);
camera->SetDepth(1.0f);
camera->SetProjectionType(CameraProjectionType::Perspective);
camera->SetNearClipPlane(0.3f);
camera->SetFarClipPlane(100.0f);
GameObject* shadowLightObject = scene.CreateGameObject("ShadowLight");
auto* shadowLight = shadowLightObject->AddComponent<LightComponent>();
shadowLight->SetLightType(LightType::Directional);
shadowLight->SetCastsShadows(true);
SceneRenderRequestPlanner planner;
DirectionalShadowPlanningSettings settings = {};
settings.mapDimension = 2048u;
settings.minFocusDistance = 12.0f;
settings.maxFocusDistance = 12.0f;
settings.perspectiveFocusFactor = 0.01f;
settings.minDepthRange = 80.0f;
planner.SetDirectionalShadowPlanningSettings(settings);
const std::vector<CameraRenderRequest> requests = planner.BuildRequests(
scene,
nullptr,
CreateValidContext(),
RenderSurface(640, 360));
ASSERT_EQ(requests.size(), 1u);
const CameraRenderRequest& request = requests[0];
ASSERT_TRUE(request.directionalShadow.IsValid());
EXPECT_EQ(request.directionalShadow.mapWidth, 2048u);
EXPECT_EQ(request.directionalShadow.mapHeight, 2048u);
EXPECT_EQ(request.shadowCaster.cameraDataOverride.viewportWidth, 2048u);
EXPECT_EQ(request.shadowCaster.cameraDataOverride.viewportHeight, 2048u);
EXPECT_GE(request.directionalShadow.focusPoint.z, 6.0f);
EXPECT_LE(request.directionalShadow.focusPoint.z, 6.3f);
EXPECT_GE(
request.directionalShadow.farClipPlane - request.directionalShadow.nearClipPlane,
80.0f);
}
TEST(SceneRenderRequestPlanner_Test, SanitizesInvalidDirectionalShadowPlanningSettings) {
SceneRenderRequestPlanner planner;
DirectionalShadowPlanningSettings invalidSettings = {};
invalidSettings.mapDimension = 0u;
invalidSettings.minFocusDistance = -1.0f;
invalidSettings.maxFocusDistance = 0.0f;
invalidSettings.perspectiveFocusFactor = 0.0f;
invalidSettings.orthographicFocusFactor = -2.0f;
invalidSettings.minDepthRange = 0.0f;
invalidSettings.boundsPadding = -1.0f;
invalidSettings.minDepthPadding = -3.0f;
planner.SetDirectionalShadowPlanningSettings(invalidSettings);
const DirectionalShadowPlanningSettings& settings =
planner.GetDirectionalShadowPlanningSettings();
EXPECT_EQ(settings.mapDimension, 1024u);
EXPECT_FLOAT_EQ(settings.minFocusDistance, 5.0f);
EXPECT_FLOAT_EQ(settings.maxFocusDistance, 64.0f);
EXPECT_FLOAT_EQ(settings.perspectiveFocusFactor, 1.0f);
EXPECT_FLOAT_EQ(settings.orthographicFocusFactor, 2.0f);
EXPECT_FLOAT_EQ(settings.minDepthRange, 20.0f);
EXPECT_FLOAT_EQ(settings.boundsPadding, 1.0f);
EXPECT_FLOAT_EQ(settings.minDepthPadding, 2.0f);
}