载入中...
搜索中...
未找到
ScenePhysicsPlacement.cpp
浏览该文件的文档.
28 finite(value.rotationY) && finite(value.rotationZ) && finite(value.scaleX) && finite(value.scaleY) &&
33 return glm::quat(glm::vec3(static_cast<float>(value.rotationX), static_cast<float>(value.rotationY),
47 static std::vector<PhysicsPlacementCollider> selectedColliders(const PhysicsPlacementObject& object,
115 explicit Impl(PhysicsPlacementRequest value) : request(std::move(value)), world(0.0f, 0.0f, 0.0f, false) {}
128 static_cast<float>(request.settings.softCollision ? request.settings.contactDampingRatio : 1.0),
136 auto* rawBody = world.newBody(object.selected ? "dynamic" : "static", static_cast<float>(transform.x),
159 runtime.body->setLinearDamping(static_cast<float>(dropping ? 0.6 : request.settings.linearDamping));
162 runtime.body->setMotionLocks(request.settings.freezePositionX, request.settings.freezePositionY,
189 return editing::failed<void>(editing::Status::Failed, editing::RuleId("scene.physics-placement.build"),
197 glm::dvec3 initialHandle{0.0};
199 glm::quat initialHandleRotation{1.0f, 0.0f, 0.0f, 0.0f};
200 glm::quat handleRotation{1.0f, 0.0f, 0.0f, 0.0f};
201 glm::dvec3 initialHandleScale{1.0};
202 glm::dvec3 handleScale{1.0};
204 glm::vec3 surfaceNormal{0.0f, 1.0f, 0.0f};
208ScenePhysicsPlacementBackend::ScenePhysicsPlacementBackend(std::unique_ptr<Impl> impl) : impl_(std::move(impl)) {}
211editing::Result<std::unique_ptr<ScenePhysicsPlacementBackend>> ScenePhysicsPlacementBackend::create(
220 if (std::find(object.tags.begin(), object.tags.end(), required) == object.tags.end()) return false;
251 request.settings.maximumAngularSpeed <= 0.0 || !finite(request.settings.minimumBoundsSpeedFactor) ||
252 request.settings.minimumBoundsSpeedFactor <= 0.0 || !finite(request.settings.maximumBoundsSpeedFactor) ||
265 const bool validHull = object.shape != PhysicsPlacementShape::ConvexHull || !object.colliders.empty() ||
272 !colliders.empty() && std::all_of(colliders.begin(), colliders.end(), [](const auto& collider) {
276 const bool validPose = finite(collider.localX) && finite(collider.localY) && finite(collider.localZ) &&
286 if (object.object.empty() || !ids.insert(object.object).second || !finiteTransform(object.transform) ||
289 object.transform.scaleX == 0.0 || object.transform.scaleY == 0.0 || object.transform.scaleZ == 0.0 ||
301 const auto primary = std::find_if(request.objects.begin(), request.objects.end(), [&](const auto& object) {
311 if (!built.ok()) return editing::Result<std::unique_ptr<ScenePhysicsPlacementBackend>>::failure(built.status());
313 std::unique_ptr<ScenePhysicsPlacementBackend>(new ScenePhysicsPlacementBackend(std::move(impl))));
316std::unique_ptr<editor::IEditorSimulationBackend> ScenePhysicsPlacementBackend::cloneForPreview() const {
329editing::Result<void> ScenePhysicsPlacementBackend::setHandlePosition(double x, double y, double z) {
331 return editing::failed<void>(editing::Status::Rejected, editing::RuleId("scene.physics-placement.handle"),
337editing::Result<void> ScenePhysicsPlacementBackend::setHandleRotation(double x, double y, double z) {
346editing::Result<void> ScenePhysicsPlacementBackend::setHandleScale(double x, double y, double z) {
348 return editing::failed<void>(editing::Status::Rejected, editing::RuleId("scene.physics-placement.handle-scale"),
354editing::Result<void> ScenePhysicsPlacementBackend::alignHandleToSurface(double fromX, double fromY, double fromZ,
357 if (!finite(fromX) || !finite(fromY) || !finite(fromZ) || !finite(toX) || !finite(toY) || !finite(toZ) ||
359 return editing::failed<void>(editing::Status::Rejected, editing::RuleId("scene.physics-placement.surface-ray"),
362 impl_->world.rayCastAll(static_cast<float>(fromX), static_cast<float>(fromY), static_cast<float>(fromZ),
393 const glm::vec3 groupOffset = delta * glm::vec3(static_cast<float>(transform.x - impl_->initialHandle.x),
397 const glm::vec3 half(static_cast<float>(object.admitted.halfExtentX * std::abs(transform.scaleX)),
416 return editing::failed<void>(editing::Status::Failed, editing::RuleId("scene.physics-placement.surface-align"),
421editing::Result<void> ScenePhysicsPlacementBackend::step(std::uint64_t tick, double fixedDelta) {
423 return editing::failed<void>(editing::Status::Rejected, editing::RuleId("scene.physics-placement.step"),
427 const glm::quat delta = glm::normalize(impl_->handleRotation * glm::inverse(impl_->initialHandleRotation));
491 const double bound = std::max({object.admitted.halfExtentX * 2.0, object.admitted.halfExtentY * 2.0,
503 object.body->setRotation(targetRotation.x, targetRotation.y, targetRotation.z, targetRotation.w);
533 return editing::failed<void>(editing::Status::Failed, editing::RuleId("scene.physics-placement.advance"),
Backend-neutral, observable fixed-step contract for physics domains.
Common time values and an injectable deterministic simulation clock.
static Result< Duration > fromSeconds(double seconds)
Convert finite seconds to the nearest nanosecond.
Definition Time.cpp:16
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create pr...
Definition Body3D.h:24
3D shape (box/sphere/capsule) attached to a Body3D with material settings. Created via Body3D::new*Sh...
Definition Shape3D.h:25
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
editing::Result< PhysicsPlacementFrame > placementFrame() const
Capture all admitted objects, retaining bounds and selection metadata.
Definition ScenePhysicsPlacement.cpp:557
editing::Revision sourceRevision() const noexcept
Revision copied from the scene when this candidate was admitted.
Definition ScenePhysicsPlacement.cpp:593
editing::Result< std::vector< editor::SimulationObjectSample > > capture() const override
Capture stable selected-object transforms for generic preview tooling.
Definition ScenePhysicsPlacement.cpp:538
editing::Result< void > alignHandleToSurface(double fromX, double fromY, double fromZ, double toX, double toY, double toZ, double offset=0.0)
Align selection up to the nearest non-selected ray hit and place it outside the surface.
Definition ScenePhysicsPlacement.cpp:354
std::unique_ptr< editor::IEditorSimulationBackend > cloneForPreview() const override
Rebuild an independent preview with the same admitted scene and handle.
Definition ScenePhysicsPlacement.cpp:316
editing::Result< void > setHandlePosition(double x, double y, double z)
Move the shared world-space placement handle without advancing simulation.
Definition ScenePhysicsPlacement.cpp:329
editing::Result< void > setHandleScale(double x, double y, double z)
Scale the shared placement handle, resizing selected colliders without advancing simulation.
Definition ScenePhysicsPlacement.cpp:346
editing::Result< void > step(std::uint64_t tick, double fixedDelta) override
Advance exactly one increasing fixed tick.
Definition ScenePhysicsPlacement.cpp:421
~ScenePhysicsPlacementBackend() override
Scene physics placement backend.
static editing::Result< std::unique_ptr< ScenePhysicsPlacementBackend > > create(PhysicsPlacementRequest request)
Validate and build an isolated placement world.
Definition ScenePhysicsPlacement.cpp:211
editing::Result< void > setHandleRotation(double x, double y, double z)
Rotate the shared placement handle using XYZ Euler radians without advancing simulation.
Definition ScenePhysicsPlacement.cpp:337
Result< T > failed(Status status, eve::DiagnosticCode code, RuleId rule, std::string message)
Construct a failed editing result with explicit status and diagnostic categories.
Definition EditingResult.h:70
Definition SceneEditorModule.cpp:18
PhysicsPlacementColliderPolicy
Policy deciding which admitted collider sources participate in preview.
Definition ScenePhysicsPlacement.h:26
Definition Container.h:602
Stable transform sample captured from one simulation object.
Definition EditorSimulationPreview.h:15
Validated solver policy for one simulation step.
Definition SimulationBackend.h:120
double rotationY
Definition SceneEditingCommands.h:15
double rotationZ
Definition SceneEditingCommands.h:16
double rotationX
Definition SceneEditingCommands.h:14
One local-space shape in a possibly compound placement collider.
Definition ScenePhysicsPlacement.h:29
double halfExtentY
Definition ScenePhysicsPlacement.h:33
double localRotationX
Definition ScenePhysicsPlacement.h:38
int convexMaxVertices
Definition ScenePhysicsPlacement.h:42
double localZ
Definition ScenePhysicsPlacement.h:37
double localRotationZ
Definition ScenePhysicsPlacement.h:40
double localX
Definition ScenePhysicsPlacement.h:35
double localY
Definition ScenePhysicsPlacement.h:36
double halfExtentX
Definition ScenePhysicsPlacement.h:32
double localRotationY
Definition ScenePhysicsPlacement.h:39
double halfExtentZ
Definition ScenePhysicsPlacement.h:34
std::vector< float > convexVertices
Definition ScenePhysicsPlacement.h:41
PhysicsPlacementShape shape
Definition ScenePhysicsPlacement.h:30
Captured placement state suitable for drawing and final transaction planning.
Definition ScenePhysicsPlacement.h:119
double surfaceNormalY
Definition ScenePhysicsPlacement.h:125
bool surfaceAligned
Definition ScenePhysicsPlacement.h:123
bool colliding
Definition ScenePhysicsPlacement.h:121
std::uint64_t tick
Definition ScenePhysicsPlacement.h:120
std::vector< PhysicsPlacementObject > objects
Definition ScenePhysicsPlacement.h:127
double surfaceNormalZ
Definition ScenePhysicsPlacement.h:126
double surfaceNormalX
Definition ScenePhysicsPlacement.h:124
Scene object and collision approximation admitted into an isolated placement preview.
Definition ScenePhysicsPlacement.h:46
scene_editing::SceneTransformValue transform
Definition ScenePhysicsPlacement.h:48
bool selected
Definition ScenePhysicsPlacement.h:52
Owning request used to construct one isolated placement candidate.
Definition ScenePhysicsPlacement.h:110
Definition ScenePhysicsPlacement.cpp:40
std::unique_ptr< physics::Body3D > body
Definition ScenePhysicsPlacement.cpp:42
PhysicsPlacementObject admitted
Definition ScenePhysicsPlacement.cpp:41
std::vector< std::unique_ptr< physics::Shape3D > > shapes
Definition ScenePhysicsPlacement.cpp:43
glm::dvec3 appliedScale
Definition ScenePhysicsPlacement.cpp:44
Impl(PhysicsPlacementRequest value)
Definition ScenePhysicsPlacement.cpp:115
std::vector< RuntimeObject > objects
Definition ScenePhysicsPlacement.cpp:196
editing::Result< void > build()
Definition ScenePhysicsPlacement.cpp:117
physics::World3D world
Definition ScenePhysicsPlacement.cpp:195
static std::vector< PhysicsPlacementCollider > selectedColliders(const PhysicsPlacementObject &object, PhysicsPlacementColliderPolicy policy)
Definition ScenePhysicsPlacement.cpp:47
static std::unique_ptr< physics::Shape3D > createShape(physics::Body3D &body, const PhysicsPlacementCollider &collider, const glm::dvec3 &scale)
Definition ScenePhysicsPlacement.cpp:82
PhysicsPlacementRequest request
Definition ScenePhysicsPlacement.cpp:194