载入中...
搜索中...
未找到
WaterUnderwaterEffectsBindings.cpp
浏览该文件的文档.
2#include "graphics/Graphics.h"
5
7
8#include <simplesquirrel/simplesquirrel.hpp>
9
10namespace eve::graphics {
11
12void exposeWaterUnderwaterEffectsBindings(ssq::Table& table) {
13 auto gradient = table.addClass("UnderwaterColorGradient", ssq::Class::Ctor<UnderwaterColorGradient()>());
14 gradient.addFunc("addStop", [vm = table.getHandle()](UnderwaterColorGradient* value, float time,
15 float r, float g, float b) {
16 auto result = value ? value->addStop(time, r, g, b)
17 : Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
18 "water.underwater: non-null gradient required"));
19 return eve::script::projectResult(vm, std::move(result));
20 });
21 gradient.addFunc("clear", &UnderwaterColorGradient::clear);
22
23 auto curve = table.addClass("UnderwaterScalarCurve", ssq::Class::Ctor<UnderwaterScalarCurve()>());
24 curve.addFunc("addKey", [vm = table.getHandle()](UnderwaterScalarCurve* value, float time, float sample) {
25 auto result = value ? value->addKey(time, sample)
26 : Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
27 "water.underwater: non-null curve required"));
28 return eve::script::projectResult(vm, std::move(result));
29 });
30 curve.addFunc("clear", &UnderwaterScalarCurve::clear);
31
32 auto settings = table.addClass("WaterUnderwaterSettings", ssq::Class::Ctor<WaterUnderwaterSettings()>());
34 settings.addVar("supportFog", &WaterUnderwaterSettings::supportFog);
35 settings.addVar("supportPostFx", &WaterUnderwaterSettings::supportPostFx);
36 settings.addVar("enableTransitionFx", &WaterUnderwaterSettings::enableTransitionFx);
37 settings.addVar("useCaustics", &WaterUnderwaterSettings::useCaustics);
39 settings.addVar("overrideFogColor", &WaterUnderwaterSettings::overrideFogColor);
41 settings.addVar("fogDistance", &WaterUnderwaterSettings::fogDistance);
42 settings.addVar("hdrpFogDistance", &WaterUnderwaterSettings::hdrpFogDistance);
43 settings.addVar("nearFogDistance", &WaterUnderwaterSettings::nearFogDistance);
44 settings.addVar("fogDensity", &WaterUnderwaterSettings::fogDensity);
45 settings.addVar("playbackVolume", &WaterUnderwaterSettings::playbackVolume);
46 settings.addVar("causticSize", &WaterUnderwaterSettings::causticSize);
47 settings.addVar("framesPerSecond", &WaterUnderwaterSettings::framesPerSecond);
48 settings.addVar("causticTextureCount", &WaterUnderwaterSettings::causticTextureCount);
49 settings.addVar("overrideFogCurve", &WaterUnderwaterSettings::overrideFogCurve);
50 settings.addVar("anisotropyShallow", &WaterUnderwaterSettings::anisotropyShallow);
51 settings.addVar("anisotropyDeep", &WaterUnderwaterSettings::anisotropyDeep);
52 settings.addVar("timeDrivenPostFx", &WaterUnderwaterSettings::timeDrivenPostFx);
53 settings.addVar("constantPostExposure", &WaterUnderwaterSettings::constantPostExposure);
54 settings.addVar("transitionHalfHeight", &WaterUnderwaterSettings::transitionHalfHeight);
55 settings.addVar("transitionBlendDistance", &WaterUnderwaterSettings::transitionBlendDistance);
56 settings.addVar("transitionVignette", &WaterUnderwaterSettings::transitionVignette);
57 settings.addVar("transitionVignetteSmoothness", &WaterUnderwaterSettings::transitionVignetteSmoothness);
58 settings.addVar("transitionLensDistortion", &WaterUnderwaterSettings::transitionLensDistortion);
59 settings.addVar("transitionLensScale", &WaterUnderwaterSettings::transitionLensScale);
60 settings.addFunc("setTransitionLift", [](WaterUnderwaterSettings* value, float r, float g, float b) {
61 value->transitionLift = {r, g, b};
62 });
63 settings.addFunc("setTransitionInverseGamma", [](WaterUnderwaterSettings* value, float r, float g, float b) {
64 value->transitionInverseGamma = {r, g, b};
65 });
66 settings.addFunc("setTransitionGain", [](WaterUnderwaterSettings* value, float r, float g, float b) {
67 value->transitionGain = {r, g, b};
68 });
69 settings.addFunc("setTransitionColorFilter", [](WaterUnderwaterSettings* value, float r, float g, float b) {
70 value->transitionColorFilter = {r, g, b};
71 });
72 settings.addFunc("setFogColorMultiplier", [](WaterUnderwaterSettings* value, float r, float g, float b) {
73 value->fogColorMultiplier = {r, g, b};
74 });
75 settings.addFunc("setOverrideFogMultiplier", [](WaterUnderwaterSettings* value, float r, float g, float b) {
76 value->overrideFogMultiplier = {r, g, b};
77 });
78 settings.addFunc("setConstantPostColor", [](WaterUnderwaterSettings* value, float r, float g, float b) {
79 value->constantPostColor = {r, g, b};
80 });
81
82 auto input = table.addClass("WaterUnderwaterInput", ssq::Class::Ctor<WaterUnderwaterInput()>());
83 input.addVar("cameraY", &WaterUnderwaterInput::cameraY);
84 input.addVar("seaLevel", &WaterUnderwaterInput::seaLevel);
85 input.addVar("timeOfDay", &WaterUnderwaterInput::timeOfDay);
86 input.addVar("causticTicks", &WaterUnderwaterInput::causticTicks);
87 input.addVar("hasMainLight", &WaterUnderwaterInput::hasMainLight);
88 input.addFunc("setMainLightColor", [](WaterUnderwaterInput* value, float r, float g, float b) {
89 value->mainLightColor = {r, g, b};
90 });
91
92 auto state = table.addClass("WaterUnderwaterState", ssq::Class::Ctor<WaterUnderwaterState()>());
93 state.addVar("initialized", &WaterUnderwaterState::initialized);
94 state.addVar("isUnderwater", &WaterUnderwaterState::isUnderwater);
95 state.addVar("causticFrame", &WaterUnderwaterState::causticFrame);
96
97 auto triggerState = table.addClass("WaterUnderwaterDisableTriggerState",
98 ssq::Class::Ctor<WaterUnderwaterDisableTriggerState()>());
99 triggerState.addVar("effectsEnabled", &WaterUnderwaterDisableTriggerState::effectsEnabled);
100 auto triggerEvent = table.addClass("WaterUnderwaterTriggerEvent",
101 ssq::Class::Ctor<WaterUnderwaterTriggerEvent()>());
102 triggerEvent.addVar("sensorTag", &WaterUnderwaterTriggerEvent::sensorTag);
103 triggerEvent.addVar("visitorTag", &WaterUnderwaterTriggerEvent::visitorTag);
104 triggerEvent.addVar("entered", &WaterUnderwaterTriggerEvent::entered);
105 triggerEvent.addVar("exited", &WaterUnderwaterTriggerEvent::exited);
106
107 auto output = table.addClass("WaterUnderwaterOutput", ssq::Class::Ctor<WaterUnderwaterOutput()>());
108#define EV_UW_BOOL(name) output.addVar(#name, &WaterUnderwaterOutput::name)
109 EV_UW_BOOL(isUnderwater); EV_UW_BOOL(entered); EV_UW_BOOL(exited); EV_UW_BOOL(playSubmergeDown);
110 EV_UW_BOOL(playSubmergeUp); EV_UW_BOOL(loopAudio); EV_UW_BOOL(particles); EV_UW_BOOL(horizon);
111 EV_UW_BOOL(surfaceVfx); EV_UW_BOOL(postFx); EV_UW_BOOL(transitionFx); EV_UW_BOOL(caustics);
112#undef EV_UW_BOOL
113 output.addVar("causticFrame", &WaterUnderwaterOutput::causticFrame);
114 output.addVar("causticSize", &WaterUnderwaterOutput::causticSize);
115 output.addVar("fogDensity", &WaterUnderwaterOutput::fogDensity);
116 output.addVar("fogStart", &WaterUnderwaterOutput::fogStart);
117 output.addVar("fogEnd", &WaterUnderwaterOutput::fogEnd);
118 output.addVar("fogHeight", &WaterUnderwaterOutput::fogHeight);
119 output.addVar("depth01", &WaterUnderwaterOutput::depth01);
120 output.addVar("hdrpBaseHeight", &WaterUnderwaterOutput::hdrpBaseHeight);
121 output.addVar("hdrpMeanFreePath", &WaterUnderwaterOutput::hdrpMeanFreePath);
122 output.addVar("hdrpProbeDimmer", &WaterUnderwaterOutput::hdrpProbeDimmer);
123 output.addVar("hdrpAnisotropy", &WaterUnderwaterOutput::hdrpAnisotropy);
124 output.addVar("hdrpDepthExtent", &WaterUnderwaterOutput::hdrpDepthExtent);
125 output.addVar("postExposure", &WaterUnderwaterOutput::postExposure);
126 output.addVar("transitionWeight", &WaterUnderwaterOutput::transitionWeight);
127 output.addVar("transitionVignette", &WaterUnderwaterOutput::transitionVignette);
128 output.addVar("transitionVignetteSmoothness", &WaterUnderwaterOutput::transitionVignetteSmoothness);
129 output.addVar("transitionLensDistortion", &WaterUnderwaterOutput::transitionLensDistortion);
130 output.addVar("transitionLensScale", &WaterUnderwaterOutput::transitionLensScale);
131 output.addFunc("getTransitionLiftR", [](const WaterUnderwaterOutput* value) { return value->transitionLift.r; });
132 output.addFunc("getTransitionInverseGammaR", [](const WaterUnderwaterOutput* value) { return value->transitionInverseGamma.r; });
133 output.addFunc("getTransitionGainR", [](const WaterUnderwaterOutput* value) { return value->transitionGain.r; });
134 output.addFunc("getTransitionColorFilterR", [](const WaterUnderwaterOutput* value) {
135 return value->transitionColorFilter.r;
136 });
137 output.addFunc("getFogR", [](const WaterUnderwaterOutput* value) { return value->fogColor.r; });
138 output.addFunc("getFogG", [](const WaterUnderwaterOutput* value) { return value->fogColor.g; });
139 output.addFunc("getFogB", [](const WaterUnderwaterOutput* value) { return value->fogColor.b; });
140 output.addFunc("getPostR", [](const WaterUnderwaterOutput* value) { return value->postColor.r; });
141 output.addFunc("getPostG", [](const WaterUnderwaterOutput* value) { return value->postColor.g; });
142 output.addFunc("getPostB", [](const WaterUnderwaterOutput* value) { return value->postColor.b; });
143 output.addFunc("getUnderwaterMaterialR", [](const WaterUnderwaterOutput* value) {
144 return value->underwaterMaterialColor.r;
145 });
146 output.addFunc("getUnderwaterMaterialG", [](const WaterUnderwaterOutput* value) {
147 return value->underwaterMaterialColor.g;
148 });
149 output.addFunc("getUnderwaterMaterialB", [](const WaterUnderwaterOutput* value) {
150 return value->underwaterMaterialColor.b;
151 });
152
153 auto surface = table.addClass("WaterSurfaceFogSnapshot", ssq::Class::Ctor<WaterSurfaceFogSnapshot()>());
154 surface.addVar("density", &WaterSurfaceFogSnapshot::density);
155 surface.addVar("start", &WaterSurfaceFogSnapshot::start);
156 surface.addVar("end", &WaterSurfaceFogSnapshot::end);
157 surface.addVar("height", &WaterSurfaceFogSnapshot::height);
158 surface.addVar("heightFalloff", &WaterSurfaceFogSnapshot::heightFalloff);
159 surface.addFunc("setColor", [](WaterSurfaceFogSnapshot* value, float r, float g, float b) {
160 value->color = {r, g, b};
161 });
162
163 auto surfacePostFx = table.addClass("WaterSurfacePostFxSnapshot",
164 ssq::Class::Ctor<WaterSurfacePostFxSnapshot()>());
165 surfacePostFx.addVar("exposureEv", &WaterSurfacePostFxSnapshot::exposureEv);
166 surfacePostFx.addVar("vignette", &WaterSurfacePostFxSnapshot::vignette);
167 surfacePostFx.addVar("vignetteSmoothness", &WaterSurfacePostFxSnapshot::vignetteSmoothness);
168 surfacePostFx.addVar("lensDistortion", &WaterSurfacePostFxSnapshot::lensDistortion);
169 surfacePostFx.addVar("lensScale", &WaterSurfacePostFxSnapshot::lensScale);
170 surfacePostFx.addFunc("setColor", [](WaterSurfacePostFxSnapshot* value, float r, float g,
171 float b) { value->color = {r, g, b}; });
172 surfacePostFx.addFunc("setLiftGammaGain", [](WaterSurfacePostFxSnapshot* value,
173 float lr, float lg, float lb,
174 float gr, float gg, float gb,
175 float ar, float ag, float ab) {
176 value->lift = {lr, lg, lb};
177 value->inverseGamma = {gr, gg, gb};
178 value->gain = {ar, ag, ab};
179 });
180
181 auto surfaceMaterial = table.addClass("WaterSurfaceMaterialSnapshot",
182 ssq::Class::Ctor<WaterSurfaceMaterialSnapshot()>());
183 surfaceMaterial.addVar("alpha", &WaterSurfaceMaterialSnapshot::alpha);
184 surfaceMaterial.addFunc("setColor", [](WaterSurfaceMaterialSnapshot* value, float r, float g,
185 float b) { value->color = {r, g, b}; });
186
187 table.addFunc("advanceWaterUnderwaterEffects",
191 const UnderwaterColorGradient* depthGradient,
192 const UnderwaterColorGradient* timeGradient,
193 const UnderwaterScalarCurve* postExposureCurve,
194 const UnderwaterColorGradient* postColorGradient) {
195 auto result = state && output && settings && input && depthGradient && timeGradient &&
196 postExposureCurve && postColorGradient
197 ? advanceWaterUnderwaterEffects(*state, *output, *settings, *input,
198 *depthGradient, *timeGradient, *postExposureCurve,
199 *postColorGradient)
200 : Result<void>::failure(Diagnostic::error(
201 DiagnosticCode::InvalidArgument, "water.underwater: non-null arguments required"));
202 return eve::script::projectResult(vm, std::move(result));
203 });
204 table.addFunc("advanceWaterUnderwaterDisableTrigger",
205 [vm = table.getHandle()](WaterUnderwaterDisableTriggerState* state,
207 int expectedSensorTag, int expectedVisitorTag) {
208 if (!state || !event)
209 return eve::script::projectResult(
210 vm, Result<void>::failure(Diagnostic::error(
211 DiagnosticCode::InvalidArgument,
212 "water.underwaterTrigger: state and event are required")));
213 return eve::script::projectResult(
214 vm, advanceWaterUnderwaterDisableTrigger(*state, *event, expectedSensorTag,
215 expectedVisitorTag));
216 });
217 table.addFunc("applyWaterUnderwaterFog",
218 [vm = table.getHandle()](Volumetric* volumetric, const WaterUnderwaterOutput* output,
219 const WaterSurfaceFogSnapshot* surface) {
220 auto result = output && surface
221 ? applyWaterUnderwaterFog(volumetric, *output, *surface)
222 : Result<void>::failure(Diagnostic::error(
223 DiagnosticCode::InvalidArgument, "water.underwaterFog: non-null arguments required"));
224 return eve::script::projectResult(vm, std::move(result));
225 });
226 table.addFunc("applyWaterUnderwaterPostFx",
227 [vm = table.getHandle()](Graphics* graphics, Camera3D* camera,
229 const WaterSurfacePostFxSnapshot* surface) {
230 auto result = output && surface
231 ? applyWaterUnderwaterPostFx(graphics, camera, *output, *surface)
232 : Result<void>::failure(Diagnostic::error(
233 DiagnosticCode::InvalidArgument,
234 "water.underwaterPostFx: non-null output and surface required"));
235 return eve::script::projectResult(vm, std::move(result));
236 });
237 table.addFunc("applyWaterUnderwaterHorizon",
238 [vm = table.getHandle()](Renderable3D* horizon,
240 auto result = output ? applyWaterUnderwaterHorizon(horizon, *output)
241 : Result<void>::failure(Diagnostic::error(
242 DiagnosticCode::InvalidArgument,
243 "water.underwaterHorizon: non-null output required"));
244 return eve::script::projectResult(vm, std::move(result));
245 });
246 table.addFunc("applyWaterUnderwaterMaterial",
247 [vm = table.getHandle()](Renderable3D* renderable,
249 const WaterSurfaceMaterialSnapshot* surface) {
250 auto result = output && surface
251 ? applyWaterUnderwaterMaterial(renderable, *output, *surface)
252 : Result<void>::failure(Diagnostic::error(
253 DiagnosticCode::InvalidArgument,
254 "water.underwaterMaterial: output and surface are required"));
255 return eve::script::projectResult(vm, std::move(result));
256 });
257}
258
259} // namespace eve::graphics
double value
std::string output
HSQUIRRELVM vm
Definition ECS.cpp:20
EvpackChunkInput input
Definition Evpack.cpp:170
tensor::Graph g
Definition GpuGraph.cpp:7
float camera[2]
std::uint32_t ab
double r
MeleePoint3 b
Definition MeleeHit.cpp:41
The single Squirrel projection for common Result, Status and Value.
Heightmap curve
TerrainThermalSettings settings
#define EV_UW_BOOL(name)
EVENGINE_API_BACKENDS public API.
EVENGINE_API_BACKENDS public API.
Caller-owned ordered color gradient used for depth or time-of-day fog.
Caller-owned normalized scalar curve used by Pcg underwater post exposure.
Volumetric light + fog.
Definition Volumetric.h:38
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
void exposeWaterUnderwaterEffectsBindings(ssq::Table &table)
Register underwater-effects value types and checked transition with the VM owner thread.
Caller-owned surface fog values restored after leaving or disabling underwater effects.
Caller-owned water-renderable tint restored outside the underwater state.
Caller-owned surface post-processing values restored above water.
Caller-owned enable state driven by Pcg disable-underwater trigger events.
Immutable per-frame water, camera and lighting snapshot.
Effects snapshot for graphics, audio, particles and VFX providers to consume.
Authored Pcg underwater-effects policy; owns no renderer, audio source or scene object.
Persistent caller-owned transition and caustic animation state.
Immutable normalized 3D trigger event snapshot supplied by the physics owner.