载入中...
搜索中...
未找到
WaterReflectionMasker.cpp
浏览该文件的文档.
2
5#include "image/ImageData.h"
6
7#include <cmath>
8#include <simplesquirrel/simplesquirrel.hpp>
9
10namespace eve::graphics {
11namespace {
12bool finite6(float a,float b,float c,float d,float e,float f) {
13 return std::isfinite(a)&&std::isfinite(b)&&std::isfinite(c)&&std::isfinite(d)&&std::isfinite(e)&&std::isfinite(f);
14}
15} // namespace
16
18 bool reflectionsEnabled) {
19 const int c=static_cast<int>(channel);
20 if(c<0||c>4||!std::isfinite(minimum)||!std::isfinite(maximum)||minimum>maximum)
21 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "valid channel and finite ordered thresholds are required", {}, {},
22 "graphics.waterReflectionMasker"));
23 channel_=channel;minimum_=minimum;maximum_=maximum;enabled_=reflectionsEnabled;
24 heightFeaturesEnabled_=reflectionsEnabled;return Result<void>::success();
25}
26
28 const int width=mask.getWidth(),height=mask.getHeight();
29 if(width<=0||height<=0)return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "mask dimensions must be positive", {}, {},
30 "graphics.waterReflectionMasker"));
31 std::vector<Pixel> next;next.reserve(static_cast<size_t>(width)*static_cast<size_t>(height));
32 for(int y=0;y<height;++y)for(int x=0;x<width;++x){const auto c=mask.getPixel(x,y);next.push_back({c.r,c.g,c.b,c.a});}
33 width_=width;height_=height;pixels_=std::move(next);sampleX_=sampleY_=-1;return Result<void>::success();
34}
35
36void WaterReflectionMasker::clearMask() noexcept { width_=height_=0;pixels_.clear();sampleX_=sampleY_=-1; }
37
39 float terrainX,float terrainZ,float terrainWidth,float terrainDepth,WaterPlanarReflectionSettings& settings) {
40 if(!finite6(playerX,playerZ,terrainX,terrainZ,terrainWidth,terrainDepth)||terrainWidth<=0.f||terrainDepth<=0.f)
41 return Result<WaterReflectionMaskTransition>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "finite player, terrain origin and positive terrain size are required", {}, {},
42 "graphics.waterReflectionMasker"));
43 bool next=false;sampleX_=sampleY_=-1;
44 const float u=(playerX-terrainX)/terrainWidth,v=(playerZ-terrainZ)/terrainDepth;
45 if(!pixels_.empty()&&u>=0.f&&u<=1.f&&v>=0.f&&v<=1.f){
46 const int x=static_cast<int>(std::lround(u*static_cast<float>(width_)));
47 const int y=static_cast<int>(std::lround(v*static_cast<float>(height_)));
48 sampleX_=x;sampleY_=y;
49 if(x>=0&&x<width_&&y>=0&&y<height_){
50 const auto&p=pixels_[static_cast<size_t>(y)*static_cast<size_t>(width_)+static_cast<size_t>(x)];
51 const auto hit=[&](float value){return value>=minimum_&&value<=maximum_;};
52 switch(channel_){case WaterReflectionMaskChannel::R:next=hit(p.r);break;case WaterReflectionMaskChannel::G:next=hit(p.g);break;case WaterReflectionMaskChannel::B:next=hit(p.b);break;case WaterReflectionMaskChannel::A:next=hit(p.a);break;case WaterReflectionMaskChannel::RGBA:next=hit(p.r)||hit(p.g)||hit(p.b)||hit(p.a);break;}
53 }
54 }
56 enabled_=next;heightFeaturesEnabled_=next;settings.enabled=next;
58}
59
60void exposeWaterReflectionMaskerBindings(ssq::Table& table){auto c=table.addClass("WaterReflectionMasker",ssq::Class::Ctor<WaterReflectionMasker()>());auto vm=table.getHandle();
61 c.addFunc("configure",[vm](WaterReflectionMasker*s,int channel,float min,float max,bool enabled){return eve::script::projectResult(vm,s->configure(static_cast<WaterReflectionMaskChannel>(channel),min,max,enabled));});
62 c.addFunc("setMask",[vm](WaterReflectionMasker*s,const image::ImageData* mask){auto r=mask?s->setMask(*mask):Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "ImageData mask is required", {}, {},
63 "graphics.waterReflectionMasker"));return eve::script::projectResult(vm,std::move(r));});
64 c.addFunc("clearMask",[](WaterReflectionMasker*s){s->clearMask();});
65 c.addFunc("evaluate",[vm](WaterReflectionMasker*s,float px,float pz,float tx,float tz,float tw,float td,WaterPlanarReflectionSettings* settings){auto r=settings?s->evaluate(px,pz,tx,tz,tw,td,*settings):Result<WaterReflectionMaskTransition>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "reflection settings are required", {}, {},
66 "graphics.waterReflectionMasker"));return eve::script::projectResult(vm,std::move(r),[](WaterReflectionMaskTransition v){return eve::Value(static_cast<int>(v));});});
67 c.addFunc("getEnabled",[](const WaterReflectionMasker*s){return s->getEnabled();});c.addFunc("getHeightFeaturesEnabled",[](const WaterReflectionMasker*s){return s->getHeightFeaturesEnabled();});c.addFunc("getSampleX",[](const WaterReflectionMasker*s){return s->getSampleX();});c.addFunc("getSampleY",[](const WaterReflectionMasker*s){return s->getSampleY();});}
68
69} // namespace eve::graphics
double value
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
const std::string & s
int mask
float pz
glm::vec4 p[6]
HSQUIRRELVM vm
Definition ECS.cpp:20
float maximum[3]
float minimum[3]
float u
Definition Grass.cpp:233
double r
float v
std::int32_t c
std::vector< Colorf > px
std::uint32_t height
std::uint32_t width
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
float f
bool hit
float d
The single Squirrel projection for common Result, Status and Value.
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.
Definition Diagnostic.h:125
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
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
Own a CPU snapshot of Pcg's planar-reflection mask and evaluate player movement against it.
void clearMask() noexcept
Clear the mask; subsequent evaluations disable reflections when state changes.
Result< void > setMask(const image::ImageData &mask)
Replace the owned mask snapshot from any readable ImageData format.
Result< WaterReflectionMaskTransition > evaluate(float playerX, float playerZ, float terrainX, float terrainZ, float terrainWidth, float terrainDepth, WaterPlanarReflectionSettings &settings)
Sample a player X/Z position in one terrain's origin and size and update planar reflection settings.
Result< void > configure(WaterReflectionMaskChannel channel, float minimum, float maximum, bool reflectionsEnabled)
Configure inclusive thresholds, channel selection and initial scene-profile state.
Represents raw pixel data.
Definition ImageData.h:38
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
WaterReflectionMaskChannel
Pcg ReflectionMasker channel selection.
void exposeWaterReflectionMaskerBindings(ssq::Table &table)
Register Pcg reflection-mask bindings.
WaterReflectionMaskTransition
Observable reflection-state transition after one player-position sample.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
bool enabled
Authored planar-reflection policy with no camera or texture ownership.