载入中...
搜索中...
未找到
WaterPlanarReflection.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <cmath>
5
6namespace eve::graphics {
7namespace {
8bool finite3(const glm::vec3& v) { return std::isfinite(v.x) && std::isfinite(v.y) && std::isfinite(v.z); }
9
10float resolutionScale(WaterReflectionResolution value) {
11 switch (value) {
12 case WaterReflectionResolution::Full: return 1.0F;
13 case WaterReflectionResolution::Half: return 0.5F;
14 case WaterReflectionResolution::Third: return 0.33F;
15 case WaterReflectionResolution::Quarter: return 0.25F;
16 }
17 return 0.0F;
18}
19} // namespace
20
23 const float multiplier = resolutionScale(settings.resolutionMultiplier);
24 if (multiplier == 0.0F || settings.textureResolution <= 0 || settings.textureResolution > 16384 ||
25 !std::isfinite(settings.clipPlaneOffset) || !std::isfinite(settings.customRenderDistance) ||
26 settings.customRenderDistance < 0.0F || !std::isfinite(settings.lodBias) || settings.lodBias <= 0.0F || !finite3(input.cameraPosition) || !finite3(input.cameraForward) ||
27 glm::dot(input.cameraForward, input.cameraForward) <= 0.0F || !std::isfinite(input.waterPlaneY) ||
28 !std::isfinite(input.renderScale) || input.renderScale <= 0.0F) {
30 DiagnosticCode::InvalidArgument, "water.planarReflection: finite camera, plane, scale and valid settings required"));
31 }
32 for (float distance : settings.customRenderDistances) {
33 if (!std::isfinite(distance) || distance < 0.0F)
35 DiagnosticCode::InvalidArgument, "water.planarReflection: layer distances must be finite and nonnegative"));
36 }
37
39 const float planeY = input.waterPlaneY + settings.clipPlaneOffset;
40 plan.reflectionMatrix = glm::mat4(1.0F);
41 plan.reflectionMatrix[1][1] = -1.0F;
42 plan.reflectionMatrix[3][1] = 2.0F * planeY;
43 plan.cameraPosition = {input.cameraPosition.x, 2.0F * planeY - input.cameraPosition.y,
44 input.cameraPosition.z};
45 plan.cameraForward = glm::normalize(glm::vec3(input.cameraForward.x, -input.cameraForward.y,
46 input.cameraForward.z));
47 plan.worldClipPlane = {0.0F, 1.0F, 0.0F, -planeY};
48 plan.cullingMask = settings.enabled ? (settings.reflectLayers & ~(1U << 4U)) : 0U;
49 plan.renderShadows = settings.shadows;
50 plan.shouldRender = settings.enabled && !settings.disableSkyboxReflections && !input.orthographic &&
51 !input.reflectionOrPreviewCamera;
52 const double pixels = static_cast<double>(settings.textureResolution) * input.renderScale * multiplier;
53 plan.textureWidth = plan.textureHeight = std::max(1, static_cast<int>(pixels));
54 if (settings.enableRenderDistance) {
55 if (settings.enablePerLayerDistances) {
56 for (std::size_t i=0;i<plan.layerCullDistances.size();++i)
57 plan.layerCullDistances[i]=settings.customRenderDistances[i]*settings.lodBias;
58 } else plan.layerCullDistances.fill(settings.customRenderDistance*settings.lodBias);
59 }
61}
62
63} // namespace eve::graphics
double value
EvpackChunkInput input
Definition Evpack.cpp:170
float v
float distance
uint8_t * pixels
TerrainThermalSettings settings
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
WaterReflectionResolution
Pcg-compatible render-size multiplier for planar water reflections.
Result< WaterPlanarReflectionPlan > buildWaterPlanarReflectionPlan(const WaterPlanarReflectionSettings &settings, const WaterPlanarReflectionInput &input)
Build the mirror-camera plan used by PcgPlanarReflections without retaining scene objects.
Immutable camera and horizontal water-plane inputs for a reflection capture.
Complete, caller-owned plan for configuring a mirrored capture camera.
Authored planar-reflection policy with no camera or texture ownership.