载入中...
搜索中...
未找到
AnimLattice.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4#include <string>
5#include <vector>
6
7namespace eve::model3d {
8class ModelData;
9}
10
11namespace eve::animation {
12
43public:
44 static constexpr int kMinDivisions = 2;
45
48
50 explicit AnimLattice(int divX, int divY, int divZ);
51
52 AnimLattice(const AnimLattice&) = delete;
54
55 // ---- lattice frame ----
56
58 void setDivisions(int divX, int divY, int divZ);
60 int getDivisionsX() const { return divX_; }
62 int getDivisionsY() const { return divY_; }
64 int getDivisionsZ() const { return divZ_; }
65
67 void setSize(float sx, float sy, float sz);
69 float getSizeX() const { return sizeX_; }
71 float getSizeY() const { return sizeY_; }
73 float getSizeZ() const { return sizeZ_; }
74
76 void setOrigin(float ox, float oy, float oz);
78 float getOriginX() const { return originX_; }
80 float getOriginY() const { return originY_; }
82 float getOriginZ() const { return originZ_; }
83
88 void setClamp(bool clamp) { clamp_ = clamp; }
90 bool getClamp() const { return clamp_; }
91
92 // ---- control points ----
93
95 int getPointCount() const { return static_cast<int>(points_.size()); }
96
98 void setPointScale(int ix, int iy, int iz, float sx, float sy, float sz);
100 void setPointOffset(int ix, int iy, int iz, float dx, float dy, float dz);
101
103 void setScale(float sx, float sy, float sz);
105 void reset();
106
108 float getPointScaleX(int ix, int iy, int iz) const;
110 float getPointScaleY(int ix, int iy, int iz) const;
112 float getPointScaleZ(int ix, int iy, int iz) const;
114 float getPointOffsetX(int ix, int iy, int iz) const;
116 float getPointOffsetY(int ix, int iy, int iz) const;
118 float getPointOffsetZ(int ix, int iy, int iz) const;
119
120 // ---- binding ----
121
127 static AnimLattice* fromModel(const model3d::ModelData* model, int meshIndex, int divX, int divY, int divZ);
128
130 void bindModel(const model3d::ModelData* model, int meshIndex);
131
133 void bindPositions(const float* posXYZ, int count);
134
136 void clearBind();
138 int getVertexCount() const { return vertexCount_; }
139
141 float getBindPositionX(int vertexIndex) const;
143 float getBindPositionY(int vertexIndex) const;
145 float getBindPositionZ(int vertexIndex) const;
146
147 // ---- deformation ----
148
154 void deformPositions(const float* inPosXYZ, float* outPosXYZ, int count) const;
155
157 bool deformPositionsTo(const std::vector<float>& inPosXYZ, std::vector<float>& outPosXYZ) const;
158
164 bool deformNormals(const float* posXYZ, const float* inNrmXYZ, float* outNrmXYZ, int count) const;
165
167 bool updateDeformedPositions(const std::vector<float>& inPosXYZ);
168
170 bool updateDeformedPositions();
171
176 bool updateDeformedNormals(const std::vector<float>& posXYZ, const std::vector<float>& inNrmXYZ);
177
179 bool hasDeformedPositions() const { return deformedValid_; }
180
182 bool hasDeformedNormals() const { return deformedNrmValid_; }
183
185 float getDeformedPositionX(int vertexIndex) const;
187 float getDeformedPositionY(int vertexIndex) const;
189 float getDeformedPositionZ(int vertexIndex) const;
190
192 std::vector<float> getDeformedPositions() const;
194 std::vector<float> getDeformedNormals() const;
195
196private:
197 struct ControlPoint {
198 float ox = 0.f, oy = 0.f, oz = 0.f;
199 float sx = 1.f, sy = 1.f, sz = 1.f;
200 };
201
202 void requirePoint(int ix, int iy, int iz) const;
203 void requireVertex(int vertexIndex) const;
204 int pointIndex(int ix, int iy, int iz) const;
205 void computeCell(float x, float y, float z, int& i0, int& j0, int& k0, float& fu, float& fv, float& fw) const;
206
207 int divX_ = kMinDivisions;
208 int divY_ = kMinDivisions;
209 int divZ_ = kMinDivisions;
210 float sizeX_ = 1.f;
211 float sizeY_ = 1.f;
212 float sizeZ_ = 1.f;
213 float originX_ = 0.f;
214 float originY_ = 0.f;
215 float originZ_ = 0.f;
216 bool clamp_ = true;
217
218 std::vector<ControlPoint> points_;
219 std::vector<float> bindPos_; // xyz packed
220 int vertexCount_ = 0;
221
222 std::vector<float> deformedPos_;
223 std::vector<float> deformedNrm_;
224 bool deformedValid_ = false;
225 bool deformedNrmValid_ = false;
226};
227
228} // namespace eve::animation
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
#define EVENGINE_API_WORLD
Definition Export.h:109
uint32_t i0
Definition Grass.cpp:61
glm::mat4 model
float dz
float dy
float dx
std::uint32_t count
double oy
double ox
CPU 3D lattice scale-deformer (晶格缩放变形).
Definition AnimLattice.h:42
float getSizeZ() const
Returns the size z.
Definition AnimLattice.h:73
AnimLattice(const AnimLattice &)=delete
bool getClamp() const
Returns the clamp.
Definition AnimLattice.h:90
float getOriginZ() const
Returns the origin z.
Definition AnimLattice.h:82
int getDivisionsY() const
Returns the divisions y.
Definition AnimLattice.h:62
float getOriginY() const
Returns the origin y.
Definition AnimLattice.h:80
void setClamp(bool clamp)
When true (default), vertices outside the box are clamped to the boundary cells; when false,...
Definition AnimLattice.h:88
AnimLattice & operator=(const AnimLattice &)=delete
int getDivisionsX() const
Returns the divisions x.
Definition AnimLattice.h:60
int getPointCount() const
Total control point count (divX * divY * divZ).
Definition AnimLattice.h:95
float getSizeY() const
Returns the size y.
Definition AnimLattice.h:71
float getOriginX() const
Returns the origin x.
Definition AnimLattice.h:78
bool hasDeformedPositions() const
True after a successful updateDeformedPositions().
int getDivisionsZ() const
Returns the divisions z.
Definition AnimLattice.h:64
int getVertexCount() const
Returns the vertex count.
float getSizeX() const
Returns the size x.
Definition AnimLattice.h:69
bool hasDeformedNormals() const
True after a successful updateDeformedNormals().
CPU-side decoded 3D model (Assimp scene owned via medialoader::ModelScene). Does not upload to GPU — ...
Definition ModelData.h:39