diff --git a/src/Components/SpawnPoint.h b/src/Components/SpawnPoint.h new file mode 100644 index 0000000..c29230d --- /dev/null +++ b/src/Components/SpawnPoint.h @@ -0,0 +1,16 @@ +#ifndef Components_VehicleSpawn_h__ +#define Components_VehicleSpawn_h__ + +#include "Component.h" + +namespace Components +{ + +struct SpawnPoint : Component +{ + virtual SpawnPoint* Clone() const override { return new SpawnPoint(*this); } +}; + +} + +#endif // Components_VehicleSpawn_h__ \ No newline at end of file diff --git a/src/Events/SpawnVehicle.h b/src/Events/SpawnVehicle.h index f48c9ce..21393de 100644 --- a/src/Events/SpawnVehicle.h +++ b/src/Events/SpawnVehicle.h @@ -8,16 +8,8 @@ namespace Events { struct SpawnVehicle : Event { - enum class VehicleType - { - Tank = 0, - Helicopter, - HRSV, - Jeep - }; - int PlayerID; - VehicleType Vehicle; + std::string VehicleType; }; } diff --git a/src/GUI/GameFrame.h b/src/GUI/GameFrame.h index 1100dc9..36235a2 100644 --- a/src/GUI/GameFrame.h +++ b/src/GUI/GameFrame.h @@ -27,11 +27,12 @@ public: vp1->Width = this->Width / 2.f; //new PlayerHUD(vp1, "PlayerHUD", m_World, 1); new VehicleSelection(vp1, "VehicleSelection", m_World, 1); + vp2 = new Viewport(worldFrame, "Viewport2", m_World); vp2->X = vp1->Right(); vp2->Width = this->Width / 2.f; - new PlayerHUD(vp2, "PlayerHUD", m_World, 2); + //new PlayerHUD(vp2, "PlayerHUD", m_World, 2); m_FreeCamViewport = new Viewport(worldFrame, "ViewportFreeCam", m_World); m_FreeCamViewport->Hide(); diff --git a/src/GUI/VehicleSelection.h b/src/GUI/VehicleSelection.h index 3c8cb39..9a2ec18 100644 --- a/src/GUI/VehicleSelection.h +++ b/src/GUI/VehicleSelection.h @@ -3,6 +3,7 @@ #include "GUI/Frame.h" #include "GUI/HealthOverlay.h" +#include "Events/SpawnVehicle.h" namespace GUI { @@ -37,14 +38,8 @@ namespace GUI m_Background->SetTexture("Textures/GUI/VehicleSelection/1.png"); } - - - - void Update(double dt) override { - - glm::vec2 posDiff = m_TargetCoordinate - m_CurrentCoordinate; m_CurrentCoordinate += posDiff * 2.f * (float)dt; @@ -76,6 +71,12 @@ namespace GUI bool OnCommand(const Events::InputCommand &event) override { + if (Hidden()) + return false; + + if (event.PlayerID != m_PlayerID) + return false; + // Menu movement if (event.Command == "interface_horizontal" || event.Command == "interface_vertical") { @@ -119,6 +120,23 @@ namespace GUI m_TargetSize = size * scale; } + // Vehicle select + if (event.Command == "interface_confirm" && event.Value > 0) + { + Events::SpawnVehicle e; + e.PlayerID = m_PlayerID; + if (m_CurrentSelection == 0) + e.VehicleType = "Tank"; // HACK: Base on selected vehicle ID + else if (m_CurrentSelection == 1) + e.VehicleType = "Helicopter"; + else if (m_CurrentSelection == 2) + e.VehicleType = "HRSV"; + else if (m_CurrentSelection == 3) + e.VehicleType = "Jeep"; + EventBroker->Publish(e); + Hide(); + } + return true; } }; diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 7d6d38f..fb3329c 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -19,8 +19,8 @@ void GameWorld::Initialize() BindGamepadAxis(Gamepad::Axis::LeftY, "interface_vertical", 1.f); BindGamepadButton(Gamepad::Button::Up, "interface_vertical", 1.f); BindGamepadButton(Gamepad::Button::Down, "interface_vertical", -1.f); - BindKey(GLFW_KEY_SPACE, "interface_accept", 1.f); - BindGamepadButton(Gamepad::Button::A, "interface_accept", 1.f); + BindKey(GLFW_KEY_SPACE, "interface_confirm", 1.f); + BindGamepadButton(Gamepad::Button::A, "interface_confirm", 1.f); @@ -44,6 +44,9 @@ void GameWorld::Initialize() BindKey(GLFW_KEY_Z, "shoot", 1.f); BindGamepadAxis(Gamepad::Axis::RightTrigger, "shoot", 1.f); + BindKey(GLFW_KEY_X, "use", 1.f); + BindGamepadButton(Gamepad::Button::X, "use", 1.f); + BindMouseButton(GLFW_MOUSE_BUTTON_1, "cam_lock", 1.f); BindKey(GLFW_KEY_Y, "cam_vertical", 1.f); BindKey(GLFW_KEY_H, "cam_vertical", -1.f); @@ -114,17 +117,17 @@ void GameWorld::Initialize() CommitEntity(ground); } - EntityID tank1 = CreateTank(1); + /*EntityID tank1 = CreateTank(1); { - auto transform = GetComponent(tank1); - transform->Position.z = -125.f; - transform->Position.y = -20.f; - transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); - Events::SetViewportCamera e; - e.CameraEntity = GetProperty(tank1, "Camera"); - e.ViewportFrame = "Viewport1"; - EventBroker->Publish(e); - } + auto transform = GetComponent(tank1); + transform->Position.z = -125.f; + transform->Position.y = -20.f; + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + Events::SetViewportCamera e; + e.CameraEntity = GetProperty(tank1, "Camera"); + e.ViewportFrame = "Viewport1"; + EventBroker->Publish(e); + }*/ /*EntityID tank2 = CreateTank(2); { @@ -176,6 +179,10 @@ void GameWorld::Initialize() auto garage = CreateEntity(); auto transform = AddComponent(garage); transform->Position = Position; + auto player = AddComponent(garage); + player->ID = 1; + + auto ElevatorBase = CreateEntity(garage); { @@ -282,6 +289,14 @@ void GameWorld::Initialize() box->Depth = 6.86f; CommitEntity(shape); } + + auto spawnPoint = CreateEntity(elevator); + { + auto transform = AddComponent(spawnPoint); + transform->Position.y = 1.f; + auto spawnPointComponent = AddComponent(spawnPoint); + } + CommitEntity(spawnPoint); } CommitEntity(elevator); @@ -314,16 +329,16 @@ void GameWorld::Initialize() auto trigger = CreateEntity(garage); SetProperty(trigger, "Name", "ElevatorShaftTrigger"); auto transform = AddComponent(trigger); - transform->Position = glm::vec3(0.69385f, -6.7997f, 2.39938f); + transform->Position = glm::vec3(0.69385f, -6.7997f, -2.0f); auto triggerComponent = AddComponent(trigger); { auto shape = CreateEntity(trigger); auto transform = AddComponent(shape); transform->Position = glm::vec3(0, 0, 0); auto box = AddComponent(shape); - box->Width = 1.0f; - box->Height = 10.f; - box->Depth = 1.0f; + box->Width = 2.0f; + box->Height = 12.f; + box->Depth = 2.0f; CommitEntity(shape); } CommitEntity(trigger); @@ -564,279 +579,6 @@ void GameWorld::CreateGate(glm::vec3 Position) } } -EntityID GameWorld::CreateTank(int playerID) -{ - auto tank = CreateEntity(); - auto transform = AddComponent(tank); - transform->Position = glm::vec3(0, 5, 0); - //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); - auto physics = AddComponent(tank); - physics->Mass = 63000 - 16000; - physics->Static = false; - auto vehicle = AddComponent(tank); - vehicle->MaxTorque = 8000.f; - vehicle->MaxSteeringAngle = 90.f; - vehicle->MaxSpeedFullSteeringAngle = 4.f; - auto player = AddComponent(tank); - player->ID = playerID; - auto tankSteering = AddComponent(tank); - AddComponent(tank); - auto health = AddComponent(tank); - health->Amount = 100.f; - - { - auto shape = CreateEntity(tank); - auto transform = AddComponent(shape); - auto meshShape = AddComponent(shape); - meshShape->ResourceName = "Models/Tank/TankCollisionShape.obj"; - CommitEntity(shape); - } - { - auto shapeTower = CreateEntity(tank); - auto transform = AddComponent(shapeTower); - transform->Position = glm::vec3(0, 1.10633f, 1.03024f); - auto box = AddComponent(shapeTower); - box->Width = 1.298f; - box->Height = 0.502f; - box->Depth = 1.211f; - CommitEntity(shapeTower); - } - - { - auto chassis = CreateEntity(tank); - auto transform = AddComponent(chassis); - transform->Position = glm::vec3(0, 0, 0); - auto model = AddComponent(chassis); - model->ModelFile = "Models/Tank/tankBody.obj"; - } - { - auto tower = CreateEntity(tank); - SetProperty(tower, "Name", "tower"); - auto transform = AddComponent(tower); - transform->Position = glm::vec3(0.f, 0.68f, 0.9f); - auto model = AddComponent(tower); - model->ModelFile = "Models/Tank/tankTop.obj"; - auto towerSteering = AddComponent(tower); - towerSteering->Axis = glm::vec3(0.f, 1.f, 0.f); - towerSteering->TurnSpeed = glm::pi() / 4.f; - { - auto barrel = CreateEntity(tower); - auto transform = AddComponent(barrel); - transform->Position = glm::vec3(-0.012f, 0.3f, -0.95); - auto model = AddComponent(barrel); - model->ModelFile = "Models/Tank/tankBarrel.obj"; - auto barrelSteering = AddComponent(barrel); - barrelSteering->Axis = glm::vec3(1.f, 0.f, 0.f); - barrelSteering->TurnSpeed = glm::pi() / 4.f; - barrelSteering->ShotSpeed = 70.f; - barrelSteering->LowerRotationLimit = glm::radians(-10.f); - barrelSteering->UpperRotationLimit = glm::radians(40.f); - { - auto shot = CreateEntity(barrel); - auto transform = AddComponent(shot); - transform->Position = glm::vec3(0.35f, 0.f, -2.f); - transform->Orientation = glm::angleAxis(-glm::pi() / 2.f, glm::vec3(1, 0, 0)); - transform->Scale = glm::vec3(3.f); - AddComponent(shot); - auto physics = AddComponent(shot); - physics->Mass = 25.f; - physics->Static = false; - physics->CollisionEvent = true; - auto modelComponent = AddComponent(shot); - modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; - auto tankShellComponent = AddComponent(shot); - tankShellComponent->Damage = 20.f; - tankShellComponent->ExplosionRadius = 30.f; - tankShellComponent->ExplosionStrength = 300000.f; - { - auto shape = CreateEntity(shot); - auto transform = AddComponent(shape); - auto boxShape = AddComponent(shape); - boxShape->Width = 0.5f; - boxShape->Height = 0.5f; - boxShape->Depth = 0.5f; - CommitEntity(shape); - } - CommitEntity(shot); - barrelSteering->ShotTemplate = shot; - - - auto cameraTower = CreateEntity(barrel); - { - auto transform = 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 = AddComponent(cameraTower); - cameraComp->FarClip = 2000.f; - /*auto follow = AddComponent(cameraTower); - follow->Entity = barrel; - follow->Distance = 15.f; - follow->FollowAxis = glm::vec3(1, 1, 1);*/ - } - - SetProperty(tank, "Camera", cameraTower); - } - CommitEntity(barrel); - tankSteering->Barrel = barrel; - } - CommitEntity(tower); - tankSteering->Turret = tower; - - - - } - - - - //{ - // auto lightentity = CreateEntity(tank); - // auto transform = AddComponent(lightentity); - // transform->Position = glm::vec3(0, 0, 0); - // auto light = AddComponent(lightentity); - // //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); - // //light->Specular = glm::vec3(1.f); - // /*light->ConstantAttenuation = 0.3f; - // light->LinearAttenuation = 0.003f; - // light->QuadraticAttenuation = 0.002f;*/ - //} - - // auto wheelpair = CreateEntity(tank); - // SetProperty(wheelpair, "Name", "WheelPair"); - // AddComponent(wheelpair, "WheelPairThingy"); - -#pragma region Wheels - //Create wheels - float wheelOffset = -0.83f; - const float suspensionStrength = 15.f; - const float springLength = 0.3f; - - AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, -1.715f), 0, true); - AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, -1.715f), 0, true); - AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, 2.375), 1, false); - AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, 2.375), 1, false); -#pragma endregion - - { - auto entity = CreateEntity(tank); - auto transformComponent = 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 = 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)); - CommitEntity(entity); - - auto particleEntity = CreateEntity(entity); - auto TEMP = AddComponent(particleEntity); - TEMP->Scale = glm::vec3(0); - auto spriteComponent = AddComponent(particleEntity); - spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png"; - emitterComponent->ParticleTemplate = particleEntity; - - CommitEntity(particleEntity); - } - - CommitEntity(tank); - - return tank; -} - -void GameWorld::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front) -{ - const float separation = 1.77f; - const float suspensionStrength = 15.f; - const float springLength = 0.3f; - - bool steering = front; - - auto wheelFront = CreateEntity(tankEntity); - { - auto transform = AddComponent(wheelFront); - transform->Position = position - glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); - //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); -#ifdef DEBUG - auto model = AddComponent(wheelFront); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; -#endif - auto Wheel = AddComponent(wheelFront); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = axleID; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = steering; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - CommitEntity(wheelFront); - } - - auto wheelBack = CreateEntity(tankEntity); - { - auto transform = AddComponent(wheelBack); - transform->Position = position + glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); - //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); -#ifdef DEBUG - auto model = AddComponent(wheelBack); - model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; -#endif - auto Wheel = AddComponent(wheelBack); - Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); - Wheel->AxleID = axleID; - Wheel->Mass = 2000; - Wheel->Radius = 0.6f; - Wheel->Steering = steering; - Wheel->SuspensionStrength = suspensionStrength; - Wheel->Friction = 4.f; - Wheel->ConnectedToHandbrake = true; - Wheel->TorqueRatio = 0.125f; - Wheel->Width = 0.6f; - CommitEntity(wheelBack); - } - - auto wheelPair = CreateEntity(tankEntity); - { - { - auto transform = AddComponent(wheelPair); - transform->Position = position; - //transform->Orientation = glm::quat(glm::vec3(0, glm::pi() / 4.f, 0)); - - auto pair = AddComponent(wheelPair); - pair->FakeWheelFront = wheelFront; - pair->FakeWheelBack = wheelBack; - } - - auto modelEntity = CreateEntity(wheelPair); - { - auto transform = AddComponent(modelEntity); - //transform->Position = glm::vec3(0.f, 0.35f, 0.f); - if (front) - { - transform->Position = glm::vec3(0.f, 0.03f, 0.f); - transform->Orientation = glm::quat(glm::vec3(0, glm::pi(), 0)); - } - else - { - transform->Position = glm::vec3(0.f, 0.17f, 0.f); - transform->Scale = glm::vec3(1.f, 1.2f, 1.2f); - } - - auto model = AddComponent(modelEntity); - model->ModelFile = "Models/Tank/tankWheel.obj"; - } - CommitEntity(modelEntity); - } - CommitEntity(wheelPair); -} - EntityID GameWorld::CreateJeep(int playerID) { auto jeep = CreateEntity(); diff --git a/src/Systems/GarageSystem.cpp b/src/Systems/GarageSystem.cpp index 2e8cc4f..d019b27 100644 --- a/src/Systems/GarageSystem.cpp +++ b/src/Systems/GarageSystem.cpp @@ -5,12 +5,14 @@ void Systems::GarageSystem::RegisterComponents( ComponentFactory* cf ) { cf->Register([]() { return new Components::Garage(); }); + cf->Register([]() { return new Components::SpawnPoint(); }); } void Systems::GarageSystem::Initialize() { EVENT_SUBSCRIBE_MEMBER(m_EEnterTrigger, &Systems::GarageSystem::OnEnterTrigger); EVENT_SUBSCRIBE_MEMBER(m_ELeaveTrigger, &Systems::GarageSystem::OnLeaveTrigger); + EVENT_SUBSCRIBE_MEMBER(m_ECommand, &Systems::GarageSystem::OnCommand); } void Systems::GarageSystem::Update(double dt) @@ -34,11 +36,13 @@ bool Systems::GarageSystem::OnEnterTrigger(const Events::EnterTrigger &event) std::string name = m_World->GetProperty(event.Trigger, "Name"); - if (name == "BoundsTrigger" || name == "ElevatorShaftTrigger") + if (name == "BoundsTrigger") { ToggleGarage(garageComponent); } + m_EntitiesInTrigger[event.Trigger].insert(event.Entity); + return true; } @@ -59,6 +63,40 @@ bool Systems::GarageSystem::OnLeaveTrigger(const Events::LeaveTrigger &event) ToggleGarage(garageComponent); } + m_EntitiesInTrigger[event.Trigger].erase(event.Entity); + + return true; +} + +bool Systems::GarageSystem::OnCommand(const Events::InputCommand &event) +{ + if (event.Command == "use" && event.Value > 0) + { + for (auto &pair : m_EntitiesInTrigger) + { + EntityID trigger = pair.first; + auto entities = pair.second; + + std::string name = m_World->GetProperty(trigger, "Name"); + if (name != "ElevatorShaftTrigger") + continue; + + auto triggerBaseParent = m_World->GetEntityBaseParent(trigger); + auto triggerPlayerComponent = m_World->GetComponent(triggerBaseParent); + + for (EntityID entity : entities) + { + auto entityPlayerComponent = m_World->GetComponent(triggerBaseParent); + if (triggerPlayerComponent == entityPlayerComponent) + { + EntityID garage = m_World->GetEntityParent(trigger); + auto garageComponent = m_World->GetComponent(garage); + ToggleGarage(garageComponent); + } + } + } + } + return true; } diff --git a/src/Systems/GarageSystem.h b/src/Systems/GarageSystem.h index a4078ce..aca5673 100644 --- a/src/Systems/GarageSystem.h +++ b/src/Systems/GarageSystem.h @@ -1,13 +1,17 @@ #ifndef GarageSystem_h__ #define GarageSystem_h__ +#include #include "System.h" #include "Components/Transform.h" #include "Components/Trigger.h" #include "Components/Garage.h" +#include "Components/SpawnPoint.h" #include "Events/EnterTrigger.h" #include "Events/LeaveTrigger.h" +#include "Events/SpawnVehicle.h" +#include "Events/InputCommand.h" #include "Components/Player.h" #include "Events/Move.h" @@ -30,12 +34,17 @@ namespace Systems void UpdateEntity(double dt, EntityID entity, EntityID parent) override; private: + std::map> m_EntitiesInTrigger; + EventRelay m_EEnterTrigger; bool OnEnterTrigger(const Events::EnterTrigger &event); EventRelay m_ELeaveTrigger; bool OnLeaveTrigger(const Events::LeaveTrigger &event); + EventRelay m_ECommand; + bool OnCommand(const Events::InputCommand &event); void ToggleGarage(Components::Garage* garageComponent); + }; } diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index f5edcaa..d057079 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -2,7 +2,7 @@ #include "TankSteeringSystem.h" #include "World.h" -void Systems::TankSteeringSystem::RegisterComponents( ComponentFactory* cf ) +void Systems::TankSteeringSystem::RegisterComponents(ComponentFactory* cf) { cf->Register([]() { return new Components::TankSteering(); }); cf->Register([]() { return new Components::TowerSteering(); }); @@ -12,6 +12,7 @@ void Systems::TankSteeringSystem::RegisterComponents( ComponentFactory* cf ) void Systems::TankSteeringSystem::Initialize() { EVENT_SUBSCRIBE_MEMBER(m_ECollision, &Systems::TankSteeringSystem::OnCollision); + EVENT_SUBSCRIBE_MEMBER(m_ESpawnVehicle, &Systems::TankSteeringSystem::OnSpawnVehicle); for (int i = 0; i < 4; i++) { @@ -110,7 +111,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit } } -bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e ) +bool Systems::TankSteeringSystem::OnCollision(const Events::Collision &e) { if(m_World->ValidEntity(e.Entity1) && m_World->ValidEntity(e.Entity2)) { @@ -251,6 +252,315 @@ bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e ) return true; } +bool Systems::TankSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &event) +{ + if (event.VehicleType != "Tank") + return false; + + auto spawnPointComponents = m_World->GetComponentsOfType(); + 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 tank = CreateTank(event.PlayerID); + auto tankTransform = m_World->GetComponent(tank); + tankTransform->Position = absoluteTransform.Position; + tankTransform->Orientation = absoluteTransform.Orientation; + // Set the viewport correctly + Events::SetViewportCamera e; + e.CameraEntity = m_World->GetProperty(tank, "Camera"); + if (event.PlayerID == 1) + e.ViewportFrame = "Viewport1"; + else if (event.PlayerID == 2) + e.ViewportFrame = "Viewport2"; + EventBroker->Publish(e); + e.ViewportFrame = "Viewport2"; + EventBroker->Publish(e); + } + + return true; +} + +EntityID Systems::TankSteeringSystem::CreateTank(int playerID) +{ + auto tank = m_World->CreateEntity(); + auto transform = m_World->AddComponent(tank); + transform->Position = glm::vec3(0, 5, 0); + //transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0)); + auto physics = m_World->AddComponent(tank); + physics->Mass = 63000 - 16000; + physics->Static = false; + auto vehicle = m_World->AddComponent(tank); + vehicle->MaxTorque = 8000.f; + vehicle->MaxSteeringAngle = 90.f; + vehicle->MaxSpeedFullSteeringAngle = 4.f; + auto player = m_World->AddComponent(tank); + player->ID = playerID; + auto tankSteering = m_World->AddComponent(tank); + m_World->AddComponent(tank); + auto health = m_World->AddComponent(tank); + health->Amount = 100.f; + + { + auto shape = m_World->CreateEntity(tank); + auto transform = m_World->AddComponent(shape); + auto meshShape = m_World->AddComponent(shape); + meshShape->ResourceName = "Models/Tank/TankCollisionShape.obj"; + m_World->CommitEntity(shape); + } + { + auto shapeTower = m_World->CreateEntity(tank); + auto transform = m_World->AddComponent(shapeTower); + transform->Position = glm::vec3(0, 1.10633f, 1.03024f); + auto box = m_World->AddComponent(shapeTower); + box->Width = 1.298f; + box->Height = 0.502f; + box->Depth = 1.211f; + m_World->CommitEntity(shapeTower); + } + + { + auto chassis = m_World->CreateEntity(tank); + auto transform = m_World->AddComponent(chassis); + transform->Position = glm::vec3(0, 0, 0); + auto model = m_World->AddComponent(chassis); + model->ModelFile = "Models/Tank/tankBody.obj"; + } + { + auto tower = m_World->CreateEntity(tank); + m_World->SetProperty(tower, "Name", "tower"); + auto transform = m_World->AddComponent(tower); + transform->Position = glm::vec3(0.f, 0.68f, 0.9f); + auto model = m_World->AddComponent(tower); + model->ModelFile = "Models/Tank/tankTop.obj"; + auto towerSteering = m_World->AddComponent(tower); + towerSteering->Axis = glm::vec3(0.f, 1.f, 0.f); + towerSteering->TurnSpeed = glm::pi() / 4.f; + { + auto barrel = m_World->CreateEntity(tower); + auto transform = m_World->AddComponent(barrel); + transform->Position = glm::vec3(-0.012f, 0.3f, -0.95); + auto model = m_World->AddComponent(barrel); + model->ModelFile = "Models/Tank/tankBarrel.obj"; + auto barrelSteering = m_World->AddComponent(barrel); + barrelSteering->Axis = glm::vec3(1.f, 0.f, 0.f); + barrelSteering->TurnSpeed = glm::pi() / 4.f; + barrelSteering->ShotSpeed = 70.f; + barrelSteering->LowerRotationLimit = glm::radians(-10.f); + barrelSteering->UpperRotationLimit = glm::radians(40.f); + { + auto shot = m_World->CreateEntity(barrel); + auto transform = m_World->AddComponent(shot); + transform->Position = glm::vec3(0.35f, 0.f, -2.f); + transform->Orientation = glm::angleAxis(-glm::pi() / 2.f, glm::vec3(1, 0, 0)); + transform->Scale = glm::vec3(3.f); + m_World->AddComponent(shot); + auto physics = m_World->AddComponent(shot); + physics->Mass = 25.f; + physics->Static = false; + physics->CollisionEvent = true; + auto modelComponent = m_World->AddComponent(shot); + modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; + auto tankShellComponent = m_World->AddComponent(shot); + tankShellComponent->Damage = 20.f; + tankShellComponent->ExplosionRadius = 30.f; + tankShellComponent->ExplosionStrength = 300000.f; + { + auto shape = m_World->CreateEntity(shot); + auto transform = m_World->AddComponent(shape); + auto boxShape = m_World->AddComponent(shape); + boxShape->Width = 0.5f; + boxShape->Height = 0.5f; + boxShape->Depth = 0.5f; + m_World->CommitEntity(shape); + } + m_World->CommitEntity(shot); + barrelSteering->ShotTemplate = shot; + + + auto cameraTower = m_World->CreateEntity(barrel); + { + 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; + /*auto follow = m_World->AddComponent(cameraTower); + follow->Entity = barrel; + follow->Distance = 15.f; + follow->FollowAxis = glm::vec3(1, 1, 1);*/ + } + + m_World->SetProperty(tank, "Camera", cameraTower); + } + m_World->CommitEntity(barrel); + tankSteering->Barrel = barrel; + } + m_World->CommitEntity(tower); + tankSteering->Turret = tower; + + + + } + + + + //{ + // auto lightentity = m_World->CreateEntity(tank); + // auto transform = m_World->AddComponent(lightentity); + // transform->Position = glm::vec3(0, 0, 0); + // auto light = m_World->AddComponent(lightentity); + // //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f); + // //light->Specular = glm::vec3(1.f); + // /*light->ConstantAttenuation = 0.3f; + // light->LinearAttenuation = 0.003f; + // light->QuadraticAttenuation = 0.002f;*/ + //} + + // auto wheelpair = m_World->CreateEntity(tank); + // SetProperty(wheelpair, "Name", "WheelPair"); + // AddComponent(wheelpair, "WheelPairThingy"); + +#pragma region Wheels + //Create wheels + float wheelOffset = -0.83f; + const float suspensionStrength = 15.f; + const float springLength = 0.3f; + + AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, -1.715f), 0, true); + AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, -1.715f), 0, true); + AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, 2.375), 1, false); + AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, 2.375), 1, false); +#pragma endregion + + { + auto entity = m_World->CreateEntity(tank); + 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(tank); + + return tank; +} + +void Systems::TankSteeringSystem::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front) +{ + const float separation = 1.77f; + const float suspensionStrength = 15.f; + const float springLength = 0.3f; + + bool steering = front; + + auto wheelFront = m_World->CreateEntity(tankEntity); + { + auto transform = m_World->AddComponent(wheelFront); + transform->Position = position - glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); + //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); +#ifdef DEBUG + auto model = m_World->AddComponent(wheelFront); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; +#endif + auto Wheel = m_World->AddComponent(wheelFront); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = axleID; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = steering; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + m_World->CommitEntity(wheelFront); + } + + auto wheelBack = m_World->CreateEntity(tankEntity); + { + auto transform = m_World->AddComponent(wheelBack); + transform->Position = position + glm::vec3(0, 0, separation / 2.f); // glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); + //transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); +#ifdef DEBUG + auto model = m_World->AddComponent(wheelBack); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; +#endif + auto Wheel = m_World->AddComponent(wheelBack); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = axleID; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = steering; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 4.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + m_World->CommitEntity(wheelBack); + } + + auto wheelPair = m_World->CreateEntity(tankEntity); + { + { + auto transform = m_World->AddComponent(wheelPair); + transform->Position = position; + //transform->Orientation = glm::quat(glm::vec3(0, glm::pi() / 4.f, 0)); + + auto pair = m_World->AddComponent(wheelPair); + pair->FakeWheelFront = wheelFront; + pair->FakeWheelBack = wheelBack; + } + + auto modelEntity = m_World->CreateEntity(wheelPair); + { + auto transform = m_World->AddComponent(modelEntity); + //transform->Position = glm::vec3(0.f, 0.35f, 0.f); + if (front) + { + transform->Position = glm::vec3(0.f, 0.03f, 0.f); + transform->Orientation = glm::quat(glm::vec3(0, glm::pi(), 0)); + } + else + { + transform->Position = glm::vec3(0.f, 0.17f, 0.f); + transform->Scale = glm::vec3(1.f, 1.2f, 1.2f); + } + + auto model = m_World->AddComponent(modelEntity); + model->ModelFile = "Models/Tank/tankWheel.obj"; + } + m_World->CommitEntity(modelEntity); + } + m_World->CommitEntity(wheelPair); +} + void Systems::TankSteeringSystem::TankSteeringInputController::Update( double dt ) { PositionX = m_Horizontal; @@ -315,5 +625,3 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E return true; } - - diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index 01fc27a..d48ec2a 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -32,6 +32,18 @@ #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 "Events/SetViewportCamera.h" + namespace Systems { @@ -49,13 +61,18 @@ namespace Systems void UpdateEntity(double dt, EntityID entity, EntityID parent) override; private: + std::map m_TimeSinceLastShot; + EventRelay m_ECollision; bool OnCollision(const Events::Collision &e); + EventRelay m_ESpawnVehicle; + bool OnSpawnVehicle(const Events::SpawnVehicle &e); class TankSteeringInputController; std::array, 4> m_TankInputControllers; - std::map m_TimeSinceLastShot; + EntityID CreateTank(int playerID); + void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front); }; class TankSteeringSystem::TankSteeringInputController : InputController diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 1a131d0..6f09fb1 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -170,6 +170,7 @@ + @@ -203,6 +204,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index 2d645ad..84b8908 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -184,8 +184,7 @@ {3c2ea0e5-41a1-4b11-a891-1d59ead7223c} - - + {3cbe68d9-2446-45ee-8637-ffb805997dcd} @@ -545,6 +544,12 @@ GUI + + Game\Events + + + Game\Components +