Tanksteering improved

This commit is contained in:
ViktorLjung
2014-05-28 20:28:48 +02:00
parent f775864ed2
commit 133473b00e
3 changed files with 40 additions and 9 deletions
+38 -7
View File
@@ -138,6 +138,7 @@ void Systems::PhysicsSystem::Initialize()
e.Layer2 = EXPLOSION_LAYER; e.Layer2 = EXPLOSION_LAYER;
EventBroker->Publish(e); EventBroker->Publish(e);
}*/ }*/
} }
void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf) void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf)
@@ -377,6 +378,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
} }
// Create RigidBody // Create RigidBody
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo); hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
m_RigidBodies[entity] = rigidBody;
m_RigidBodyEntities[rigidBody] = entity;
auto vehicleComponent = m_World->GetComponent<Components::Vehicle >(entity); auto vehicleComponent = m_World->GetComponent<Components::Vehicle >(entity);
if (vehicleComponent && m_Vehicles.find(entity) == m_Vehicles.end()) if (vehicleComponent && m_Vehicles.find(entity) == m_Vehicles.end())
@@ -393,7 +396,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
VehicleSetup vehicleSetup; VehicleSetup vehicleSetup;
// Create the basic vehicle. // Create the basic vehicle.
m_Vehicles[entity] = new hkpVehicleInstance(rigidBody); m_Vehicles[entity] = new hkpVehicleInstance(m_RigidBodies[entity]);
m_PhysicsWorld->markForWrite(); m_PhysicsWorld->markForWrite();
vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels); vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels);
// Add the vehicle's entities and phantoms to the world // Add the vehicle's entities and phantoms to the world
@@ -402,8 +405,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
rigidBody->addContactListener( m_collisionResolution ); rigidBody->addContactListener( m_collisionResolution );
} }
m_Vehicles[entity]->addToWorld(m_PhysicsWorld); m_Vehicles[entity]->addToWorld(m_PhysicsWorld);
m_RigidBodies[entity] = rigidBody;
m_RigidBodyEntities[rigidBody] = entity;
// The vehicle is an action // The vehicle is an action
@@ -423,8 +424,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
rigidBody->addContactListener( m_collisionResolution ); rigidBody->addContactListener( m_collisionResolution );
} }
m_PhysicsWorld->addEntity(rigidBody); m_PhysicsWorld->addEntity(rigidBody);
m_RigidBodies[entity] = rigidBody;
m_RigidBodyEntities[rigidBody] = entity;
m_PhysicsWorld->unmarkForWrite(); m_PhysicsWorld->unmarkForWrite();
shape->removeReference(); shape->removeReference();
@@ -707,11 +707,42 @@ void HK_CALL Systems::PhysicsSystem::HavokErrorReport(const char* msg, void*)
bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event)
{ {
auto vehicleComponent = m_World->GetComponent<Components::Vehicle>(event.Entity); auto vehicleComponent = m_World->GetComponent<Components::Vehicle>(event.Entity);
if (vehicleComponent && m_Vehicles.find(event.Entity) != m_Vehicles.end() && m_RigidBodies.find(event.Entity) != m_RigidBodies.end()) if (vehicleComponent && m_Vehicles.find(event.Entity) != m_Vehicles.end() && m_RigidBodies.find(event.Entity) != m_RigidBodies.end())
{ {
hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus; hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus;
deviceStatus->m_positionX = event.PositionX; auto transformComponent = m_World->GetComponent<Components::Transform>(event.Entity);
deviceStatus->m_positionY = event.PositionY;
float steeringX = event.PositionX;
glm::vec3 velocityNormalized = glm::normalize(HKVECTOR4_TO_GLMVEC3(m_RigidBodies[event.Entity]->getLinearVelocity()));
glm::vec3 forward = glm::normalize(transformComponent->Orientation * glm::vec3(0, 0, -1));
float dotProduct = glm::dot(forward, velocityNormalized);
if(dotProduct < 0)
{
steeringX = (1 - (glm::clamp(abs(m_Vehicles[event.Entity]->calcKMPH() /vehicleComponent->TopSpeed), 0.f, 0.7f))) * steeringX;
}
if(abs(m_Vehicles[event.Entity]->calcKMPH()) < 2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180))
{
deviceStatus->m_positionY = -0.4f;
deviceStatus->m_positionX = steeringX;
}
// else if(m_Vehicles[event.Entity]->calcKMPH() > -2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180))
// {
// deviceStatus->m_positionY = 0.4f;;
// deviceStatus->m_positionX = -steeringX;
// }
else
{
deviceStatus->m_positionX = steeringX;
deviceStatus->m_positionY = event.PositionY;
}
if(event.PositionY > 0) if(event.PositionY > 0)
{ {
deviceStatus->m_reverseButtonPressed = true; deviceStatus->m_reverseButtonPressed = true;
+1 -2
View File
@@ -257,13 +257,12 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E
if (event.Command == "horizontal") if (event.Command == "horizontal")
{ {
m_Horizontal = val; m_Horizontal = val;
m_Vertical = -0.4f;
} }
else if (event.Command == "vertical") else if (event.Command == "vertical")
{ {
m_Vertical = -val; m_Vertical = -val;
} }
else if (event.Command == "handbrake") else if (event.Command == "handbrake")
{ {
Handbrake = val > 0; Handbrake = val > 0;
+1
View File
@@ -29,6 +29,7 @@
#include "Components/FrameTimer.h" #include "Components/FrameTimer.h"
#include "Events/Damage.h" #include "Events/Damage.h"
#include "Components/Vehicle.h"
namespace Systems namespace Systems
{ {