载入中...
搜索中...
未找到
MeshVfxScalability.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <cmath>
5#include <numeric>
6
7namespace eve::stylize {
8namespace {
9
10MeshVfxLodTier requestedTier(const MeshVfxLodCandidate& candidate, const MeshVfxScalabilityPolicy& policy) {
11 if (!candidate.visible || !std::isfinite(candidate.distance) || candidate.distance < 0.0f ||
12 candidate.distance > policy.maximumDistance || !std::isfinite(candidate.projectedRadiusPixels)) {
14 }
15 if (candidate.projectedRadiusPixels >= policy.fullQualityMinPixels) {
17 }
18 if (candidate.projectedRadiusPixels >= policy.reducedQualityMinPixels) {
20 }
22}
23
24MeshVfxLodDecision makeDecision(std::uint64_t id, MeshVfxLodTier tier, const MeshVfxScalabilityPolicy& policy) {
25 MeshVfxLodDecision decision;
26 decision.stableInstanceId = id;
27 decision.tier = tier;
28 switch (tier) {
30 decision.workUnits = policy.fullWorkUnits;
31 break;
33 decision.workUnits = policy.reducedWorkUnits;
34 decision.trailSampleStride = std::max(1u, policy.reducedTrailSampleStride);
35 decision.meshUpdateInterval = std::max(1u, policy.reducedMeshUpdateInterval);
36 break;
38 decision.workUnits = policy.minimalWorkUnits;
39 decision.trailSampleStride = std::max(1u, policy.minimalTrailSampleStride);
40 decision.meshUpdateInterval = std::max(1u, policy.minimalMeshUpdateInterval);
41 break;
43 break;
44 }
45 return decision;
46}
47
48MeshVfxLodTier degrade(MeshVfxLodTier tier) {
49 switch (tier) {
57 }
59}
60
61} // namespace
62
64
65std::vector<MeshVfxLodDecision>
66MeshVfxScalabilityPlanner::plan(std::span<const MeshVfxLodCandidate> candidates) const {
67 std::vector<MeshVfxLodDecision> decisions;
68 decisions.reserve(candidates.size());
69 for (const auto& candidate : candidates) {
70 decisions.push_back(makeDecision(candidate.stableInstanceId, MeshVfxLodTier::Culled, policy_));
71 }
72
73 std::vector<std::size_t> order(candidates.size());
74 std::iota(order.begin(), order.end(), 0);
75 std::stable_sort(order.begin(), order.end(), [&](std::size_t lhs, std::size_t rhs) {
76 const auto& a = candidates[lhs];
77 const auto& b = candidates[rhs];
78 if (a.priority != b.priority) {
79 return a.priority > b.priority;
80 }
81 if (a.distance != b.distance) {
82 return a.distance < b.distance;
83 }
84 return a.stableInstanceId < b.stableInstanceId;
85 });
86
87 std::uint32_t remaining = policy_.workUnitBudget;
88 for (const auto index : order) {
89 auto tier = requestedTier(candidates[index], policy_);
90 auto decision = makeDecision(candidates[index].stableInstanceId, tier, policy_);
91 while (decision.workUnits > remaining && tier != MeshVfxLodTier::Culled) {
92 tier = degrade(tier);
93 decision = makeDecision(candidates[index].stableInstanceId, tier, policy_);
94 }
95 remaining -= decision.workUnits;
96 decisions[index] = decision;
97 }
98 return decisions;
99}
100
101} // namespace eve::stylize
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
std::vector< std::int32_t > order
std::string id
Definition PlayHost.cpp:108
uint32_t index
MeshVfxScalabilityPlanner(MeshVfxScalabilityPolicy policy={})
Creates a planner with the supplied immutable policy.
std::vector< MeshVfxLodDecision > plan(std::span< const MeshVfxLodCandidate > candidates) const
Plans one frame while preserving the input order in the result.
MeshVfxLodTier
Runtime quality tier selected for one mesh VFX instance.
Global deterministic quality and work budget for mesh VFX.