载入中...
搜索中...
未找到
AnimSkin.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
6#include "common/Result.h"
7
8#include <array>
9#include <memory>
10#include <string>
11#include <vector>
12
13namespace eve::model3d {
14class ModelData;
15}
16
17namespace eve::graphics {
18class Graphics;
19class Mesh;
20} // namespace eve::graphics
21
22namespace eve::animation {
23
24class AnimSkeleton;
25class AnimPose;
26
29 int vertexCount = 0;
30 std::vector<float> bindPositions;
31 std::vector<float> bindNormals;
32 std::vector<int> skeletonBones;
33 std::vector<std::string> boneNames;
34 std::vector<std::array<float, 16>> inverseBindMatrices;
35 std::vector<int> vertexSkinJoints;
36 std::vector<float> vertexWeights;
37};
38
48public:
49 static constexpr int kMaxInfluences = 4;
50
52 AnimSkin() = default;
54 ~AnimSkin() = default;
55
56 AnimSkin(const AnimSkin&) = delete;
57 AnimSkin& operator=(const AnimSkin&) = delete;
58
64 static AnimSkin* fromModel(const model3d::ModelData* model, int meshIndex, const AnimSkeleton* skeleton);
65
72 [[nodiscard]] static Result<std::unique_ptr<AnimSkin>> fromStreams(AnimSkinStreamData streams);
73
74 int getVertexCount() const { return vertexCount_; }
76 int getBoneCount() const { return static_cast<int>(skeletonBone_.size()); }
78 int getInfluenceCount() const { return kMaxInfluences; }
79
81 int getSkeletonBone(int skinBoneIndex) const;
83 std::string getSkinBoneName(int skinBoneIndex) const;
84
86 float getInverseBindElement(int skinBoneIndex, int elementIndex) const;
87
94 bool updateMatrixPalette(const AnimPose* pose) const;
96 float getMatrixPaletteElement(int skinBoneIndex, int elementIndex) const;
98 bool bindGpuMesh(graphics::Graphics* gfx, graphics::Mesh* mesh);
100 bool updateGpuMesh(graphics::Mesh* mesh, const AnimPose* pose) const;
101
107 void skinPositions(const AnimPose* pose, float* outPosXYZ) const;
108
113 bool skinPositionsTo(const AnimPose* pose, std::vector<float>& outPosXYZ) const;
114
119 bool updateSkinnedPositions(const AnimPose* pose);
120
122 bool hasSkinnedPositions() const { return skinnedValid_; }
123
125 float getSkinnedPositionX(int vertexIndex) const;
127 float getSkinnedPositionY(int vertexIndex) const;
129 float getSkinnedPositionZ(int vertexIndex) const;
130
135 std::vector<float> getSkinnedPositions() const;
136
143 bool updateSkinnedNormals(const AnimPose* pose);
144
146 bool hasSkinnedNormals() const { return skinnedNrmValid_; }
147
149 std::vector<float> getSkinnedNormals() const;
150
158 bool applyToMesh(graphics::Graphics* gfx, graphics::Mesh* mesh, const AnimPose* pose);
159
161 float getBindPositionX(int vertexIndex) const;
163 float getBindPositionY(int vertexIndex) const;
165 float getBindPositionZ(int vertexIndex) const;
166
168 int getVertexBone(int vertexIndex, int influenceIndex) const;
170 int getVertexSkinJoint(int vertexIndex, int influenceIndex) const;
172 float getVertexWeight(int vertexIndex, int influenceIndex) const;
173
174private:
175 struct Influence {
176 int bone = -1; // index into skeletonBone_ / inverseBind_
177 float weight = 0.f;
178 };
179
180 void requireVertex(int vertexIndex) const;
181 void requireSkinBone(int skinBoneIndex) const;
182
183 int vertexCount_ = 0;
184 std::vector<float> bindPos_; // xyz packed
185 std::vector<Influence> influences_; // vertexCount_ * kMaxInfluences
186 std::vector<int> skeletonBone_; // skin joint → skeleton bone
187 std::vector<std::string> skinBoneNames_;
188 std::vector<Mat4> inverseBind_;
189 std::vector<float> bindNrm_; // xyz packed, may be empty
190 std::vector<float> skinnedPos_; // xyz packed cache
191 std::vector<float> skinnedNrm_; // xyz packed cache
192 mutable std::vector<Mat4> skinMatrices_; // reused per-frame palette scratch
193 mutable std::vector<float> normalMatrices_; // reused 3x3 palette scratch
194 mutable bool matrixPaletteValid_ = false;
195 bool skinnedValid_ = false;
196 bool skinnedNrmValid_ = false;
197};
198
199} // namespace eve::animation
eve::EntitySpatialPose pose
#define EVENGINE_API_WORLD
Definition Export.h:109
std::uint32_t bone
Mesh * mesh
glm::mat4 model
Move-only, checked operation results for the common layer.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Evaluated local (and optional world) pose for an AnimSkeleton. Script type: AnimPose.
Definition AnimPose.h:17
3D bone hierarchy + bind-pose local TRS for skeletal animation. Independent of ik::Skeleton3D (FABRIK...
CPU linear-blend skinning binding for one mesh against an AnimSkeleton.
Definition AnimSkin.h:47
int getBoneCount() const
Returns the bone count.
Definition AnimSkin.h:76
bool hasSkinnedPositions() const
True after a successful updateSkinnedPositions().
Definition AnimSkin.h:122
AnimSkin & operator=(const AnimSkin &)=delete
AnimSkin(const AnimSkin &)=delete
int getInfluenceCount() const
Returns the influence count.
Definition AnimSkin.h:78
bool hasSkinnedNormals() const
True after a successful updateSkinnedNormals().
Definition AnimSkin.h:146
AnimSkin()=default
Anim skin.
int getVertexCount() const
Definition AnimSkin.h:74
~AnimSkin()=default
Anim skin.
GPU mesh handle (+ optional CPU morph targets).
Definition Mesh.h:25
CPU-side decoded 3D model (Assimp scene owned via medialoader::ModelScene). Does not upload to GPU — ...
Definition ModelData.h:39
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
Owned native streams for constructing a skin outside the model importer.
Definition AnimSkin.h:28
std::vector< std::array< float, 16 > > inverseBindMatrices
Definition AnimSkin.h:34
std::vector< int > vertexSkinJoints
Definition AnimSkin.h:35
std::vector< std::string > boneNames
Definition AnimSkin.h:33
std::vector< int > skeletonBones
Definition AnimSkin.h:32
std::vector< float > bindPositions
Definition AnimSkin.h:30
std::vector< float > bindNormals
Definition AnimSkin.h:31
std::vector< float > vertexWeights
Definition AnimSkin.h:36