载入中...
搜索中...
未找到
PcgInteriorWeatherVolume.cpp
浏览该文件的文档.
2
3#include <cmath>
4
5namespace eve::weather {
6namespace {
7bool validMode(int mode) {
8 return mode == static_cast<int>(PcgInteriorWeatherMode::Collision) ||
9 mode == static_cast<int>(PcgInteriorWeatherMode::DisableVfx);
10}
11bool finite3(float x, float y, float z) {
12 return std::isfinite(x) && std::isfinite(y) && std::isfinite(z);
13}
14} // namespace
15
16Result<void> PcgInteriorWeatherVolume::configureBox(float centerX, float centerY, float centerZ,
17 float sizeX, float sizeY, float sizeZ,
18 int mode, int interiorReverbPreset,
19 int exteriorReverbPreset) {
20 if (!finite3(centerX, centerY, centerZ) || !finite3(sizeX, sizeY, sizeZ) ||
21 sizeX <= 0.f || sizeY <= 0.f || sizeZ <= 0.f)
22 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "box center and positive dimensions must be finite",
23 "weather.interiorVolume"));
24 if (!validMode(mode) || interiorReverbPreset < 0 || exteriorReverbPreset < 0)
25 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "mode and reverb preset identifiers are invalid",
26 "weather.interiorVolume"));
28 mode_ = static_cast<PcgInteriorWeatherMode>(mode);
29 centerX_ = centerX; centerY_ = centerY; centerZ_ = centerZ;
30 extentX_ = sizeX * .5f; extentY_ = sizeY * .5f; extentZ_ = sizeZ * .5f;
31 interiorReverbPreset_ = interiorReverbPreset;
32 exteriorReverbPreset_ = exteriorReverbPreset;
33 return Result<void>::success();
34}
35
36Result<void> PcgInteriorWeatherVolume::configureSphere(float centerX, float centerY, float centerZ,
37 float radius, int mode,
38 int interiorReverbPreset,
39 int exteriorReverbPreset) {
40 if (!finite3(centerX, centerY, centerZ) || !std::isfinite(radius) || radius <= 0.f)
41 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "sphere center and positive radius must be finite",
42 "weather.interiorVolume"));
43 if (!validMode(mode) || interiorReverbPreset < 0 || exteriorReverbPreset < 0)
44 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "mode and reverb preset identifiers are invalid",
45 "weather.interiorVolume"));
47 mode_ = static_cast<PcgInteriorWeatherMode>(mode);
48 centerX_ = centerX; centerY_ = centerY; centerZ_ = centerZ;
49 extentX_ = radius; extentY_ = radius; extentZ_ = radius;
50 interiorReverbPreset_ = interiorReverbPreset;
51 exteriorReverbPreset_ = exteriorReverbPreset;
52 return Result<void>::success();
53}
54
55bool PcgInteriorWeatherVolume::contains(float x, float y, float z) const noexcept {
56 if (!finite3(x, y, z)) return false;
57 const float dx = x - centerX_, dy = y - centerY_, dz = z - centerZ_;
59 return dx * dx + dy * dy + dz * dz <= extentX_ * extentX_;
60 return std::fabs(dx) <= extentX_ && std::fabs(dy) <= extentY_ &&
61 std::fabs(dz) <= extentZ_;
62}
63} // namespace eve::weather
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float radius
float dz
float dy
float dx
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
PcgInteriorWeatherMode mode() const noexcept
Mode.
Result< void > configureBox(float centerX, float centerY, float centerZ, float sizeX, float sizeY, float sizeZ, int mode, int interiorReverbPreset, int exteriorReverbPreset)
Configure an axis-aligned box atomically. Dimensions must be finite and positive.
bool contains(float x, float y, float z) const noexcept
Return whether a finite world-space position lies inside, including the boundary.
int exteriorReverbPreset() const noexcept
Exterior reverb preset.
Result< void > configureSphere(float centerX, float centerY, float centerZ, float radius, int mode, int interiorReverbPreset, int exteriorReverbPreset)
Configure a sphere atomically. Radius must be finite and positive.
int interiorReverbPreset() const noexcept
Interior reverb preset.
PcgInteriorWeatherMode
Interior precipitation policy mirrored from Pcg.