载入中...
搜索中...
未找到
PbrSurface.cpp
浏览该文件的文档.
2#include <cmath>
3namespace eve::graphics {
5 auto fail = [] {
7 DiagnosticCode::InvalidArgument, "invalid PBR surface factors or sampler", {}, {}, "graphics.material"));
8 };
9 auto unit = [](float x) { return std::isfinite(x) && x >= 0 && x <= 1; };
10 auto positive = [](float x) { return std::isfinite(x) && x >= 0; };
11 if (uint32_t(s.cullMode) > uint32_t(PbrCullMode::Front)) return fail();
12 if (!unit(s.occlusionStrength) || !unit(s.specularFactor) || !unit(s.anisotropyStrength) ||
13 !unit(s.clearcoatFactor) || !unit(s.clearcoatRoughness) || !positive(s.emissiveStrength) ||
14 !std::isfinite(s.normalScale) || !std::isfinite(s.clearcoatNormalScale) ||
15 !std::isfinite(s.anisotropyRotation) || !std::isfinite(s.ior) || (s.ior != 0 && s.ior < 1))
16 return fail();
17 for (float v : s.emissive)
18 if (!positive(v)) return fail();
19 for (float v : s.motionHighlightColor)
20 if (!positive(v)) return fail();
21 if (!unit(s.vegetationColor.overlay) || !unit(s.vegetationColor.wetness) ||
22 !unit(s.vegetationColor.overlayVariation) || !unit(s.vegetationColor.overlayProjection) ||
23 !unit(s.vegetationColor.vertexOcclusionAlpha) || !unit(s.vegetationColor.overlayNormalScale) ||
24 !unit(s.vegetationColor.wetnessNormalScale) || !unit(s.vegetationColor.overlaySmoothness) ||
25 !unit(s.vegetationColor.wetnessContrast) || !unit(s.vegetationColor.overlaySubsurface) ||
26 !unit(s.vegetationColor.colorsCoverage) || !std::isfinite(s.vegetationColor.colorsIntensity) ||
27 s.vegetationColor.colorsIntensity < 0 || s.vegetationColor.colorsIntensity > 2 ||
28 !unit(s.vegetationColor.colorsMask) || !unit(s.vegetationColor.colorsVariation) ||
29 !unit(s.vegetationColor.globalColorMaskMinimum) || !unit(s.vegetationColor.globalColorMaskMaximum) ||
30 !unit(s.vegetationColor.globalOverlayMaskMinimum) || !unit(s.vegetationColor.globalOverlayMaskMaximum) ||
31 !std::isfinite(s.vegetationColor.globalAlphaThresholdOffset) ||
32 s.vegetationColor.globalAlphaThresholdOffset < -.5f || s.vegetationColor.globalAlphaThresholdOffset > .5f ||
33 s.vegetationColor.globalColorMaskMaximum - s.vegetationColor.globalColorMaskMinimum + .0001f == 0.f ||
34 s.vegetationColor.globalOverlayMaskMaximum - s.vegetationColor.globalOverlayMaskMinimum + .0001f == 0.f ||
35 !unit(s.vegetationColor.vertexOcclusionMinimum) || !unit(s.vegetationColor.vertexOcclusionMaximum) ||
36 s.vegetationColor.vertexOcclusionMaximum - s.vegetationColor.vertexOcclusionMinimum + .0001f == 0.f)
37 return fail();
38 if (uint32_t(s.vegetationColor.backfaceNormalMode) > uint32_t(PbrVegetationBackfaceNormalMode::Same)) return fail();
39 for (std::size_t i = 0; i < s.vegetationColor.fieldColor.size(); ++i)
40 if ((i == 3 ? !unit(s.vegetationColor.fieldColor[i]) : !positive(s.vegetationColor.fieldColor[i])))
41 return fail();
42 for (float v : s.vegetationColor.overlayColor)
43 if (!positive(v)) return fail();
44 for (float v : s.vegetationColor.vertexOcclusionColor)
45 if (!positive(v)) return fail();
46 const auto& detail = s.vegetationDetail;
47 if (!unit(detail.value) || !unit(detail.normalBlendValue) || !std::isfinite(detail.normalValue) ||
48 detail.normalValue < -8 || detail.normalValue > 8 || !unit(detail.albedoValue) || !unit(detail.metallicValue) ||
49 !unit(detail.occlusionValue) || !unit(detail.smoothnessValue) || !unit(detail.blendMinimum) ||
50 !unit(detail.blendMaximum) || !unit(detail.maskMinimum) || !unit(detail.maskMaximum) ||
51 !unit(detail.meshMinimum) || !unit(detail.meshMaximum) ||
52 detail.blendMaximum - detail.blendMinimum + .0001f == 0 ||
53 detail.maskMaximum - detail.maskMinimum + .0001f == 0 ||
54 detail.meshMaximum - detail.meshMinimum + .0001f == 0 || detail.uvMode > 2 || detail.colorMode > 1 ||
55 detail.blendMode > 1 || detail.alphaMode > 1 || detail.maskMode > 1 || detail.meshMode > 1)
56 return fail();
57 for (size_t i = 0; i < detail.color.size(); ++i)
58 if (!positive(detail.color[i]) || (i == 3 && detail.color[i] > 1)) return fail();
59 for (size_t i = 0; i < detail.colorTwo.size(); ++i)
60 if (!positive(detail.colorTwo[i]) || (i == 3 && detail.colorTwo[i] > 1)) return fail();
61 for (float value : detail.uvScale)
62 if (!std::isfinite(value) || value == 0) return fail();
63 for (float value : detail.uvOffset)
64 if (!std::isfinite(value)) return fail();
65 for (float v : s.specularColor)
66 if (!positive(v)) return fail();
67 if (!unit(s.colorMaskMin) || !unit(s.colorMaskMax) || s.colorMaskMax - s.colorMaskMin + .0001f == 0.f ||
68 !unit(s.albedoTextureStrength))
69 return fail();
70 for (float v : s.colorMaskSecondary)
71 if (!positive(v)) return fail();
72 const auto& mask = s.textures[std::size_t(PbrTextureSlot::MetallicRoughness)];
73 if (s.colorMaskEnabled && (!mask.texture || mask.srgbDecode)) return fail();
74 const auto& trans = s.translucency;
75 if (!unit(trans.maskMinimum) || !unit(trans.maskMaximum) || trans.maskMaximum - trans.maskMinimum + .0001f == 0.f)
76 return fail();
77 if (!unit(trans.intensity) || !unit(trans.normalDistortion) || !unit(trans.direct) || !unit(trans.ambient) ||
78 !unit(trans.shadow) || !unit(trans.maskAmount) || !positive(trans.strength) || trans.strength > 50 ||
79 !std::isfinite(trans.scattering) || trans.scattering < 1 || trans.scattering > 50 ||
80 !positive(trans.globalIntensity) || !positive(trans.overlay) ||
81 !std::isfinite(trans.globalIntensity * trans.overlay))
82 return fail();
83 for (float v : trans.color)
84 if (!positive(v)) return fail();
85 if (trans.intensity > 0 && trans.maskAmount > 0 && (!mask.texture || mask.srgbDecode)) return fail();
86 if (uint32_t(s.normalMode) > uint32_t(PbrNormalMode::VegetationAG)) return fail();
87 if (s.normalMode != PbrNormalMode::TangentXYZ) {
88 const auto& normal = s.textures[std::size_t(PbrTextureSlot::Normal)];
89 if (!normal.texture || normal.srgbDecode || s.normalScale < -8.f || s.normalScale > 8.f) return fail();
90 }
91 auto validateBinding = [&](const auto& b) {
92 for (float v : b.offset)
93 if (!std::isfinite(v)) return false;
94 for (float v : b.scale)
95 if (!std::isfinite(v)) return false;
96 auto wrap = [](uint32_t v) { return v == 10497 || v == 33071 || v == 33648; };
97 if (!std::isfinite(b.rotation) || !wrap(b.wrapS) || !wrap(b.wrapT) ||
98 (b.magFilter != 9728 && b.magFilter != 9729) ||
99 (b.minFilter != 9728 && b.minFilter != 9729 && (b.minFilter < 9984 || b.minFilter > 9987)))
100 return false;
101 return true;
102 };
103 for (const auto& b : s.textures)
104 if (!validateBinding(b)) return fail();
105 for (const auto& b : detail.textures)
106 if (!validateBinding(b)) return fail();
107 if (detail.value > 0 && (!detail.textures[0].texture || !detail.textures[1].texture)) return fail();
108 const auto& extras = s.vegetationExtras;
109 if (extras.layer > 8) return fail();
110 for (float value : extras.usage)
111 if (!unit(value)) return fail();
112 for (float value : extras.fallback)
113 if (!std::isfinite(value)) return fail();
114 for (float value : extras.coords)
115 if (!std::isfinite(value)) return fail();
116 const auto& alpha = s.vegetationAlpha;
117 if (!unit(alpha.global) || !unit(alpha.variation) || !unit(alpha.glancing) || !unit(alpha.camera) ||
118 !unit(alpha.constant) || !std::isfinite(alpha.cameraFadeMin) || alpha.cameraFadeMin < 0 ||
119 alpha.cameraFadeMin > 1000000 || !std::isfinite(alpha.cameraFadeMax) || alpha.cameraFadeMax < 0 ||
120 alpha.cameraFadeMax > 1000000 || !std::isfinite(alpha.noiseTiling) || alpha.noiseTiling < 0 ||
121 alpha.noiseTiling > 1000000)
122 return fail();
123 const auto& emission = s.vegetationEmission;
124 if (!unit(emission.minimum) || !unit(emission.maximum) || emission.maximum - emission.minimum + .0001f == 0 ||
125 !unit(emission.phase) || !unit(emission.global))
126 return fail();
127 const auto& gradient = s.vegetationGradient;
128 if (!unit(gradient.minimum) || !unit(gradient.maximum) || gradient.maximum - gradient.minimum + .0001f == 0)
129 return fail();
130 for (float value : gradient.colorOne)
131 if (!positive(value)) return fail();
132 for (float value : gradient.colorTwo)
133 if (!positive(value)) return fail();
134 const auto& colors = s.vegetationColors;
135 if (colors.layer > 8) return fail();
136 for (float value : colors.usage)
137 if (!unit(value)) return fail();
138 for (size_t i = 0; i < colors.fallback.size(); ++i)
139 if (!std::isfinite(colors.fallback[i]) || (i == 3 ? !unit(colors.fallback[i]) : colors.fallback[i] < 0))
140 return fail();
141 for (float value : colors.coords)
142 if (!std::isfinite(value)) return fail();
143 const auto& vertex = s.vegetationVertex;
144 if (vertex.layer > 8 || uint32_t(vertex.source) > uint32_t(PbrVegetationDeformationSource::GpuFields))
145 return fail();
146 for (float value : vertex.usage)
147 if (!unit(value)) return fail();
148 for (float value : vertex.fallback)
149 if (!std::isfinite(value)) return fail();
150 for (float value : vertex.coords)
151 if (!std::isfinite(value)) return fail();
152 if (!unit(vertex.globalSize) || !std::isfinite(vertex.sizeFadeStart) || vertex.sizeFadeStart < 0 ||
153 !std::isfinite(vertex.sizeFadeEnd) || vertex.sizeFadeEnd < vertex.sizeFadeStart ||
154 !std::isfinite(vertex.distanceFadeBias) || vertex.distanceFadeBias < .0001f)
155 return fail();
156 const auto& motion = s.vegetationMotion;
157 if (motion.layer > 8 || uint32_t(motion.mode) > uint32_t(PbrVegetationMotionMode::Object)) return fail();
158 for (float value : motion.usage)
159 if (!unit(value)) return fail();
160 for (float value : motion.fallback)
161 if (!std::isfinite(value)) return fail();
162 for (float value : motion.coords)
163 if (!std::isfinite(value)) return fail();
164 for (float value : motion.globalDirection)
165 if (!std::isfinite(value)) return fail();
166 for (float value : motion.worldOrigin)
167 if (!std::isfinite(value)) return fail();
168 if (!std::isfinite(motion.time) || std::abs(motion.time) > 1e12 || !unit(motion.dynamicMode) ||
169 !unit(motion.rigidity) || !unit(motion.facing) || !unit(motion.interactionMask))
170 return fail();
171 for (float value : {motion.bending, motion.bendingSpeed, motion.bendingScale, motion.bendingVariation,
172 motion.branch, motion.rolling, motion.branchSpeed, motion.branchScale,
173 motion.branchVariation, motion.flutter, motion.flutterSpeed, motion.flutterScale,
174 motion.flutterVariation, motion.globalBending, motion.globalBranch, motion.globalFlutter,
175 motion.noiseTiling, motion.interaction, motion.fadeDistance, motion.perspectivePush,
176 motion.perspectiveNoise, motion.perspectiveAngle})
177 if (!std::isfinite(value) || value < 0 || value > 1000000) return fail();
178 if (motion.mode == PbrVegetationMotionMode::Object && (!motion.texture || !motion.noise)) return fail();
180 return fail();
181 if (vertex.source == PbrVegetationDeformationSource::GpuFields && !vertex.texture &&
183 return fail();
184 return Result<void>::success();
185}
186} // namespace eve::graphics
double value
float x
Definition AnimClip.cpp:738
const std::string & s
int mask
float v
MeleePoint3 b
Definition MeleeHit.cpp:41
Texture * normal
int detail
std::vector< float > colors
TacticalUnit * unit
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
Result< void > validatePbrSurface(const PbrSurface &s)
Validate finite material factors and sampler enums without changing the input.
Definition PbrSurface.cpp:4
Owning material parameter snapshot; texture pointers remain borrowed. Base color/metallic/roughness c...
Definition PbrSurface.h:218