diff --git a/assets b/assets index 0f0dc5d..4a7b5c2 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 0f0dc5d839ef6fb47818e5dbf3646e8ce23a78ff +Subproject commit 4a7b5c236d0177881b62cda56cb97300a329a06c diff --git a/src/Components/Garage.h b/src/Components/Garage.h new file mode 100644 index 0000000..7098661 --- /dev/null +++ b/src/Components/Garage.h @@ -0,0 +1,35 @@ +#ifndef Components_Garage_h__ +#define Components_Garage_h__ + +#include "Component.h" + +namespace Components +{ + struct Garage : Component + { + Garage() + : Open(false) + , Elevator(0) + , DoorLeft(0) + , DoorRight(0) + , Light1(0) + , Light2(0) + , Light3(0) + , Light4(0) + { } + + EntityID Elevator; + EntityID DoorLeft; + EntityID DoorRight; + EntityID Light1; + EntityID Light2; + EntityID Light3; + EntityID Light4; + + bool Open; + + virtual Garage* Clone() const override { return new Garage(*this); } + }; +} + +#endif // Components_TankShell_h__ diff --git a/src/Components/Move.h b/src/Components/Move.h new file mode 100644 index 0000000..28579e6 --- /dev/null +++ b/src/Components/Move.h @@ -0,0 +1,20 @@ +#ifndef Components_Move_h__ +#define Components_Move_h__ + +#include "Component.h" + +namespace Components +{ + +struct Move : Component +{ + float Speed; + glm::vec3 StartPosition; + glm::vec3 GoalPosition; + + virtual Move* Clone() const override { return new Move(*this); } +}; + +} + +#endif // Components_Move_h__ \ No newline at end of file diff --git a/src/Components/Rotate.h b/src/Components/Rotate.h new file mode 100644 index 0000000..98bc438 --- /dev/null +++ b/src/Components/Rotate.h @@ -0,0 +1,19 @@ +#ifndef Components_Rotate_h__ +#define Components_Rotate_h__ + +#include "Component.h" + +namespace Components +{ + +struct Rotate : Component +{ + float Time; + glm::quat StartRotation; + glm::quat GoalRotation; + virtual Rotate* Clone() const override { return new Rotate(*this); } +}; + +} + +#endif // Components_Rotate_h__ \ No newline at end of file diff --git a/src/Components/TriggerMove.h b/src/Components/TriggerMove.h index 6f78611..2ecbda4 100644 --- a/src/Components/TriggerMove.h +++ b/src/Components/TriggerMove.h @@ -8,10 +8,14 @@ namespace Components struct TriggerMove : Component { + TriggerMove() + : Queue(false) + , Swap(true) + { } + EntityID Entity; - float Speed; - glm::vec3 StartPosition; - glm::vec3 GoalPosition; + bool Queue; + bool Swap; virtual TriggerMove* Clone() const override { return new TriggerMove(*this); } }; diff --git a/src/Components/TriggerRotate.h b/src/Components/TriggerRotate.h new file mode 100644 index 0000000..e2fd341 --- /dev/null +++ b/src/Components/TriggerRotate.h @@ -0,0 +1,24 @@ +#ifndef TriggerRotate_h__ +#define TriggerRotate_h__ + +#include "Component.h" + +namespace Components +{ + + struct TriggerRotate : Component + { + TriggerRotate() + : Queue(false) + , Swap(true) + { } + + EntityID Entity; + bool Queue; + bool Swap; + virtual TriggerRotate* Clone() const override { return new TriggerRotate(*this); } + }; + +} + +#endif // TriggerRotate_h__ \ No newline at end of file diff --git a/src/Events/EnterTrigger.h b/src/Events/EnterTrigger.h index 117b306..9206933 100644 --- a/src/Events/EnterTrigger.h +++ b/src/Events/EnterTrigger.h @@ -8,8 +8,8 @@ namespace Events struct EnterTrigger : Event { - EntityID Entity1; - EntityID Entity2; + EntityID Trigger; + EntityID Entity; }; } diff --git a/src/Events/LeaveTrigger.h b/src/Events/LeaveTrigger.h index 1c5bbb6..e02a5f6 100644 --- a/src/Events/LeaveTrigger.h +++ b/src/Events/LeaveTrigger.h @@ -8,8 +8,8 @@ struct LeaveTrigger : Event { - EntityID Entity1; - EntityID Entity2; + EntityID Trigger; + EntityID Entity; }; } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 772079b..52f657d 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -106,7 +106,7 @@ void GameWorld::Initialize() //transform->Scale = glm::vec3(400.0f, 10.0f, 400.0f); transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f)); auto model = AddComponent(ground); - model->ModelFile = "Models/TestScene3/testScene.obj"; + model->ModelFile = "Models/TestScene3/testScene2.obj"; //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; auto physics = AddComponent(ground); @@ -118,7 +118,7 @@ void GameWorld::Initialize() auto transformshape = AddComponent(groundshape); auto meshShape = AddComponent(groundshape); //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; - meshShape->ResourceName = "Models/TestScene3/testScene.obj"; + meshShape->ResourceName = "Models/TestScene3/testScene2.obj"; CommitEntity(groundshape); @@ -128,7 +128,7 @@ void GameWorld::Initialize() EntityID tank1 = CreateTank(1); { auto transform = GetComponent(tank1); - transform->Position.z = 125.f; + transform->Position.z = -125.f; transform->Position.y = -20.f; transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); Events::SetViewportCamera e; @@ -137,7 +137,7 @@ void GameWorld::Initialize() EventBroker->Publish(e); } - EntityID tank2 = CreateTank(2); + /*EntityID tank2 = CreateTank(2); { auto transform = GetComponent(tank2); transform->Position.x = 10.f; @@ -147,7 +147,7 @@ void GameWorld::Initialize() e.CameraEntity = GetProperty(tank2, "Camera"); e.ViewportFrame = "Viewport2"; EventBroker->Publish(e); - } + }*/ { auto flag = CreateEntity(); @@ -182,6 +182,164 @@ void GameWorld::Initialize() } CreateGate(glm::vec3(0, -50, 150)); + glm::vec3 Position = glm::vec3(-3.93076, -49, 0); + { + auto garage = CreateEntity(); + auto transform = AddComponent(garage); + transform->Position = Position; + + auto ElevatorBase = CreateEntity(garage); + { + auto transform = AddComponent(ElevatorBase); + auto model = AddComponent(ElevatorBase); + model->ModelFile = "Models/SpawnRamp/Main/Main.obj"; + auto physics = AddComponent(ElevatorBase); + physics->Static = true; + physics->CollisionLayer = (int)Components::Physics::CollisionLayer::STATIC; + + { + auto mainShape = CreateEntity(ElevatorBase); + auto transform = AddComponent(mainShape); + transform->Position = glm::vec3(0.f, 0, 0.f); + auto mesh = AddComponent(mainShape); + mesh->ResourceName = "Models/SpawnRamp/Main/CollisionShape.obj"; + CommitEntity(mainShape); + } + { + auto StairsShape = CreateEntity(ElevatorBase); + auto transform = AddComponent(StairsShape); + transform->Position = glm::vec3(-7.48639f, 0.4809f, 3.79166f); + auto box = AddComponent(StairsShape); + box->Width = 1.211f; + box->Height = 1.798f; + box->Depth = 3.229f; + CommitEntity(StairsShape); + } + } + CommitEntity(ElevatorBase); + + auto leftHatch = CreateEntity(garage); + { + auto transform = AddComponent(leftHatch); + transform->Position = glm::vec3(5.83103f, 1.3553f, -2.40268f); + auto model = AddComponent(leftHatch); + model->ModelFile = "Models/SpawnRamp/LeftHatch/LeftHatch.obj"; + auto physics = AddComponent(leftHatch); + physics->Static = true; + physics->CollisionLayer = (int)Components::Physics::CollisionLayer::STATIC; + auto rotate = AddComponent(leftHatch); + rotate->StartRotation = transform->Orientation; + rotate->GoalRotation = transform->Orientation * glm::angleAxis(-glm::radians(110.f),glm::vec3(0, 0, 1)); + rotate->Time = 5.f; + { + auto shape = CreateEntity(leftHatch); + auto transform = AddComponent(shape); + transform->Position = glm::vec3(-2.79331, 0, 0); + auto box = AddComponent(shape); + box->Width = 2.317f; + box->Height = 0.183f; + box->Depth = 6.987f; + CommitEntity(shape); + } + CommitEntity(leftHatch); + } + + auto rightHatch = CreateEntity(garage); + { + auto transform = AddComponent(rightHatch); + transform->Position = glm::vec3(-4.52423f, 1.3553f, -2.40268f); + auto model = AddComponent(rightHatch); + model->ModelFile = "Models/SpawnRamp/RightHatch/RightHatch.obj"; + auto physics = AddComponent(rightHatch); + physics->Static = true; + physics->CollisionLayer = (int)Components::Physics::CollisionLayer::STATIC; + auto rotate = AddComponent(rightHatch); + rotate->StartRotation = transform->Orientation; + rotate->GoalRotation = transform->Orientation * glm::angleAxis(glm::radians(110.f),glm::vec3(0, 0, 1)); + rotate->Time = 5.f; + { + auto shape = CreateEntity(rightHatch); + auto transform = AddComponent(shape); + transform->Position = glm::vec3(2.79331, 0, 0); + auto box = AddComponent(shape); + box->Width = 2.317f; + box->Height = 0.183f; + box->Depth = 6.987f; + CommitEntity(shape); + } + CommitEntity(rightHatch); + } + + auto elevator = CreateEntity(garage); + { + auto transform = AddComponent(elevator); + transform->Position = glm::vec3(0.69385f, 1.25222f, -2.39938f) + glm::vec3(0, -9.5f, 0); + auto model = AddComponent(elevator); + model->ModelFile = "Models/SpawnRamp/Elevator/Elevator.obj"; + auto physics = AddComponent(elevator); + physics->Static = true; + physics->CollisionLayer = (int)Components::Physics::CollisionLayer::STATIC; + auto move = AddComponent(elevator); + move->StartPosition = transform->Position; + move->GoalPosition = transform->Position + glm::vec3(0, 9.5f, 0); + move->Speed = 1.5f; + { + auto shape = CreateEntity(elevator); + auto transform = AddComponent(shape); + transform->Position = glm::vec3(0, 0, 0); + auto box = AddComponent(shape); + box->Width = 4.754f; + box->Height = 0.141f; + box->Depth = 6.86f; + CommitEntity(shape); + } + } + CommitEntity(elevator); + + auto garageComponent = AddComponent(garage); + garageComponent->DoorLeft = leftHatch; + garageComponent->DoorRight = rightHatch; + garageComponent->Elevator = elevator; + CommitEntity(garage); + + { + auto trigger = CreateEntity(garage); + SetProperty(trigger, "Name", "BoundsTrigger"); + auto transform = AddComponent(trigger); + transform->Position = glm::vec3(0, 44.87521f, 0); + 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 = 72.98f; + box->Height = 54.53f; + box->Depth = 72.98f; + CommitEntity(shape); + } + CommitEntity(trigger); + } + + { + auto trigger = CreateEntity(garage); + SetProperty(trigger, "Name", "ElevatorShaftTrigger"); + auto transform = AddComponent(trigger); + transform->Position = glm::vec3(0.69385f, -6.7997f, 2.39938f); + 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; + CommitEntity(shape); + } + CommitEntity(trigger); + } + } //for (int i = 0; i < 500; i++) //{ @@ -210,6 +368,8 @@ void GameWorld::RegisterComponents() m_ComponentFactory.Register([]() { return new Components::Template(); }); m_ComponentFactory.Register([]() { return new Components::Player(); }); m_ComponentFactory.Register([]() { return new Components::Flag(); }); + m_ComponentFactory.Register([]() { return new Components::Move(); }); + m_ComponentFactory.Register([]() { return new Components::Rotate(); }); } void GameWorld::RegisterSystems() @@ -230,6 +390,7 @@ void GameWorld::RegisterSystems() m_SystemFactory.Register([this]() { return new Systems::PhysicsSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::TriggerSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::FollowSystem(this, EventBroker, ResourceManager); }); + m_SystemFactory.Register([this]() { return new Systems::GarageSystem(this, EventBroker, ResourceManager); }); m_SystemFactory.Register([this]() { return new Systems::RenderSystem(this, EventBroker, ResourceManager); }); } @@ -251,6 +412,7 @@ void GameWorld::AddSystems() AddSystem(); AddSystem(); AddSystem(); + AddSystem(); AddSystem(); } @@ -290,184 +452,6 @@ void GameWorld::BindGamepadButton(Gamepad::Button button, std::string command, f EventBroker->Publish(e); } -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 = 36000.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/Fix/ChassiCollision.obj"; - CommitEntity(shape); - - // auto box = AddComponent(jeep); - // box->Width = 1.487f; - // box->Height = 0.727f; - // box->Depth = 2.594f; - - } - - { - 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(); - { - auto model = AddComponent(cameraTower); - model->ModelFile = "Models/Placeholders/PhysicsTest/PointLight.obj"; - auto transform = AddComponent(cameraTower); - transform->Scale = glm::vec3(10); - 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::CreateGate(glm::vec3 Position) { { @@ -540,7 +524,10 @@ void GameWorld::CreateGate(glm::vec3 Position) auto physics = AddComponent(gate); physics->Static = true; physics->CollisionLayer = (int)Components::Physics::CollisionLayer::STATIC; - + auto move = AddComponent(gate); + move->Speed = 5.f; + move->GoalPosition = glm::vec3(Position.x, Position.y + 9.02345f, Position.z); + move->StartPosition = glm::vec3(Position.x, Position.y, Position.z); { auto mainShape = CreateEntity(gate); auto transform = AddComponent(mainShape); @@ -570,9 +557,6 @@ void GameWorld::CreateGate(glm::vec3 Position) auto trigger = AddComponent(gateTrigger); auto triggerMove = AddComponent(gateTrigger); triggerMove->Entity = gate; - triggerMove->Speed = 5.f; - triggerMove->GoalPosition = glm::vec3(0, -50 + 9.02345f, 150); - triggerMove->StartPosition = glm::vec3(0, -50, 150); { @@ -591,6 +575,191 @@ 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 = 36000.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; @@ -619,16 +788,6 @@ void GameWorld::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int ax Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheelFront); - auto shapetransform = AddComponent(shape); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } CommitEntity(wheelFront); } @@ -652,16 +811,6 @@ void GameWorld::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int ax Wheel->ConnectedToHandbrake = true; Wheel->TorqueRatio = 0.125f; Wheel->Width = 0.6f; - { - auto shape = CreateEntity(wheelBack); - auto shapetransform = AddComponent(shape); - shapetransform->Position = glm::vec3(0.f, 0.32f, 0.f) + transform->Position; - auto boxShape = AddComponent(shape); - boxShape->Width = 0.7f; - boxShape->Height = 0.34f; - boxShape->Depth = 0.7f; - CommitEntity(shape); - } CommitEntity(wheelBack); } diff --git a/src/GameWorld.h b/src/GameWorld.h index c878b1a..1ca7de7 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -22,6 +22,7 @@ #include "Systems/DamageSystem.h" #include "Systems/WheelPairSystem.h" #include "Systems/FollowSystem.h" +#include "Systems/GarageSystem.h" #include "Components/Camera.h" #include "Components/DirectionalLight.h" @@ -51,6 +52,9 @@ #include "Components/Flag.h" #include "Components/WheelPair.h" #include "Components/Follow.h" +#include "Components/TriggerRotate.h" +#include "Components/Move.h" +#include "Components/Rotate.h" class GameWorld : public World { diff --git a/src/Systems/GarageSystem.cpp b/src/Systems/GarageSystem.cpp new file mode 100644 index 0000000..2e8cc4f --- /dev/null +++ b/src/Systems/GarageSystem.cpp @@ -0,0 +1,104 @@ +#include "PrecompiledHeader.h" +#include "GarageSystem.h" +#include "World.h" + +void Systems::GarageSystem::RegisterComponents( ComponentFactory* cf ) +{ + cf->Register([]() { return new Components::Garage(); }); +} + +void Systems::GarageSystem::Initialize() +{ + EVENT_SUBSCRIBE_MEMBER(m_EEnterTrigger, &Systems::GarageSystem::OnEnterTrigger); + EVENT_SUBSCRIBE_MEMBER(m_ELeaveTrigger, &Systems::GarageSystem::OnLeaveTrigger); +} + +void Systems::GarageSystem::Update(double dt) +{ + +} + +void Systems::GarageSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) +{ + +} + +bool Systems::GarageSystem::OnEnterTrigger(const Events::EnterTrigger &event) +{ + EntityID garage = m_World->GetEntityParent(event.Trigger); + if (garage == 0) + return false; + auto garageComponent = m_World->GetComponent(garage); + if (!garageComponent) + return false; + + std::string name = m_World->GetProperty(event.Trigger, "Name"); + + if (name == "BoundsTrigger" || name == "ElevatorShaftTrigger") + { + ToggleGarage(garageComponent); + } + + return true; +} + + +bool Systems::GarageSystem::OnLeaveTrigger(const Events::LeaveTrigger &event) +{ + EntityID garage = m_World->GetEntityParent(event.Trigger); + if (garage == 0) + return false; + auto garageComponent = m_World->GetComponent(garage); + if (!garageComponent) + return false; + + std::string name = m_World->GetProperty(event.Trigger, "Name"); + + if (name == "BoundsTrigger") + { + ToggleGarage(garageComponent); + } + + return true; +} + +void Systems::GarageSystem::ToggleGarage(Components::Garage* garageComponent) +{ + // Elevator + if (garageComponent->Elevator != 0) + { + auto move = m_World->GetComponent(garageComponent->Elevator); + Events::Move e; + e.Entity = garageComponent->Elevator; + e.GoalPosition = move->GoalPosition; + e.Speed = move->Speed; + e.Queue = true; + EventBroker->Publish(e); + std::swap(move->GoalPosition, move->StartPosition); + } + + // Left door + if (garageComponent->DoorLeft != 0) + { + auto rotate = m_World->GetComponent(garageComponent->DoorLeft); + Events::Rotate e; + e.Entity = garageComponent->DoorLeft; + e.GoalRotation = rotate->GoalRotation; + e.Time = rotate->Time; + e.Queue = true; + EventBroker->Publish(e); + std::swap(rotate->GoalRotation, rotate->StartRotation); + } + // Right door + if (garageComponent->DoorRight != 0) + { + auto rotate = m_World->GetComponent(garageComponent->DoorRight); + Events::Rotate e; + e.Entity = garageComponent->DoorRight; + e.GoalRotation = rotate->GoalRotation; + e.Time = rotate->Time; + e.Queue = true; + EventBroker->Publish(e); + std::swap(rotate->GoalRotation, rotate->StartRotation); + } +} diff --git a/src/Systems/GarageSystem.h b/src/Systems/GarageSystem.h new file mode 100644 index 0000000..a4078ce --- /dev/null +++ b/src/Systems/GarageSystem.h @@ -0,0 +1,42 @@ +#ifndef GarageSystem_h__ +#define GarageSystem_h__ + + +#include "System.h" +#include "Components/Transform.h" +#include "Components/Trigger.h" +#include "Components/Garage.h" +#include "Events/EnterTrigger.h" +#include "Events/LeaveTrigger.h" + +#include "Components/Player.h" +#include "Events/Move.h" +#include "Events/Rotate.h" +#include "Components/Move.h" +#include "Components/Rotate.h" + +namespace Systems +{ + class GarageSystem : public System + { + public: + + GarageSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager) + : System(world, eventBroker, resourceManager) { } + + void Initialize() override; + void RegisterComponents(ComponentFactory* cf) override; + void Update(double dt) override; + void UpdateEntity(double dt, EntityID entity, EntityID parent) override; + + private: + EventRelay m_EEnterTrigger; + bool OnEnterTrigger(const Events::EnterTrigger &event); + EventRelay m_ELeaveTrigger; + bool OnLeaveTrigger(const Events::LeaveTrigger &event); + + void ToggleGarage(Components::Garage* garageComponent); + }; + +} +#endif // GarageSystem_h__ diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 31f9871..90cd930 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -282,26 +282,27 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) m_Wheels.push_back(entity); } - EntityID entityParent = m_World->GetEntityBaseParent(entity); + EntityID entityParent = m_World->GetEntityParent(entity); auto sphereComponent = m_World->GetComponent(entity); auto boxComponent = m_World->GetComponent(entity); auto meshShapeComponent = m_World->GetComponent(entity); - if(entityParent == entity && (sphereComponent || boxComponent || meshShapeComponent)) + if(entityParent == 0 && (sphereComponent || boxComponent || meshShapeComponent)) { - LOG_ERROR("Entity: %i , Only the children can have a shapeComponent", entity); + LOG_ERROR("Entity: %i, Only the children can have a shapeComponent", entity); return; } auto physicsComponent = m_World->GetComponent(entity); if (physicsComponent && m_Shapes[entity].size() > 0) { - if(entityParent != entity) + if(entityParent != 0 && !physicsComponent->Static) { - LOG_ERROR("Entity: %i , Only the baseparent can have a PhysicsComponent", entity); + LOG_ERROR("Entity: %i, Only the baseparent can have a dynamic PhysicsComponent", entity); return; } + hkpShape* shape; if(! physicsComponent->Static) // Not static { @@ -489,7 +490,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity ) hkpRigidBodyCinfo rigidBodyInfo; { rigidBodyInfo.m_shape = shape; - rigidBodyInfo.m_motionType = hkpMotion::MOTION_FIXED; + rigidBodyInfo.m_motionType = hkpMotion::MOTION_KEYFRAMED; auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position); hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation); diff --git a/src/Systems/PhysicsSystem.h b/src/Systems/PhysicsSystem.h index 58f1453..5a82742 100644 --- a/src/Systems/PhysicsSystem.h +++ b/src/Systems/PhysicsSystem.h @@ -132,8 +132,8 @@ public: if(m_PhysicsSystem->m_World->ValidEntity(entity1) && m_PhysicsSystem->m_World->ValidEntity(entity2)) { Events::EnterTrigger e; - e.Entity1 = entity1; - e.Entity2 = entity2; + e.Trigger = entity1; + e.Entity = entity2; m_PhysicsSystem->EventBroker->Publish(e); } } @@ -146,8 +146,8 @@ public: if(m_PhysicsSystem->m_World->ValidEntity(entity1) && m_PhysicsSystem->m_World->ValidEntity(entity2)) { Events::LeaveTrigger e; - e.Entity1 = entity1; - e.Entity2 = entity2; + e.Trigger = entity1; + e.Entity = entity2; m_PhysicsSystem->EventBroker->Publish(e); } } diff --git a/src/Systems/TriggerSystem.cpp b/src/Systems/TriggerSystem.cpp index ccfa716..68431a9 100644 --- a/src/Systems/TriggerSystem.cpp +++ b/src/Systems/TriggerSystem.cpp @@ -7,6 +7,7 @@ void Systems::TriggerSystem::RegisterComponents( ComponentFactory* cf ) cf->Register([]() { return new Components::Trigger(); }); cf->Register([]() { return new Components::TriggerExplosion(); }); cf->Register([]() { return new Components::TriggerMove(); }); + cf->Register([]() { return new Components::TriggerRotate(); }); } void Systems::TriggerSystem::Initialize() @@ -47,44 +48,31 @@ void Systems::TriggerSystem::OnEntityRemoved( EntityID entity ) bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event ) { - /*auto explosionComponent1 = m_World->GetComponent(event.Entity1); - auto explosionComponent2 = m_World->GetComponent(event.Entity2); - - if(explosionComponent1) - { - Explosion(event.Entity2, event.Entity1); - } - else if (explosionComponent2) - { - Explosion(event.Entity1, event.Entity2); - }*/ - - auto flagComponent1 = m_World->GetComponent(event.Entity1); - auto flagComponent2 = m_World->GetComponent(event.Entity2); + + auto flagComponent1 = m_World->GetComponent(event.Trigger); + auto flagComponent2 = m_World->GetComponent(event.Entity); + //HACK: SIMON IS DISSING AMERICA if(flagComponent1) { - Flag(event.Entity2, event.Entity1); + Flag(event.Entity, event.Trigger); } else if (flagComponent2) { - Flag(event.Entity1, event.Entity2); + Flag(event.Trigger, event.Entity); } - auto triggerComponent1 = m_World->GetComponent(event.Entity1); - auto triggerComponent2 = m_World->GetComponent(event.Entity2); - - auto playerComponent1 = m_World->GetComponent(event.Entity1); - auto playerComponent2 = m_World->GetComponent(event.Entity2); - - if(triggerComponent1 && playerComponent2) + auto triggerMoveComponent = m_World->GetComponent(event.Trigger); + if (triggerMoveComponent) { - Move(event.Entity1); + Move(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap); } - else if (triggerComponent2 && playerComponent1) + + auto triggerRotateComponent = m_World->GetComponent(event.Trigger); + if (triggerRotateComponent) { - Move(event.Entity2); + Rotate(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap); } return true; @@ -93,41 +81,56 @@ bool Systems::TriggerSystem::OnEnterTrigger( const Events::EnterTrigger &event ) bool Systems::TriggerSystem::OnLeaveTrigger( const Events::LeaveTrigger &event ) { - auto triggerComponent1 = m_World->GetComponent(event.Entity1); - auto triggerComponent2 = m_World->GetComponent(event.Entity2); - - auto playerComponent1 = m_World->GetComponent(event.Entity1); - auto playerComponent2 = m_World->GetComponent(event.Entity2); - - if(triggerComponent1 && playerComponent2) + auto triggerMoveComponent = m_World->GetComponent(event.Trigger); + if (triggerMoveComponent) { - Move(event.Entity1); + Move(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap); } - else if (triggerComponent2 && playerComponent1) + + auto triggerRotateComponent = m_World->GetComponent(event.Trigger); + if (triggerRotateComponent) { - Move(event.Entity2); + Rotate(triggerMoveComponent->Entity, triggerMoveComponent->Queue, triggerMoveComponent->Swap); } return true; } - -void Systems::TriggerSystem::Move( EntityID entity ) +void Systems::TriggerSystem::Rotate(EntityID entity, bool queue, bool swap) { - auto trigger = m_World->GetComponent(entity); - auto transform = m_World->GetComponent(trigger->Entity); - - Events::Move e; - e.Entity = trigger->Entity; - e.GoalPosition = trigger->GoalPosition; - e.Speed = trigger->Speed; - e.Queue = false; + auto transform = m_World->GetComponent(entity); + auto rotate = m_World->GetComponent(entity); + + Events::Rotate e; + e.Entity = entity; + e.GoalRotation = rotate->GoalRotation; + e.Time = rotate->Time; + e.Queue = queue; EventBroker->Publish(e); - glm::vec3 temp = trigger->GoalPosition; - trigger->GoalPosition = trigger->StartPosition; - trigger->StartPosition = temp; + if (swap) + { + std::swap(rotate->GoalRotation, rotate->StartRotation); + } +} + + + +void Systems::TriggerSystem::Move(EntityID entity, bool queue, bool swap) +{ + auto move = m_World->GetComponent(entity); + Events::Move e; + e.Entity = entity; + e.GoalPosition = move->GoalPosition; + e.Speed = move->Speed; + e.Queue = queue; + EventBroker->Publish(e); + + if (swap) + { + std::swap(move->GoalPosition, move->StartPosition); + } } diff --git a/src/Systems/TriggerSystem.h b/src/Systems/TriggerSystem.h index e006e26..07f1543 100644 --- a/src/Systems/TriggerSystem.h +++ b/src/Systems/TriggerSystem.h @@ -17,6 +17,9 @@ #include "Events/LeaveTrigger.h" #include "Components/Flag.h" #include "Components/TriggerMove.h" +#include "Components/TriggerRotate.h" +#include "Components/Move.h" +#include "Components/Rotate.h" #include "Components/Player.h" #include "Events/Move.h" #include "Events/Rotate.h" @@ -46,7 +49,8 @@ namespace Systems private: void Flag(EntityID entity, EntityID phantomEntity); void Explosion(EntityID entity, EntityID phantomEntity); - void Move(EntityID entity); + void Move(EntityID entity, bool queue, bool swap); + void Rotate(EntityID entity, bool queue, bool swap); }; } diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 0f1cef3..d4f45a9 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -113,6 +113,7 @@ + @@ -138,6 +139,9 @@ + + + @@ -163,6 +167,7 @@ + @@ -224,6 +229,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index c1ed260..a6e3f4e 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -79,6 +79,9 @@ Game\Systems + + Game\Systems + @@ -494,7 +497,6 @@ Physics\Events - Game\Components @@ -504,6 +506,24 @@ Base\Events + + Physics\Components + + + Physics\Components + + + Game\Systems + + + Game\Components + + + Base\Components + + + Base\Components +