Added rigid bodys
This commit is contained in:
parent
d51528dd0f
commit
f27cf4bd88
@ -10,6 +10,10 @@ find_package(glfw3 3.3 REQUIRED)
|
|||||||
## Find SWIG
|
## Find SWIG
|
||||||
find_package(SWIG REQUIRED)
|
find_package(SWIG REQUIRED)
|
||||||
|
|
||||||
|
## Find Bullet
|
||||||
|
find_package(Bullet REQUIRED)
|
||||||
|
include_directories(${BULLET_INCLUDE_DIRS})
|
||||||
|
|
||||||
## Find Lua
|
## Find Lua
|
||||||
find_package(Lua REQUIRED)
|
find_package(Lua REQUIRED)
|
||||||
|
|
||||||
@ -24,6 +28,7 @@ endif()
|
|||||||
target_link_libraries(couch OpenGL::GL)
|
target_link_libraries(couch OpenGL::GL)
|
||||||
target_link_libraries(couch GLEW::GLEW)
|
target_link_libraries(couch GLEW::GLEW)
|
||||||
target_link_libraries(couch ${LUA_LIBRARIES})
|
target_link_libraries(couch ${LUA_LIBRARIES})
|
||||||
|
target_link_libraries(couch ${BULLET_LIBRARIES})
|
||||||
|
|
||||||
include(UseSWIG)
|
include(UseSWIG)
|
||||||
set_property(SOURCE scripting/couch.i PROPERTY CPLUSPLUS ON)
|
set_property(SOURCE scripting/couch.i PROPERTY CPLUSPLUS ON)
|
||||||
|
56
core/Rigidbody.cpp
Normal file
56
core/Rigidbody.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "Rigidbody.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
Rigidbody::Rigidbody() {}
|
||||||
|
|
||||||
|
Rigidbody *Rigidbody::Create() {
|
||||||
|
return new Rigidbody;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rigidbody *Rigidbody::Duplicate() {
|
||||||
|
Rigidbody *rigidbody = static_cast<Rigidbody*>(Spatial::Duplicate());
|
||||||
|
|
||||||
|
rigidbody->collisionShape = collisionShape;
|
||||||
|
rigidbody->btBody = btBody;
|
||||||
|
rigidbody->mass = mass;
|
||||||
|
return rigidbody;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rigidbody *Rigidbody::Instance() {
|
||||||
|
Rigidbody *rigidbody = static_cast<Rigidbody*>(Node::Instance());
|
||||||
|
|
||||||
|
rigidbody->collisionShape = new btSphereShape(1.0f);
|
||||||
|
rigidbody->btBody = new btRigidBody(rigidbody->mass, new RigidbodyMotionState(rigidbody), rigidbody->collisionShape);
|
||||||
|
assert(rigidbody);
|
||||||
|
|
||||||
|
World *world = World::GetWorld();
|
||||||
|
world->AddRigidbody(rigidbody);
|
||||||
|
|
||||||
|
return rigidbody;
|
||||||
|
}
|
||||||
|
|
||||||
|
RigidbodyMotionState::RigidbodyMotionState(Rigidbody *rigidbody) {
|
||||||
|
this->rigidbody = rigidbody;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RigidbodyMotionState::getWorldTransform(btTransform &worldTrans) const {
|
||||||
|
worldTrans.setOrigin(btVector3(
|
||||||
|
rigidbody->transform.position.x,
|
||||||
|
rigidbody->transform.position.y,
|
||||||
|
rigidbody->transform.position.z));
|
||||||
|
btQuaternion quat;
|
||||||
|
quat.setEuler(rigidbody->transform.rotation.z,
|
||||||
|
rigidbody->transform.rotation.y,
|
||||||
|
rigidbody->transform.rotation.x);
|
||||||
|
worldTrans.setRotation(quat);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RigidbodyMotionState::setWorldTransform(const btTransform &worldTrans) {
|
||||||
|
rigidbody->transform.position = Vector3(worldTrans.getOrigin().getX(),
|
||||||
|
worldTrans.getOrigin().getY(),
|
||||||
|
worldTrans.getOrigin().getZ());
|
||||||
|
|
||||||
|
worldTrans.getRotation().getEulerZYX(rigidbody->transform.rotation.z,
|
||||||
|
rigidbody->transform.rotation.y,
|
||||||
|
rigidbody->transform.rotation.x);
|
||||||
|
}
|
31
core/Rigidbody.h
Normal file
31
core/Rigidbody.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef RIGIDBODY_H
|
||||||
|
#define RIGIDBODY_H
|
||||||
|
|
||||||
|
#include <btBulletDynamicsCommon.h>
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
#include "Spatial.h"
|
||||||
|
|
||||||
|
class Rigidbody : public Spatial {
|
||||||
|
public:
|
||||||
|
Rigidbody();
|
||||||
|
virtual Rigidbody *Create();
|
||||||
|
virtual Rigidbody *Duplicate();
|
||||||
|
virtual Rigidbody *Instance();
|
||||||
|
cfloat mass = 1.0f;
|
||||||
|
private:
|
||||||
|
btRigidBody *btBody;
|
||||||
|
btCollisionShape *collisionShape;
|
||||||
|
friend class World;
|
||||||
|
};
|
||||||
|
|
||||||
|
class RigidbodyMotionState : public btMotionState {
|
||||||
|
public:
|
||||||
|
RigidbodyMotionState(Rigidbody *rigidbody);
|
||||||
|
virtual void getWorldTransform(btTransform &worldTrans) const;
|
||||||
|
virtual void setWorldTransform(const btTransform &worldTrans);
|
||||||
|
private:
|
||||||
|
Rigidbody *rigidbody;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* RIGIDBODY_H */
|
37
core/World.cpp
Normal file
37
core/World.cpp
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
World* World::GetWorld() {
|
||||||
|
if (!world) {
|
||||||
|
world = new World();
|
||||||
|
}
|
||||||
|
|
||||||
|
return world;
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::AddRigidbody(Rigidbody *rigidbody) {
|
||||||
|
btWorld->addRigidBody(rigidbody->btBody);
|
||||||
|
}
|
||||||
|
|
||||||
|
void World::Step(cfloat delta) {
|
||||||
|
btWorld->stepSimulation(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
World* World::world { new World() };
|
||||||
|
|
||||||
|
World::World() {
|
||||||
|
// Some Java-ass code to follow
|
||||||
|
collisionConfiguration = new btDefaultCollisionConfiguration();
|
||||||
|
dispatcher = new btCollisionDispatcher(collisionConfiguration);
|
||||||
|
overlappingPairCache = new btDbvtBroadphase();
|
||||||
|
solver = new btSequentialImpulseConstraintSolver();
|
||||||
|
btWorld = new btDiscreteDynamicsWorld(dispatcher, overlappingPairCache, solver, collisionConfiguration);
|
||||||
|
btWorld->setGravity(btVector3(0, -10, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
World::~World() {
|
||||||
|
delete btWorld;
|
||||||
|
delete solver;
|
||||||
|
delete overlappingPairCache;
|
||||||
|
delete dispatcher;
|
||||||
|
delete collisionConfiguration;
|
||||||
|
}
|
24
core/World.h
Normal file
24
core/World.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#ifndef WORLD_H
|
||||||
|
#define WORLD_H
|
||||||
|
|
||||||
|
#include <btBulletDynamicsCommon.h>
|
||||||
|
|
||||||
|
#include "Rigidbody.h"
|
||||||
|
|
||||||
|
class World {
|
||||||
|
public:
|
||||||
|
static World* GetWorld();
|
||||||
|
void AddRigidbody(Rigidbody *rigidbody);
|
||||||
|
void Step(cfloat delta);
|
||||||
|
private:
|
||||||
|
static World* world;
|
||||||
|
btDiscreteDynamicsWorld *btWorld;
|
||||||
|
btDefaultCollisionConfiguration *collisionConfiguration;
|
||||||
|
btCollisionDispatcher *dispatcher;
|
||||||
|
btBroadphaseInterface *overlappingPairCache;
|
||||||
|
btSequentialImpulseConstraintSolver *solver;
|
||||||
|
World();
|
||||||
|
~World();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* WORLD_H */
|
@ -23,6 +23,10 @@
|
|||||||
#include "Light.h"
|
#include "Light.h"
|
||||||
#include "Skybox.h"
|
#include "Skybox.h"
|
||||||
|
|
||||||
|
#include "Rigidbody.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
|
||||||
#include "Scripting/Lua.h"
|
#include "Scripting/Lua.h"
|
||||||
|
|
||||||
// Thirdparty Includes
|
// Thirdparty Includes
|
||||||
@ -37,17 +41,17 @@ const int height = 600;
|
|||||||
Node *root;
|
Node *root;
|
||||||
|
|
||||||
void render(Node *curr, Shader *shader, Matrix model) {
|
void render(Node *curr, Shader *shader, Matrix model) {
|
||||||
|
if (curr->IsTransformable()) {
|
||||||
|
Spatial *spatial = dynamic_cast<Spatial*>(curr);
|
||||||
|
model = glm::rotate(model, spatial->transform.rotation.x, Vector3(1.0f, 0.0f, 0.0f));
|
||||||
|
model = glm::rotate(model, spatial->transform.rotation.y, Vector3(0.0f, 1.0f, 0.0f));
|
||||||
|
model = glm::rotate(model, spatial->transform.rotation.z, Vector3(0.0f, 0.0f, 1.0f));
|
||||||
|
model = glm::translate(model, spatial->transform.position);
|
||||||
|
model = glm::scale(model, spatial->transform.scale);
|
||||||
|
shader->UpdateModel(model);
|
||||||
|
shader->UpdateNormal(glm::mat3(glm::transpose(glm::inverse(model))));
|
||||||
|
}
|
||||||
if (curr->IsDrawable()) {
|
if (curr->IsDrawable()) {
|
||||||
if (curr->IsTransformable()) {
|
|
||||||
Spatial *spatial = dynamic_cast<Spatial*>(curr);
|
|
||||||
model = glm::rotate(model, spatial->transform.rotation.x, Vector3(1.0f, 0.0f, 0.0f));
|
|
||||||
model = glm::rotate(model, spatial->transform.rotation.y, Vector3(0.0f, 1.0f, 0.0f));
|
|
||||||
model = glm::rotate(model, spatial->transform.rotation.z, Vector3(0.0f, 0.0f, 1.0f));
|
|
||||||
model = glm::translate(model, spatial->transform.position);
|
|
||||||
model = glm::scale(model, spatial->transform.scale);
|
|
||||||
shader->UpdateModel(model);
|
|
||||||
shader->UpdateNormal(glm::mat3(glm::transpose(glm::inverse(model))));
|
|
||||||
}
|
|
||||||
Mesh *mesh = dynamic_cast<Mesh*>(curr);
|
Mesh *mesh = dynamic_cast<Mesh*>(curr);
|
||||||
mesh->Draw(shader);
|
mesh->Draw(shader);
|
||||||
}
|
}
|
||||||
@ -89,6 +93,8 @@ int main() {
|
|||||||
|
|
||||||
Camera defaultCamera;
|
Camera defaultCamera;
|
||||||
|
|
||||||
|
World *world = World::GetWorld();
|
||||||
|
|
||||||
Screen screen;
|
Screen screen;
|
||||||
ScreenShader *screenShader = new ScreenShader();
|
ScreenShader *screenShader = new ScreenShader();
|
||||||
|
|
||||||
@ -106,6 +112,10 @@ int main() {
|
|||||||
double delta = 0.0;
|
double delta = 0.0;
|
||||||
|
|
||||||
while(!glfwWindowShouldClose(window)) {
|
while(!glfwWindowShouldClose(window)) {
|
||||||
|
|
||||||
|
// Physics update()
|
||||||
|
world->Step(delta);
|
||||||
|
|
||||||
// Start rendering to texture;
|
// Start rendering to texture;
|
||||||
screen.Enable();
|
screen.Enable();
|
||||||
|
|
||||||
|
@ -46,6 +46,17 @@ function init()
|
|||||||
)
|
)
|
||||||
couch.Node.GetRoot().children:Append(skybox:Instance())
|
couch.Node.GetRoot().children:Append(skybox:Instance())
|
||||||
|
|
||||||
|
local physics_ball_prefab = couch.Rigidbody()
|
||||||
|
local physics_ball_mesh = couch.Mesh.FromFile("ball.obj")
|
||||||
|
material = physics_ball_mesh:GetMaterial(0)
|
||||||
|
material.ambient = BLUE
|
||||||
|
material.diffuse = BLUE
|
||||||
|
physics_ball_mesh:SetMaterial(0, material)
|
||||||
|
physics_ball_prefab.children:Append(physics_ball_mesh);
|
||||||
|
physics_ball_prefab.transform.position = couch.Vector3(0.0, 30.0, -10.0)
|
||||||
|
local physics_ball = physics_ball_prefab:Instance()
|
||||||
|
couch.Node.GetRoot().children:Append(physics_ball)
|
||||||
|
|
||||||
make_ground()
|
make_ground()
|
||||||
|
|
||||||
local cube_prefab = couch.Mesh.FromFile("cube.obj")
|
local cube_prefab = couch.Mesh.FromFile("cube.obj")
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "Light.h"
|
#include "Light.h"
|
||||||
#include "Skybox.h"
|
#include "Skybox.h"
|
||||||
|
#include "Rigidbody.h"
|
||||||
%}
|
%}
|
||||||
|
|
||||||
typedef float cfloat;
|
typedef float cfloat;
|
||||||
@ -48,3 +49,4 @@ public:
|
|||||||
%include "Camera.h"
|
%include "Camera.h"
|
||||||
%include "Light.h"
|
%include "Light.h"
|
||||||
%include "Skybox.h"
|
%include "Skybox.h"
|
||||||
|
%include "Rigidbody.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user