载入中...
搜索中...
未找到
GroomInstance.h
浏览该文件的文档.
1#pragma once
2
3#include "common/Result.h"
9
10#include <cstdint>
11#include <vector>
12
13#include <glm/mat4x4.hpp>
14#include <glm/vec3.hpp>
15
16namespace eve::graphics {
17
18class Graphics;
19class Mesh;
20class Shader;
21class Texture;
22
23namespace hair {
24
41public:
43 explicit GroomInstance(Graphics *gfx);
46
47 GroomInstance(const GroomInstance &) = delete;
49
54 [[nodiscard]] Result<void> setAsset(const GroomAsset &asset);
55
57 [[nodiscard]] Result<void> bakeProceduralPlane(float sizeX, float sizeZ,
58 const ProceduralParams &params = {});
59
61 [[nodiscard]] Result<void> bakeProceduralMesh(const float *posXYZ, const float *nrmXYZ,
62 int vertexCount, const uint32_t *indices,
63 int indexCount,
64 const ProceduralParams &params = {});
65
67 void setForcedLod(int lod);
69 [[nodiscard]] int getForcedLod() const;
70
72 void setScreenSize(float screenSize);
74 [[nodiscard]] float getScreenSize() const;
75
77 void setWidthScale(float scale);
79 [[nodiscard]] float getWidthScale() const;
80
82 void setSideHint(float x, float y, float z);
83
88 void setClusterCullingEnabled(bool enabled);
90 [[nodiscard]] bool isClusterCullingEnabled() const;
91
96 [[nodiscard]] Result<void> updateVisibility(const float *viewProj16);
97
102 void setMarschnerLobes(float r, float tt, float trt);
104 [[nodiscard]] float getMarschnerR() const;
106 [[nodiscard]] float getMarschnerTT() const;
108 [[nodiscard]] float getMarschnerTRT() const;
109
117 void setSelfShadow(float strength, float bias, float rootAo);
119 [[nodiscard]] float getSelfShadowStrength() const;
121 [[nodiscard]] float getSelfShadowBias() const;
123 [[nodiscard]] float getRootAoStrength() const;
124
126 [[nodiscard]] Result<void> rebuild();
127
136 [[nodiscard]] Result<void> enableGuideSimulation(const GuideSimParams &params = {},
137 float guideFraction = 0.15f,
138 InterpolationMode mode = InterpolationMode::Offset);
139
141 [[nodiscard]] Result<void> disableGuideSimulation();
142
143 [[nodiscard]] bool isGuideSimulationEnabled() const;
144 void setGuideSimParams(const GuideSimParams &params);
146 [[nodiscard]] const GuideSimParams &getGuideSimParams() const;
147
152 [[nodiscard]] Result<void> update(float dt);
153
154 void draw(const glm::mat4 &model);
156 void draw();
157
159 [[nodiscard]] Mesh *getMesh() const;
161 [[nodiscard]] Shader *getShader() const;
163 [[nodiscard]] Texture *getTexture() const;
165 [[nodiscard]] int getCurveCount() const;
167 [[nodiscard]] int getPointCount() const;
169 [[nodiscard]] size_t getGroupCount() const;
171 [[nodiscard]] int getActiveLodIndex() const;
173 [[nodiscard]] int getActiveRepresentation() const;
175 [[nodiscard]] size_t getClusterCount() const;
177 [[nodiscard]] int getVisibleCurveCount() const;
178
179private:
180 struct GroupCullState {
181 ClusterGrid clusters;
182 std::vector<uint32_t> visibleCurves;
183 bool hasVisibility = false;
184 };
185
186 struct GroupSimState {
187 GuideSimulator simulator;
188 StrandsDatas restStrands;
189 StrandsDatas restGuides;
190 std::vector<StrandGuideWeights> weights;
191 StrandsDatas deformedStrands;
192 bool active = false;
193 };
194
195 [[nodiscard]] Result<void> bakeFromStrands(StrandsDatas strands, const char *debugName);
200 [[nodiscard]] const GroomGroup *primaryGroup() const;
201 [[nodiscard]] size_t resolveLodIndex(const GroomGroup &group) const;
202 [[nodiscard]] StrandsDatas decimatedStrands(const StrandsDatas &src, float curveFraction) const;
203 [[nodiscard]] Result<void> rebuildClusterGrids();
204 [[nodiscard]] Result<void> ensureDrawResources();
205 [[nodiscard]] Result<void> setupGuideSimulation(float guideFraction, InterpolationMode mode);
206 void clearGuideSimulation();
207 void applyShadingParams();
208
209 Graphics *gfx_ = nullptr;
210 GroomAsset asset_;
211 std::vector<GroupCullState> groupCull_;
212 std::vector<GroupSimState> groupSim_;
213 Mesh *mesh_ = nullptr;
214 Shader *shader_ = nullptr;
215 Texture *texture_ = nullptr;
216 int forcedLod_ = -1;
217 int activeLodIndex_ = 0;
218 Representation activeRepresentation_ = Representation::None;
219 float screenSize_ = 1.f;
220 float widthScale_ = 1.f;
221 float clusterCellSize_ = 0.15f;
222 float marschnerR_ = 1.f;
223 float marschnerTT_ = 0.45f;
224 float marschnerTRT_ = 0.25f;
225 float selfShadowStrength_ = 0.35f;
226 float selfShadowBias_ = 0.25f;
227 float rootAoStrength_ = 0.3f;
228 float guideFraction_ = 0.15f;
229 GuideSimParams guideSimParams_{};
230 InterpolationMode guideInterpMode_ = InterpolationMode::Offset;
231 bool clusterCulling_ = false;
232 bool guideSimEnabled_ = false;
233 glm::vec3 sideHint_{1.f, 0.f, 0.f};
234 glm::mat4 lastModel_{1.f};
235};
236
237} // namespace hair
238} // namespace eve::graphics
bool & active
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
building::EdgeCurveGroup group
int strands
#define EVENGINE_API_BACKENDS
Definition Export.h:108
std::uint32_t vertexCount
std::uint32_t indexCount
double r
std::vector< std::uint32_t > indices
std::array< float, 3 > scale
MeshVfxBatchedDraw draw
bool hair
glm::mat4 model
Move-only, checked operation results for the common layer.
int lod
float bias
float weights[3]
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Shared CPU groom container (UE UGroomAsset analogue).
Definition GroomAsset.h:52
Runtime groom drawable (UE UGroomComponent analogue).
GroomInstance & operator=(const GroomInstance &)=delete
GroomInstance(const GroomInstance &)=delete
std::vector< ParamSpec > params
Representation
Geometry representation selected by a groom LOD (UE GeometryType analogue).
Definition GroomAsset.h:14
InterpolationMode
How render strands follow deformed guides (UE interpolation analogue).
Definition Guides.h:19
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
bool enabled
Parameters for growing strands on a triangle mesh (scalp / body).
Definition Procedural.h:16