载入中...
搜索中...
未找到
GrassParameters.cpp
浏览该文件的文档.
1#include <array>
2#include <cmath>
3#include "common/Exception.h"
4#include "graphics/Grass.h"
5namespace eve::graphics::grass {
6namespace {
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"};
14}
15int paramCount() { return int(kParamSlots.size()); }
16
17std::string paramName(int index) {
18 if (index < 0 || index >= int(kParamSlots.size())) return {};
19 return kParamSlots[size_t(index)];
20}
21
23 if (!shader) throw eve::Exception("grass::bindDefaults: null shader");
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);
62}
63
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);
77}
78
79TerrainDetailQuality terrainDetailQuality(int resolutionPerPatch) noexcept {
80 switch (resolutionPerPatch) {
81 case 2: return TerrainDetailQuality::Ultra2;
83 case 8: return TerrainDetailQuality::High8;
84 case 16: return TerrainDetailQuality::Medium16;
85 case 32: return TerrainDetailQuality::Low32;
86 default: return TerrainDetailQuality::VeryLow64;
87 }
88}
89
92 if (!std::isfinite(settings.pcgDetailDistance) || !std::isfinite(settings.pcgFadeoutDistance) ||
93 settings.unityDetailDistance < 0 || settings.unityDetailDistance > 8388607 ||
94 !std::isfinite(settings.unityDetailDensity) ||
95 settings.unityDetailDensity < 0 || settings.unityDetailDensity > 1)
97 DiagnosticCode::InvalidArgument, "grass.detailOverwrite: valid distance and density required"));
98 auto candidate = foliage;
99 candidate.renderDistance = std::max(settings.pcgDetailDistance, 0.f);
100 candidate.fadeRange = std::max(settings.pcgFadeoutDistance, 0.f);
101 candidate.hardRenderDistance = float(settings.unityDetailDistance);
102 candidate.density = settings.unityDetailDensity;
103 foliage = candidate;
104 return Result<int>::success(static_cast<int>(terrainDetailQuality(settings.detailResolutionPerPatch)));
105}
106
107} // namespace eve::graphics::grass
const std::string & s
Shader * shader
TerrainThermalSettings settings
uint32_t index
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.
Definition Diagnostic.h:125
EVENGINE_API_FOUNDATION public API.
Definition Exception.h:13
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Custom GPU program.
Definition Shader.h:39
t3ssel8r-style stylized grass.
Definition Grass.cpp:28
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.
Definition Grass.h:64
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...
Definition Grass.h:40
Runtime terrain-detail overrides kept distinct from foliage material settings.
Definition Grass.h:55