载入中...
搜索中...
未找到
MeshDeformationSession.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6#include "procgen/MeshBuild.h"
7
8#include <cstdint>
9#include <string_view>
10#include <vector>
11
12namespace eve::procgen {
13
16 float x = 0.f, y = 0.f, z = 0.f;
17};
18
26public:
28 [[nodiscard]] Result<void> initializeResult(const MeshBuild& mesh);
40 [[nodiscard]] Result<void> applyBrushResult(std::string_view mode, float x, float y, float z, float radius,
41 float strength, float falloff, float directionX = 0.f,
42 float directionY = 1.f, float directionZ = 0.f);
44 [[nodiscard]] Result<void> applyBrushGpuResult(std::string_view mode, float x, float y, float z, float radius,
45 float strength, float falloff, float directionX = 0.f,
46 float directionY = 1.f, float directionZ = 0.f);
60 [[nodiscard]] Result<void> applyImpactResult(float x, float y, float z, float impulseX, float impulseY,
61 float impulseZ, float radius, float plasticity, float hardness,
62 float maxDisplacement);
64 [[nodiscard]] Result<void> applyImpactGpuResult(float x, float y, float z, float impulseX, float impulseY,
65 float impulseZ, float radius, float plasticity, float hardness,
66 float maxDisplacement);
68 [[nodiscard]] Result<void> prepareImpactVertexBlocksResult(int divisionsPerAxis);
70 [[nodiscard]] int impactVertexBlockCount() const noexcept;
72 [[nodiscard]] bool hasImpactVertexBlocks() const noexcept { return !impactVertexBlocks_.empty(); }
83 [[nodiscard]] Result<void> applySurfaceContactResult(float x, float y, float z, float normalX, float normalY,
84 float normalZ, float velocityX, float velocityY,
85 float velocityZ, float radius, float depth, float drag,
86 float falloff, float plasticity = 0.f);
93 [[nodiscard]] Result<void> recoverSurfaceResult(float dt, float recoveryRate);
95 [[nodiscard]] Result<void> applySlimeImpulseResult(float x, float y, float z, float impulseX, float impulseY,
96 float impulseZ, float radius, float falloff);
102 [[nodiscard]] Result<void> stepSlimeResult(float dt, float stiffness, float damping, float maxSpeed);
104 [[nodiscard]] Result<void> configureColliderRefreshResult(std::string_view mode, float intervalSeconds,
105 float offsetX = 0.f, float offsetY = 0.f,
106 float offsetZ = 0.f);
108 [[nodiscard]] Result<void> requestColliderRefreshResult();
110 [[nodiscard]] Result<bool> updateColliderRefreshResult(float dt);
112 [[nodiscard]] Result<MeshBuild> colliderMeshResult() const;
114 [[nodiscard]] Result<int> selectVerticesSphereResult(float x, float y, float z, float radius, bool replace = true);
116 [[nodiscard]] Result<int> selectVerticesBoxResult(float minX, float minY, float minZ, float maxX, float maxY,
117 float maxZ, bool replace = true);
119 void clearVertexSelection() noexcept;
121 [[nodiscard]] int selectedVertexCount() const noexcept;
123 [[nodiscard]] Result<MeshVertexSelectionCenter> selectedVertexCenterResult() const;
125 [[nodiscard]] Result<void> moveSelectedVerticesResult(float x, float y, float z);
133 [[nodiscard]] Result<void> manipulateSelectedVerticesResult(std::string_view mode, float originX, float originY,
134 float originZ, float directionX, float directionY,
135 float directionZ, float distance);
137 [[nodiscard]] Result<void> restoreResult();
139 [[nodiscard]] Result<void> bakeResult();
141 [[nodiscard]] Result<void> undoResult();
143 [[nodiscard]] Result<MeshBuild> currentMeshResult() const;
145 [[nodiscard]] std::uint64_t revision() const noexcept { return revision_; }
147 [[nodiscard]] int undoCount() const noexcept { return static_cast<int>(undo_.size()); }
149 [[nodiscard]] bool isInitialized() const noexcept { return initialized_; }
150
151private:
152 struct UndoState {
154 std::vector<float> equilibrium;
155 std::vector<float> velocity;
156 };
157 void pushUndo();
158 void invalidateImpactVertexBlocks() noexcept;
159 [[nodiscard]] std::vector<std::uint32_t> impactCandidates(float x, float y, float z, float radius) const;
160
161 MeshBuild original_;
162 MeshBuild current_;
163 std::vector<float> surfaceEquilibrium_;
164 std::vector<float> surfaceVelocity_;
165 std::vector<std::uint8_t> selectedVertices_;
166 std::vector<std::vector<std::uint32_t>> impactVertexBlocks_;
167 int impactBlockDivisions_ = 0;
168 float impactBlockMinX_ = 0.f, impactBlockMinY_ = 0.f, impactBlockMinZ_ = 0.f;
169 float impactBlockMaxX_ = 0.f, impactBlockMaxY_ = 0.f, impactBlockMaxZ_ = 0.f;
170 std::vector<UndoState> undo_;
171 std::string colliderRefreshMode_ = "manual";
172 float colliderRefreshInterval_ = 0.f;
173 float colliderRefreshAccumulator_ = 0.f;
174 float colliderOffsetX_ = 0.f, colliderOffsetY_ = 0.f, colliderOffsetZ_ = 0.f;
175 bool colliderRefreshConfigured_ = false;
176 bool colliderRefreshPending_ = false;
177 std::uint64_t revision_ = 0;
178 bool initialized_ = false;
179};
180
181} // namespace eve::procgen
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
#define EVENGINE_API_DOMAINS
Definition Export.h:110
float distance
float f
std::uint64_t revision
float radius
Mesh * mesh
Move-only, checked operation results for the common layer.
float offsetX
float offsetY
std::uint32_t depth
Move-only operation result carrying either a value or Status.
Definition Result.h:155
CPU triangle mesh from procedural mesh recipes (e.g. marching cubes). Positions/normals are xyz-packe...
Definition MeshBuild.h:19
Stateful CPU sculpting session with explicit bake, restore, and undo semantics.
bool hasImpactVertexBlocks() const noexcept
Report whether impact queries currently use a prepared vertex-block index.
int undoCount() const noexcept
Return the number of available undo snapshots.
bool isInitialized() const noexcept
Report whether the session has been initialized.
Value-only center of the current runtime vertex selection.