From 5fbb71053cc97000c4d4354b123b93081beb3ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tur=C3=A1nszki=20J=C3=A1nos?= Date: Thu, 10 Apr 2025 08:35:15 +0200 Subject: [PATCH] added slider constraint --- Content/models/constraint_test.wiscene | Bin 43082 -> 62328 bytes Editor/ConstraintWindow.cpp | 16 ++++++++++++++++ WickedEngine/wiPhysics_Jolt.cpp | 15 +++++++++++++++ WickedEngine/wiScene.h | 2 +- WickedEngine/wiScene_Components.h | 22 ++++++++++++++++++---- WickedEngine/wiScene_Serializers.cpp | 10 ++++++++++ WickedEngine/wiVersion.cpp | 2 +- 7 files changed, 61 insertions(+), 6 deletions(-) diff --git a/Content/models/constraint_test.wiscene b/Content/models/constraint_test.wiscene index 024f4f318035a8fbb0fb4a5984a67585e066a6d1..fc3dcccd6a6a197dd9af5017dc09ecd7e15a79b0 100644 GIT binary patch delta 36964 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 p4#R}rMxhl70MH^qR-O#{vmm+5YG_ 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 ZP?J4?u&^Saj{+V31PvWaqR|XT(qF<3T`>Rv diff --git a/Editor/ConstraintWindow.cpp b/Editor/ConstraintWindow.cpp index 7dedf8181..1882d05c6 100644 --- a/Editor/ConstraintWindow.cpp +++ b/Editor/ConstraintWindow.cpp @@ -85,6 +85,7 @@ void ConstraintWindow::Create(EditorComponent* _editor) typeComboBox.AddItem("Cone", (uint64_t)PhysicsConstraintComponent::Type::Cone); typeComboBox.AddItem("Six DOF", (uint64_t)PhysicsConstraintComponent::Type::SixDOF); typeComboBox.AddItem("Swing Twist", (uint64_t)PhysicsConstraintComponent::Type::SwingTwist); + typeComboBox.AddItem("Slider", (uint64_t)PhysicsConstraintComponent::Type::Slider); typeComboBox.OnSelect([&](wi::gui::EventArgs args) { wi::scene::Scene& scene = editor->GetCurrentScene(); for (auto& x : editor->translator.selected) @@ -158,6 +159,9 @@ void ConstraintWindow::Create(EditorComponent* _editor) case PhysicsConstraintComponent::Type::SwingTwist: physicscomponent->swing_twist.min_twist_angle = wi::math::DegreesToRadians(args.fValue); break; + case PhysicsConstraintComponent::Type::Slider: + physicscomponent->slider_constraint.min_limit = args.fValue; + break; default: break; } @@ -186,6 +190,9 @@ void ConstraintWindow::Create(EditorComponent* _editor) case PhysicsConstraintComponent::Type::SwingTwist: physicscomponent->swing_twist.max_twist_angle = wi::math::DegreesToRadians(args.fValue); break; + case PhysicsConstraintComponent::Type::Slider: + physicscomponent->slider_constraint.max_limit = args.fValue; + break; default: break; } @@ -560,6 +567,14 @@ void ConstraintWindow::SetEntity(Entity entity) minSlider.SetValue(physicsComponent->distance_constraint.min_distance); maxSlider.SetValue(physicsComponent->distance_constraint.max_distance); break; + case PhysicsConstraintComponent::Type::Slider: + minSlider.SetText("Min limit: "); + maxSlider.SetText("Max limit: "); + minSlider.SetRange(-10, 0); + maxSlider.SetRange(0, 10); + minSlider.SetValue(physicsComponent->slider_constraint.min_limit); + maxSlider.SetValue(physicsComponent->slider_constraint.max_limit); + break; case PhysicsConstraintComponent::Type::Hinge: minSlider.SetText("Min angle: "); maxSlider.SetText("Max angle: "); @@ -684,6 +699,7 @@ void ConstraintWindow::ResizeLayout() switch (physicsComponent->type) { case PhysicsConstraintComponent::Type::Distance: + case PhysicsConstraintComponent::Type::Slider: case PhysicsConstraintComponent::Type::Hinge: minSlider.SetVisible(true); maxSlider.SetVisible(true); diff --git a/WickedEngine/wiPhysics_Jolt.cpp b/WickedEngine/wiPhysics_Jolt.cpp index f8cdbc22c..1be526673 100644 --- a/WickedEngine/wiPhysics_Jolt.cpp +++ b/WickedEngine/wiPhysics_Jolt.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -1072,6 +1073,15 @@ namespace wi::physics settings.mTwistMaxAngle = physicscomponent.swing_twist.max_twist_angle; physicsobject.constraint = settings.Create(*body1, *body2); } + else if (physicscomponent.type == PhysicsConstraintComponent::Type::Slider) + { + SliderConstraintSettings settings; + settings.mSpace = EConstraintSpace::WorldSpace; + settings.mPoint1 = settings.mPoint2 = cast(transform.GetPosition()); + settings.mSliderAxis1 = settings.mSliderAxis2 = cast(transform.GetRight()).Normalized(); + settings.mNormalAxis1 = settings.mNormalAxis2 = cast(transform.GetUp()).Normalized(); + physicsobject.constraint = settings.Create(*body1, *body2); + } else { wilog("Constraint creation failed: constraint type is not valid!"); @@ -2053,6 +2063,11 @@ namespace wi::physics ptr->SetTwistMinAngle(physicscomponent.swing_twist.min_twist_angle); ptr->SetTwistMaxAngle(physicscomponent.swing_twist.max_twist_angle); } + else if (physicscomponent.type == PhysicsConstraintComponent::Type::Slider) + { + SliderConstraint* ptr = ((SliderConstraint*)constraint.constraint.GetPtr()); + ptr->SetLimits(physicscomponent.slider_constraint.min_limit, physicscomponent.slider_constraint.max_limit); + } } }); diff --git a/WickedEngine/wiScene.h b/WickedEngine/wiScene.h index f78d4fcec..371b77007 100644 --- a/WickedEngine/wiScene.h +++ b/WickedEngine/wiScene.h @@ -63,7 +63,7 @@ namespace wi::scene wi::ecs::ComponentManager& voxel_grids = componentLibrary.Register("wi::scene::Scene::voxel_grids"); wi::ecs::ComponentManager& metadatas = componentLibrary.Register("wi::scene::Scene::metadatas"); wi::ecs::ComponentManager& characters = componentLibrary.Register("wi::scene::Scene::characters"); - wi::ecs::ComponentManager& constraints = componentLibrary.Register("wi::scene::Scene::constraints", 3); // version = 3 + wi::ecs::ComponentManager& constraints = componentLibrary.Register("wi::scene::Scene::constraints", 4); // version = 4 // Non-serialized attributes: float dt = 0; diff --git a/WickedEngine/wiScene_Components.h b/WickedEngine/wiScene_Components.h index b8ea77094..b8f2e7cb4 100644 --- a/WickedEngine/wiScene_Components.h +++ b/WickedEngine/wiScene_Components.h @@ -536,15 +536,23 @@ namespace wi::scene }; uint32_t _flags = EMPTY; + // Note: the constraint axes are taken from the TransformComponent on the constraint's entity + // RIGHT axis means X axis in the default orientation + // UP axis means Y axis in the default orientation + // + // The constraints are created in world space from the current TransformComponent orientation + // To issue recreation of the constraint, reset the physicsobject pointer of this structure + // To only refresh cosntraint settings without recreating the constraint, use SetRefreshParametersNeeded(true) enum class Type { Fixed, // fixed in place completely Point, // fixed to a point but can rotate around it Distance, // point constraint within specified distance Hinge, // rotation around a point on the UP axis of the contraint transform - Cone, // constrain to a cone shape specified by the cone angle + Cone, // constrain to a cone shape specified by the cone angle (cone axis: UP) SixDOF, // manual specification of axes movement and rotation limits - SwingTwist, // cone + rotational limits + SwingTwist, // cone (UP axis) + rotational limits + Slider, // constrain on the RIGHT axis between limits } type = Type::Fixed; wi::ecs::Entity bodyA = wi::ecs::INVALID_ENTITY; @@ -561,12 +569,12 @@ namespace wi::scene float min_angle = -XM_PI; // radians float max_angle = XM_PI; // radians float target_angular_velocity = 0; // motor - } hinge_constraint; // note: hinge axis is UP, normal axis is RIGHT directions of the TransformComponent on this entity + } hinge_constraint; struct ConeConstraintSettings { float half_cone_angle = 0; // radians - } cone_constraint; // note: cone axis is RIGHT of the TransformComponent on this entity + } cone_constraint; struct SixDOFConstraintSettings { @@ -598,6 +606,12 @@ namespace wi::scene float max_twist_angle = 0; // radians [-PI, PI] } swing_twist; + struct SliderConstraintSettings + { + float min_limit = -FLT_MAX; + float max_limit = FLT_MAX; + } slider_constraint; + // Non-serialized attributes: std::shared_ptr physicsobject = nullptr; // You can set to null to recreate the physics object the next time phsyics system will be running. diff --git a/WickedEngine/wiScene_Serializers.cpp b/WickedEngine/wiScene_Serializers.cpp index c69c1c1e3..03505cd31 100644 --- a/WickedEngine/wiScene_Serializers.cpp +++ b/WickedEngine/wiScene_Serializers.cpp @@ -940,6 +940,11 @@ namespace wi::scene { archive >> hinge_constraint.target_angular_velocity; } + if (seri.GetVersion() >= 4) + { + archive >> slider_constraint.min_limit; + archive >> slider_constraint.max_limit; + } } else { @@ -970,6 +975,11 @@ namespace wi::scene { archive << hinge_constraint.target_angular_velocity; } + if (seri.GetVersion() >= 4) + { + archive << slider_constraint.min_limit; + archive << slider_constraint.max_limit; + } } } void SoftBodyPhysicsComponent::Serialize(wi::Archive& archive, EntitySerializer& seri) diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index edf8af635..b56a6e10f 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wi::version // minor features, major updates, breaking compatibility changes const int minor = 71; // minor bug fixes, alterations, refactors, updates - const int revision = 735; + const int revision = 736; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);