diff --git a/core/src/objects/part/basepart.cpp b/core/src/objects/part/basepart.cpp index 5052a7d..037bb95 100644 --- a/core/src/objects/part/basepart.cpp +++ b/core/src/objects/part/basepart.cpp @@ -53,8 +53,6 @@ void BasePart::OnWorkspaceAdded(std::optional> oldWor } void BasePart::OnWorkspaceRemoved(std::shared_ptr oldWorkspace) { - if (simulationTicket.has_value()) - oldWorkspace->RemoveBody(shared()); } void BasePart::onUpdated(std::string property) { diff --git a/core/src/objects/part/basepart.h b/core/src/objects/part/basepart.h index 6dbe4da..f100a78 100644 --- a/core/src/objects/part/basepart.h +++ b/core/src/objects/part/basepart.h @@ -34,12 +34,6 @@ struct PartConstructParams { class Workspace; -#ifndef __SIMULATION_TICKET -#define __SIMULATION_TICKET -class BasePart; -typedef std::list>::iterator SimulationTicket; -#endif - class DEF_INST_ABSTRACT_(explorer_icon="part") BasePart : public PVInstance { AUTOGEN_PREAMBLE protected: @@ -117,8 +111,6 @@ public: DEF_SIGNAL SignalSource TouchEnded; rp::RigidBody* rigidBody = nullptr; - std::optional simulationTicket; - bool rigidBodyDirty = true; inline SurfaceType GetSurfaceFromFace(NormalId face) { return surfaceFromFace(face); } float GetSurfaceParamA(Vector3 face); diff --git a/core/src/objects/service/workspace.cpp b/core/src/objects/service/workspace.cpp index d5e90a9..8465c79 100644 --- a/core/src/objects/service/workspace.cpp +++ b/core/src/objects/service/workspace.cpp @@ -157,12 +157,7 @@ void Workspace::ProcessContactEvents() { } void Workspace::SyncPartPhysics(std::shared_ptr part) { - if (globalPhysicsLock.try_lock()) { - updatePartPhysics(part); - globalPhysicsLock.unlock(); - } else { - part->rigidBodyDirty = true; - } + updatePartPhysics(part); } tu_time_t physTime; @@ -172,28 +167,8 @@ void Workspace::PhysicsStep(float deltaTime) { std::scoped_lock lock(globalPhysicsLock); physicsWorld->update(std::min(deltaTime / 2, (1/60.f))); - // Update queued objects - queueLock.lock(); - for (QueueItem item : bodyQueue) { - if (item.action == QueueItem::QUEUEITEM_ADD) { - simulatedBodies.push_back(item.part); - item.part->simulationTicket = --simulatedBodies.end(); - } else if (item.part->simulationTicket.has_value()) { - simulatedBodies.erase(item.part->simulationTicket.value()); - item.part->simulationTicket = std::nullopt; - } - } - queueLock.unlock(); - // TODO: Add list of tracked parts in workspace based on their ancestry using inWorkspace property of Instance for (std::shared_ptr part : simulatedBodies) { - // If the part's body is dirty, update it now instead - if (part->rigidBodyDirty) { - updatePartPhysics(part); - part->rigidBodyDirty = false; - continue; - } - if (!part->rigidBody) continue; // Sync properties @@ -300,14 +275,10 @@ rp::Joint* Workspace::CreateJoint(const rp::JointInfo& jointInfo) { } void Workspace::AddBody(std::shared_ptr part) { - queueLock.lock(); - bodyQueue.push_back({part, QueueItem::QUEUEITEM_ADD}); - part->rigidBodyDirty = true; - queueLock.unlock(); + simulatedBodies.push_back(part); } void Workspace::RemoveBody(std::shared_ptr part) { - queueLock.lock(); - bodyQueue.push_back({part, QueueItem::QUEUEITEM_REMOVE}); - queueLock.unlock(); + auto it = std::find(simulatedBodies.begin(), simulatedBodies.end(), part); + simulatedBodies.erase(it); } \ No newline at end of file diff --git a/core/src/objects/service/workspace.h b/core/src/objects/service/workspace.h index 3da9aa8..b2724d0 100644 --- a/core/src/objects/service/workspace.h +++ b/core/src/objects/service/workspace.h @@ -38,11 +38,6 @@ class Weld; class Rotate; class RotateV; -#ifndef __SIMULATION_TICKET -#define __SIMULATION_TICKET -typedef std::list>::iterator SimulationTicket; -#endif - typedef std::function)> RaycastFilter; struct QueueItem { @@ -79,7 +74,6 @@ class DEF_INST_SERVICE_(explorer_icon="workspace") Workspace : public Service { friend PhysicsEventListener; std::list> simulatedBodies; - std::list bodyQueue; std::queue contactQueue; std::mutex contactQueueLock; rp::PhysicsWorld* physicsWorld; diff --git a/editor/placedocument.cpp b/editor/placedocument.cpp index c9ccfcd..0cc214e 100644 --- a/editor/placedocument.cpp +++ b/editor/placedocument.cpp @@ -23,36 +23,6 @@ #include "objects/service/selection.h" #include "timeutil.h" -class PlaceDocumentPhysicsWorker { -public: - std::mutex sync; - std::thread thread; - std::condition_variable runningCond; - bool running = false; - bool quit = false; - - PlaceDocumentPhysicsWorker() : thread(&PlaceDocumentPhysicsWorker::doWork, this) {} -private: - tu_time_t lastTime = tu_clock_micros(); - void doWork() { - do { - tu_time_t deltaTime = tu_clock_micros() - lastTime; - lastTime = tu_clock_micros(); - - // First frame is always empty - if (deltaTime > 100) { - gWorkspace()->PhysicsStep(float(deltaTime)/1'000'000); - } - - std::this_thread::sleep_for(std::chrono::microseconds(16'667 - deltaTime)); - - std::unique_lock lock(sync); - runningCond.wait(lock, [&]{ return running || quit; }); - lock.unlock(); - } while (!quit); - } -}; - PlaceDocument::PlaceDocument(QWidget* parent): QMdiSubWindow(parent) { placeWidget = new MainGLWidget; @@ -62,29 +32,15 @@ PlaceDocument::PlaceDocument(QWidget* parent): _runState = RUN_STOPPED; updateSelectionListeners(gDataModel->GetService()); - - worker = new PlaceDocumentPhysicsWorker(); } PlaceDocument::~PlaceDocument() { - worker->quit = true; - worker->runningCond.notify_all(); - worker->thread.join(); -} - -void PlaceDocument::updatePhysicsWorker() { - { - std::lock_guard lock(worker->sync); - worker->running = _runState == RUN_RUNNING; - } - worker->runningCond.notify_all(); } void PlaceDocument::setRunState(RunState newState) { if (newState == RUN_RUNNING && _runState != RUN_RUNNING) { if (_runState == RUN_PAUSED) { _runState = RUN_RUNNING; - updatePhysicsWorker(); return; } @@ -103,8 +59,6 @@ void PlaceDocument::setRunState(RunState newState) { gDataModel = editModeDataModel; updateSelectionListeners(gDataModel->GetService()); } - - updatePhysicsWorker(); } void PlaceDocument::updateSelectionListeners(std::shared_ptr selection) { @@ -130,7 +84,6 @@ void PlaceDocument::closeEvent(QCloseEvent *closeEvent) { closeEvent->ignore(); } -std::shared_ptr shit; void PlaceDocument::timerEvent(QTimerEvent* evt) { if (evt->timerId() != timer.timerId()) { QWidget::timerEvent(evt); @@ -140,6 +93,7 @@ void PlaceDocument::timerEvent(QTimerEvent* evt) { placeWidget->repaint(); placeWidget->updateCycle(); gDataModel->GetService()->RunSleepingThreads(); + if (_runState == RUN_RUNNING) gDataModel->GetService()->PhysicsStep(0.033); gDataModel->GetService()->ProcessContactEvents(); } diff --git a/editor/placedocument.h b/editor/placedocument.h index 2da64df..473d706 100644 --- a/editor/placedocument.h +++ b/editor/placedocument.h @@ -13,7 +13,6 @@ #include class Selection; -class PlaceDocumentPhysicsWorker; enum RunState { RUN_STOPPED, @@ -25,14 +24,10 @@ class PlaceDocument : public QMdiSubWindow { QBasicTimer timer; RunState _runState; - PlaceDocumentPhysicsWorker* worker; - std::weak_ptr selectionConnection; void timerEvent(QTimerEvent*) override; void updateSelectionListeners(std::shared_ptr); - - void updatePhysicsWorker(); public: MainGLWidget* placeWidget; PlaceDocument(QWidget* parent = nullptr);