diff --git a/src/Components/TankSteering.h b/src/Components/TankSteering.h
index 2c4b123..c47c5c8 100644
--- a/src/Components/TankSteering.h
+++ b/src/Components/TankSteering.h
@@ -7,7 +7,6 @@ namespace Components
{
struct TankSteering : Component
{
- EntityID Player;
EntityID Turret;
EntityID Barrel;
TankSteering* Clone() const override { return new TankSteering(*this); }
diff --git a/src/Components/WheelPair.h b/src/Components/WheelPair.h
index 4e74a82..24bc598 100644
--- a/src/Components/WheelPair.h
+++ b/src/Components/WheelPair.h
@@ -8,7 +8,8 @@ namespace Components
struct WheelPair : Component
{
- // Flag for pair wheels
+ EntityID FakeWheelFront;
+ EntityID FakeWheelBack;
virtual WheelPair* Clone() const override { return new WheelPair(*this); }
};
diff --git a/src/GUI/Frame.h b/src/GUI/Frame.h
index 85f756d..fccd65b 100644
--- a/src/GUI/Frame.h
+++ b/src/GUI/Frame.h
@@ -32,12 +32,14 @@ public:
, Rectangle()
, m_Name("UIParent")
, m_Layer(0)
+ , m_Hidden(false)
{ }
// Create a frame as a child
Frame(Frame* parent, std::string name)
: m_Name(name)
, m_Layer(0)
+ , m_Hidden(false)
{ SetParent(std::shared_ptr(parent)); }
::RenderQueuePair RenderQueue;
@@ -74,6 +76,9 @@ public:
std::string Name() const { return m_Name; }
void SetName(std::string val) { m_Name = val; }
int Layer() const { return m_Layer; }
+ bool Hidden() const { return m_Hidden; }
+ void Hide() { m_Hidden = true; }
+ void Show() { m_Hidden = false; }
int Left() const override
{
@@ -105,6 +110,9 @@ public:
void UpdateLayered(double dt)
{
+ if (this->Hidden())
+ return;
+
// Update ourselves
this->Update(dt);
@@ -115,6 +123,8 @@ public:
for (auto &pairChild : children)
{
auto child = pairChild.second;
+ if (child->Hidden())
+ continue;
child->Update(dt);
}
}
@@ -123,6 +133,9 @@ public:
void DrawLayered(std::shared_ptr renderer)
{
+ if (this->Hidden())
+ return;
+
// Draw ourselves
renderer->SetViewport(AbsoluteRectangle());
this->Draw(renderer);
@@ -134,6 +147,8 @@ public:
for (auto &pairChild : children)
{
auto child = pairChild.second;
+ if (child->Hidden())
+ continue;
Rectangle rect = child->AbsoluteRectangle();
renderer->SetViewport(rect);
child->Draw(renderer);
@@ -149,7 +164,8 @@ protected:
std::string m_Name;
int m_Layer;
-
+ bool m_Hidden;
+
std::shared_ptr m_Parent;
typedef std::multimap> Children_t; // name -> frame
std::map m_Children; // layer -> Children_t
diff --git a/src/GUI/GameFrame.h b/src/GUI/GameFrame.h
index d99bc64..791baa1 100644
--- a/src/GUI/GameFrame.h
+++ b/src/GUI/GameFrame.h
@@ -18,32 +18,47 @@ public:
GameFrame(Frame* parent, std::string name)
: Frame(parent, name)
{
+ EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &GameFrame::OnKeyUp);
+
m_World = std::make_shared(EventBroker, ResourceManager);
auto worldFrame = new WorldFrame(this, "GameWorldFrame", m_World);
{
vp1 = new Viewport(worldFrame, "Viewport1", m_World);
vp1->X = 0;
vp1->Width = 640;
- vp1->Height = 720 / 2;
//new PlayerHUD(vp1, "PlayerHUD", m_World, 1);
vp2 = new Viewport(worldFrame, "Viewport2", m_World);
vp2->X = vp1->Right();
vp2->Width = 640;
- vp2->Height = 720 / 2;
//new PlayerHUD(vp2, "PlayerHUD", m_World, 2);
- auto vpc = new Viewport(worldFrame, "ViewportFreeCam", m_World);
- vpc->Y = 720 / 2;
- vpc->Height = 720 / 2;
+ m_FreeCamViewport = new Viewport(worldFrame, "ViewportFreeCam", m_World);
+ m_FreeCamViewport->Show();
}
m_World->Initialize();
}
private:
+ EventRelay m_EKeyUp;
+
std::shared_ptr m_World;
Viewport* vp1;
Viewport* vp2;
+ Viewport* m_FreeCamViewport;
+
+ bool OnKeyUp(const Events::KeyUp &event)
+ {
+ if (event.KeyCode == GLFW_KEY_1)
+ {
+ if (m_FreeCamViewport->Hidden())
+ m_FreeCamViewport->Show();
+ else
+ m_FreeCamViewport->Hide();
+ }
+
+ return true;
+ }
};
}
diff --git a/src/GUI/PlayerHUD.h b/src/GUI/PlayerHUD.h
index 648230a..b094d4c 100644
--- a/src/GUI/PlayerHUD.h
+++ b/src/GUI/PlayerHUD.h
@@ -16,6 +16,13 @@ namespace GUI
, m_PlayerID(playerID)
{
m_HealthOverlay = new HealthOverlay(this, "HealthOverlay", m_World, m_PlayerID);
+ m_Crosshair = new TextureFrame(this, "Crosshair");
+ m_Crosshair->Width = 45;
+ m_Crosshair->Height = 45;
+ m_Crosshair->X = this->Width / 2.f - m_Crosshair->Width / 2.f;
+ m_Crosshair->Y = this->Height / 2.f - m_Crosshair->Height / 2.f;
+ m_Crosshair->SetTexture("Textures/GUI/crosshair.png");
+ m_Crosshair->SetColor(glm::vec4(1.f, 1.f, 1.f, 0.75f));
}
protected:
@@ -23,6 +30,7 @@ namespace GUI
int m_PlayerID;
HealthOverlay* m_HealthOverlay;
+ TextureFrame* m_Crosshair;
};
}
diff --git a/src/GameWorld.cpp b/src/GameWorld.cpp
index 60473be..2ca1bbc 100755
--- a/src/GameWorld.cpp
+++ b/src/GameWorld.cpp
@@ -53,12 +53,11 @@ void GameWorld::Initialize()
RegisterComponents();
-#pragma region FreeCamera
auto camera = CreateEntity();
{
auto transform = AddComponent(camera);
- transform->Position.z = 20.f;
- transform->Position.y = 20.f;
+ transform->Position.z = 150.f;
+ transform->Position.y = 10.f;
//transform->Orientation = glm::quat(glm::vec3(glm::pi() / 8.f, 0.f, 0.f));
auto cameraComp = AddComponent(camera);
cameraComp->FarClip = 2000.f;
@@ -70,33 +69,102 @@ void GameWorld::Initialize()
e.ViewportFrame = "ViewportFreeCam";
EventBroker->Publish(e);
}
-#pragma endregion
+
+ {
+ auto road_base = CreateEntity();
+ auto transform = AddComponent(road_base);
+ transform->Position = glm::vec3(0, -50, 0);
+ auto model = AddComponent(road_base);
+ model->ModelFile = "Models/TerrainFiveIstles/Roads/BaseRoad.obj";
+ auto physics = AddComponent(road_base);
+ physics->Mass = 10;
+ physics->Static = true;
+ physics->CollisionLayer = 1;
+
+ auto groundshape = CreateEntity(road_base);
+ auto transformshape = AddComponent(groundshape);
+ auto meshShape = AddComponent(groundshape);
+ meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/BaseRoad.obj";
+
+
+ CommitEntity(groundshape);
+ CommitEntity(road_base);
+ }
+
+ {
+ auto road_middle = CreateEntity();
+ auto transform = AddComponent(road_middle);
+ transform->Position = glm::vec3(0, -50, 0);
+ auto model = AddComponent(road_middle);
+ model->ModelFile = "Models/TerrainFiveIstles/Roads/MiddleRoad.obj";
+ auto physics = AddComponent(road_middle);
+ physics->Mass = 10;
+ physics->Static = true;
+ physics->CollisionLayer = 1;
+
+ auto groundshape = CreateEntity(road_middle);
+ auto transformshape = AddComponent(groundshape);
+ auto meshShape = AddComponent(groundshape);
+ meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/MiddleRoad.obj";
+
+
+ CommitEntity(groundshape);
+ CommitEntity(road_middle);
+ }
+
+ {
+ auto road_small = CreateEntity();
+ auto transform = AddComponent(road_small);
+ transform->Position = glm::vec3(0, -50, 0);
+ auto model = AddComponent(road_small);
+ model->ModelFile = "Models/TerrainFiveIstles/Roads/SmallRoad.obj";
+ auto physics = AddComponent(road_small);
+ physics->Mass = 10;
+ physics->Static = true;
+ physics->CollisionLayer = 1;
+
+ auto groundshape = CreateEntity(road_small);
+ auto transformshape = AddComponent(groundshape);
+ auto meshShape = AddComponent(groundshape);
+ meshShape->ResourceName = "Models/TerrainFiveIstles/Roads/SmallRoad.obj";
+
+
+ CommitEntity(groundshape);
+ CommitEntity(road_small);
+ }
+
- //{
- // auto ground = CreateEntity();
- // auto transform = AddComponent(ground);
- // 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/TestScene3/testScene.obj";
- // //model->ModelFile = "Models/Placeholders/Terrain/Terrain2.obj";
- //
- // auto physics = AddComponent(ground);
- // physics->Mass = 10;
- // physics->Static = true;
+ {
+ auto water = CreateEntity();
+ auto transform = AddComponent(water);
+ transform->Position = glm::vec3(0, -35, 0);
+ transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
+ transform->Scale = glm::vec3(5000.f, 10.f, 5000.f);
+ auto model = AddComponent(water);
+ model->ModelFile = "Models/Placeholders/PhysicsTest/Cube.obj";
+ auto blendmap = AddComponent(water);
+ blendmap->TextureRed = "Textures/Skybox/Sky34/bottom.jpg";
+ blendmap->TextureGreen = "Textures/Skybox/Sky34/bottom.jpg";
+ blendmap->TextureBlue = "Textures/Skybox/Sky34/bottom.jpg";
+ blendmap->TextureRepeats = 1.f;
+
+ auto physics = AddComponent(water);
+ physics->Mass = 10;
+ physics->Static = true;
+ physics->CollisionLayer = 1;
+ {
+
+ auto groundshape = CreateEntity(water);
+ auto box = AddComponent(groundshape);
+ box->Depth = 250.f;
+ box->Height = 5.f;
+ box->Width = 250.f;
- // auto groundshape = CreateEntity(ground);
- // auto transformshape = AddComponent(groundshape);
- // auto meshShape = AddComponent(groundshape);
- // //meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain2.obj";
- // meshShape->ResourceName = "Models/TestScene3/testScene.obj";
-
- //
- // CommitEntity(groundshape);
- // CommitEntity(ground);
- //}
+ CommitEntity(groundshape);
+ }
+ CommitEntity(water);
+ }
{
auto ground_middle = CreateEntity();
@@ -107,9 +175,9 @@ void GameWorld::Initialize()
model->ModelFile = "Models/TerrainFiveIstles/Middle.obj";
auto blendmap = AddComponent(ground_middle);
blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg";
- blendmap->TextureBlueNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
+ blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg";
- blendmap->TextureBlueNormal = "Textures/Ground/Grass0126_2_SNM.png";
+ blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png";
blendmap->TextureBlue = "Textures/Ground/Cliffs2.png";
blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png";
blendmap->TextureRepeats = 30.f;
@@ -137,9 +205,12 @@ void GameWorld::Initialize()
auto model = AddComponent(ground_small);
model->ModelFile = "Models/TerrainFiveIstles/Small.obj";
auto blendmap = AddComponent(ground_small);
- blendmap->TextureRed = "Textures/Ground/Sand.png";
- blendmap->TextureGreen = "Textures/Ground/Grass.png";
- blendmap->TextureBlue = "Textures/Ground/Asphalt.png";
+ blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg";
+ blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
+ blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg";
+ blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png";
+ blendmap->TextureBlue = "Textures/Ground/Cliffs2.png";
+ blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png";
blendmap->TextureRepeats = 30.f;
auto physics = AddComponent(ground_small);
@@ -165,9 +236,12 @@ void GameWorld::Initialize()
auto model = AddComponent(ground_small_mirrored);
model->ModelFile = "Models/TerrainFiveIstles/Small.obj";
auto blendmap = AddComponent(ground_small_mirrored);
- blendmap->TextureRed = "Textures/Ground/Sand.png";
- blendmap->TextureGreen = "Textures/Ground/Grass.png";
- blendmap->TextureBlue = "Textures/Ground/Asphalt.png";
+ blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg";
+ blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
+ blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg";
+ blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png";
+ blendmap->TextureBlue = "Textures/Ground/Cliffs2.png";
+ blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png";
blendmap->TextureRepeats = 30.f;
auto physics = AddComponent(ground_small_mirrored);
@@ -193,9 +267,12 @@ void GameWorld::Initialize()
auto model = AddComponent(ground_base);
model->ModelFile = "Models/TerrainFiveIstles/Base.obj";
auto blendmap = AddComponent(ground_base);
- blendmap->TextureRed = "Textures/Ground/Sand.png";
- blendmap->TextureGreen = "Textures/Ground/Grass.png";
- blendmap->TextureBlue = "Textures/Ground/Asphalt.png";
+ blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg";
+ blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
+ blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg";
+ blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png";
+ blendmap->TextureBlue = "Textures/Ground/Cliffs2.png";
+ blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png";
blendmap->TextureRepeats = 30.f;
auto physics = AddComponent(ground_base);
@@ -221,9 +298,12 @@ void GameWorld::Initialize()
auto model = AddComponent(ground_base_mirrored);
model->ModelFile = "Models/TerrainFiveIstles/Base.obj";
auto blendmap = AddComponent(ground_base_mirrored);
- blendmap->TextureRed = "Textures/Ground/Sand.png";
- blendmap->TextureGreen = "Textures/Ground/Grass.png";
- blendmap->TextureBlue = "Textures/Ground/Asphalt.png";
+ blendmap->TextureRed = "Textures/Ground/SoilBeach0087_11_S.jpg";
+ blendmap->TextureRedNormal = "Textures/Ground/SoilBeach0087_11_SNM.png";
+ blendmap->TextureGreen = "Textures/Ground/Grass0126_2_S.jpg";
+ blendmap->TextureGreenNormal = "Textures/Ground/Grass0126_2_SNM.png";
+ blendmap->TextureBlue = "Textures/Ground/Cliffs2.png";
+ blendmap->TextureBlueNormal = "Textures/Ground/Cliffs2NM.png";
blendmap->TextureRepeats = 30.f;
auto physics = AddComponent(ground_base_mirrored);
@@ -244,27 +324,40 @@ void GameWorld::Initialize()
{
/* auto tree = CreateEntity();
auto transform = AddComponent(tree);
- transform->Position = glm::vec3(0, -15, 0);
+ transform->Position = glm::vec3(0, -10, 0);
auto model = AddComponent(tree);
- model->ModelFile = "Models/Tree/leafs/Leafs.obj";
+ model->ModelFile = "Models/Tree/Stem/Stem.obj";
+ auto physics = AddComponent(tree);
+ physics->Mass = 100.f;
+ physics->Static = false;
+ physics->CalculateCenterOfMass = true;
+ {
+ auto leafs = CreateEntity(tree);
+ auto transform = AddComponent(leafs);
+ auto model = AddComponent(leafs);
+ model->ModelFile = "Models/Tree/Leafs/Leafs.obj";
model->Transparent = true;
+ CommitEntity(leafs);
+ }
+ {
+ auto shape = CreateEntity(tree);
+ auto transform = AddComponent(shape);
+ auto box = AddComponent(shape);
+ transform->Position = glm::vec3(0.f, 0.f, 2.29552f);
+ box->Width = 0.296f;
+ box->Height = 2.511f;
+ box->Depth = 0.296f;
+ }
+
CommitEntity(tree);*/
-
-// auto thing = CreateEntity();
-// auto transform = AddComponent(thing);
-// transform->Position = glm::vec3(0,15,0);
-// transform->Scale = glm::vec3(3);
-// // auto model = AddComponent(thing);
-// // model->ModelFile = "Models/Barrel/Barrel.obj";
-// auto sprite = AddComponent(thing);
-// sprite->SpriteFile = "Textures/Sprites/SeriousParticle.png";
}
EntityID tank1 = CreateTank(1);
{
auto transform = GetComponent(tank1);
+ transform->Position.z = 50;
transform->Position.z = 50.f;
Events::SetViewportCamera e;
@@ -333,6 +426,69 @@ void GameWorld::Initialize()
//}
+ {
+ auto gateBase = CreateEntity();
+ auto transform = AddComponent(gateBase);
+ transform->Position = glm::vec3(0, -50, 150);
+ auto model = AddComponent(gateBase);
+ model->ModelFile = "Models/Gate/Lift/Lift.obj";
+
+ auto physics = AddComponent(gateBase);
+ physics->Static = true;
+ physics->CollisionLayer = 1; // Terrain-Layer
+ {
+ auto leftBaseShape = CreateEntity(gateBase);
+ auto transform = AddComponent(leftBaseShape);
+ transform->Position = glm::vec3(8.5f, 3, 0);
+ auto box = AddComponent(leftBaseShape);
+ box->Width = 3.f/2;
+ box->Height = 6.094f/2;
+ box->Depth = 4.f/2;
+ CommitEntity(leftBaseShape);
+ }
+ {
+ auto RightBaseShape = CreateEntity(gateBase);
+ auto transform = AddComponent(RightBaseShape);
+ transform->Position = glm::vec3(-8.5f, 3, 0);
+ auto box = AddComponent(RightBaseShape);
+ box->Width = 3.f/2;
+ box->Height = 6.094f/2;
+ box->Depth = 4.f/2;
+ CommitEntity(RightBaseShape);
+ }
+ {
+ auto LeftTopShape = CreateEntity(gateBase);
+ auto transform = AddComponent(LeftTopShape);
+ transform->Position = glm::vec3(7.5485f, 9.385f, 0);
+ auto box = AddComponent(LeftTopShape);
+ box->Width = 1.747f/2;
+ box->Height = 6.851f/2;
+ box->Depth = 1.767f/2;
+ CommitEntity(LeftTopShape);
+ }
+ {
+ auto RightTopShape = CreateEntity(gateBase);
+ auto transform = AddComponent(RightTopShape);
+ transform->Position = glm::vec3(-7.5485f, 9.385f, 0);
+ auto box = AddComponent(RightTopShape);
+ box->Width = 1.747f/2;
+ box->Height = 6.851f/2;
+ box->Depth = 1.767f/2;
+ CommitEntity(RightTopShape);
+ }
+ {
+ auto RampShape = CreateEntity(gateBase);
+ auto transform = AddComponent(RampShape);
+ transform->Position = glm::vec3(0, 0.24f, 0);
+ auto box = AddComponent(RampShape);
+ box->Width = 14.9f/2;
+ box->Height = 0.38f/2;
+ box->Depth = 1.484f/2;
+ CommitEntity(RampShape);
+ }
+ CommitEntity(gateBase);
+ }
+
}
void GameWorld::Update(double dt)
@@ -346,7 +502,6 @@ 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::BlendMap(); });
}
void GameWorld::RegisterSystems()
@@ -362,6 +517,7 @@ void GameWorld::RegisterSystems()
//m_SystemFactory.Register([this]() { return new Systems::PlayerSystem(this); });
m_SystemFactory.Register([this]() { return new Systems::FreeSteeringSystem(this, EventBroker, ResourceManager); });
m_SystemFactory.Register([this]() { return new Systems::TankSteeringSystem(this, EventBroker, ResourceManager); });
+ m_SystemFactory.Register([this]() { return new Systems::WheelPairSystem(this, EventBroker, ResourceManager); });
m_SystemFactory.Register([this]() { return new Systems::SoundSystem(this, EventBroker, ResourceManager); });
m_SystemFactory.Register([this]() { return new Systems::PhysicsSystem(this, EventBroker, ResourceManager); });
m_SystemFactory.Register([this]() { return new Systems::TriggerSystem(this, EventBroker, ResourceManager); });
@@ -381,6 +537,7 @@ void GameWorld::AddSystems()
//AddSystem();
AddSystem();
AddSystem();
+ AddSystem();
AddSystem();
AddSystem();
AddSystem();
@@ -425,12 +582,6 @@ void GameWorld::BindGamepadButton(Gamepad::Button button, std::string command, f
EntityID GameWorld::CreateTank(int playerID)
{
- auto playerEnt = CreateEntity();
- {
- auto player = AddComponent(playerEnt);
- player->ID = playerID;
- }
-
auto tank = CreateEntity();
auto transform = AddComponent(tank);
transform->Position = glm::vec3(0, 5, 0);
@@ -445,7 +596,6 @@ EntityID GameWorld::CreateTank(int playerID)
auto player = AddComponent(tank);
player->ID = playerID;
auto tankSteering = AddComponent(tank);
- tankSteering->Player = playerEnt;
AddComponent(tank);
auto health = AddComponent(tank);
health->Amount = 100.f;
@@ -519,6 +669,20 @@ EntityID GameWorld::CreateTank(int playerID)
}
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 freeSteering = AddComponent(cameraTower);
+ }
+
+ SetProperty(tank, "Camera", cameraTower);
}
CommitEntity(barrel);
tankSteering->Barrel = barrel;
@@ -527,18 +691,7 @@ EntityID GameWorld::CreateTank(int playerID)
tankSteering->Turret = tower;
- auto cameraTower = CreateEntity(tower);
- {
- auto transform = AddComponent(cameraTower);
- transform->Position.z = 16.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);
- }
-
- SetProperty(tank, "Camera", cameraTower);
+
}
//{
@@ -559,192 +712,17 @@ EntityID GameWorld::CreateTank(int playerID)
#pragma region Wheels
//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);
+ 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);
@@ -770,76 +748,121 @@ EntityID GameWorld::CreateTank(int playerID)
// CommitEntity(particleEntity);
// emitterComponent->ParticleTemplate = 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);
-#pragma endregion
-
-
- }
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 = 3.f;
+ 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);
+ }
+
+ 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 = 3.f;
+ 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);
+ }
+
+ 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/GameWorld.h b/src/GameWorld.h
index 85353c6..aae2472 100755
--- a/src/GameWorld.h
+++ b/src/GameWorld.h
@@ -20,6 +20,7 @@
#include "Systems/TriggerSystem.h"
#include "Systems/TimerSystem.h"
#include "Systems/DamageSystem.h"
+#include "Systems/WheelPairSystem.h"
#include "Components/Camera.h"
#include "Components/DirectionalLight.h"
@@ -33,7 +34,6 @@
#include "Components/Template.h"
#include "Components/Transform.h"
#include "Components/Viewport.h"
-#include "Components/BlendMap.h"
#include "Components/Physics.h"
#include "Components/SphereShape.h"
@@ -48,6 +48,7 @@
#include "Components/Health.h"
#include "Components/Trigger.h"
#include "Components/Flag.h"
+#include "Components/WheelPair.h"
class GameWorld : public World
{
@@ -58,9 +59,6 @@ public:
void Initialize();
- EntityID CreateTank(int playerID);
- EntityID CreateJeep(int playerID);
-
void RegisterSystems() override;
void AddSystems() override;
void RegisterComponents() override;
@@ -72,6 +70,10 @@ private:
void BindMouseButton(int button, std::string command, float value);
void BindGamepadAxis(Gamepad::Axis axis, std::string command, float value);
void BindGamepadButton(Gamepad::Button button, std::string command, float value);
+
+ EntityID CreateTank(int playerID);
+ void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering);
+ EntityID CreateJeep(int playerID);
};
#endif // GameWorld_h__
diff --git a/src/Physics/VehicleSetup.cpp b/src/Physics/VehicleSetup.cpp
index e319834..3568a26 100644
--- a/src/Physics/VehicleSetup.cpp
+++ b/src/Physics/VehicleSetup.cpp
@@ -183,7 +183,6 @@ void VehicleSetup::setupComponent(const hkpVehicleData& data, hkpVehicleDefaultE
engine.m_maxRPM = vehicleComponent.MaxRPM;
-
engine.m_torqueFactorAtMinRPM = 0.8f;
engine.m_torqueFactorAtMaxRPM = 0.8f;
engine.m_resistanceFactorAtMinRPM = 0.05f;
@@ -200,7 +199,7 @@ void VehicleSetup::setupComponent(const hkpVehicleData& data, hkpVehicleDefaultT
transmission.m_downshiftRPM = 3500.0f; //HACK: Should be in VehicleComponent
transmission.m_upshiftRPM = 7000.0f;
- transmission.m_clutchDelayTime = 0.0f;
+ transmission.m_clutchDelayTime = 1.5f;
transmission.m_reverseGearRatio = 1.0f;
transmission.m_gearsRatio[0] = 3.0f;
transmission.m_gearsRatio[1] = 2.25f;
diff --git a/src/RenderQueue.h b/src/RenderQueue.h
index 932dd69..2636f84 100644
--- a/src/RenderQueue.h
+++ b/src/RenderQueue.h
@@ -14,6 +14,9 @@ struct RenderJob
{
friend class RenderQueue;
+ glm::mat4 ModelMatrix;
+ float Depth;
+
protected:
uint64_t Hash;
@@ -37,7 +40,6 @@ struct ModelJob : RenderJob
GLuint VAO;
unsigned int StartIndex;
unsigned int EndIndex;
- glm::mat4 ModelMatrix;
float Transparent;
void CalculateHash() override
@@ -67,7 +69,6 @@ struct SpriteJob : RenderJob
GLuint Texture;
glm::vec4 Color;
- glm::mat4 ModelMatrix;
void CalculateHash() override
{
@@ -82,31 +83,30 @@ public:
void Add(T &job)
{
job.CalculateHash();
- m_Jobs.push_front(std::shared_ptr(new T(job)));
+ Jobs.push_front(std::shared_ptr(new T(job)));
}
void Sort()
{
- m_Jobs.sort();
+ Jobs.sort();
}
void Clear()
{
- m_Jobs.clear();
+ Jobs.clear();
}
std::forward_list>::const_iterator begin()
{
- return m_Jobs.begin();
+ return Jobs.begin();
}
std::forward_list>::const_iterator end()
{
- return m_Jobs.end();
+ return Jobs.end();
}
-private:
- std::forward_list> m_Jobs;
+ std::forward_list> Jobs;
};
struct RenderQueuePair
diff --git a/src/Renderer.cpp b/src/Renderer.cpp
index e6aa0ad..142f7ec 100755
--- a/src/Renderer.cpp
+++ b/src/Renderer.cpp
@@ -18,7 +18,7 @@ Renderer::Renderer(std::shared_ptr<::ResourceManager> resourceManager)
CAtt = 1.0f;
LAtt = 0.0f;
QAtt = 3.0f;
- m_ShadowMapRes = 2048*2;
+ m_ShadowMapRes = 1;
m_SunPosition = glm::vec3(0.f, 1.0f, 0.5f);
m_SunTarget = glm::vec3(0, 0, 0);
m_SunProjection_height = glm::vec2(-40.f, 40.f);
@@ -163,7 +163,7 @@ void Renderer::LoadContent()
FrameBufferTextures();
m_sphereModel = ResourceManager->Load("Model", "Models/Placeholders/PhysicsTest/Sphere.obj");
- m_Skybox = std::make_shared("Textures/Skybox/Sunset", "jpg");
+ m_Skybox = std::make_shared("Textures/Skybox/sky36", "jpg");
}
void Renderer::Draw(double dt)
@@ -369,6 +369,17 @@ void Renderer::DrawWorld(RenderQueuePair &rq)
glDepthMask(GL_TRUE);
glEnable(GL_SCISSOR_TEST);
+ //Sort forward rendering items by z value.
+ for(auto job : rq.Forward)
+ {
+ glm::mat4 cameraProjection = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height);
+ glm::mat4 cameraMatrix = cameraProjection * m_Camera->ViewMatrix();
+
+ glm::vec3 spritePos = glm::vec3(cameraMatrix * job->ModelMatrix * glm::vec4(1, 1, 1, 0));
+ job->Depth = spritePos.z;
+ }
+ rq.Forward.Jobs.sort(Renderer::DepthSort);
+
//DrawShadowMap(rq.Deferred);
/*
@@ -392,6 +403,7 @@ void Renderer::DrawWorld(RenderQueuePair &rq)
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
+ DrawSkybox();
DrawFBOScene(rq.Deferred);
/*
@@ -511,6 +523,8 @@ void Renderer::ForwardRendering(RenderQueue &rq)
continue;
}
+
+
auto spriteJob = std::dynamic_pointer_cast(job);
if (spriteJob)
{
@@ -593,12 +607,16 @@ void Renderer::Swap()
void Renderer::DrawSkybox()
{
//glBindFramebuffer(GL_FRAMEBUFFER, 0);
- //glViewport(0, 0, m_Width, m_Height);
- //glScissor(0, 0, m_Width, m_Height);
+ glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height);
+ glScissor(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
m_ShaderProgramSkybox.Bind();
- glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix((float)m_Width / m_Height) * glm::toMat4(glm::inverse(m_Camera->Orientation()));
+
+ //glm::mat4 cameraProjection = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height);
+ //glm::mat4 cameraMatrix = cameraProjection * m_Camera->ViewMatrix();
+
+ glm::mat4 cameraMatrix = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height) * glm::inverse(glm::toMat4(m_Camera->Orientation()));
glUniformMatrix4fv(glGetUniformLocation(m_ShaderProgramSkybox.GetHandle(), "MVP"), 1, GL_FALSE, glm::value_ptr(cameraMatrix));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
m_Skybox->Draw();
diff --git a/src/Renderer.h b/src/Renderer.h
index 445601f..dacc6db 100755
--- a/src/Renderer.h
+++ b/src/Renderer.h
@@ -201,7 +201,8 @@ private:
void CreateNormalMapTangent();
void ForwardRendering(RenderQueue &rq);
-
+ static bool DepthSort(const std::shared_ptr &i, const std::shared_ptr &j) { return (i->Depth < j->Depth); }
+
GLuint CreateQuad();
void DrawDebugShadowMap();
GLuint CreateAABB();
diff --git a/src/Shaders/Skybox.frag.glsl b/src/Shaders/Skybox.frag.glsl
index 195fa21..0c97492 100755
--- a/src/Shaders/Skybox.frag.glsl
+++ b/src/Shaders/Skybox.frag.glsl
@@ -12,5 +12,4 @@ out vec4 FragColor;
void main()
{
FragColor = texture(CubemapTexture, Input.TextureCoord);
- //FragColor = vec4(1.0, 1.0, 1.0, 0.0);
}
\ No newline at end of file
diff --git a/src/Systems/PhysicsSystem.cpp b/src/Systems/PhysicsSystem.cpp
index 889d213..4d8b8ed 100644
--- a/src/Systems/PhysicsSystem.cpp
+++ b/src/Systems/PhysicsSystem.cpp
@@ -138,6 +138,7 @@ void Systems::PhysicsSystem::Initialize()
e.Layer2 = EXPLOSION_LAYER;
EventBroker->Publish(e);
}*/
+
}
void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf)
@@ -155,6 +156,8 @@ void Systems::PhysicsSystem::RegisterComponents(ComponentFactory* cf)
void Systems::PhysicsSystem::Update(double dt)
{
+
+
for (auto pair : *m_World->GetEntities())
{
EntityID entity = pair.first;
@@ -171,23 +174,36 @@ void Systems::PhysicsSystem::Update(double dt)
{
hkVector4 position;
hkQuaternion rotation;
+ hkVector4 velocity;
if (parent)
{
auto absoluteTransform = m_World->GetSystem()->AbsoluteTransform(entity);
position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position);
rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation);
+ velocity = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Velocity);
}
else
{
position = GLMVEC3_TO_HKVECTOR4(transformComponent->Position);
rotation = GLMQUAT_TO_HKQUATERNION(transformComponent->Orientation);
+ velocity = GLMVEC3_TO_HKVECTOR4(transformComponent->Velocity);
}
m_PhysicsWorld->markForWrite();
m_RigidBodies[entity]->setPositionAndRotation(position, rotation);
+ m_RigidBodies[entity]->setLinearVelocity(velocity);
m_PhysicsWorld->unmarkForWrite();
}
+/*
+
+ glm::vec3 pos1 = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[m_World->m_Terrain]->getPosition());
+ pos1 += glm::vec3(1, 1, 1)*(float)dt;
+ hkVector4 pos = GLMVEC3_TO_HKVECTOR4(pos1);
+
+ m_PhysicsWorld->markForWrite();
+ m_RigidBodies[m_World->m_Terrain]->setPositionAndRotation(pos, GLMQUAT_TO_HKQUATERNION(glm::quat()));
+ m_PhysicsWorld->unmarkForWrite();*/
}
static const double timestep = 1 / 60.0;
@@ -240,11 +256,12 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
else if(m_RigidBodies.find(entity) != m_RigidBodies.end())
{
auto transformComponentParent = m_World->GetComponent(parent);
-
transformComponent->Position = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getPosition());
transformComponent->Orientation = HKQUATERNION_TO_GLMQUAT(m_RigidBodies[entity]->getRotation());
+ transformComponent->Velocity = HKVECTOR4_TO_GLMVEC3(m_RigidBodies[entity]->getLinearVelocity());
// TODO: No support for Scale, MIGHT be possible
+ // HACK: WTF IS THIS?
if (transformComponentParent)
{
transformComponent->Position -= transformComponentParent->Position;
@@ -319,7 +336,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
}
-
// Create a hkpListShape* of all the childEntities collected in m_ShapeArrays
hkpListShape* listShape = new hkpListShape(shapeArray.begin(), shapeArray.getSize(), hkpShapeContainer::REFERENCE_POLICY_INCREMENT);
// Save the listShape for further use
@@ -377,6 +393,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
}
// Create RigidBody
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
+ m_RigidBodies[entity] = rigidBody;
+ m_RigidBodyEntities[rigidBody] = entity;
auto vehicleComponent = m_World->GetComponent(entity);
if (vehicleComponent && m_Vehicles.find(entity) == m_Vehicles.end())
@@ -393,7 +411,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
VehicleSetup vehicleSetup;
// Create the basic vehicle.
- m_Vehicles[entity] = new hkpVehicleInstance(rigidBody);
+ m_Vehicles[entity] = new hkpVehicleInstance(m_RigidBodies[entity]);
m_PhysicsWorld->markForWrite();
vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels);
// Add the vehicle's entities and phantoms to the world
@@ -402,8 +420,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
rigidBody->addContactListener( m_collisionResolution );
}
m_Vehicles[entity]->addToWorld(m_PhysicsWorld);
- m_RigidBodies[entity] = rigidBody;
- m_RigidBodyEntities[rigidBody] = entity;
// The vehicle is an action
@@ -423,8 +439,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
rigidBody->addContactListener( m_collisionResolution );
}
m_PhysicsWorld->addEntity(rigidBody);
- m_RigidBodies[entity] = rigidBody;
- m_RigidBodyEntities[rigidBody] = entity;
+
m_PhysicsWorld->unmarkForWrite();
shape->removeReference();
@@ -576,7 +591,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
if(triggerComponent)
{
auto parentTransformComponent = m_World->GetComponent(entityParent);
-
PhantomCallbackShape* phantom = new PhantomCallbackShape(this);
hkpBvShape* phantomShape = new hkpBvShape(boxShape, phantom);
@@ -707,11 +721,40 @@ void HK_CALL Systems::PhysicsSystem::HavokErrorReport(const char* msg, void*)
bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event)
{
auto vehicleComponent = m_World->GetComponent(event.Entity);
+
if (vehicleComponent && m_Vehicles.find(event.Entity) != m_Vehicles.end() && m_RigidBodies.find(event.Entity) != m_RigidBodies.end())
{
hkpVehicleDriverInputAnalogStatus* deviceStatus = (hkpVehicleDriverInputAnalogStatus*)m_Vehicles[event.Entity]->m_deviceStatus;
- deviceStatus->m_positionX = event.PositionX;
- deviceStatus->m_positionY = event.PositionY;
+ auto transformComponent = m_World->GetComponent(event.Entity);
+
+ float steeringX = event.PositionX;
+
+ glm::vec3 velocityNormalized = glm::normalize(HKVECTOR4_TO_GLMVEC3(m_RigidBodies[event.Entity]->getLinearVelocity()));
+ glm::vec3 forward = glm::normalize(transformComponent->Orientation * glm::vec3(0, 0, -1));
+ float dotProduct = glm::dot(forward, velocityNormalized);
+
+ if(dotProduct < 0)
+ {
+ steeringX = (1 - (glm::clamp(abs(m_Vehicles[event.Entity]->calcKMPH() /vehicleComponent->TopSpeed), 0.f, 0.7f))) * steeringX;
+ }
+
+
+ if(abs(m_Vehicles[event.Entity]->calcKMPH()) < 2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180))
+ {
+ deviceStatus->m_positionY = -0.4f;
+ deviceStatus->m_positionX = steeringX;
+ }
+// else if(m_Vehicles[event.Entity]->calcKMPH() > -2 && abs(m_Vehicles[event.Entity]->m_mainSteeringAngle) > 80.f * (HK_REAL_PI / 180))
+// {
+// deviceStatus->m_positionY = 0.4f;;
+// deviceStatus->m_positionX = -steeringX;
+// }
+ else
+ {
+ deviceStatus->m_positionX = steeringX;
+ deviceStatus->m_positionY = event.PositionY;
+ }
+
if(event.PositionY > 0)
{
deviceStatus->m_reverseButtonPressed = true;
@@ -728,6 +771,9 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event )
{
m_PhysicsWorld->markForWrite();
m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity));
+
+ auto transformComponent = m_World->GetComponent(event.Entity);
+ transformComponent->Velocity = event.Velocity;
m_PhysicsWorld->unmarkForWrite();
}
return true;
@@ -813,4 +859,4 @@ bool Systems::PhysicsSystem::OnDisableCollisions( const Events::DisableCollision
m_PhysicsWorld->setCollisionFilter(m_CollisionFilter);
m_PhysicsWorld->unmarkForWrite();
return true;
-}
\ No newline at end of file
+}
diff --git a/src/Systems/RenderSystem.cpp b/src/Systems/RenderSystem.cpp
index e101f30..99acd91 100755
--- a/src/Systems/RenderSystem.cpp
+++ b/src/Systems/RenderSystem.cpp
@@ -15,6 +15,7 @@ void Systems::RenderSystem::RegisterComponents(ComponentFactory* cf)
cf->Register([]() { return new Components::PointLight(); });
cf->Register([]() { return new Components::DirectionalLight(); });
cf->Register([]() { return new Components::Viewport(); });
+ cf->Register([]() { return new Components::BlendMap(); });
}
void Systems::RenderSystem::OnEntityCommit(EntityID entity)
diff --git a/src/Systems/RenderSystem.h b/src/Systems/RenderSystem.h
index e6350db..0829f29 100755
--- a/src/Systems/RenderSystem.h
+++ b/src/Systems/RenderSystem.h
@@ -20,6 +20,7 @@
#include "Renderer.h"
#include "RenderQueue.h"
#include "Events/SetViewportCamera.h"
+#include "Components/BlendMap.h"
namespace Systems
{
diff --git a/src/Systems/TankSteeringSystem.cpp b/src/Systems/TankSteeringSystem.cpp
index bf72fc7..94f4f25 100644
--- a/src/Systems/TankSteeringSystem.cpp
+++ b/src/Systems/TankSteeringSystem.cpp
@@ -33,7 +33,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
if(!tankSteeringComponent)
return;
- auto playerComponent = m_World->GetComponent(tankSteeringComponent->Player);
+ auto playerComponent = m_World->GetComponent(entity);
if (!playerComponent)
return;
@@ -62,6 +62,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
if(barrelSteeringComponent)
{
+ auto tankTransform = m_World->GetComponent(entity);
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);
@@ -76,7 +77,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
cloneTransform->Orientation = absoluteTransform.Orientation * cloneTransform->Orientation;
Events::SetVelocity eSetVelocity;
eSetVelocity.Entity = clone;
- eSetVelocity.Velocity = absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed);
+ eSetVelocity.Velocity = tankTransform->Velocity + absoluteTransform.Orientation * (glm::vec3(0.f, 0.f, -1.f) * barrelSteeringComponent->ShotSpeed);
EventBroker->Publish(eSetVelocity);
m_TimeSinceLastShot[tankSteeringComponent->Barrel] = 0;
@@ -87,7 +88,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
Events::ApplyPointImpulse ePointImpulse ;
ePointImpulse.Entity = entity;
ePointImpulse.Position = absoluteTransform.Position;
- ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 1670.f;
+ ePointImpulse.Impulse = glm::normalize(absoluteTransform.Orientation * glm::vec3(0, 0, 1)) * clonePhysicsComponent->Mass * 6.f * 1670.f;
EventBroker->Publish(ePointImpulse);
}
@@ -280,13 +281,12 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E
if (event.Command == "horizontal")
{
m_Horizontal = val;
- m_Vertical = -0.4f;
}
else if (event.Command == "vertical")
{
m_Vertical = -val;
}
-
+
else if (event.Command == "handbrake")
{
Handbrake = val > 0;
diff --git a/src/Systems/TankSteeringSystem.h b/src/Systems/TankSteeringSystem.h
index f3115a6..8c996fa 100644
--- a/src/Systems/TankSteeringSystem.h
+++ b/src/Systems/TankSteeringSystem.h
@@ -30,6 +30,8 @@
#include "Components/FrameTimer.h"
#include "Events/Damage.h"
+#include "Components/Vehicle.h"
+#include "Components/Player.h"
namespace Systems
{
diff --git a/src/Systems/TriggerSystem.cpp b/src/Systems/TriggerSystem.cpp
index 41ea333..166a509 100644
--- a/src/Systems/TriggerSystem.cpp
+++ b/src/Systems/TriggerSystem.cpp
@@ -82,7 +82,7 @@ void Systems::TriggerSystem::Flag( EntityID entity, EntityID phantomEntity )
m_World->RemoveComponent(phantomEntity);
m_World->SetEntityParent(phantomEntity, entity);
auto phantomTransform = m_World->GetComponent(phantomEntity);
- phantomTransform->Position = glm::vec3(1.f, 0.1f, 2.f);
+ phantomTransform->Position = glm::vec3(-1.5f, 0.1f, 2.f);
}
diff --git a/src/Systems/WheelPairSystem.cpp b/src/Systems/WheelPairSystem.cpp
new file mode 100644
index 0000000..b8b6c4a
--- /dev/null
+++ b/src/Systems/WheelPairSystem.cpp
@@ -0,0 +1,33 @@
+#include "PrecompiledHeader.h"
+#include "WheelPairSystem.h"
+#include "World.h"
+
+void Systems::WheelPairSystem::RegisterComponents(ComponentFactory* cf)
+{
+ cf->Register([]() { return new Components::WheelPair(); });
+}
+
+void Systems::WheelPairSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
+{
+ auto wheelPair = m_World->GetComponent(entity);
+ if (!wheelPair)
+ return;
+
+ auto transform = m_World->GetComponent(entity);
+ if (!transform)
+ return;
+ auto transformFakeFront = m_World->GetComponent(wheelPair->FakeWheelFront);
+ if (!transformFakeFront)
+ return;
+ auto transformFakeBack = m_World->GetComponent(wheelPair->FakeWheelBack);
+ if (!transformFakeBack)
+ return;
+
+ glm::vec3 thing = transformFakeBack->Position - transformFakeFront->Position;
+
+ float height = ((transformFakeFront->Position + transformFakeBack->Position) / 2.f).y;
+ float angle = std::atan2f(thing.y, thing.z);
+
+ transform->Position.y = height;
+ transform->Orientation = glm::quat(glm::eulerAngles(transform->Orientation) * glm::vec3(0, 1, 1) + glm::vec3(-angle, 0, 0));
+}
\ No newline at end of file
diff --git a/src/Systems/WheelPairSystem.h b/src/Systems/WheelPairSystem.h
new file mode 100644
index 0000000..a2bd224
--- /dev/null
+++ b/src/Systems/WheelPairSystem.h
@@ -0,0 +1,22 @@
+#ifndef Systems_WheelPairSystem_h__
+#define Systems_WheelPairSystem_h__
+
+#include "World.h"
+#include "System.h"
+#include "Components/Transform.h"
+#include "Components/WheelPair.h"
+
+namespace Systems
+{
+ class WheelPairSystem : public System
+ {
+ public:
+
+ WheelPairSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager)
+ : System(world, eventBroker, resourceManager) { }
+
+ void RegisterComponents(ComponentFactory* cf) override;
+ void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
+ };
+}
+#endif // Systems_WheelPairSystem_h__
diff --git a/vs11/Returngeance/Returngeance.vcxproj b/vs11/Returngeance/Returngeance.vcxproj
index c64c59a..849554f 100755
--- a/vs11/Returngeance/Returngeance.vcxproj
+++ b/vs11/Returngeance/Returngeance.vcxproj
@@ -122,6 +122,7 @@
+
@@ -228,6 +229,7 @@
+
diff --git a/vs11/Returngeance/Returngeance.vcxproj.filters b/vs11/Returngeance/Returngeance.vcxproj.filters
index 965f3be..6aa9e62 100755
--- a/vs11/Returngeance/Returngeance.vcxproj.filters
+++ b/vs11/Returngeance/Returngeance.vcxproj.filters
@@ -75,6 +75,7 @@
Gameplay\Systems
+
@@ -484,6 +485,9 @@
GUI
+
+ Physics\Systems
+
Rendering\Components