载入中...
搜索中...
未找到
DepthOfFieldFocus.cpp
浏览该文件的文档.
2#include <algorithm>
3#include <cmath>
4namespace eve::graphics {
7 if (!state || !output || !settings || !input)
9 Diagnostic::error(DiagnosticCode::InvalidArgument, "graphics.depthOfFieldFocus: objects required"));
10 const bool finite = std::isfinite(settings->focusOffset) && std::isfinite(settings->maximumDistance) &&
11 std::isfinite(settings->aperture) && std::isfinite(settings->focalLength) &&
12 std::isfinite(settings->response) && std::isfinite(input->rayHitDistance) &&
13 std::isfinite(input->targetDistance) && std::isfinite(input->deltaSeconds);
14 if (!finite || settings->maximumDistance < 0.f || settings->aperture <= 0.f || settings->focalLength <= 0.f ||
15 settings->response < 0.f || input->deltaSeconds < 0.f || input->rayHitDistance < 0.f ||
16 input->targetDistance < 0.f || settings->tracking < 0 || settings->tracking > 2)
18 Diagnostic::error(DiagnosticCode::InvalidArgument, "graphics.depthOfFieldFocus: invalid finite settings"));
21 result.active = settings->enabled;
22 result.aperture = settings->aperture;
23 result.focalLength = settings->focalLength;
24 if (!next.initialized) {
25 next.initialized = true;
26 next.maximumExceeded = true;
27 next.focusDistance = settings->maximumDistance;
28 }
29 float target = next.focusDistance;
30 const auto tracking = static_cast<DepthOfFieldTracking>(settings->tracking);
31 if (tracking == DepthOfFieldTracking::FixedOffset) {
32 target = settings->focusOffset;
33 next.maximumExceeded = false;
34 } else if (tracking == DepthOfFieldTracking::FollowTarget) {
35 if (input->hasTarget) {
36 target = input->targetDistance + settings->focusOffset;
37 next.maximumExceeded = false;
38 }
39 } else if (input->hasRayHit) {
40 if (settings->interactWithPlayer && input->hitPlayer) {
41 target = settings->maximumDistance;
42 next.maximumExceeded = true;
43 } else {
44 target = input->rayHitDistance + settings->focusOffset;
45 next.maximumExceeded = false;
46 }
47 } else if (next.maximumExceeded)
48 target = settings->maximumDistance;
50 next.focusDistance = target;
51 else {
52 const float t = std::clamp(input->deltaSeconds * settings->response, 0.f, 1.f);
53 next.focusDistance += (target - next.focusDistance) * t;
54 }
55 next.focusDistance = std::max(0.f, next.focusDistance);
56 result.focusDistance = next.focusDistance;
57 *state = next;
58 *output = result;
59 return Result<void>::success();
60}
61} // namespace eve::graphics
LogicalId target
std::string output
EvpackChunkInput input
Definition Evpack.cpp:170
bool finite
float t
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
卡牌游戏 UI 工具模块:工厂 + 脚本绑定入口。 功能参考 ycarowr/UiCard:扇形手牌布局、抽牌/洗牌、悬浮放大、拖拽到落牌区、 敌方手牌(背面/偷看)、费用不足置灰,以及可实时调节的布局...
Definition Animation.h:25
DepthOfFieldTracking
Pcg-compatible autofocus tracking mode.
Result< void > evaluateDepthOfFieldFocus(DepthOfFieldFocusState *state, DepthOfFieldFocusOutput *output, const DepthOfFieldFocusSettings *settings, const DepthOfFieldFocusInput *input)
Evaluate Pcg AutoDepthOfField tracking and smoothing for one frame.
One frame of caller-owned raycast or target observations.
Focus and lens values ready for a depth-of-field renderer.
Provider-neutral autofocus configuration.
Persistent autofocus state owned by the caller.