refactor: formalize directional shadow planning settings
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user