载入中...
搜索中...
未找到
CameraController.cpp
浏览该文件的文档.
78bool CameraController::supports(const LogicalId&) const noexcept { return getActionCuesEnabled(); }
82 addImpulse(static_cast<float>(binding.positionAmplitude), static_cast<float>(binding.rotationAmplitude),
84 addFovImpulse(static_cast<float>(binding.fovAmplitude), static_cast<float>(binding.duration.seconds()));
90 if(enabled)cap::addListener<IPhotoModeFieldSink>(this);else cap::removeListener<IPhotoModeFieldSink>(this);
93PhotoModeFieldAcceptance CameraController::acceptsPhotoModeField(const PhotoModeAssignment&a)const noexcept{
94 return a.domain==PhotoModeDomain::Camera||a.domain==PhotoModeDomain::PostFx?PhotoModeFieldAcceptance::Accepted:PhotoModeFieldAcceptance::Rejected;
97 if(!std::isfinite(degrees))return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
104 if(length>1e-6f){forward/=length;glm::vec3 up(0,1,0);if(std::abs(glm::dot(forward,up))>0.999f)up={0,0,-1};
105 glm::vec3 right=glm::normalize(glm::cross(forward,up));up=glm::normalize(glm::cross(right,forward));
111 auto bad=[&](const std::string&m){return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,m,a.field,{},"camera.photoMode"));};
115 auto number=std::get_if<float>(&a.value);if(!number||!std::isfinite(*number))return bad("camera field requires a finite float");
116 if(a.field=="m_fieldOfView"){if(*number<=0||*number>=180)return bad("field of view must be in (0,180)");fovDeg_=*number;cam_->setFov(*number);}
117 else if(a.field=="m_pcgCullinDistance"){pcgCullingDistance_=*number;const float distance=std::max(0.f,cam_->getFarClip()+*number);for(int layer=0;layer<32;++layer)cam_->setLayerCullDistance(layer,distance);}
118 else if(a.field=="m_cameraAperture"){if(*number<=0)return bad("camera aperture must be positive");cam_->setPhysicalLens(*number,cam_->getFocalLength());}
119 else if(a.field=="m_cameraFocalLength"){if(*number<=0)return bad("camera focal length must be positive");cam_->setPhysicalLens(cam_->getAperture(),*number);}
121 else if(a.field=="m_farClipPlane"){if(*number<=cam_->getNearClip())return bad("far clip must exceed near clip");cam_->setClipPlanes(cam_->getNearClip(),*number);const float distance=std::max(0.f,*number+pcgCullingDistance_);for(int layer=0;layer<32;++layer)cam_->setLayerCullDistance(layer,distance);}
127 auto bad=[&](const std::string&m){return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,m,a.field,{},"camera.photoMode.postFx"));};
129 auto number=std::get_if<float>(&a.value);auto integer=std::get_if<int64_t>(&a.value);auto flag=std::get_if<bool>(&a.value);
130 auto finitePositive=[&](float* target){if(!number||!std::isfinite(*number)||*number<=0.f)return false;*target=*number;return true;};
131 auto finiteNonNegative=[&](float* target){if(!number||!std::isfinite(*number)||*number<0.f)return false;*target=*number;return true;};
132 if(a.field=="m_postFXExposure"){if(!number||!std::isfinite(*number))return bad("exposure requires a finite float");next.postFxExposure=*number;}
133 else if(a.field=="m_postFXExposureMode"){if(!integer||*integer<0)return bad("exposure mode requires a non-negative integer");next.postFxExposureMode=*integer;}
134 else if(a.field=="m_dofActive"){if(!flag)return bad("depth-of-field active requires a bool");next.depthOfFieldActive=*flag;}
135 else if(a.field=="m_autoDOFFocus"){if(!flag)return bad("automatic focus requires a bool");next.autoDepthOfFieldFocus=*flag;}
136 else if(a.field=="m_dofFocusDistance"){if(!finitePositive(&next.focusDistance))return bad("focus distance must be positive and finite");}
137 else if(a.field=="m_dofAperture"){if(!finitePositive(&next.aperture))return bad("aperture must be positive and finite");}
138 else if(a.field=="m_dofFocalLength"){if(!finitePositive(&next.focalLength))return bad("focal length must be positive and finite");}
139 else if(a.field=="m_dofKernelSize"){if(!integer||*integer<0||*integer>3)return bad("kernel size must be in [0,3]");next.kernelSize=*integer;}
140 else if(a.field=="m_savedDofFocusMode"){if(!integer||*integer<0)return bad("saved focus mode requires a non-negative integer");next.savedFocusMode=*integer;}
141 else if(a.field=="m_dofFocusModeHDRP"){if(!integer||*integer<0)return bad("HDRP focus mode requires a non-negative integer");next.focusModeHdrp=*integer;}
142 else if(a.field=="m_dofFocusModeURP"){if(!integer||*integer<0)return bad("URP focus mode requires a non-negative integer");next.focusModeUrp=*integer;}
143 else if(a.field=="m_dofQualityHDRP"){if(!integer||*integer<0)return bad("HDRP quality requires a non-negative integer");next.qualityHdrp=*integer;}
144 else if(a.field=="m_dofNearBlurStart"){if(!finiteNonNegative(&next.nearBlurStart))return bad("near blur start must be finite and non-negative");}
145 else if(a.field=="m_dofNearBlurEnd"){if(!finiteNonNegative(&next.nearBlurEnd))return bad("near blur end must be finite and non-negative");}
146 else if(a.field=="m_dofFarBlurStart"){if(!finiteNonNegative(&next.farBlurStart))return bad("far blur start must be finite and non-negative");}
147 else if(a.field=="m_dofFarBlurEnd"){if(!finiteNonNegative(&next.farBlurEnd))return bad("far blur end must be finite and non-negative");}
148 else if(a.field=="m_dofStartBlurURP"){if(!finiteNonNegative(&next.blurStartUrp))return bad("URP blur start must be finite and non-negative");}
149 else if(a.field=="m_dofEndBlurURP"){if(!finiteNonNegative(&next.blurEndUrp))return bad("URP blur end must be finite and non-negative");}
150 else if(a.field=="m_dofMaxRadiusBlur"){if(!finiteNonNegative(&next.maximumBlurRadius))return bad("maximum blur radius must be finite and non-negative");}
151 else if(a.field=="m_dofHighQualityURP"){if(!flag)return bad("URP high quality requires a bool");next.highQualityUrp=*flag;}
191void CameraController::setLookAhead(float x, float y, float z) { lookAhead_ = glm::vec3(x, y, z); }
208 return mode == "follow" || mode == "orbit" || mode == "topdown" || mode == "firstperson" || mode == "cinematic" ||
218void CameraController::setRadius(float r) { radius_ = glm::clamp(r, minimumRadius_, maximumRadius_); }
221 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "camera radius limits are invalid", "camera.radiusLimits"));
252void CameraController::setPositionSmooth(float damping) { positionSmooth_ = std::max(0.f, damping); }
253void CameraController::setTargetSmooth(float damping) { targetSmooth_ = std::max(0.f, damping); }
255void CameraController::setMaxSpeed(float unitsPerSec) { maxSpeed_ = std::max(0.f, unitsPerSec); }
258void CameraController::setCollisionRadius(float radius) { collisionRadius_ = std::max(0.f, radius); }
259void CameraController::setCollisionRecovery(float damping) { collisionRecovery_ = std::max(0.f, damping); }
263void CameraController::addCollisionBox(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) {
287 auto it = std::find_if(rigs_.begin(), rigs_.end(), [&](const Rig& r) { return r.name == name; });
333 auto it = std::find_if(rigs_.begin(), rigs_.end(), [&](const Rig& r) { return r.name == name && r.enabled; });
368void CameraController::addImpulse(float positionAmplitude, float rotationAmplitude, float duration, unsigned int seed) {
378void CameraController::addView(const std::string& name, float ex, float ey, float ez, float tx, float ty, float tz) {
454 const bool known = std::any_of(rigs_.begin(), rigs_.end(), [&](const Rig& r) { return r.name == rigName; });
463bool CameraController::addTimelineEvent(float time, const std::string& name, const std::string& data) {
507std::string CameraController::getTimelineEventData() const { return consumedTimelineEventData_; }
508int CameraController::getPendingTimelineEventCount() const { return static_cast<int>(pendingTimelineEvents_.size()); }
527 << ",\"fov\":" << rig.fov << ",\"smooth\":" << rig.smooth << ",\"maxSpeed\":" << rig.maxSpeed << '}';
612 if (!item.isObject() || !addTimelineFloat(item.getFloat("time", -1.f), item.getString("property"),
625 for (const std::string property : {"fov", "radius", "smooth", "compositionX", "compositionY"}) {
654 const glm::vec3 observed(node.getWorldPositionX(), node.getWorldPositionY(), node.getWorldPositionZ());
661 if (length > deadZone_ && length > 1e-6f) deadZoneTarget_ += delta * ((length - deadZone_) / length);
783 const glm::vec3 noise(std::sin(phase * 1.13f), std::sin(phase * 1.71f + 2.f), std::sin(phase * 2.07f + 4.f));
797 std::remove_if(impulses_.begin(), impulses_.end(), [](const Impulse& i) { return i.age >= i.duration; }),
823 glm::vec3 dir(std::cos(pitch) * std::sin(yaw), std::sin(pitch), std::cos(pitch) * std::cos(yaw));
958 "CameraController", std::function<CameraController*()>([]() { return new CameraController(); }), true);
965 cc.addFunc("getPhotoModeAuthority", [](const CameraController* self){return self->getPhotoModeAuthority();});
966 cc.addFunc("setCameraRoll", [vm=table.getHandle()](CameraController* self,float value){return eve::script::projectResult(vm,self->setCameraRoll(value));});
968 cc.addFunc("getPcgCullingDistance", [](const CameraController* self){return self->getPcgCullingDistance();});
979 cc.addFunc("hasSecondaryTarget", [](const CameraController* self) { return self->hasSecondaryTarget(); });
The single Squirrel projection for common Result, Status and Value.
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
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
void setCollisionMask(uint64_t maskBits)
Sets the Box3D category mask used by dynamic obstruction queries.
Definition CameraController.cpp:260
bool deserializeAsset(const std::string &json)
Replaces rigs and timeline data from a versioned JSON asset.
Definition CameraController.cpp:556
void setEventSink(platform_event::PlatformEvent *sink)
Sets the event sink.
Definition CameraController.cpp:472
bool supports(const LogicalId &cue) const noexcept override
Accept every project-defined camera cue while explicitly enabled.
Definition CameraController.cpp:78
void addView(const std::string &name, float ex, float ey, float ez, float tx, float ty, float tz)
Adds view.
Definition CameraController.cpp:378
float getSecondaryTargetX() const
Definition CameraController.cpp:203
Result< void > setCameraRoll(float degrees)
Set finite camera roll in degrees.
Definition CameraController.cpp:96
bool addTimelineCut(float time, const std::string &rigName, float blendTime)
Adds timeline cut.
Definition CameraController.cpp:452
void setActionCuesEnabled(bool enabled)
Opt this controller into or out of action camera-cue dispatch.
Definition CameraController.cpp:70
bool setRigEnabled(const std::string &name, bool enabled)
Sets the rig enabled.
Definition CameraController.cpp:303
std::string serializeAsset() const
Serializes rigs and timeline data as a versioned JSON asset.
Definition CameraController.cpp:512
bool addTimelineFloat(float time, const std::string &property, float value)
Adds a linearly interpolated camera property key.
Definition CameraController.cpp:440
void setComposition(float screenX, float screenY)
Screen-space composition offset, expressed as normalized view fractions.
Definition CameraController.cpp:239
Result< void > setRadiusLimits(float minimum, float maximum)
Set inclusive orbit zoom limits atomically.
Definition CameraController.cpp:219
Result< void > trigger(const action::ActionCameraCueBinding &binding, const action::ActionNotifyContext &context) override
Convert one action cue into deterministic positional, rotational and FOV impulses.
Definition CameraController.cpp:80
void setSecondaryTarget(float x, float y, float z)
Store a world-space lock-on look target for mode "lockon".
Definition CameraController.cpp:193
void seekTimeline(float time, bool fireEvents=false)
Seeks timeline.
Definition CameraController.cpp:485
void addInput(float yawDeltaDeg, float pitchDeltaDeg, float zoomDelta)
Applies device-independent yaw, pitch and zoom deltas.
Definition CameraController.cpp:231
bool getActionCuesEnabled() const
Return whether this controller is currently registered for action cues.
Definition CameraController.cpp:64
int getPendingTimelineEventCount() const
Returns the pending timeline event count.
Definition CameraController.cpp:508
bool addRig(const std::string &name, const std::string &mode, int priority)
Adds rig.
Definition CameraController.cpp:272
void setCollisionIgnoredBody(int bodyId)
Excludes one Box3D body id, normally the followed player body.
Definition CameraController.cpp:261
void setCollisionEnabled(bool enabled)
Enables swept-sphere obstruction against boxes registered below.
Definition CameraController.cpp:257
void setPhotoModeAuthority(bool enabled)
Register or revoke this controller as the sole photo-mode camera authority.
Definition CameraController.cpp:88
void addFovImpulse(float degrees, float duration)
Adds fov impulse.
Definition CameraController.cpp:372
void addImpulse(float positionAmplitude, float rotationAmplitude, float duration, unsigned int seed=0)
Adds a damped positional/rotational camera impulse.
Definition CameraController.cpp:368
Result< void > applyPhotoModeField(const PhotoModeAssignment &assignment) override
Apply one camera assignment atomically to this controller and its bound Camera3D.
Definition CameraController.cpp:110
std::string getTimelineEventData() const
Returns the timeline event data.
Definition CameraController.cpp:507
void setLookAhead(float x, float y, float z)
follow:额外的视线前移点(可让镜头看向玩家前方)。
Definition CameraController.cpp:191
void setTargetNode(scene::SceneNodeRef *node)
Follow a stable scene-node handle. nullptr restores explicit coordinates.
Definition CameraController.cpp:180
void clearSecondaryTarget()
Forget the lock-on look target; lockon then falls back to offset/yaw follow.
Definition CameraController.cpp:198
bool switchTo(const std::string &name, float blendTime)
Switch to.
Definition CameraController.cpp:387
void setOffset(float x, float y, float z)
follow:摄像机相对 target 的偏移(默认 (0, 2, 6))。
Definition CameraController.cpp:189
bool saveRigState(const std::string &name)
Stores the controller's current framing/lens parameters in a rig preset.
Definition CameraController.cpp:312
bool setRigPriority(const std::string &name, int priority)
Sets the rig priority.
Definition CameraController.cpp:294
PhotoModeFieldAcceptance acceptsPhotoModeField(const PhotoModeAssignment &assignment) const noexcept override
Return whether this controller owns a photo-mode camera assignment.
Definition CameraController.cpp:93
bool activateRig(const std::string &name, float blendTime)
Activate rig.
Definition CameraController.cpp:332
void setDeadZone(float radius)
Dead-zone radius in world units around the tracked target.
Definition CameraController.cpp:243
void addCollisionBox(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)
Adds collision box.
Definition CameraController.cpp:263
void setCollisionRecovery(float damping)
Sets the collision recovery.
Definition CameraController.cpp:259
bool addTimelineEvent(float time, const std::string &name, const std::string &data)
Adds timeline event.
Definition CameraController.cpp:463
摄像机模块命名空间(eve.Camera)。主要职责是把 CameraController 绑定进脚本。
Definition CameraController.h:436
void setDepthOfField(float focusDistance, float maxBlurPx, float focusRange=8.f)
Configure Gaussian depth-of-field on the final HDR resolve.
Definition RenderSystem3D.cpp:316
float getFocalLength()
Return physical-camera focal length in millimetres.
Definition RenderSystem3D.cpp:252
void setLayerCullDistance(int layer, float distance)
Set the camera cull distance for one render layer; zero disables the override.
Definition RenderSystem3D.cpp:253
void setUp(float x, float y, float z)
Definition RenderSystem3D.cpp:219
void setPhysicalLens(float aperture, float focalLength)
Set positive physical-camera aperture and focal length metadata.
Definition RenderSystem3D.cpp:244
void setExposure(float ev)
Set exposure compensation in photographic stops. Positive values brighten.
Definition RenderSystem3D.cpp:294
void setAutoExposure(bool enabled, float minEV=-8.f, float maxEV=8.f)
Enable log-average automatic exposure and set its EV clamp range.
Definition RenderSystem3D.cpp:298
void setTarget(float x, float y, float z)
Definition RenderSystem3D.cpp:208
void clearDepthOfField()
Disable depth-of-field while retaining the current focus settings.
Definition RenderSystem3D.cpp:323
void setEye(float x, float y, float z)
Definition RenderSystem3D.cpp:197
void setClipPlanes(float nearZ, float farZ)
Set positive near/far clipping distances; far is kept beyond near.
Definition RenderSystem3D.cpp:237
static Document parse(const std::string &text, std::string *error=nullptr)
Parse.
Definition Json.cpp:581
void pushData(std::string name, std::string data="")
Script helper: pushes an event with an optional string payload.
Definition PlatformEvent.cpp:47
Script handle to a scene node (hostName + nodeId). Deliberately holds strings rather than arena point...
Definition SceneNodeRef.h:20
std::vector< double > forward(const Policy &p, const Observation &o)
Forward.
Definition Learning.h:65
Definition CameraController.cpp:20
void exposePcgFreeCameraBindings(ssq::Table &t)
Register Pcg free-camera bindings.
Definition PcgFreeCamera.cpp:13
void exposePcgCarCameraSetupBindings(ssq::Table &t)
Register Pcg vehicle camera bindings.
Definition PcgCarCameraSetup.cpp:88
constexpr HexDirection next(HexDirection d) noexcept
The next direction clockwise (NW wraps to NE).
Definition HexMetrics.h:76
@ InvalidArgument
@ Applied
PhotoModeFieldAcceptance
Capability implemented by the composition root that routes assignments to domain owners.
Definition PcgPhotoModeApply.h:32
@ Accepted
@ Rejected
@ Camera
@ PostFx
Closest hit returned by the optional camera-obstruction provider.
Definition CameraObstruction.h:10
One reversible field assignment in a photo-mode transaction.
Definition PcgPhotoModeApply.h:15
Owning validated camera impulse shared by action runtime and camera targets.
Definition ActionCameraBlock.h:14
Context linking a routed event to its action execution.
Definition ActionNotifyRegistry.h:34