57 [[nodiscard]]
Result<void> bakeProceduralPlane(
float sizeX,
float sizeZ,
61 [[nodiscard]]
Result<void> bakeProceduralMesh(
const float *posXYZ,
const float *nrmXYZ,
67 void setForcedLod(
int lod);
69 [[nodiscard]]
int getForcedLod()
const;
72 void setScreenSize(
float screenSize);
74 [[nodiscard]]
float getScreenSize()
const;
77 void setWidthScale(
float scale);
79 [[nodiscard]]
float getWidthScale()
const;
82 void setSideHint(
float x,
float y,
float z);
88 void setClusterCullingEnabled(
bool enabled);
90 [[nodiscard]]
bool isClusterCullingEnabled()
const;
96 [[nodiscard]]
Result<void> updateVisibility(
const float *viewProj16);
102 void setMarschnerLobes(
float r,
float tt,
float trt);
104 [[nodiscard]]
float getMarschnerR()
const;
106 [[nodiscard]]
float getMarschnerTT()
const;
108 [[nodiscard]]
float getMarschnerTRT()
const;
117 void setSelfShadow(
float strength,
float bias,
float rootAo);
119 [[nodiscard]]
float getSelfShadowStrength()
const;
121 [[nodiscard]]
float getSelfShadowBias()
const;
123 [[nodiscard]]
float getRootAoStrength()
const;
137 float guideFraction = 0.15f,
138 InterpolationMode mode = InterpolationMode::Offset);
143 [[nodiscard]]
bool isGuideSimulationEnabled()
const;
144 void setGuideSimParams(
const GuideSimParams &
params);
146 [[nodiscard]]
const GuideSimParams &getGuideSimParams()
const;
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;
180 struct GroupCullState {
181 ClusterGrid clusters;
182 std::vector<uint32_t> visibleCurves;
183 bool hasVisibility =
false;
186 struct GroupSimState {
187 GuideSimulator simulator;
188 StrandsDatas restStrands;
189 StrandsDatas restGuides;
190 std::vector<StrandGuideWeights>
weights;
191 StrandsDatas deformedStrands;
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();
211 std::vector<GroupCullState> groupCull_;
212 std::vector<GroupSimState> groupSim_;
213 Mesh *mesh_ =
nullptr;
214 Shader *shader_ =
nullptr;
217 int activeLodIndex_ = 0;
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_{};
231 bool clusterCulling_ =
false;
232 bool guideSimEnabled_ =
false;
233 glm::vec3 sideHint_{1.f, 0.f, 0.f};
234 glm::mat4 lastModel_{1.f};