openblocks/src/physics/simulation.cpp

67 lines
2.2 KiB
C++
Raw Normal View History

2024-09-29 17:05:13 +00:00
#include <cstdio>
#include <glm/ext/matrix_float3x3.hpp>
2024-09-29 17:19:49 +00:00
#include <glm/gtc/quaternion.hpp>
2024-09-29 17:05:13 +00:00
#include <reactphysics3d/collision/shapes/BoxShape.h>
#include <reactphysics3d/collision/shapes/CollisionShape.h>
#include <reactphysics3d/components/RigidBodyComponents.h>
#include <reactphysics3d/mathematics/Quaternion.h>
#include <reactphysics3d/mathematics/Transform.h>
#include <reactphysics3d/mathematics/Vector3.h>
#include <reactphysics3d/memory/DefaultAllocator.h>
#include <reactphysics3d/memory/MemoryAllocator.h>
2024-09-28 13:55:27 +00:00
#include <reactphysics3d/reactphysics3d.h>
#include <vector>
#include "../part.h"
2024-09-29 17:05:13 +00:00
#include "util.h"
2024-09-28 13:55:27 +00:00
#include "simulation.h"
namespace rp = reactphysics3d;
extern std::vector<Part> 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);
2024-09-29 17:19:49 +00:00
rp::RigidBody* body = world->createRigidBody(transform);
2024-11-17 12:11:53 +00:00
world->setGravity(rp::Vector3(0, -196.2, 0));
2024-09-29 17:05:13 +00:00
}
2024-09-29 17:19:49 +00:00
void syncPartPhysics(Part& part) {
2024-09-29 17:05:13 +00:00
glm::mat4 rotMat = glm::mat4(1.0f);
rp::Transform transform(glmToRp(part.position), glmToRp(part.rotation));
2024-09-29 17:19:49 +00:00
if (!part.rigidBody) {
part.rigidBody = world->createRigidBody(transform);
} else {
part.rigidBody->setTransform(transform);
}
2024-09-29 17:05:13 +00:00
2024-09-29 17:19:49 +00:00
rp::BoxShape* shape = physicsCommon.createBoxShape(glmToRp(part.scale * glm::vec3(0.5f)));
if (part.rigidBody->getNbColliders() > 0) {
part.rigidBody->removeCollider(part.rigidBody->getCollider(0));
}
2024-09-29 17:05:13 +00:00
2024-11-17 12:11:53 +00:00
if (part.rigidBody->getNbColliders() == 0)
2024-09-29 17:05:13 +00:00
part.rigidBody->addCollider(shape, rp::Transform());
part.rigidBody->setType(part.anchored ? rp::BodyType::STATIC : rp::BodyType::DYNAMIC);
2024-09-28 13:55:27 +00:00
}
void physicsStep(float deltaTime) {
// Step the simulation a few steps
world->update(deltaTime);
2024-09-29 17:19:49 +00:00
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());
2024-09-29 17:19:49 +00:00
}
2024-09-28 13:55:27 +00:00
}