diff --git a/assets b/assets index 9d3f71b..6cc3858 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 9d3f71bee6e0a930a4bd265eca3f5fceac619709 +Subproject commit 6cc38589ed77dbb3b9c34c1168d52e0f86e1de46 diff --git a/src/Components/Input.h b/src/Components/Input.h index 15cb286..e3f043a 100755 --- a/src/Components/Input.h +++ b/src/Components/Input.h @@ -1,10 +1,6 @@ #ifndef Components_Input_h__ #define Components_Input_h__ -#include - -#include - #include "Component.h" namespace Components @@ -12,12 +8,14 @@ namespace Components struct Input : Component { - std::array KeyState; - std::array LastKeyState; - std::array MouseState; - std::array LastMouseState; - float dX, dY; - float WheelDelta; + /*Input() + : Keyboard(false) + , Mouse(false) + , GamepadID(0) { } + + bool Keyboard; + bool Mouse; + int GamepadID;*/ virtual Input* Clone() const override { return new Input(*this); } }; diff --git a/src/Components/Player.h b/src/Components/Player.h new file mode 100644 index 0000000..a5e926b --- /dev/null +++ b/src/Components/Player.h @@ -0,0 +1,21 @@ +#ifndef Player_h__ +#define Player_h__ + +#include "Component.h" + +namespace Components +{ + +struct Player : Component +{ + Player() + : ID(0) { } + + int ID; + + virtual Player* Clone() const override { return new Player(*this); } +}; + +} + +#endif // Player_h__ \ No newline at end of file diff --git a/src/Components/TankSteering.h b/src/Components/TankSteering.h index c9184b3..2c4b123 100644 --- a/src/Components/TankSteering.h +++ b/src/Components/TankSteering.h @@ -7,6 +7,9 @@ namespace Components { struct TankSteering : Component { + EntityID Player; + EntityID Turret; + EntityID Barrel; TankSteering* Clone() const override { return new TankSteering(*this); } }; } diff --git a/src/Components/TowerSteering.h b/src/Components/TowerSteering.h index f4f72b9..0b4a6c8 100644 --- a/src/Components/TowerSteering.h +++ b/src/Components/TowerSteering.h @@ -10,7 +10,6 @@ struct TowerSteering : Component { TowerSteering() : TurnSpeed(1.f), Axis(glm::vec3(0,1,0)){ } - float TurnSpeed; glm::vec3 Axis; virtual TowerSteering* Clone() const override { return new TowerSteering(*this); } diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp index 63a6a9f..62fbc40 100755 --- a/src/GameWorld.cpp +++ b/src/GameWorld.cpp @@ -72,15 +72,28 @@ void GameWorld::Initialize() } CommitEntity(viewport2); + auto player1 = CreateEntity(); + { + auto player = AddComponent(player1); + player->ID = 1; + } + + auto player2 = CreateEntity(); + { + auto player = AddComponent(player2); + player->ID = 2; + } + + { auto ground = CreateEntity(); auto transform = AddComponent(ground); - transform->Position = glm::vec3(0, 0, 0); + transform->Position = glm::vec3(0, -50, 0); //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/TestScene/testScene.obj"; - model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; + model->ModelFile = "Models/TestScene3/testScene.obj"; + //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj"; auto physics = AddComponent(ground); physics->Mass = 10; @@ -90,8 +103,8 @@ void GameWorld::Initialize() auto groundshape = CreateEntity(ground); auto transformshape = AddComponent(groundshape); auto meshShape = AddComponent(groundshape); - meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; - //meshShape->ResourceName = "Models/TestScene/testScene.obj"; + //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj"; + meshShape->ResourceName = "Models/TestScene3/testScene.obj"; CommitEntity(groundshape); @@ -239,10 +252,11 @@ void GameWorld::Initialize() physics->Mass = 63000 - 16000; physics->Static = false; auto vehicle = AddComponent(tank); - vehicle->MaxTorque = 8000.f; + vehicle->MaxTorque = 36000.f; vehicle->MaxSteeringAngle = 90.f; vehicle->MaxSpeedFullSteeringAngle = 4.f; - AddComponent(tank); + auto tankSteering = AddComponent(tank); + tankSteering->Player = player1; AddComponent(tank); { @@ -264,24 +278,24 @@ void GameWorld::Initialize() auto transform = AddComponent(chassis); transform->Position = glm::vec3(0, 0, 0); auto model = AddComponent(chassis); - model->ModelFile = "Models/Tank/Fix/Chassi.obj"; + model->ModelFile = "Models/Tank/tankBody.obj"; } { auto tower = CreateEntity(tank); SetProperty(tower, "Name", "tower"); auto transform = AddComponent(tower); - transform->Position = glm::vec3(0.f, 1.2f, 1.8f); + transform->Position = glm::vec3(0.f, 0.68f, 0.9f); auto model = AddComponent(tower); - model->ModelFile = "Models/Tank/Fix/Top.obj"; + 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.018f, -0.2, -1.3f); + transform->Position = glm::vec3(-0.012f, 0.4f, -0.75); auto model = AddComponent(barrel); - model->ModelFile = "Models/Tank/Fix/Barrel.obj"; + 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; @@ -312,7 +326,429 @@ void GameWorld::Initialize() barrelSteering->ShotTemplate = shot; } CommitEntity(barrel); + tankSteering->Barrel = barrel; } + CommitEntity(tower); + tankSteering->Turret = tower; + + + auto cameraTower = CreateEntity(tower); + { + auto transform = AddComponent(cameraTower); + transform->Position.z = 11.f; + transform->Position.y = 4.f; + //transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f)); + auto cameraComp = AddComponent(cameraTower); + cameraComp->FarClip = 2000.f; + //auto freeSteering = AddComponent(cameraTower); + } + CommitEntity(cameraTower); + GetComponent(viewport1)->Camera = cameraTower; + } + + { + 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"); + + //Create wheels + float wheelOffset = 0.4f; + float springLength = 0.3f; + float suspensionStrength = 15.f; + + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -2.6f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, -0.83f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, -2.6f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, -0.83f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 0; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = true; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + + + //Back + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 1.f); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(1.68f, -0.83f - wheelOffset, 2.95f); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + + 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); + } + + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 1.f); + transform->Orientation = glm::angleAxis(glm::pi(), glm::vec3(0, 1, 0)); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + } + { + auto wheel = CreateEntity(tank); + auto transform = AddComponent(wheel); + transform->Position = glm::vec3(-1.68f, -0.83f - wheelOffset, 2.95f); + auto model = AddComponent(wheel); + model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj"; + auto Wheel = AddComponent(wheel); + Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f); + Wheel->AxleID = 1; + Wheel->Mass = 2000; + Wheel->Radius = 0.6f; + Wheel->Steering = false; + Wheel->SuspensionStrength = suspensionStrength; + Wheel->Friction = 3.f; + Wheel->ConnectedToHandbrake = true; + Wheel->TorqueRatio = 0.125f; + Wheel->Width = 0.6f; + { + auto shape = CreateEntity(wheel); + 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(wheel); + + 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); + } + + { + auto tank = CreateEntity(); + auto transform = AddComponent(tank); + transform->Position = glm::vec3(20, 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 tankSteering = AddComponent(tank); + tankSteering->Player = player2; + AddComponent(tank); + + { + 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.4f, -0.75); + 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; + { + 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; + auto modelComponent = AddComponent(shot); + modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj"; + + { + 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; + } + CommitEntity(barrel); + tankSteering->Barrel = barrel; + } + CommitEntity(tower); + tankSteering->Turret = tower; + auto cameraTower = CreateEntity(tower); { @@ -643,8 +1079,6 @@ void GameWorld::Initialize() CommitEntity(tank); } - - /* for(int i = 0; i < 10; i++) { @@ -744,6 +1178,7 @@ void GameWorld::RegisterComponents() { m_ComponentFactory.Register([]() { return new Components::Transform(); }); m_ComponentFactory.Register([]() { return new Components::Template(); }); + m_ComponentFactory.Register([]() { return new Components::Player(); }); } void GameWorld::RegisterSystems() diff --git a/src/GameWorld.h b/src/GameWorld.h index e4f7403..7ea100f 100755 --- a/src/GameWorld.h +++ b/src/GameWorld.h @@ -40,6 +40,7 @@ #include "Components/TankSteering.h" #include "Components/TowerSteering.h" #include "Components/BarrelSteering.h" +#include "Components/Player.h" class GameWorld : public World { diff --git a/src/Model.cpp b/src/Model.cpp index 4e1f937..c13a192 100755 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -66,7 +66,7 @@ Model::Model(ResourceManager* rm, OBJ &obj) if (Vertices.size() > 0) { CreateTangents(); - getSimilarVertexIndex(); + //getSimilarVertexIndex(); CreateBuffers(Vertices, Normals, TangentNormals, BiTangentNormals, TextureCoords); } else diff --git a/src/Systems/InputSystem.cpp b/src/Systems/InputSystem.cpp index dbb9ba6..2f774d0 100755 --- a/src/Systems/InputSystem.cpp +++ b/src/Systems/InputSystem.cpp @@ -53,7 +53,7 @@ bool Systems::InputSystem::OnKeyDown(const Events::KeyDown &event) float value; std::tie(command, value) = bindingIt->second; m_CommandKeyboardValues[command][event.KeyCode] = value; - PublishCommand(0, command, GetCommandTotalValue(command)); + PublishCommand(1, command, GetCommandTotalValue(command)); } return true; @@ -68,7 +68,7 @@ bool Systems::InputSystem::OnKeyUp(const Events::KeyUp &event) float value; std::tie(command, value) = bindingIt->second; m_CommandKeyboardValues[command][event.KeyCode] = 0; - PublishCommand(0, command, GetCommandTotalValue(command));; + PublishCommand(1, command, GetCommandTotalValue(command));; } return true; @@ -83,7 +83,7 @@ bool Systems::InputSystem::OnMousePress(const Events::MousePress &event) float value; std::tie(command, value) = bindingIt->second; m_CommandMouseButtonValues[command][event.Button] = value; - PublishCommand(0, command, GetCommandTotalValue(command)); + PublishCommand(1, command, GetCommandTotalValue(command)); } return true; @@ -98,7 +98,7 @@ bool Systems::InputSystem::OnMouseRelease(const Events::MouseRelease &event) float value; std::tie(command, value) = bindingIt->second; m_CommandMouseButtonValues[command][event.Button] = 0; - PublishCommand(0, command, GetCommandTotalValue(command)); + PublishCommand(1, command, GetCommandTotalValue(command)); } return true; diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp index 03aade8..3c3c1f6 100644 --- a/src/Systems/PhysicsSystem.cpp +++ b/src/Systems/PhysicsSystem.cpp @@ -75,7 +75,7 @@ void Systems::PhysicsSystem::Initialize() worldInfo.setupSolverInfo(hkpWorldCinfo::SOLVER_TYPE_4ITERS_MEDIUM); worldInfo.m_gravity = hkVector4(0.0f, -9.82f, 0.0f); - worldInfo.m_broadPhaseBorderBehaviour = hkpWorldCinfo::BROADPHASE_BORDER_FIX_ENTITY; // just fix the entity if the object falls off too far + worldInfo.m_broadPhaseBorderBehaviour = hkpWorldCinfo::BROADPHASE_BORDER_DO_NOTHING; // You must specify the size of the broad phase - objects should not be simulated outside this region worldInfo.setBroadPhaseWorldSize(1000.0f); diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp index df48c92..43268ce 100755 --- a/src/Systems/RenderSystem.cpp +++ b/src/Systems/RenderSystem.cpp @@ -43,11 +43,15 @@ void Systems::RenderSystem::OnEntityCommit(EntityID entity) void Systems::RenderSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { + auto templateComponent = m_World->GetComponent(entity); + if (templateComponent) + return; + auto transformComponent = m_World->GetComponent(entity); // Draw models auto modelComponent = m_World->GetComponent(entity); - if (transformComponent&& modelComponent) + if (transformComponent && modelComponent) { auto model = m_World->GetResourceManager()->Load("Model", modelComponent->ModelFile); if (model) diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp index 11c48fe..3d36977 100644 --- a/src/Systems/TankSteeringSystem.cpp +++ b/src/Systems/TankSteeringSystem.cpp @@ -11,70 +11,85 @@ void Systems::TankSteeringSystem::RegisterComponents( ComponentFactory* cf ) void Systems::TankSteeringSystem::Initialize() { - m_TankInputController = std::unique_ptr(new TankSteeringInputController(EventBroker)); - m_TowerInputController = std::unique_ptr(new TowerSteeringInputController(EventBroker)); + for (int i = 0; i < 4; i++) + { + m_TankInputControllers[i] = std::shared_ptr(new TankSteeringInputController(EventBroker, i + 1)); + } } void Systems::TankSteeringSystem::Update(double dt) { - m_TankInputController->Update(dt); - m_TowerInputController->Update(dt); + for (int i = 0; i < 4; i++) + { + m_TankInputControllers[i]->Update(dt); + } } void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, EntityID parent) { auto tankSteeringComponent = m_World->GetComponent(entity); - auto towerSteeringComponent = m_World->GetComponent(entity); - auto barrelSteeringComponent = m_World->GetComponent(entity); + if(!tankSteeringComponent) + return; - if(tankSteeringComponent) + auto playerComponent = m_World->GetComponent(tankSteeringComponent->Player); + if (!playerComponent) + return; + + if (playerComponent->ID == 0) + return; + + auto inputController = m_TankInputControllers[playerComponent->ID - 1]; + + Events::TankSteer eSteering; + eSteering.Entity = entity; + eSteering.PositionX = inputController->PositionX; + eSteering.PositionY = inputController->PositionY; + eSteering.Handbrake = inputController->Handbrake; + EventBroker->Publish(eSteering); + + + auto towerSteeringComponent = m_World->GetComponent(tankSteeringComponent->Turret); + auto barrelSteeringComponent = m_World->GetComponent(tankSteeringComponent->Barrel); + + if(towerSteeringComponent) { - Events::TankSteer e; - e.Entity = entity; - e.PositionX = m_TankInputController->PositionX; - e.PositionY = m_TankInputController->PositionY; - e.Handbrake = m_TankInputController->Handbrake; - EventBroker->Publish(e); - } - else if(towerSteeringComponent) - { - auto transformComponent = m_World->GetComponent(entity); - glm::quat orientation = glm::angleAxis(towerSteeringComponent->TurnSpeed * m_TowerInputController->TowerDirection * (float)dt, towerSteeringComponent->Axis); + auto transformComponent = m_World->GetComponent(tankSteeringComponent->Turret); + glm::quat orientation = glm::angleAxis(towerSteeringComponent->TurnSpeed * inputController->TowerDirection * (float)dt, towerSteeringComponent->Axis); transformComponent->Orientation *= orientation; } - else if(barrelSteeringComponent) + + if(barrelSteeringComponent) { - auto transformComponent = m_World->GetComponent(entity); - auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity); - glm::quat orientation = glm::angleAxis(barrelSteeringComponent->TurnSpeed * m_TowerInputController->BarrelDirection * (float)dt, barrelSteeringComponent->Axis); + auto transformComponent = m_World->GetComponent(tankSteeringComponent->Barrel); + auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(tankSteeringComponent->Barrel); + glm::quat orientation = glm::angleAxis(barrelSteeringComponent->TurnSpeed * inputController->BarrelDirection * (float)dt, barrelSteeringComponent->Axis); transformComponent->Orientation *= orientation; - if(m_TowerInputController->Shoot && m_TimeSinceLastShot[entity] > 1.0) + if(inputController->Shoot && m_TimeSinceLastShot[tankSteeringComponent->Barrel] > 0.5) { EntityID clone = m_World->CloneEntity(barrelSteeringComponent->ShotTemplate); auto templateAbsoluteTransform = m_World->GetSystem()->AbsoluteTransform(barrelSteeringComponent->ShotTemplate); auto cloneTransform = m_World->GetComponent(clone); cloneTransform->Position = templateAbsoluteTransform.Position; cloneTransform->Orientation = absoluteTransform.Orientation * cloneTransform->Orientation; - Events::SetVelocity e; - e.Entity = clone; - e.Velocity = absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed); - EventBroker->Publish(e); - m_TimeSinceLastShot[entity] = 0; + Events::SetVelocity eSetVelocity; + eSetVelocity.Entity = clone; + eSetVelocity.Velocity = absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed); + EventBroker->Publish(eSetVelocity); + m_TimeSinceLastShot[tankSteeringComponent->Barrel] = 0; auto clonePhysicsComponent = m_World->GetComponent(clone); //1,670m/s //25kg - EntityID baseParent = m_World->GetEntityBaseParent(entity); Events::ApplyPointImpulse ePointImpulse ; - ePointImpulse.Entity = baseParent; + ePointImpulse.Entity = entity; ePointImpulse.Position = absoluteTransform.Position; ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 1670.f; EventBroker->Publish(ePointImpulse); } - m_TimeSinceLastShot[entity] += dt; + m_TimeSinceLastShot[tankSteeringComponent->Barrel] += dt; } } @@ -82,10 +97,7 @@ void Systems::TankSteeringSystem::TankSteeringInputController::Update( double dt { PositionX = m_Horizontal; PositionY = m_Vertical; -} -void Systems::TankSteeringSystem::TowerSteeringInputController::Update( double dt ) -{ TowerDirection = m_TowerDirection; BarrelDirection = m_BarrelDirection; Shoot = m_Shoot; @@ -93,9 +105,12 @@ void Systems::TankSteeringSystem::TowerSteeringInputController::Update( double d bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const Events::InputCommand &event) { - + if (event.PlayerID != this->PlayerID) + return false; + float val = event.Value; + // Tank if (event.Command == "horizontal") { m_Horizontal = val; @@ -111,12 +126,7 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E Handbrake = val > 0; } - return true; -} - -bool Systems::TankSteeringSystem::TowerSteeringInputController::OnCommand( const Events::InputCommand &event ) -{ - float val = event.Value; + // Turret if(event.Command == "tower_rotation") { m_TowerDirection = -val; @@ -130,19 +140,9 @@ bool Systems::TankSteeringSystem::TowerSteeringInputController::OnCommand( const { m_Shoot = val > 0; } + return true; } -bool Systems::TankSteeringSystem::TowerSteeringInputController::OnMouseMove( const Events::MouseMove &event ) -{ - return false; -} - -bool Systems::TankSteeringSystem::TankSteeringInputController::OnMouseMove( const Events::MouseMove &event ) -{ - return false; -} - - diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h index 65c0bfc..370ba92 100644 --- a/src/Systems/TankSteeringSystem.h +++ b/src/Systems/TankSteeringSystem.h @@ -11,6 +11,7 @@ #include "Components/BarrelSteering.h" #include "Components/Physics.h" #include "Components/Vehicle.h" +#include "Components/Player.h" #include "Systems/TransformSystem.h" #include "InputController.h" @@ -31,9 +32,7 @@ namespace Systems private: class TankSteeringInputController; - std::unique_ptr m_TankInputController; - class TowerSteeringInputController; - std::unique_ptr m_TowerInputController; + std::array, 4> m_TankInputControllers; std::map m_TimeSinceLastShot; }; @@ -41,35 +40,17 @@ namespace Systems class TankSteeringSystem::TankSteeringInputController : InputController { public: - TankSteeringInputController(std::shared_ptr<::EventBroker> eventBroker) + TankSteeringInputController(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; - } - 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; - }; - - class TankSteeringSystem::TowerSteeringInputController : InputController - { - public: - TowerSteeringInputController(std::shared_ptr<::EventBroker> eventBroker) - : InputController(eventBroker) - { m_TowerDirection = 0.f; m_BarrelDirection = 0.f; TowerDirection = 0.f; @@ -78,18 +59,28 @@ namespace Systems m_Shoot = false; } + int PlayerID; + + float PositionY; + float PositionX; + bool Handbrake; + float TowerDirection; float BarrelDirection; bool Shoot; + void Update(double dt); protected: virtual bool OnCommand(const Events::InputCommand &event); - virtual bool OnMouseMove(const Events::MouseMove &event); + //virtual bool OnMouseMove(const Events::MouseMove &event); private: - float m_TowerDirection; - float m_BarrelDirection; - bool m_Shoot; - }; + float m_Horizontal; + float m_Vertical; + float m_TowerDirection; + float m_BarrelDirection; + + bool m_Shoot; + }; } \ No newline at end of file diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj index 9f7083a..6a99e47 100755 --- a/vs11/Returngeance/Returngeance.vcxproj +++ b/vs11/Returngeance/Returngeance.vcxproj @@ -141,6 +141,7 @@ + diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters index d7a5449..2bf19bf 100755 --- a/vs11/Returngeance/Returngeance.vcxproj.filters +++ b/vs11/Returngeance/Returngeance.vcxproj.filters @@ -1,4 +1,4 @@ - + @@ -155,6 +155,9 @@ {b34c0c95-a887-4cf4-af24-cf7c1f459aa8} + + {cb06b441-90b8-46ed-b347-4190dac7185b} + @@ -371,7 +374,7 @@ Input\Events - Physics\Components + Physics\Components Physics\Components @@ -388,10 +391,12 @@ Physics\Events - Physics\Events + + Gameplay\Components +