Changed toolset to vs11, for future Havok implementation.

This commit is contained in:
ViktorLjung
2014-04-12 01:44:35 +02:00
parent 3470a80f40
commit 04fff4a27b
828 changed files with 80880 additions and 157684 deletions
-19
View File
@@ -1,19 +0,0 @@
#ifndef Components_BallSocketConstraint_h__
#define Components_BallSocketConstraint_h__
#include "Component.h"
namespace Components
{
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
struct BallSocketConstraint : Component
{
// Create constraint between these entities
EntityID EntityA;
EntityID EntityB;
// The pivot point in local coordinates
glm::vec3 PivotA;
glm::vec3 PivotB;
};
}
#endif // Components_BallSocketConstraint_h__
-17
View File
@@ -1,17 +0,0 @@
#ifndef Components_Bounds_h__
#define Components_Bounds_h__
#include "Component.h"
namespace Components
{
struct Bounds : Component
{
//Axis Aligned Bounding Box
glm::vec3 Origin;
glm::vec3 VolumeVector; //The vector that defines the volume of the BB, it goes from one corner to the opposite one
};
}
#endif // !Components_Bounds_h__
-18
View File
@@ -1,18 +0,0 @@
#ifndef Components_BoxShape_h__
#define Components_BoxShape_h__
#include "Component.h"
namespace Components
{
struct BoxShape : Component
{
float Height;
float Width;
float Depth;
};
}
#endif // !Components_BoxShape_h__
-21
View File
@@ -1,21 +0,0 @@
#ifndef Components_Collision_h__
#define Components_Collision_h__
#include "Entity.h"
#include "Component.h"
#include <vector>
namespace Components
{
struct Collision : Component
{
Collision() : Phantom(false), Interested(false) { }
bool Phantom;
bool Interested;
std::vector<EntityID> CollidingEntities;
};
}
#endif // !Components_Collision_h__
-14
View File
@@ -1,14 +0,0 @@
#ifndef Components_CompoundShape_h__
#define Components_CompoundShape_h__
#include "Component.h"
namespace Components
{
struct CompoundShape : Component
{
};
}
#endif // Components_CompoundShape_h__
-17
View File
@@ -1,17 +0,0 @@
#ifndef Components_CustomShape_h__
#define Components_CustomShape_h__
#include "Component.h"
#include <string>
namespace Components
{
struct CustomShape : Component
{
std::string fileName;
};
}
#endif // !Components_CustomShape_h__
+2 -1
View File
@@ -7,7 +7,8 @@ namespace Components
{
struct FreeSteering : Component
{
float Speed = 35;
FreeSteering() : Speed(35) { }
float Speed;
};
}
-35
View File
@@ -1,35 +0,0 @@
#ifndef Components_HingeConstraint_h__
#define Components_HingeConstraint_h__
#include "Component.h"
namespace Components
{
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
struct HingeConstraint : Component
{
// Create constraint between these entities
EntityID EntityA;
EntityID EntityB;
// The pivot point in local coordinates
glm::vec3 PivotA;
glm::vec3 PivotB;
// The axis to rotate around
glm::vec3 AxisA;
glm::vec3 AxisB;
/*
void setLimit(btScalar low,
btScalar high,
btScalar softness = 0.9f,
btScalar_biasFactor = 0.3f,
btScalar relaxationFactor = 1.0f)
*/
float LowLimit;
float HighLimit;
float Softness = 0.9f;
float BiasFactor = 0.3f;
float RelaxationFactor = 1.0f;
};
}
#endif // Components_HingeConstraint_h__
-14
View File
@@ -1,14 +0,0 @@
#ifndef Components_MeshShape_h__
#define Components_MeshShape_h__
#include "Component.h"
namespace Components
{
struct MeshShape : Component
{
std::string Filename;
};
}
#endif // Components_MeshShape_h__
-18
View File
@@ -1,18 +0,0 @@
#ifndef Components_Physics_h__
#define Components_Physics_h__
#include "Component.h"
namespace Components
{
struct Physics : Component
{
float Mass = 0;
float Friction = 0;
glm::vec3 Gravity = glm::vec3(0, -9.82f, 0);
};
}
#endif // !Components_Physics_h__
-15
View File
@@ -1,15 +0,0 @@
#ifndef Components_PowerUp_h__
#define Components_PowerUp_h__
#include "Component.h"
namespace Components
{
struct PowerUp : Component
{
float Speed;
};
}
#endif // !Components_PowerUp_h__
-16
View File
@@ -1,16 +0,0 @@
#ifndef Components_SliderConstraint_h__
#define Components_SliderConstraint_h__
#include "Component.h"
namespace Components
{
// http://bulletphysics.org/mediawiki-1.5.8/index.php/Constraints
struct SliderConstraint : Component
{
// Create constraint between these entities
EntityID EntityA;
EntityID EntityB;
};
}
#endif // Components_SliderConstraint_h__
+6 -5
View File
@@ -10,11 +10,12 @@ namespace Components
struct SoundEmitter : Component
{
float Gain = 1.f;
float MaxDistance = 1.f;
float ReferenceDistance = 1.f;
float Pitch = 1.f;
bool Loop = false;
SoundEmitter() : Gain(1.f), MaxDistance(1.f), ReferenceDistance(1.f), Pitch(1.f), Loop(false) {}
float Gain;
float MaxDistance;
float ReferenceDistance;
float Pitch;
bool Loop;
std::string Path;
};
-17
View File
@@ -1,17 +0,0 @@
#ifndef Components_SphereShape_h__
#define Components_SphereShape_h__
#include "Component.h"
namespace Components
{
struct SphereShape : Component
{
float Radius;
float RollingFriction;
};
}
#endif // !Components_SphereShape_h__
-14
View File
@@ -1,14 +0,0 @@
#ifndef Components_StaticMeshShape_h__
#define Components_StaticMeshShape_h__
#include "Component.h"
namespace Components
{
struct StaticMeshShape : Component
{
std::string Filename;
};
}
#endif // Components_StaticMeshShape_h__
-18
View File
@@ -1,18 +0,0 @@
#ifndef Components_Vehicle_h__
#define Components_Vehicle_h__
#include "Component.h"
namespace Components
{
struct Vehicle : Component
{
};
}
#endif // Components_Vehicle_h__
-31
View File
@@ -1,31 +0,0 @@
#ifndef Components_Wheel_h__
#define Components_Wheel_h__
#include "Component.h"
namespace Components
{
struct Wheel : Component
{
EntityID CarID;
glm::vec3 ConnectionPoint;
glm::vec3 Direction;
glm::vec3 Axle;
float SuspensionRestLength;
float Radius;
bool IsFrontWheel;
float SuspensionStiffness;
float SuspensionCompression;
float SuspensionDamping;
float MaxSuspensionTravelCm;
float FrictionSlip;
float MaxSuspensionForce;
};
}
#endif // Components_Wheel_h__
+1 -82
View File
@@ -25,73 +25,6 @@ void GameWorld::Initialize()
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(terrain, "Model");
model->ModelFile = "Models/Placeholders/PhysicsTest/Plane.obj";
auto physics = AddComponent<Components::Physics>(terrain, "Physics");
physics->Friction = 0.5f;
auto Box = AddComponent<Components::BoxShape>(terrain, "BoxShape");
Box->Width = 0.5f;
Box->Height = 0.5;
Box->Depth = 0.5f;
}
{
for (int i = 0; i < 1; i++)
{
auto entity = CreateEntity();
auto transform = AddComponent<Components::Transform>(entity, "Transform");
transform->Scale = glm::vec3(1.0f);
transform->Position = glm::vec3(0, 10+i, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(entity, "Model");
model->ModelFile = "Models/Placeholders/PhysicsTest/ArrowCube.obj";
auto physics = AddComponent<Components::Physics>(entity, "Physics");
physics->Mass = 10;
auto box = AddComponent<Components::BoxShape>(entity, "BoxShape");
box->Width = 0.5;
box->Height = 0.5;
box->Depth = 0.5;
{
auto entity1 = CreateEntity();
auto transform = AddComponent<Components::Transform>(entity1, "Transform");
transform->Scale = glm::vec3(1.0f);
transform->Position = glm::vec3(-5.f, 10+i, 0);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(entity1, "Model");
model->ModelFile = "Models/Placeholders/PhysicsTest/ArrowCube.obj";
auto physics = AddComponent<Components::Physics>(entity1, "Physics");
physics->Mass = 0;
auto box = AddComponent<Components::BoxShape>(entity1, "BoxShape");
box->Width = 0.5;
box->Height = 0.5;
box->Depth = 0.5;
auto hingeConstraint = AddComponent<Components::HingeConstraint>(entity1, "HingeConstraint");
hingeConstraint->EntityA = entity;
hingeConstraint->EntityB = entity1;
hingeConstraint->AxisA = glm::vec3(0, 0, 1);
hingeConstraint->AxisB = glm::vec3(0, 0, 1);
hingeConstraint->LowLimit = -glm::pi<float>();
hingeConstraint->HighLimit = glm::pi<float>();
hingeConstraint->PivotA = glm::vec3(-5, 0, 0);
hingeConstraint->PivotB = glm::vec3(0, 0, 0);
}
}
}
{
@@ -102,8 +35,6 @@ void GameWorld::Initialize()
emitter->Loop = true;
GetSystem<Systems::SoundSystem>("SoundSystem")->PlaySound(emitter);
}
}
void GameWorld::Update(double dt)
@@ -113,9 +44,7 @@ void GameWorld::Update(double dt)
void GameWorld::RegisterComponents()
{
m_ComponentFactory.Register("Bounds", []() { return new Components::Bounds(); });
m_ComponentFactory.Register("Camera", []() { return new Components::Camera(); });
m_ComponentFactory.Register("Collision", []() { return new Components::Collision(); });
m_ComponentFactory.Register("DirectionalLight", []() { return new Components::DirectionalLight(); });
m_ComponentFactory.Register("Input", []() { return new Components::Input(); });
m_ComponentFactory.Register("Model", []() { return new Components::Model(); });
@@ -127,17 +56,7 @@ void GameWorld::RegisterComponents()
m_ComponentFactory.Register("Transform", []() { return new Components::Transform(); });
m_ComponentFactory.Register("FreeSteering", []() { return new Components::FreeSteering(); });
m_ComponentFactory.Register("Physics", []() { return new Components::Physics(); });
m_ComponentFactory.Register("CompoundShape", []() { return new Components::CompoundShape(); });
m_ComponentFactory.Register("SphereShape", []() { return new Components::SphereShape(); });
m_ComponentFactory.Register("BoxShape", []() { return new Components::BoxShape(); });
m_ComponentFactory.Register("HingeConstraint", []() { return new Components::HingeConstraint(); });
m_ComponentFactory.Register("BallSocketConstraint", []() { return new Components::BallSocketConstraint(); });
m_ComponentFactory.Register("SliderConstraint", []() { return new Components::SliderConstraint(); });
m_ComponentFactory.Register("Vehicle", []() { return new Components::Vehicle(); });
m_ComponentFactory.Register("Wheel", []() { return new Components::Wheel(); });
///m_ComponentFactory.Register("Physics", []() { return new Components::Physics(); });
}
void GameWorld::RegisterSystems()
-15
View File
@@ -15,33 +15,18 @@
#include "Systems/SoundSystem.h"
#include "Systems/PhysicsSystem.h"
#include "Components/Bounds.h"
#include "Components/Camera.h"
#include "Components/Collision.h"
#include "Components/DirectionalLight.h"
#include "Components/Input.h"
#include "Components/Model.h"
#include "Components/ParticleEmitter.h"
#include "Components/PointLight.h"
#include "Components/PowerUp.h"
#include "Components/SoundEmitter.h"
#include "Components/Sprite.h"
#include "Components/Stat.h"
#include "Components/Template.h"
#include "Components/Transform.h"
#include "Components/CompoundShape.h"
#include "Components/BoxShape.h"
#include "Components/SphereShape.h"
#include "Components/Physics.h"
#include "Components/BallSocketConstraint.h"
#include "Components/HingeConstraint.h"
#include "Components/SliderConstraint.h"
#include "Components/Vehicle.h"
#include "Components/Wheel.h"
class GameWorld : public World
{
public:
+3 -3
View File
@@ -3,13 +3,13 @@
Skybox::Skybox(std::string skyboxPath, std::string extension /* = "png" */)
{
m_Cubemap = std::make_shared<CubemapTexture>(
skyboxPath + "/right." + extension,
m_Cubemap = std::shared_ptr<CubemapTexture>(new CubemapTexture(
skyboxPath + "/right." + extension,
skyboxPath + "/left." + extension,
skyboxPath + "/top." + extension,
skyboxPath + "/bottom." + extension,
skyboxPath + "/front." + extension,
skyboxPath + "/back." + extension);
skyboxPath + "/back." + extension));
m_Cubemap->Load();
Initialize();
}
+5 -321
View File
@@ -5,219 +5,17 @@
Systems::PhysicsSystem::PhysicsSystem(World* world) : System(world)
{
m_Broadphase = new btDbvtBroadphase();
m_CollisionConfiguration = new btDefaultCollisionConfiguration();
m_Dispatcher = new btCollisionDispatcher(m_CollisionConfiguration);
m_Solver = new btSequentialImpulseConstraintSolver();
m_DynamicsWorld = new btDiscreteDynamicsWorld(m_Dispatcher, m_Broadphase, m_Solver, m_CollisionConfiguration);
m_DynamicsWorld->setGravity(btVector3(0, -9.82f, 0));
{
}
void Systems::PhysicsSystem::Update(double dt)
{
// Update entity transform in physics world
for (auto pair : *m_World->GetEntities())
{
EntityID entity = pair.first;
EntityID parent = pair.second;
if (parent != 0)
continue;
if (m_PhysicsData.find(entity) != m_PhysicsData.end())
{
PhysicsData* physicsData = &m_PhysicsData[entity];
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
btTransform transform;
transform.setFromOpenGLMatrix(glm::value_ptr(glm::translate(glm::mat4(), transformComponent->Position) * glm::toMat4(transformComponent->Orientation)));
physicsData->MotionState->setWorldTransform(transform);
physicsData->CollisionShape->setLocalScaling(btVector3(transformComponent->Scale.x, transformComponent->Scale.y, transformComponent->Scale.z));
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity, "Physics");
physicsData->RigidBody->setGravity(btVector3(physicsComponent->Gravity.x, physicsComponent->Gravity.y, physicsComponent->Gravity.z));
}
}
m_DynamicsWorld->stepSimulation(dt, 10, 1.0f/60.0f);
{
}
void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
{
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
if (!transformComponent)
return;
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity, "Physics");
auto sphereShapeComponent = m_World->GetComponent<Components::SphereShape>(entity, "SphereShape");
auto boxShapeComponent = m_World->GetComponent<Components::BoxShape>(entity, "BoxShape");
auto meshShapeComponent = m_World->GetComponent<Components::MeshShape>(entity, "MeshShape");
auto staticMeshShapeComponent = m_World->GetComponent<Components::StaticMeshShape>(entity, "StaticMeshShape");
auto vehicleComponent = m_World->GetComponent<Components::Vehicle>(entity, "Vehicle");
auto wheelComponent = m_World->GetComponent<Components::Wheel>(entity, "Wheel");
if (physicsComponent || sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent)
{
if (m_PhysicsData.find(entity) == m_PhysicsData.end())
{
SetUpPhysicsState(entity, parent);
}
if (parent != 0)
return;
PhysicsData* physicsData = &m_PhysicsData[entity];
btTransform transform;
physicsData->MotionState->getWorldTransform(transform);
transformComponent->Position.x = transform.getOrigin().x();
transformComponent->Position.y = transform.getOrigin().y();
transformComponent->Position.z = transform.getOrigin().z();
btVector3 angle = transform.getRotation().getAxis();
transformComponent->Orientation.x = transform.getRotation().x();
transformComponent->Orientation.y = transform.getRotation().y();
transformComponent->Orientation.z = transform.getRotation().z();
transformComponent->Orientation.w = transform.getRotation().w();
}
else
{
if (m_PhysicsData.find(entity) != m_PhysicsData.end())
{
TearDownPhysicsState(entity, parent);
}
}
auto ballSocketComponent = m_World->GetComponent<Components::BallSocketConstraint>(entity, "BallSocketConstraint");
auto sliderComponent = m_World->GetComponent<Components::SliderConstraint>(entity, "SliderConstraint");
auto hingeComponent = m_World->GetComponent<Components::HingeConstraint>(entity, "HingeConstraint");
if (ballSocketComponent)
{
EntityID entityA = ballSocketComponent->EntityA;
EntityID entityB = ballSocketComponent->EntityB;
if (m_Constraints.find(std::make_pair(entityA, entityB)) == m_Constraints.end())
{
if (m_PhysicsData.find(entityA) != m_PhysicsData.end() && m_PhysicsData.find(entityB) != m_PhysicsData.end())
{
btVector3 pivotA = btVector3(ballSocketComponent->PivotA.x, ballSocketComponent->PivotA.y, ballSocketComponent->PivotA.z);
btVector3 pivotB = btVector3(ballSocketComponent->PivotB.x, ballSocketComponent->PivotB.y, ballSocketComponent->PivotB.z);
m_Constraints[std::make_pair(entityA, entityB)] = new btPoint2PointConstraint(*m_PhysicsData[entityA].RigidBody, *m_PhysicsData[entityB].RigidBody, pivotA, pivotB);
m_DynamicsWorld->addConstraint(m_Constraints[std::make_pair(entityA, entityB)]);
}
}
}
else if (sliderComponent)
{
EntityID entityA = sliderComponent->EntityA;
EntityID entityB = sliderComponent->EntityB;
if (m_Constraints.find(std::make_pair(entityA, entityB)) == m_Constraints.end())
{
if (m_PhysicsData.find(entityA) != m_PhysicsData.end() && m_PhysicsData.find(entityB) != m_PhysicsData.end())
{
btTransform transformA;
m_PhysicsData[entityA].MotionState->getWorldTransform(transformA);
btTransform transformB;
m_PhysicsData[entityB].MotionState->getWorldTransform(transformB);
m_Constraints[std::make_pair(entityA, entityB)] = new btSliderConstraint(*m_PhysicsData[entityA].RigidBody, *m_PhysicsData[entityB].RigidBody, transformA, transformB, true);
m_DynamicsWorld->addConstraint(m_Constraints[std::make_pair(entityA, entityB)]);
}
}
}
else if (hingeComponent)
{
EntityID entityA = hingeComponent->EntityA;
EntityID entityB = hingeComponent->EntityB;
if (m_Constraints.find(std::make_pair(entityA, entityB)) == m_Constraints.end())
{
if (m_PhysicsData.find(entityA) != m_PhysicsData.end() && m_PhysicsData.find(entityB) != m_PhysicsData.end())
{
btVector3 PivotA = btVector3(hingeComponent->PivotA.x, hingeComponent->PivotA.y, hingeComponent->PivotA.z);
btVector3 PivotB = btVector3(hingeComponent->PivotB.x, hingeComponent->PivotB.y, hingeComponent->PivotB.z);
btVector3 AxisA = btVector3(hingeComponent->AxisA.x, hingeComponent->AxisA.y, hingeComponent->AxisA.z);
btVector3 AxisB = btVector3(hingeComponent->AxisB.x, hingeComponent->AxisB.y, hingeComponent->AxisB.z);
btHingeConstraint* hingeConstraint = new btHingeConstraint(*m_PhysicsData[entityA].RigidBody, *m_PhysicsData[entityB].RigidBody, PivotA, PivotB, AxisA, AxisB, true);
hingeConstraint->setLimit(hingeComponent->LowLimit, hingeComponent->HighLimit, hingeComponent->Softness, hingeComponent->BiasFactor, hingeComponent->RelaxationFactor);
m_Constraints[std::make_pair(entityA, entityB)] = hingeConstraint;
m_DynamicsWorld->addConstraint(m_Constraints[std::make_pair(entityA, entityB)]);
}
}
}
if (vehicleComponent )
{
if (m_Vehicles.find(entity) == m_Vehicles.end()) {
if (m_PhysicsData.find(entity) == m_PhysicsData.end()){
LOG_WARNING("Chassi missing rigidbody on vehicle i%", entity);
return;
}
m_Vehicles[entity].VehicleRaycaster = new btDefaultVehicleRaycaster(m_DynamicsWorld);
m_Vehicles[entity].RaycastVehicle = new btRaycastVehicle(m_Vehicles[entity].Tuning, m_PhysicsData[entity].RigidBody, m_Vehicles[entity].VehicleRaycaster);
//m_Vehicles[entity].RaycastVehicle->setCoordinateSystem(0, 1, 2);
m_DynamicsWorld->addVehicle(m_Vehicles[entity].RaycastVehicle);
}
// for (int i = 0; i < m_Vehicles[entity].RaycastVehicle->getNumWheels(); i++)
// {
// m_Vehicles[entity].RaycastVehicle->applyEngineForce(10, i);
//
// }
}
if (wheelComponent)
{
EntityID carID = wheelComponent->CarID;
if (m_Vehicles.find(carID) != m_Vehicles.end()){
auto wheels = &m_Vehicles[carID].Wheels;
if (wheels->find(entity) == wheels->end())
{
wheels->insert(entity);
btVector3 connectionPoint = btVector3(wheelComponent->ConnectionPoint.x, wheelComponent->ConnectionPoint.y, wheelComponent->ConnectionPoint.z);
btVector3 direction = btVector3(wheelComponent->Direction.x, wheelComponent->Direction.y, wheelComponent->Direction.z);
btVector3 axle = btVector3(wheelComponent->Axle.x, wheelComponent->Axle.y, wheelComponent->Axle.z);
btWheelInfo& wheel = m_Vehicles[carID].RaycastVehicle->addWheel(connectionPoint, direction, axle, wheelComponent->SuspensionRestLength, wheelComponent->Radius, m_Vehicles[entity].Tuning, wheelComponent->IsFrontWheel);
wheel.m_suspensionStiffness = wheelComponent->SuspensionStiffness;
wheel.m_wheelsDampingRelaxation = wheelComponent->SuspensionDamping;
wheel.m_wheelsDampingCompression = wheelComponent->SuspensionCompression;
wheel.m_frictionSlip = wheelComponent->FrictionSlip;
wheel.m_rollInfluence = 0.1f;
}
}
}
{
}
@@ -232,126 +30,12 @@ void Systems::PhysicsSystem::OnComponentRemoved(std::string type, Component* com
}
void Systems::PhysicsSystem::SetUpPhysicsState(EntityID entity, EntityID parent)
{
auto transformComponent = m_World->GetComponent<Components::Transform>(entity, "Transform");
if (!transformComponent)
{
LOG_WARNING("Physics component missing transform component on entity %i", entity);
return;
}
{
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity, "Physics");
auto compoundShapeComponent = m_World->GetComponent<Components::CompoundShape>(entity, "CompoundShape");
auto sphereShapeComponent = m_World->GetComponent<Components::SphereShape>(entity, "SphereShape");
auto boxShapeComponent = m_World->GetComponent<Components::BoxShape>(entity, "BoxShape");
auto meshShapeComponent = m_World->GetComponent<Components::MeshShape>(entity, "MeshShape");
auto staticMeshShapeComponent = m_World->GetComponent<Components::StaticMeshShape>(entity, "StaticMeshShape");
if (compoundShapeComponent && (sphereShapeComponent || boxShapeComponent || meshShapeComponent || staticMeshShapeComponent))
{
LOG_WARNING("Entity %i has both compound shape and normal shape! Normal shapes must be children to entity with compound shape.", entity);
}
PhysicsData* physicsData = &m_PhysicsData[entity];
/*EntityID baseParent = m_World->GetEntityBaseParent(entity);
auto baseCompoundShape = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");*/
// Set-up compound shape
if (compoundShapeComponent)
{
btCompoundShape* compoundShape = new btCompoundShape();
physicsData->CollisionShape = compoundShape;
btTransform transform;
transform.setFromOpenGLMatrix(glm::value_ptr(glm::translate(glm::mat4(), transformComponent->Position) * glm::toMat4(transformComponent->Orientation)));
physicsData->MotionState = new btDefaultMotionState(transform);
btVector3 inertia;
if (physicsComponent->Mass != 0)
{
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
}
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(physicsComponent->Mass, physicsData->MotionState, physicsData->CollisionShape, inertia);
physicsData->RigidBody = new btRigidBody(rigidBodyCI);
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
}
// Set-up normal shapes
else if (boxShapeComponent)
{
physicsData->CollisionShape = new btBoxShape(btVector3(boxShapeComponent->Width, boxShapeComponent->Height, boxShapeComponent->Depth));
}
else if (sphereShapeComponent)
{
physicsData->CollisionShape = new btSphereShape(sphereShapeComponent->Radius);
}
else if (meshShapeComponent)
{
// TODO: Collision mesh things go here
//new btConvexTriangleMeshShape()
}
if (boxShapeComponent || sphereShapeComponent || meshShapeComponent || staticMeshShapeComponent)
{
btTransform transform;
transform.setFromOpenGLMatrix(glm::value_ptr(glm::translate(glm::mat4(), transformComponent->Position) * glm::toMat4(transformComponent->Orientation)));
// If there's a local physics component
if (physicsComponent)
{
physicsData->MotionState = new btDefaultMotionState(transform);
btVector3 inertia;
if (physicsComponent->Mass != 0)
{
physicsData->CollisionShape->calculateLocalInertia(physicsComponent->Mass, inertia);
}
btRigidBody::btRigidBodyConstructionInfo rigidBodyCI(physicsComponent->Mass, physicsData->MotionState, physicsData->CollisionShape, inertia);
physicsData->RigidBody = new btRigidBody(rigidBodyCI);
m_DynamicsWorld->addRigidBody(physicsData->RigidBody);
}
else
{
// Otherwise, find our base parent and attach to compound shape
EntityID baseParent = m_World->GetEntityBaseParent(entity);
auto basePhysicsComponent = m_World->GetComponent<Components::Physics>(baseParent, "Physics");
if (!basePhysicsComponent)
{
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing physics component on base parent entity %i", entity, baseParent);
return;
}
auto baseCompoundShapeComponent = m_World->GetComponent<Components::CompoundShape>(baseParent, "CompoundShape");
if (!baseCompoundShapeComponent)
{
LOG_WARNING("Failed to attach orphan collision shape on entity %i: missing compound shape on base parent entity %i", entity, baseParent);
return;
}
PhysicsData* basePhysicsData = &m_PhysicsData.at(baseParent);
btCompoundShape* baseCompoundShape = dynamic_cast<btCompoundShape*>(basePhysicsData->CollisionShape);
baseCompoundShape->addChildShape(transform, physicsData->CollisionShape);
btVector3 inertia;
baseCompoundShape->calculateLocalInertia(basePhysicsComponent->Mass, inertia);
basePhysicsData->RigidBody->setMassProps(basePhysicsComponent->Mass, inertia);
basePhysicsData->RigidBody->updateInertiaTensor();
}
}
}
void Systems::PhysicsSystem::TearDownPhysicsState(EntityID entity, EntityID parent)
{
PhysicsData* physicsData = &m_PhysicsData[entity];
{
delete physicsData->RigidBody;
delete physicsData->MotionState;
delete physicsData->CollisionShape;
m_PhysicsData.erase(entity);
}
-43
View File
@@ -3,20 +3,7 @@
#include "System.h"
#include "Components/Transform.h"
#include "Components/Physics.h"
#include "Components/CompoundShape.h"
#include "Components/BoxShape.h"
#include "Components/SphereShape.h"
#include "Components/MeshShape.h"
#include "Components/StaticMeshShape.h"
#include "Components/BallSocketConstraint.h"
#include "Components/HingeConstraint.h"
#include "Components/SliderConstraint.h"
#include "Components/Vehicle.h"
#include "Components/Wheel.h"
#include "btBulletDynamicsCommon.h"
#include "LinearMath/btMatrix3x3.h"
#include <unordered_set>
namespace Systems
@@ -32,36 +19,6 @@ public:
void OnComponentRemoved(std::string type, Component* component) override;
private:
btBroadphaseInterface* m_Broadphase;
btDefaultCollisionConfiguration* m_CollisionConfiguration;
btCollisionDispatcher* m_Dispatcher;
btSequentialImpulseConstraintSolver* m_Solver;
btDiscreteDynamicsWorld* m_DynamicsWorld;
//m_DynamicsWorld = new btDiscreteDynamicsWorld(m_Dispatcher, m_Broadphase, m_Solver, m_CollisionConfiguration);
struct PhysicsData
{
btRigidBody* RigidBody;
btMotionState* MotionState;
btCollisionShape* CollisionShape;
};
std::map<EntityID, PhysicsData> m_PhysicsData;
std::map<std::pair<EntityID, EntityID>, btTypedConstraint*> m_Constraints;
struct Vehicle
{
btVehicleRaycaster* VehicleRaycaster;
btRaycastVehicle* RaycastVehicle;
btRaycastVehicle::btVehicleTuning Tuning;
std::unordered_set<EntityID> Wheels;
};
std::map<EntityID, Vehicle> m_Vehicles;
void SetUpPhysicsState(EntityID entity, EntityID parent);
void TearDownPhysicsState(EntityID entity, EntityID parent);
};
-12
View File
@@ -32,18 +32,6 @@ void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID pa
m_Renderer->AddModelToDraw(model, position, orientation, scale, modelComponent->Visible, modelComponent->ShadowCaster);
}
// Debug draw bounds
#ifdef DEBUG
auto collision = m_World->GetComponent<Components::Collision>(entity, "Collision");
auto bounds = m_World->GetComponent<Components::Bounds>(entity, "Bounds");
if (bounds != nullptr)
{
glm::vec3 origin = m_TransformSystem->AbsolutePosition(entity) + (transformComponent->Scale * bounds->Origin);
glm::vec3 volumeVector = transformComponent->Scale * bounds->VolumeVector;
m_Renderer->AddAABBToDraw(origin, volumeVector, (collision != nullptr && collision->CollidingEntities.size() > 0));
}
#endif
auto pointLightComponent = m_World->GetComponent<Components::PointLight>(entity, "PointLight");
if (pointLightComponent != nullptr)
{
-2
View File
@@ -10,8 +10,6 @@
#include "Components/Model.h"
#include "Components/Transform.h"
#include "Components/Camera.h"
#include "Components/Bounds.h"
#include "Components/Collision.h"
#include "Renderer.h"
namespace Systems