From 590ecbe5ec2a2b32002c0f7a4b79726d61bc80f9 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Fri, 2 May 2025 21:28:00 +0200 Subject: [PATCH] feat(joints): added parameters for motor joint --- autogen/src/codegen.cpp | 1 + core/src/objects/base/member.h | 3 ++- core/src/objects/part.cpp | 29 ++++++++++++++++++++++++++++- core/src/objects/part.h | 19 ++++++++++++++++++- core/src/objects/workspace.cpp | 10 ++++++---- editor/panes/propertiesview.cpp | 6 +++++- 6 files changed, 60 insertions(+), 8 deletions(-) diff --git a/autogen/src/codegen.cpp b/autogen/src/codegen.cpp index 2eff211..30cb388 100644 --- a/autogen/src/codegen.cpp +++ b/autogen/src/codegen.cpp @@ -10,6 +10,7 @@ std::map CATEGORY_STR = { { "BEHAVIOR", "PROP_CATEGORY_BEHAVIOR" }, { "PART", "PROP_CATEGORY_PART" }, { "SURFACE", "PROP_CATEGORY_SURFACE" }, + { "SURFACE_INPUT", "PROP_CATEGORY_SURFACE_INPUT" }, }; std::map MAPPED_TYPE = { diff --git a/core/src/objects/base/member.h b/core/src/objects/base/member.h index 0318165..aaaaa19 100644 --- a/core/src/objects/base/member.h +++ b/core/src/objects/base/member.h @@ -56,9 +56,10 @@ enum PropertyCategory { PROP_CATEGORY_BEHAVIOR, PROP_CATEGORY_PART, PROP_CATEGORY_SURFACE, + PROP_CATEGORY_SURFACE_INPUT, }; -const int PROPERTY_CATEGORY_MAX = PROP_CATEGORY_SURFACE; +const int PROPERTY_CATEGORY_MAX = PROP_CATEGORY_SURFACE_INPUT; struct PropertyMeta { const Data::TypeInfo* type; diff --git a/core/src/objects/part.cpp b/core/src/objects/part.cpp index 80e380e..fcfbb5e 100644 --- a/core/src/objects/part.cpp +++ b/core/src/objects/part.cpp @@ -94,7 +94,8 @@ void Part::onUpdated(std::string property) { workspace().value()->SyncPartPhysics(std::dynamic_pointer_cast(this->shared_from_this())); // When position/rotation/size is manually edited, break all joints, they don't apply anymore - BreakJoints(); + if (property != "Anchored") + BreakJoints(); } // Expands provided extents to fit point @@ -158,6 +159,32 @@ SurfaceType Part::surfaceFromFace(NormalId face) { return SurfaceSmooth; // Unreachable } +float Part::GetSurfaceParamA(Vector3 face) { + // printVec(face); + // printf("Enum: %d\n", faceFromNormal(face)); + switch (faceFromNormal(face)) { + case Top: return topParamA; + case Bottom: return bottomParamA; + case Right: return rightParamA; + case Left: return leftParamA; + case Front: return frontParamA; + case Back: return backParamA; + } + return 0; // Unreachable +} + +float Part::GetSurfaceParamB(Vector3 face) { + switch (faceFromNormal(face)) { + case Top: return topParamB; + case Bottom: return bottomParamB; + case Right: return rightParamB; + case Left: return leftParamB; + case Front: return frontParamB; + case Back: return backParamB; + } + return 0; // Unreachable +} + bool Part::checkJointContinuity(std::shared_ptr otherPart) { // Make sure that the two parts don't depend on one another diff --git a/core/src/objects/part.h b/core/src/objects/part.h index 476f68d..fc78602 100644 --- a/core/src/objects/part.h +++ b/core/src/objects/part.h @@ -65,7 +65,7 @@ public: bool selected = false; DEF_PROP_CATEGORY(BEHAVIOR) - DEF_PROP bool anchored = false; + DEF_PROP_(on_update=onUpdated) bool anchored = false; DEF_PROP bool locked = false; DEF_PROP_CATEGORY(SURFACE) @@ -76,10 +76,27 @@ public: DEF_PROP SurfaceType frontSurface = SurfaceType::SurfaceSmooth; DEF_PROP SurfaceType backSurface = SurfaceType::SurfaceSmooth; + DEF_PROP_CATEGORY(SURFACE_INPUT) + DEF_PROP float topParamA = -0.5; + DEF_PROP float bottomParamA = -0.5; + DEF_PROP float leftParamA = -0.5; + DEF_PROP float rightParamA = -0.5; + DEF_PROP float frontParamA = -0.5; + DEF_PROP float backParamA = -0.5; + + DEF_PROP float topParamB = 0.5; + DEF_PROP float bottomParamB = 0.5; + DEF_PROP float leftParamB = 0.5; + DEF_PROP float rightParamB = 0.5; + DEF_PROP float frontParamB = 0.5; + DEF_PROP float backParamB = 0.5; + rp::RigidBody* rigidBody = nullptr; inline SurfaceType GetSurfaceFromFace(NormalId face) { return surfaceFromFace(face); } + float GetSurfaceParamA(Vector3 face); + float GetSurfaceParamB(Vector3 face); Part(); Part(PartConstructParams params); diff --git a/core/src/objects/workspace.cpp b/core/src/objects/workspace.cpp index 1e9727c..4b77d18 100644 --- a/core/src/objects/workspace.cpp +++ b/core/src/objects/workspace.cpp @@ -1,4 +1,5 @@ #include "workspace.h" +#include "datatypes/vector.h" #include "objects/base/instance.h" #include "objects/jointsservice.h" #include "objects/joint/jointinstance.h" @@ -104,13 +105,14 @@ void Workspace::PhysicsStep(float deltaTime) { part->cframe = CFrame(transform); part->velocity = part->rigidBody->getLinearVelocity(); - part->rigidBody->enableGravity(true); + // part->rigidBody->enableGravity(true); for (auto& joint : part->secondaryJoints) { if (joint.expired() || !joint.lock()->IsA("RotateV")) continue; - + std::shared_ptr motor = joint.lock()->CastTo().expect(); - part->rigidBody->enableGravity(false); - part->rigidBody->setAngularVelocity((motor->part0.lock()->cframe * motor->c0).LookVector() * 10.f); + float rate = motor->part0.lock()->GetSurfaceParamB(motor->c0.LookVector().Unit()) * 30; + // part->rigidBody->enableGravity(false); + part->rigidBody->setAngularVelocity(-(motor->part0.lock()->cframe * motor->c0).LookVector() * rate); } } } diff --git a/editor/panes/propertiesview.cpp b/editor/panes/propertiesview.cpp index 73363b7..f91f2d6 100644 --- a/editor/panes/propertiesview.cpp +++ b/editor/panes/propertiesview.cpp @@ -249,7 +249,8 @@ QStringList PROPERTY_CATEGORY_NAMES { "Data", "Behavior", "Part", - "Surface" + "Surface", + "Surface Inputs", }; QModelIndex PropertiesView::indexAt(const QPoint &point) const { @@ -330,6 +331,9 @@ void PropertiesView::setSelected(std::optional instance) { // Remove child-less categories for (int i = 0; i <= PROPERTY_CATEGORY_MAX; i++) { + if (i == PROP_CATEGORY_SURFACE_INPUT) + propertyCategories[(PropertyCategory)i]->setExpanded(false); + if (propertyCategories[(PropertyCategory)i]->childCount() > 0) continue; int idx = indexOfTopLevelItem(propertyCategories[(PropertyCategory)i]); delete takeTopLevelItem(idx);