7const std::array<const char *, 32> kParamSlots = {
8 "time",
"frameDuration",
"grassWidth",
"grassHeight",
"alphaCutoff",
"alwaysDark",
9 "lightGreenX",
"lightGreenY",
"lightGreenZ",
"darkGreenX",
"darkGreenY",
"darkGreenZ",
10 "frameCount",
"atlasCols",
"atlasRows",
"grassVariantCount",
"leafVariantCount",
"leafRowOffset",
11 "windDirectionX",
"windDirectionY",
"windDirectionZ",
"windStrength",
"windPhase",
"windDistance",
12 "windFlexX",
"windFlexY",
"windFlexZ",
"windFrequencyX",
"windFrequencyY",
"windFrequencyZ",
13 "windSinQuarter",
"windSinFull"};
18 if (index < 0 || index >=
int(kParamSlots.size()))
return {};
19 return kParamSlots[size_t(
index)];
24 shader->declareFloat(
"time");
25 shader->declareFloat(
"frameDuration");
26 shader->declareFloat(
"grassWidth");
27 shader->declareFloat(
"grassHeight");
28 shader->declareFloat(
"alphaCutoff");
29 shader->declareFloat(
"alwaysDark");
30 shader->declareVec3(
"lightGreen");
31 shader->declareVec3(
"darkGreen");
32 shader->declareFloat(
"frameCount");
33 shader->declareFloat(
"atlasCols");
34 shader->declareFloat(
"atlasRows");
35 shader->declareFloat(
"grassVariantCount");
36 shader->declareFloat(
"leafVariantCount");
37 shader->declareFloat(
"leafRowOffset");
38 shader->declareVec4(
"windGlobals");
39 shader->declareVec2(
"windPhaseDistance");
40 shader->declareVec3(
"windFlex");
41 shader->declareVec3(
"windFrequency");
42 shader->declareVec2(
"windSineTime");
43 shader->sendVec4(
"windGlobals", 0, 0, 0, 0);
44 shader->sendVec2(
"windPhaseDistance", 0, 0);
45 shader->sendVec3(
"windFlex", 0.8f, 1.15f, 0.1f);
46 shader->sendVec3(
"windFrequency", 0.25f, 0.5f, 1.3f);
47 shader->sendVec2(
"windSineTime", 0, 0);
48 shader->sendFloat(
"time", 0.f);
49 shader->sendFloat(
"frameDuration", 0.12f);
50 shader->sendFloat(
"grassWidth", 0.62f);
51 shader->sendFloat(
"grassHeight", 0.95f);
52 shader->sendFloat(
"alphaCutoff", 0.35f);
53 shader->sendFloat(
"alwaysDark", 0.f);
54 shader->sendVec3(
"lightGreen", 0.58f, 0.84f, 0.26f);
55 shader->sendVec3(
"darkGreen", 0.10f, 0.28f, 0.12f);
56 shader->sendFloat(
"frameCount", 4.f);
57 shader->sendFloat(
"atlasCols", 2.f);
58 shader->sendFloat(
"atlasRows", 2.f);
59 shader->sendFloat(
"grassVariantCount", 1.f);
60 shader->sendFloat(
"leafVariantCount", 1.f);
61 shader->sendFloat(
"leafRowOffset", 0.f);
66 shader->sendFloat(
"time",
s.snowMinimumHeight);
67 shader->sendFloat(
"frameDuration",
s.normalStrength);
68 shader->sendFloat(
"alphaCutoff",
s.alphaCutoff);
69 shader->sendVec3(
"lightGreen",
s.baseR,
s.baseG,
s.baseB);
70 shader->sendVec3(
"darkGreen",
s.snowR,
s.snowG,
s.snowB);
71 shader->sendFloat(
"frameCount", -1.f);
72 shader->sendFloat(
"atlasCols",
s.renderDistance);
73 shader->sendFloat(
"atlasRows",
s.fadeRange);
74 shader->sendFloat(
"grassVariantCount",
s.snowFadeDistance);
75 shader->sendFloat(
"leafVariantCount",
s.snowProgress);
76 shader->sendFloat(
"leafRowOffset", std::floor(
s.hardRenderDistance) +
s.density * 0.5f);
80 switch (resolutionPerPatch) {
92 if (!std::isfinite(
settings.pcgDetailDistance) || !std::isfinite(
settings.pcgFadeoutDistance) ||
93 settings.unityDetailDistance < 0 ||
settings.unityDetailDistance > 8388607 ||
94 !std::isfinite(
settings.unityDetailDensity) ||
98 auto candidate = foliage;
100 candidate.fadeRange = std::max(
settings.pcgFadeoutDistance, 0.f);
101 candidate.hardRenderDistance = float(
settings.unityDetailDistance);
102 candidate.density =
settings.unityDetailDensity;
TerrainThermalSettings settings
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
EVENGINE_API_FOUNDATION public API.
Move-only operation result carrying either a value or Status.
static Result success(T value)
Construct a successful result owning value.
static Result failure(Status status)
Construct a failed result from a structured status.
t3ssel8r-style stylized grass.
EVENGINE_API_BACKENDS TerrainDetailQuality terrainDetailQuality(int resolutionPerPatch) noexcept
Classify a Unity terrain detail patch resolution with Pcg's exact default mapping.
EVENGINE_API_BACKENDS void bindFoliage(Shader *shader, const GrassFoliageSettings &settings)
Select the static foliage profile and copy its validated surface parameters.
EVENGINE_API_BACKENDS int paramCount()
Param count.
TerrainDetailQuality
Pcg quality category derived from detailResolutionPerPatch.
EVENGINE_API_BACKENDS std::string paramName(int index)
Param name.
EVENGINE_API_BACKENDS void bindDefaults(Shader *shader)
Binds defaults.
EVENGINE_API_BACKENDS Result< int > applyTerrainDetailOverwrite(GrassFoliageSettings &foliage, const TerrainDetailOverwriteSettings &settings)
Validate and copy TerrainDetailOverwrite distances/density into a foliage profile atomically.
Pcg-style static foliage surface controls packed into the grass shader profile. Values are copied dur...
Runtime terrain-detail overrides kept distinct from foliage material settings.