#include #include #include #include #include #include #include #include #include #include #include #include #include #include "../part.h" #include "util.h" #include "simulation.h" namespace rp = reactphysics3d; extern std::vector parts; rp::PhysicsCommon physicsCommon; rp::PhysicsWorld* world; void simulationInit() { world = physicsCommon.createPhysicsWorld(); rp::Vector3 position(0, 20, 0); rp::Quaternion orientation = rp::Quaternion::identity(); rp::Transform transform(position, orientation); rp::RigidBody* body = world->createRigidBody(transform); } void syncPartPhysics(Part& part) { glm::mat4 rotMat = glm::mat4(1.0f); rp::Transform transform(glmToRp(part.position), glmToRp(part.rotation)); if (!part.rigidBody) { part.rigidBody = world->createRigidBody(transform); } else { part.rigidBody->setTransform(transform); } rp::BoxShape* shape = physicsCommon.createBoxShape(glmToRp(part.scale * glm::vec3(0.5f))); if (part.rigidBody->getNbColliders() > 0) { part.rigidBody->removeCollider(part.rigidBody->getCollider(0)); } part.rigidBody->addCollider(shape, rp::Transform()); part.rigidBody->setType(part.anchored ? rp::BodyType::STATIC : rp::BodyType::DYNAMIC); } void physicsStep(float deltaTime) { // Step the simulation a few steps world->update(deltaTime); for (Part& part : parts) { const rp::Transform& transform = part.rigidBody->getTransform(); part.position = rpToGlm(transform.getPosition()); // part.rotation = glm::eulerAngles(rpToGlm(transform.getOrientation())); part.rotation = rpToGlm(transform.getOrientation()); } }