载入中...
搜索中...
未找到
MeshAdhereLive.cpp
浏览该文件的文档.
2
3#include <utility>
4
5namespace eve::procgen {
6
7Result<MeshBuild> meshAdhereResult(const MeshBuild& sourceA, const MeshBuild& surfaceB,
10 adhere.softSnapPositions = true;
11 return meshContactBlendAgainstSurfaceResult(sourceA, surfaceB, adhere);
12}
13
15 if (sourceA.empty() || surfaceB.empty())
17 "mesh adhere requires non-empty source and surface",
18 "activate", {}, "procgen.mesh.adhere"));
19 source_ = sourceA;
20 surface_ = surfaceB;
21 derived_ = {};
22 active_ = true;
23 dirty_ = true;
24 revision_ = 0;
25 params_ = MeshContactBlendParams{};
26 params_.softSnapPositions = true;
27 params_.strength = 1.f;
28 params_.edgeRadius = 0.5f;
29 params_.materialRadius = 0.5f;
30 params_.normalsBlend = 1.f;
31 params_.materialBlend = 1.f;
32 falloffStorage_ = "smooth";
33 params_.falloff = falloffStorage_;
34 return Result<void>::success();
35}
36
38 if (!active_)
40 "mesh adhere session is not active", "params", {},
41 "procgen.mesh.adhere"));
42 if (params.falloff != "smooth" && params.falloff != "linear" && params.falloff != "sharp" &&
43 params.falloff != "sphere")
45 "mesh adhere falloff is invalid", "falloff", {},
46 "procgen.mesh.adhere"));
47 falloffStorage_ = std::string(params.falloff);
48 params_ = params;
49 params_.falloff = falloffStorage_;
50 dirty_ = true;
51 return Result<void>::success();
52}
53
55 if (!active_)
57 "mesh adhere session is not active", "softSnap", {},
58 "procgen.mesh.adhere"));
59 params_.softSnapPositions = enabled;
60 dirty_ = true;
61 return Result<void>::success();
62}
63
65 if (!active_)
67 "mesh adhere session is not active", "surface", {},
68 "procgen.mesh.adhere"));
69 if (surfaceB.empty())
71 "mesh adhere surface is empty", "surface", {},
72 "procgen.mesh.adhere"));
73 surface_ = surfaceB;
74 dirty_ = true;
75 return Result<void>::success();
76}
77
79 if (!active_)
81 "mesh adhere session is not active", "source", {},
82 "procgen.mesh.adhere"));
83 if (sourceA.empty())
85 "mesh adhere source is empty", "source", {},
86 "procgen.mesh.adhere"));
87 source_ = sourceA;
88 dirty_ = true;
89 return Result<void>::success();
90}
91
93 if (!active_)
95 "mesh adhere session is not active", "evaluate", {},
96 "procgen.mesh.adhere"));
97 if (!dirty_ && !force && !derived_.empty()) return Result<std::uint64_t>::success(revision_);
98 auto blended = meshContactBlendAgainstSurfaceResult(source_, surface_, params_);
99 if (!blended.ok()) return Result<std::uint64_t>::failure(blended.status());
100 derived_ = std::move(blended).takeValue();
101 dirty_ = false;
102 ++revision_;
103 return Result<std::uint64_t>::success(revision_);
104}
105
106const MeshBuild* MeshAdhereLive::derivedMesh() const noexcept {
107 return derived_.empty() ? nullptr : &derived_;
108}
109
111 if (!active_)
113 "mesh adhere session is not active", "derived", {},
114 "procgen.mesh.adhere"));
115 if (derived_.empty())
117 "mesh adhere has no derived mesh; evaluate first",
118 "derived", {}, "procgen.mesh.adhere"));
119 return Result<MeshBuild>::success(derived_);
120}
121
122const MeshBuild* MeshAdhereLive::sourceMesh() const noexcept {
123 return source_.empty() ? nullptr : &source_;
124}
125
127 active_ = false;
128 dirty_ = false;
129 revision_ = 0;
130 source_ = {};
131 surface_ = {};
132 derived_ = {};
133 params_ = {};
134}
135
137 auto evaluated = evaluateResult(false);
138 if (!evaluated.ok()) return Result<MeshBuild>::failure(evaluated.status());
139 MeshBuild baked = derived_;
140 removeSetup();
141 return Result<MeshBuild>::success(std::move(baked));
142}
143
144} // namespace eve::procgen
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
Result< void > setSurfaceResult(const MeshBuild &surfaceB)
Replace surface B (e.g. after pose change baked into mesh space). Marks dirty.
const MeshContactBlendParams & params() const noexcept
Result< void > setSoftSnapPositionsResult(bool enabled) noexcept
Soft position snap defaults true for dynamic fusion.
const MeshBuild * derivedMesh() const noexcept
Borrow derived mesh; null until first successful evaluate. @ownership Borrowed from this session; cal...
Result< void > setParamsResult(const MeshContactBlendParams &params)
Result< MeshBuild > bakeToMeshResult()
Freeze current derived (evaluating if dirty) into an owning MeshBuild and deactivate.
const MeshBuild * sourceMesh() const noexcept
Borrow immutable source A baseline; null when inactive or empty. @ownership Borrowed from this sessio...
Result< void > activateResult(const MeshBuild &sourceA, const MeshBuild &surfaceB)
Activate with owning copies of A (movable) and B (surface).
Result< std::uint64_t > evaluateResult(bool force=false)
Recompute derived mesh when dirty (or force).
void removeSetup() noexcept
Drop derived state and restore inactive; keeps no derived publication.
Result< void > setSourceResult(const MeshBuild &sourceA)
Replace source A baseline. Marks dirty.
Result< MeshBuild > derivedMeshResult() const
Owning snapshot of the current derived mesh (session stays active).
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
bool empty() const
Empty.
std::vector< ParamSpec > params
Result< MeshBuild > meshContactBlendAgainstSurfaceResult(const MeshBuild &movable, const MeshBuild &surface, const MeshContactBlendParams &params)
Deform movable toward surface only (dynamic adhere / one-way fusion).
Result< MeshBuild > meshAdhereResult(const MeshBuild &sourceA, const MeshBuild &surfaceB, const MeshContactBlendParams &params)
One-shot adhere of A onto B (soft snap on) using contact blend.
bool enabled
Parameters for contact-band edge and material fusion.
std::string_view falloff
smooth|linear|sharp|sphere