载入中...
搜索中...
未找到
Mesh.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6#include "graphics/Drawable.h"
7
8#include <cstdint>
9#include <map>
10#include <span>
11#include <string>
12#include <unordered_map>
13#include <vector>
14
15struct aiMesh;
16
17namespace eve::graphics {
18
26public:
27 int indexCount = 0;
28 void *gpuHandle = nullptr; // vulkan::GpuMesh*
30 int gpuVertexCount = 0;
32 bool hasGpuSkinning() const { return gpuSkinned_; }
34 int getSkinPaletteCount() const { return static_cast<int>(skinPalette_.size() / 16u); }
39 [[nodiscard]] Result<void> setSkinPalette(const float* matrices, int matrixCount);
41 const std::vector<float> &skinPalette() const { return skinPalette_; }
43 void markGpuSkinned(bool value) { gpuSkinned_ = value; }
44
48 [[nodiscard]] Result<void> setTexcoordSet(uint32_t set, std::span<const float> values);
50 std::span<const float> texcoordSet(uint32_t set) const;
52 uint64_t texcoordRevision() const { return texcoordRevision_; }
59 float boundsCx = 0.f;
60 float boundsCy = 0.f;
61 float boundsCz = 0.f;
62 float boundsRadius = 0.f;
63
65 bool hasBounds() const { return boundsRadius > 0.f; }
66
68 void computeBounds(const float *posXYZ, int vertexCount);
69
71 void draw(Graphics * /*gfx*/, const glm::mat4 & /*matrix*/) const override {}
77 void drawOcclusion(Graphics *gfx, const glm::mat4 &matrix) const override;
78
79 // ---- morph targets (CPU) ----
81 void clearMorphData();
83 void initMorphBase(int vertexCount, const float *posXYZ, const float *nrmXYZ = nullptr,
84 const float *uvST = nullptr);
87 bool addMorphTarget(const std::string &name, const float *deltaPosXYZ);
89 bool addMorphTargetAbsolute(const std::string &name, const float *absPosXYZ);
90
92 int getVertexCount() const;
94 int getMorphCount() const;
96 std::string getMorphName(int index) const;
98 bool hasMorph(const std::string &name) const;
100 bool setMorphWeight(const std::string &name, float weight);
102 float getMorphWeight(const std::string &name) const;
104 void clearMorphWeights();
106 bool isMorphDirty() const { return morphDirty_; }
108 void markMorphClean() { morphDirty_ = false; }
110 bool hasMorphData() const { return !basePos_.empty(); }
111
113 void computeMorphedPositions(std::vector<float> &outPos, std::vector<float> &outNrm) const;
114
116 const std::vector<float> &baseUv() const { return baseUv_; }
117
119 void captureImportedAttributes(const ::aiMesh &mesh);
130 [[nodiscard]] Result<void> setTangentFrame(std::span<const float> tangents, std::span<const float> bitangents);
137 [[nodiscard]] Result<void> validateTangentFrame(std::span<const float> tangents,
138 std::span<const float> bitangents) const;
147 [[nodiscard]] Result<void> adoptTangentFrame(std::vector<float> &&tangents, std::vector<float> &&bitangents);
156 [[nodiscard]] Result<void> validateMotionHighlights(std::span<const float> values) const;
165 [[nodiscard]] Result<void> adoptMotionHighlights(std::vector<float> &&values);
172 [[nodiscard]] std::span<const float> motionHighlights() const { return motionHighlights_; }
180 [[nodiscard]] Result<void> validateVegetationFactors(std::span<const float> values) const;
189 [[nodiscard]] Result<void> adoptVegetationFactors(std::vector<float> &&values);
191 [[nodiscard]] std::span<const float> vegetationFactors() const { return vegetationFactors_; }
201 [[nodiscard]] Result<void> validateVegetationDeformationFactors(std::span<const float> values) const;
208 [[nodiscard]] Result<void> adoptVegetationDeformationFactors(std::vector<float> &&values);
210 [[nodiscard]] std::span<const float> vegetationDeformationFactors() const { return vegetationDeformationFactors_; }
211 int getUvChannelCount() const { return static_cast<int>(importedUvs_.size()); }
213 int getColorChannelCount() const { return static_cast<int>(importedColors_.size()); }
215 bool hasImportedTangents() const { return !importedTangents_.empty(); }
217 const std::vector<float> &importedUv(int channel) const;
219 const std::vector<float> &importedColor(int channel) const;
221 const std::vector<float> &importedTangents() const { return importedTangents_; }
223 const std::vector<float> &importedBitangents() const { return importedBitangents_; }
224
225private:
226 std::map<uint32_t, std::vector<float>> texcoords_;
227 uint64_t texcoordRevision_ = 0;
228
229 struct MorphTarget {
230 std::string name;
231 std::vector<float> deltaPos; // xyz packed, size = vertexCount*3
232 };
233
234 std::vector<float> basePos_;
235 std::vector<float> baseNrm_;
236 std::vector<float> baseUv_;
237 std::vector<MorphTarget> morphs_;
238 std::unordered_map<std::string, float> morphWeights_;
239 bool morphDirty_ = false;
240 std::vector<std::vector<float>> importedUvs_; // xy packed per channel
241 std::vector<std::vector<float>> importedColors_; // rgba packed per channel
242 std::vector<float> importedTangents_; // xyz packed
243 std::vector<float> importedBitangents_; // xyz packed
244 std::vector<float> motionHighlights_;
245 std::vector<float> vegetationFactors_;
246 std::vector<float> vegetationDeformationFactors_;
247 bool gpuSkinned_ = false;
248 std::vector<float> skinPalette_;
249};
250
251} // namespace eve::graphics
double value
std::map< std::string, Var > values
#define EVENGINE_API_BACKENDS
Definition Export.h:108
std::uint32_t vertexCount
std::uint32_t indexCount
std::string name
Mesh * mesh
Move-only, checked operation results for the common layer.
uint32_t index
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Drawable base (textures, meshes, canvases).
Definition Drawable.h:17
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:25
bool hasMorphData() const
True when morph data.
Definition Mesh.h:110
bool isMorphDirty() const
True when morph dirty.
Definition Mesh.h:106
const std::vector< float > & importedTangents() const
Imported tangents.
Definition Mesh.h:221
const std::vector< float > & skinPalette() const
Packed column-major matrix palette used by graphics backends.
Definition Mesh.h:41
int getUvChannelCount() const
Definition Mesh.h:211
int getColorChannelCount() const
Returns the color channel count.
Definition Mesh.h:213
std::span< const float > motionHighlights() const
Borrow motion-highlight scalars until replacement or mesh destruction.
Definition Mesh.h:172
uint64_t texcoordRevision() const
Revision used to invalidate backend UV uploads after a channel changes.
Definition Mesh.h:52
const std::vector< float > & baseUv() const
Base uv.
Definition Mesh.h:116
void draw(Graphics *, const glm::mat4 &) const override
Draws .
Definition Mesh.h:71
std::span< const float > vegetationDeformationFactors() const
Borrow TVE rest-deformation data until mesh mutation or destruction.
Definition Mesh.h:210
bool hasBounds() const
True when a valid bounding sphere is available for culling.
Definition Mesh.h:65
std::span< const float > vegetationFactors() const
Borrow interleaved variation/occlusion pairs until mesh mutation or destruction.
Definition Mesh.h:191
bool hasImportedTangents() const
True when imported tangents.
Definition Mesh.h:215
bool hasGpuSkinning() const
True after joint and weight data has been uploaded for GPU skinning.
Definition Mesh.h:32
void markGpuSkinned(bool value)
Mark whether the backend vertex stream contains skin attributes.
Definition Mesh.h:43
void markMorphClean()
Mark morph clean.
Definition Mesh.h:108
int getSkinPaletteCount() const
Number of matrices in the current skinning palette.
Definition Mesh.h:34
const std::vector< float > & importedBitangents() const
Imported bitangents.
Definition Mesh.h:223
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25