载入中...
搜索中...
未找到
VegetationMotion.cpp
浏览该文件的文档.
20 return Diagnostic::error(DiagnosticCode::InvalidArgument, "invalid vegetation motion input or output overflow", {},
24 if (!std::isfinite(uv.x) || !std::isfinite(uv.y)) return glm::vec4(std::numeric_limits<float>::quiet_NaN());
52 1.f / glm::length(glm::vec3(frame.inverseModel[0][i], frame.inverseModel[1][i], frame.inverseModel[2][i]));
55 std::lerp(motion.time, motion.time * motion.timeScale + motion.timeOffset, double(motion.timeOverride));
65LocalDeformation deformLocal(const VegetationVertex& v, glm::vec3 position, const VegetationSample& field,
70 const auto objectWorld = batched ? world : glm::vec3(motion.objectToWorld * glm::vec4(pivot, 1.f));
73 const double positionHash = std::sin(double(objectShifted.x) * 12.9898 + double(objectShifted.z) * 78.233);
75 batched ? v.variation : float(fract(positionHash * (1.f - motion.dynamicMode) + v.variation)), 0.01f, 0.99f);
79 const double flowTime = (frame.time * motion.bendingSpeed + motion.bendingVariation * variation) * 0.03;
84 repeatNoise(motion.noise, uv - wind * fract(flowTime + 0.5)), float(std::abs(cycle - 0.5) / 0.5));
85 const auto noiseDirection = directionInObject(frame, {noise.r * 2.f - 1.f, 0.f, noise.g * 2.f - 1.f});
92 const auto bending = bendDirection * (bendingMask * motion.bending * power * power * motion.globalBending);
99 const float interactionWeight = saturate(motion.interaction * std::pow(interactionStrength, 4.f));
104 float(std::sin(branchPhase + motion.branchVariation * variation + frame.time * motion.branchSpeed));
111 : std::max(std::lerp(1.f, glm::dot(normalPosition, -reactDirection) * 0.5f + 0.5f, motion.facing), 0.001f);
113 const float branchAmplitude = facing * power * std::pow(noiseBlue, std::lerp(1.8f, 0.4f, power));
114 const float squashScale = (std::max(sineA, sineB) * 0.5f + 0.5f) * branchAmplitude * motion.branch * v.branch *
116 const glm::vec3 squash = glm::vec3(reactDirection.x, sineA * 0.3f, reactDirection.z) * squashScale;
117 const float rolling = sineA * branchAmplitude * motion.rolling * v.branch * motion.globalBranch;
123 const float fade = saturate((glm::distance(world, motion.camera) - fadeEnd) / (-fadeEnd * 0.5f + 0.0001f));
124 const float flutterAmplitude = motion.flutter * facing * fade * v.flutter * power * motion.globalFlutter *
139 const auto push = frame.inverseModel * glm::vec3(-cross.z, 0, cross.x) * motion.perspectivePush;
140 const auto jitter = glm::vec3(variation * 2.f - 1.f, 0, variation * 2.f - 1.f) * motion.perspectiveNoise;
145 saturate((glm::distance(motion.camera, objectWorld) / motion.distanceFadeBias - motion.sizeFadeEnd) /
155 !unit(m.rigidity) || !unit(m.facing) || !unit(m.interactionMask) || !unit(m.globalSize) || m.motionLayer > 8 ||
162 m.flutterVariation, m.globalBending, m.globalBranch, m.globalFlutter, m.noiseTiling, m.interaction,
166 m.sizeFadeEnd - m.sizeFadeStart < 0.001f || !std::isfinite(m.distanceFadeBias) || m.distanceFadeBias < 0.0001f)
170 if (m.objectToWorld[0][3] != 0.f || m.objectToWorld[1][3] != 0.f || m.objectToWorld[2][3] != 0.f ||
176 if (texture.width == 0 || texture.height == 0 || texture.width > 2048 || texture.height > 2048 ||
180 if (!finite(pixel) || !unit(pixel.r) || !unit(pixel.g) || !unit(pixel.b) || !unit(pixel.a)) return false;
185Result<VegetationGeometry> deformVegetation(const VegetationField& field, std::span<const VegetationVertex> vertices,
201 if (!finite(v.position) || !finite(v.normal) || !finite(v.pivot) || !unit(v.bending) || !unit(v.branch) ||
232 ? glm::normalize(glm::vec3(*v.tangent) - baseNormal * glm::dot(baseNormal, glm::vec3(*v.tangent)))
242 glm::normalize(frame.normalMatrix * (glm::length(cross) > 1e-12f ? glm::normalize(cross) : baseNormal));
254 const auto b = glm::normalize(model * (glm::length(dq) > 1e-12f ? dq : bitangent)) * v.tangent->w;
263 DiagnosticCode::Failed, "vegetation geometry allocation failed", {}, {}, "graphics.vegetation"));
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
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Backend-independent, owning vegetation influence field. Single writer; concurrent const evaluation is...
Definition VegetationField.h:86
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
Result< VegetationGeometry > deformVegetation(const VegetationField &field, std::span< const VegetationVertex > vertices, const VegetationMotion &motion)
Evaluate plant bending, squash, rolling, flutter, interaction and perspective. Worker-safe with immut...
Definition VegetationMotion.cpp:185
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
@ InvalidArgument
@ Failed
Owning geometry projection, packed world XYZ positions and unit normals.
Definition VegetationMotion.h:63
std::vector< float > positions
Definition VegetationMotion.h:64
std::vector< float > vegetationFactors
Interleaved variation, occlusion, detail mask and detail UV, five floats per vertex.
Definition VegetationMotion.h:66
std::vector< float > motionHighlights
Owning per-rest-vertex motion highlight scalar, parallel to positions/3. Evaluated before raster inte...
Definition VegetationMotion.h:73
std::vector< float > normals
Definition VegetationMotion.h:64
std::vector< float > tangents
Owning deformed world XYZ frame streams; both empty when source tangents are absent.
Definition VegetationMotion.h:75
std::vector< float > bitangents
Definition VegetationMotion.h:75
Source-equivalent plant motion parameters with explicit time and texture inputs. All data is owned....
Definition VegetationMotion.h:38
VegetationBatchMode batchMode
Definition VegetationMotion.h:44
glm::mat4 objectToWorld
Definition VegetationMotion.h:42