From f9f20535ba6038a142ea3efd310a81201aa8ec1f Mon Sep 17 00:00:00 2001 From: ViktorLjung Date: Wed, 4 Jun 2014 05:47:17 +0200 Subject: [PATCH] Jeep and tank tuning --- assets | 2 +- src/Components/JeepSteering.h | 14 + src/Components/Vehicle.h | 4 +- src/Events/JeepSteer.h | 19 + src/GameWorld.cpp | 3 +- src/GameWorld.h | 1 + src/Systems/JeepSteeringSystem.cpp | 312 +++++++ src/Systems/JeepSteeringSystem.h | 92 ++ src/Systems/PhysicsSystem.cpp | 122 +-- src/Systems/PhysicsSystem.h | 3 + src/Systems/TankSteeringSystem.cpp | 16 +- vs11/Returngeance/Returngeance.vcxproj | 4 + .../Returngeance/Returngeance.vcxproj.filters | 822 ++++-------------- 13 files changed, 715 insertions(+), 699 deletions(-) create mode 100644 src/Components/JeepSteering.h create mode 100644 src/Events/JeepSteer.h create mode 100644 src/Systems/JeepSteeringSystem.cpp create mode 100644 src/Systems/JeepSteeringSystem.h diff --git a/assets b/assets index 588da9c..e09ebf5 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 588da9ca0d0e6a3dd08f4373e03468f79082b359 +Subproject commit e09ebf5a29f007cb8ee884f48dc600926f0665bc diff --git a/src/Components/JeepSteering.h b/src/Components/JeepSteering.h new file mode 100644 index 0000000..763745f --- /dev/null +++ b/src/Components/JeepSteering.h @@ -0,0 +1,14 @@ +#ifndef JeepSteering_h__ +#define JeepSteering_h__ + +#include "Component.h" + +namespace Components +{ + struct JeepSteering : Component + { + JeepSteering* Clone() const override { return new JeepSteering(*this); } + }; +} + +#endif // JeepSteering_h__ \ No newline at end of file diff --git a/src/Components/Vehicle.h b/src/Components/Vehicle.h index 9f6cfac..8d9dfed 100644 --- a/src/Components/Vehicle.h +++ b/src/Components/Vehicle.h @@ -10,8 +10,8 @@ namespace Components struct Vehicle : Component { Vehicle() - : MaxTorque(1000.0f), MinRPM(200.0f), OptimalRPM(3000.0f), MaxRPM(6000.0f), MaxSteeringAngle(35), TopSpeed(90.0f), - MaxSpeedFullSteeringAngle(40.0f), SpringDamping(1.f), UpshiftRPM(5500.0f), DownshiftRPM(1000.0f), + : MaxTorque(1000.0f), MinRPM(200.0f), OptimalRPM(2500.0f), MaxRPM(4000.0f), MaxSteeringAngle(35), TopSpeed(90.0f), + MaxSpeedFullSteeringAngle(40.0f), SpringDamping(1.f), UpshiftRPM(3500.0f), DownshiftRPM(1000.0f), gearsRatio0(3.0f), gearsRatio1(2.25f), gearsRatio2(1.5f), gearsRatio3(1.0f){ } float MaxTorque; float MinRPM; diff --git a/src/Events/JeepSteer.h b/src/Events/JeepSteer.h new file mode 100644 index 0000000..03189ec --- /dev/null +++ b/src/Events/JeepSteer.h @@ -0,0 +1,19 @@ +#ifndef Events_JeepSteer_h__ +#define Events_JeepSteer_h__ +#include "Entity.h" +#include "EventBroker.h" + +namespace Events +{ + + struct JeepSteer : Event + { + EntityID Entity; + float PositionX; + float PositionY; + bool Handbrake; + }; + +} + +#endif // Events_JeepSteer_h__ \ No newline at end of file diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index ed130c7..d8dee4c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -413,7 +413,6 @@ void GameWorld::Initialize() } CommitEntity(gateBase); } - } void GameWorld::Update(double dt) @@ -444,6 +443,7 @@ void GameWorld::RegisterSystems() //m_SystemFactory.Register([this]() { return new Systems::PlayerSystem(this); }); m_SystemFactory.Register([this]() { return new Systems::FreeSteeringSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::TankSteeringSystem(this, EventBroker, ResourceManager); }); + m_SystemFactory.Register([this]() { return new Systems::JeepSteeringSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::WheelPairSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::SoundSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::PhysicsSystem(this, EventBroker, ResourceManager); }); @@ -467,6 +467,7 @@ void GameWorld::AddSystems() //AddSystem(); AddSystem(); AddSystem(); + AddSystem(); AddSystem(); AddSystem(); AddSystem(); diff --git a/src/GameWorld.h b/src/GameWorld.h index 66dde65..cb5ec94 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -24,6 +24,7 @@ #include "Systems/FollowSystem.h" #include "Systems/WallSystem.h" #include "Systems/GarageSystem.h" +#include "Systems/JeepSteeringSystem.h" #include "Components/Camera.h" #include "Components/DirectionalLight.h" diff --git a/src/Systems/JeepSteeringSystem.cpp b/src/Systems/JeepSteeringSystem.cpp new file mode 100644 index 0000000..d5c501b --- /dev/null +++ b/src/Systems/JeepSteeringSystem.cpp @@ -0,0 +1,312 @@ +#include "PrecompiledHeader.h" +#include "JeepSteeringSystem.h" +#include "World.h" + +void Systems::JeepSteeringSystem::RegisterComponents(ComponentFactory* cf) +{ + cf->Register([]() { return new Components::JeepSteering(); }); +} + +void Systems::JeepSteeringSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_ESpawnVehicle, &Systems::JeepSteeringSystem::OnSpawnVehicle); + + for (int i = 0; i < 4; i++) + { + m_JeepInputControllers[i] = std::shared_ptr(new JeepSteeringInputController(EventBroker, i + 1)); + } +} + +void Systems::JeepSteeringSystem::Update(double dt) +{ + for (int i = 0; i < 4; i++) + { + m_JeepInputControllers[i]->Update(dt); + } +} + +void Systems::JeepSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + auto tankSteeringComponent = m_World->GetComponent(entity); + if(!tankSteeringComponent) + return; + + auto playerComponent = m_World->GetComponent(entity); + if (!playerComponent) + return; + + if (playerComponent->ID == 0) + return; + + auto inputController = m_JeepInputControllers[playerComponent->ID - 1]; + + + Events::JeepSteer eSteering; + eSteering.Entity = entity; + eSteering.PositionX = inputController->PositionX; + eSteering.PositionY = inputController->PositionY; + eSteering.Handbrake = inputController->Handbrake; + EventBroker->Publish(eSteering); +} + +bool Systems::JeepSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &event) +{ + + if (event.VehicleType != "Jeep") + return false; + + auto spawnPointComponents = m_World->GetComponentsOfType(); + if (!spawnPointComponents) + { + LOG_ERROR("Found no spawn points!"); + return false; + } + + for (auto &spawnPointComponent : *spawnPointComponents) + { + auto spawnPoint = spawnPointComponent->Entity; + auto spawnPointBaseParent = m_World->GetEntityBaseParent(spawnPoint); + auto playerComponent = m_World->GetComponent(spawnPointBaseParent); + if (!playerComponent || playerComponent->ID != event.PlayerID) + continue; + + Components::Transform absoluteTransform = m_World->GetSystem()->AbsoluteTransform(spawnPoint); + + // Create a tank + EntityID Jeep = CreateJeep(event.PlayerID); + auto tankTransform = m_World->GetComponent(Jeep); + tankTransform->Position = glm::vec3(0, 50, 0);//absoluteTransform.Position; +// tankTransform->Orientation = absoluteTransform.Orientation; + // Set the viewport correctly + Events::SetViewportCamera e; + e.CameraEntity = m_World->GetProperty(Jeep, "Camera"); + if (event.PlayerID == 1) + e.ViewportFrame = "Viewport1"; + else if (event.PlayerID == 2) + e.ViewportFrame = "Viewport2"; + EventBroker->Publish(e); + } + + return true; +} + +EntityID Systems::JeepSteeringSystem::CreateJeep(int playerID) +{ + auto jeep = m_World->CreateEntity(); + auto transform = m_World->AddComponent(jeep); + transform->Position = glm::vec3(0, 5, 0); + //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); + auto physics = m_World->AddComponent(jeep); + physics->Mass = 1600; + physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic; + auto vehicle = m_World->AddComponent(jeep); + vehicle->MaxTorque = 400.f; + vehicle->MaxSteeringAngle = 50.f; + vehicle->MaxSpeedFullSteeringAngle = 20.f; + vehicle->MinRPM = 1000.0f; + vehicle->OptimalRPM = 4000.0f, + vehicle->MaxRPM = 6000.0f; + vehicle->TopSpeed = 90.0f; + vehicle->SpringDamping = 1.f; + vehicle->UpshiftRPM = 5500.0f; + vehicle->DownshiftRPM = 1500.0f; + vehicle->gearsRatio0 = 3.0f; + vehicle->gearsRatio1 = 2.25f; + vehicle->gearsRatio2 = 1.5f; + vehicle->gearsRatio3 = 1.0f; + + auto player = m_World->AddComponent(jeep); + player->ID = playerID; + auto tankSteering = m_World->AddComponent(jeep); + m_World->AddComponent(jeep); + auto health = m_World->AddComponent(jeep); + health->Amount = 100.f; + + { + auto shape = m_World->CreateEntity(jeep); + auto transform = m_World->AddComponent(shape); + auto meshShape = m_World->AddComponent(shape); + meshShape->ResourceName = "Models/Jeep/Chassi/ChassiCollision.obj"; + m_World->CommitEntity(shape); + } + + { + auto chassis = m_World->CreateEntity(jeep); + auto transform = m_World->AddComponent(chassis); + transform->Position = glm::vec3(0, 0, 0); + auto model = m_World->AddComponent(chassis); + model->ModelFile = "Models/Jeep/Chassi/Chassi.OBJ"; + } + + + auto cameraTower = m_World->CreateEntity(jeep); + { + auto transform = m_World->AddComponent(cameraTower); + transform->Position.z = 16.f; + transform->Position.y = 4.f; + transform->Orientation = glm::quat(glm::vec3(-glm::radians(5.f), 0.f, 0.f)); + auto cameraComp = m_World->AddComponent(cameraTower); + cameraComp->FarClip = 2000.f; + m_World->SetProperty(jeep, "Camera", cameraTower); + } + + + + + + +#pragma region Wheels + //Create wheels + float wheelOffset = 0.f;//-0.83f; + const float suspensionStrength = 15.f; + const float springLength = 0.3f; + + AddJeepWheels(jeep); +#pragma endregion + + { + auto entity = m_World->CreateEntity(jeep); + auto transformComponent = m_World->AddComponent(entity); + transformComponent->Position = glm::vec3(-2, -1.7, 2.0); + transformComponent->Scale = glm::vec3(3, 3, 3); + transformComponent->Orientation = glm::angleAxis(glm::pi() / 2, glm::vec3(1, 0, 0)); + auto emitterComponent = m_World->AddComponent(entity); + emitterComponent->SpawnCount = 2; + emitterComponent->SpawnFrequency = 0.005; + emitterComponent->SpreadAngle = glm::pi(); + emitterComponent->UseGoalVelocity = false; + emitterComponent->LifeTime = 0.5; + //emitterComponent->AngularVelocitySpectrum.push_back(glm::pi() / 100); + emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05)); + m_World->CommitEntity(entity); + + auto particleEntity = m_World->CreateEntity(entity); + auto TEMP = m_World->AddComponent(particleEntity); + TEMP->Scale = glm::vec3(0); + auto spriteComponent = m_World->AddComponent(particleEntity); + spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; + emitterComponent->ParticleTemplate = particleEntity; + + m_World->CommitEntity(particleEntity); + } + + m_World->CommitEntity(jeep); + + return jeep; +} + +void Systems::JeepSteeringSystem::AddJeepWheels(EntityID jeepEntity) +{ + //Create wheels + float wheelOffset = 0.4f; + float springLength = 0.3f; + float suspensionStrength = 45.f; + { + auto wheel = m_World->CreateEntity(jeepEntity); + auto transform = m_World->AddComponent(wheel); + transform->Position = glm::vec3(1.9f, 0.5546f - wheelOffset, -0.9242f); + transform->Scale = glm::vec3(1.0f); + auto model = m_World->AddComponent(wheel); + model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; + auto Wheel = m_World->AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 50; + Wheel->Radius = 0.837f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + m_World->CommitEntity(wheel); + } + + { + auto wheel = m_World->CreateEntity(jeepEntity); + auto transform = m_World->AddComponent(wheel); + transform->Position = glm::vec3(-1.9f, 0.5546f - wheelOffset, -0.9242f); + transform->Scale = glm::vec3(1.0f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); + auto model = m_World->AddComponent(wheel); + model->ModelFile = "Models/Jeep/WheelFront/wheelFront.obj"; + auto Wheel = m_World->AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 50; + Wheel->Radius = 0.837f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + m_World->CommitEntity(wheel); + } + + { + auto wheel = m_World->CreateEntity(jeepEntity); + auto transform = m_World->AddComponent(wheel); + transform->Position = glm::vec3(0.2726f, 0.2805f - wheelOffset, 1.9307f); + auto model = m_World->AddComponent(wheel); + model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; + auto Wheel = m_World->AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 50; + Wheel->Radius = 0.737f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + m_World->CommitEntity(wheel); + } + + { + auto wheel = m_World->CreateEntity(jeepEntity); + auto transform = m_World->AddComponent(wheel); + transform->Position = glm::vec3(-0.2726f, 0.2805f - wheelOffset, 1.9307f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 0, 1)); + auto model = m_World->AddComponent(wheel); + model->ModelFile = "Models/Jeep/WheelBack/wheelBack.obj"; + auto Wheel = m_World->AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 50; + Wheel->Radius = 0.737f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + m_World->CommitEntity(wheel); + } + + +} + +void Systems::JeepSteeringSystem::JeepSteeringInputController::Update( double dt ) +{ + PositionX = m_Horizontal; + PositionY = m_Vertical; +} + +bool Systems::JeepSteeringSystem::JeepSteeringInputController::OnCommand(const Events::InputCommand &event) +{ + if (event.PlayerID != this->PlayerID) + return false; + + float val = event.Value; + + // Tank + if (event.Command == "horizontal") + { + m_Horizontal = val; + } + else if (event.Command == "vertical") + { + m_Vertical = -val; + } + + else if (event.Command == "handbrake") + { + Handbrake = val > 0; + } + return true; +} + diff --git a/src/Systems/JeepSteeringSystem.h b/src/Systems/JeepSteeringSystem.h new file mode 100644 index 0000000..0a786be --- /dev/null +++ b/src/Systems/JeepSteeringSystem.h @@ -0,0 +1,92 @@ +#include + +#include "System.h" +#include "Components/Transform.h" +#include "Components/Physics.h" +#include "Components/Vehicle.h" +#include "Components/Player.h" +#include "Components/Model.h" +#include "Systems/TransformSystem.h" +#include "Systems/ParticleSystem.h" +#include "InputController.h" + +#include "Components/Health.h" + +#include "Components/Trigger.h" + +#include "Components/Vehicle.h" +#include "Components/Player.h" + +#include "Events/SpawnVehicle.h" +#include "Components/SpawnPoint.h" + +#include "Components/Wheel.h" +#include "Components/MeshShape.h" +#include "Components/Camera.h" +#include "Components/BoxShape.h" +#include "Components/WheelPair.h" +#include "Components/Input.h" +#include "Components/JeepSteering.h" +#include "Events/JeepSteer.h" + +#include "Events/SetViewportCamera.h" + +namespace Systems +{ + + class JeepSteeringSystem : public System + { + public: + JeepSteeringSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager) + : System(world, eventBroker, resourceManager) + { } + + void RegisterComponents(ComponentFactory* cf) override; + void Initialize() override; + + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + private: + std::map m_TimeSinceLastShot; + EventRelay m_ESpawnVehicle; + bool OnSpawnVehicle(const Events::SpawnVehicle &e); + + class JeepSteeringInputController; + std::array, 4> m_JeepInputControllers; + + EntityID CreateJeep(int playerID); + void AddJeepWheels(EntityID jeepEntity); + }; + + class JeepSteeringSystem::JeepSteeringInputController : InputController + { + public: + JeepSteeringInputController(std::shared_ptr<::EventBroker> eventBroker, int playerID) + : InputController(eventBroker) + { + PlayerID = playerID; + + m_Horizontal = 0.f; + m_Vertical = 0.f; + PositionX = 0; + PositionY = 0; + Handbrake = false; + } + + int PlayerID; + + float PositionY; + float PositionX; + bool Handbrake; + + void Update(double dt); + protected: + virtual bool OnCommand(const Events::InputCommand &event); + //virtual bool OnMouseMove(const Events::MouseMove &event); + + private: + float m_Horizontal; + float m_Vertical; + }; +} \ No newline at end of file diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 1e8e2dd..f03709a 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -33,6 +33,7 @@ void Systems::PhysicsSystem::Initialize() // Events EVENT_SUBSCRIBE_MEMBER(m_ETankSteer, &Systems::PhysicsSystem::OnTankSteer); + EVENT_SUBSCRIBE_MEMBER(m_EJeepSteer, &Systems::PhysicsSystem::OnJeepSteer); EVENT_SUBSCRIBE_MEMBER(m_ESetVelocity, &Systems::PhysicsSystem::OnSetVelocity); EVENT_SUBSCRIBE_MEMBER(m_EApplyForce, &Systems::PhysicsSystem::OnApplyForce); EVENT_SUBSCRIBE_MEMBER(m_EApplyPointImpulse, &Systems::PhysicsSystem::OnApplyPointImpulse); @@ -274,27 +275,10 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p else if(m_RigidBodies.find(entity) != m_RigidBodies.end()) { auto transformComponentParent = m_World->GetComponent(parent); - - /* if(transformComponentParent) - { - auto absoluteTransformParent = m_World->GetSystem()->AbsoluteTransform(parent); - transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition()); - transformComponent->Orientation = glm::inverse(HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation())) * absoluteTransformParent.Orientation; - transformComponent->Velocity = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getLinearVelocity()); - } - else - { - auto transformComponentParent = m_World->GetComponent(parent); - transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition()); - transformComponent->Orientation = HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation()); - transformComponent->Velocity = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getLinearVelocity()); - }*/ - transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition()); transformComponent->Orientation = HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation()); transformComponent->Velocity = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getLinearVelocity()); - // HACK: WTF IS THIS? if (transformComponentParent) { auto absoluteTransformParent = m_World->GetSystem()->AbsoluteTransform(parent); @@ -758,47 +742,6 @@ void HK_CALL Systems::PhysicsSystem::HavokErrorReport(const char* msg, void*) LOG_INFO("%s", msg); } -bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) -{ - auto vehicleComponent = m_World->GetComponent(event.Entity); - - 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; - auto transformComponent = m_World->GetComponent(event.Entity); - - 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 - { - deviceStatus->m_positionX = event.PositionX; - deviceStatus->m_positionY = event.PositionY; - } - - if(event.PositionY > 0) - { - deviceStatus->m_reverseButtonPressed = true; - } - deviceStatus->m_handbrakeButtonPressed = event.Handbrake; - } - - return true; -} - bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event ) { if(m_RigidBodies.find(event.Entity) != m_RigidBodies.end()) @@ -894,3 +837,66 @@ bool Systems::PhysicsSystem::OnDisableCollisions( const Events::DisableCollision m_PhysicsWorld->unmarkForWrite(); return true; } + + +bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event) +{ + auto vehicleComponent = m_World->GetComponent(event.Entity); + + 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; + auto transformComponent = m_World->GetComponent(event.Entity); + + 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 + { + deviceStatus->m_positionX = event.PositionX; + deviceStatus->m_positionY = event.PositionY; + } + + if(event.PositionY > 0) + { + deviceStatus->m_reverseButtonPressed = true; + } + deviceStatus->m_handbrakeButtonPressed = event.Handbrake; + } + + return true; +} + + +bool Systems::PhysicsSystem::OnJeepSteer( const Events::JeepSteer &event ) +{ + auto vehicleComponent = m_World->GetComponent(event.Entity); + + 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; + deviceStatus->m_positionX = event.PositionX; + deviceStatus->m_positionY = event.PositionY; + + if(event.PositionY > 0) + { + deviceStatus->m_reverseButtonPressed = true; + } + deviceStatus->m_handbrakeButtonPressed = event.Handbrake; + } + + return true; +} diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index a1df46a..cdfac8a 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -88,6 +88,7 @@ #include "Components/Template.h" #include "Events/EnterTrigger.h" +#include "Events/JeepSteer.h" namespace Systems { @@ -178,6 +179,8 @@ private: // Events EventRelay m_ETankSteer; bool OnTankSteer(const Events::TankSteer &event); + EventRelay m_EJeepSteer; + bool OnJeepSteer(const Events::JeepSteer &event); EventRelay m_ESetVelocity; bool OnSetVelocity(const Events::SetVelocity &event); EventRelay m_EApplyForce; diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index e140f49..6f37005 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -313,8 +313,8 @@ bool Systems::TankSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &eve // Create a tank EntityID tank = CreateTank(event.PlayerID); auto tankTransform = m_World->GetComponent(tank); - tankTransform->Position = absoluteTransform.Position; - tankTransform->Orientation = absoluteTransform.Orientation; + tankTransform->Position = glm::vec3(0, 50, 0);//absoluteTransform.Position; +// tankTransform->Orientation = absoluteTransform.Orientation; // Set the viewport correctly Events::SetViewportCamera e; e.CameraEntity = m_World->GetProperty(tank, "Camera"); @@ -341,6 +341,18 @@ EntityID Systems::TankSteeringSystem::CreateTank(int playerID) vehicle->MaxTorque = 8000.f; vehicle->MaxSteeringAngle = 90.f; vehicle->MaxSpeedFullSteeringAngle = 4.f; + vehicle->MinRPM = 200.0f; + vehicle->OptimalRPM = 2500.0f, + vehicle->MaxRPM = 4000.0f; + vehicle->TopSpeed = 90.0f; + vehicle->SpringDamping = 1.f; + vehicle->UpshiftRPM = 3500.0f; + vehicle->DownshiftRPM = 1000.0f; + vehicle->gearsRatio0 = 3.0f; + vehicle->gearsRatio1 = 2.25f; + vehicle->gearsRatio2 = 1.5f; + vehicle->gearsRatio3 = 1.0f; + auto player = m_World->AddComponent(tank); player->ID = playerID; auto tankSteering = m_World->AddComponent(tank); diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 4f89884..8121c25 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -109,6 +109,7 @@ + @@ -142,6 +143,7 @@ + @@ -195,6 +197,7 @@ + @@ -237,6 +240,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 24209c6..1ccb35d 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -1,649 +1,201 @@  - - - - - - - Rendering\Systems - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Physics\Systems - - - Base\Systems - - - Base\Systems - - - Audio\Systems - - - Input\Systems - - - Input\Systems - - - - Particle System\Systems - + + - - Physics - - - Input - - - Physics\Systems - - - Game\Vehicles\Helicopter\Systems - - - Physics\Systems - - - Base\Systems - - - Game\Systems - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Game\Systems - - - Gameplay\Systems - - - Game\Systems - - - Audio - + + + - - {ce43847c-9745-46d2-b000-069af4882886} - - - {8974329a-5c12-4b94-86e7-5931555bc129} - - - {aca514ec-84de-423c-a270-ec4399904c5a} - - - {fcbc3469-7049-4c07-9d76-f8f1e872f042} - - - {f6c5fd1d-7180-42b7-b973-a91bfc3ea189} - - - {d08cc18b-b7d8-47a7-91af-7283052e4c97} - - - {1c5d571e-55f4-498b-b64a-2f28ac2cd9b0} - - - {635843f6-c94e-4798-8201-db64d11e2a03} - - - {3bd82924-397c-4c5a-959c-971612269374} - - - {c17ff66a-f9f5-4329-a05d-e7bf8a140dd3} - - - {caa1e07f-fa19-4706-bf59-de74a0290763} - - - {444e18d8-8ab6-413b-b9b0-59a6309e0511} - - - {a2db813b-1d08-4d48-97ac-2faaff29a1cc} - - - {44c41b41-b706-4d88-8d50-abdeb2a828fe} - - - {30c6d948-459c-4fc7-b44d-ecbe5f34203e} - - - {8bcc0a31-3e0d-4342-8d10-ec8edfa03abd} - - - {93ce6550-7614-46b4-a554-0eec26e6fbf6} - - - {0bb544bb-1b0a-487f-88d6-f8ab8a2795f4} - - - {a6ca6194-3aa5-46cc-ac05-206f9a400dec} - - - {9f45f029-46c8-4c0d-b44c-dc9bffd3c6a6} - - - {6e633434-4aed-453d-b2f9-8c51ca7f78db} - - - {85692f3a-5241-4780-a3ca-f4d8a2851392} - - - {ee125b77-b275-4841-abc9-374957a89916} - - - {42ae084f-ade8-402c-87ba-f03f6b846bc8} - - - {a025d51e-594d-4844-983b-f683726bf1bf} - - - {ffab6cc2-2fbf-400f-9398-a6741b6cc95c} - - - {5b992473-73e6-485e-8f13-17e0801fb2ca} - - - {8a78be3a-a3c5-4054-a2f1-1456f3fcbab0} - - - {8ccc0abe-5bdd-4656-ab11-5708a39c71ae} - - - {b2416d05-a49e-4fef-a5c4-cd03d8cc2efd} - - - {b34c0c95-a887-4cf4-af24-cf7c1f459aa8} - - - {cb06b441-90b8-46ed-b347-4190dac7185b} - - - {ddd3c442-7c2f-4690-9308-fcef62deee0b} - - - {3c2ea0e5-41a1-4b11-a891-1d59ead7223c} - - - {3cbe68d9-2446-45ee-8637-ffb805997dcd} - - - {9702064a-02a2-4b3c-a2ab-47c23a9cf49c} - - - - - - - - - - - Util - - - Util - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - Rendering\Components - - - Rendering\Components - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Rendering - - - Physics\Components - - - Physics\Systems - - - Base\Components - - - Base\Components - - - Rendering\Components - - - Base\Systems - - - Base\Systems - - - Audio\Systems - - - Audio\Components - - - Rendering\Systems - - - Input\Systems - - - Input\Systems - - - Input\Components - - - Input\Components - - - Particle System\Components - - - Rendering\Components - - - Rendering\Components - - - - Audio - - - Physics\Components - - - Physics\Components - - - Physics - - - Physics\Components - - - Physics\Components - - - Physics\Components - - - Util - - - Physics\Components - - - Physics\Components - - - Physics\Components - - - Particle System\Systems - - - Particle System\Components - - - GUI - - - Util - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Input\Events - - - Input\Events - - - Input - - - Input\Events - - - Input\Events - - - Input\Events - - - Input\Events - - - Input\Events - - - Input\Events - - - Input - - - Rendering - - - GUI - - - Physics - - - Physics\Components - - - Physics\Events - - - Physics\Systems - - - Physics\Components - - - Physics\Components - - - Physics\Events - - - Input\Events - - - Input\Events - - - Input\Events - - - Input\Events - - - Physics\Components - - - Physics\Components - - - Input\Events - - - Game\Vehicles\Helicopter\Components - - - Game\Vehicles\Helicopter\Systems - - - Physics\Events - - - Physics\Events - - - Game\Components - - - Particle System\Events - - - Physics\Events - - - Gameplay\Components - - - Audio\Components - - - Base\Events - - - Audio\Events - - - Audio\Events - - - Audio\Events - - - Physics\Components - - - Physics\Events - - - Physics\Events - - - Physics\Components - - - Physics\Systems - - - Physics\Components - - - Physics\Events - - - Base\Systems - - - Base\Components - - - Base\Components - - - Game\Systems - - - Game\Events - - - Game\Components - - - GUI - - - GUI - - - Rendering\Events - - - GUI - - - GUI - - - GUI - - - Physics\Systems - - - Base\Events - - - Rendering\Components - - - Gameplay\Systems - - - Physics\Events - - - Game\Components - - - Game\Systems - - - Base\Events - - - Physics\Components - - - Physics\Components - - - Game\Systems - - - Game\Components - - - Base\Components - - - Base\Components - - - GUI - - - Gameplay\Events - - - Game\Events - - - Game\Components - - - Game\Components - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - - - Shaders - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file