Merge branch 'master' into Sound+Particles
Conflicts: src/GameWorld.cpp vs11/Returngeance/Returngeance.vcxproj vs11/Returngeance/Returngeance.vcxproj.filters
This commit is contained in:
+4
-4
@@ -15,12 +15,12 @@ MKLINK "%ConfigPath%\Sounds\" "assets\Sounds\" /J
|
|||||||
:: Shaders
|
:: Shaders
|
||||||
MKLINK "%ConfigPath%\Shaders\" "src\Shaders\" /J
|
MKLINK "%ConfigPath%\Shaders\" "src\Shaders\" /J
|
||||||
:: DLLs
|
:: DLLs
|
||||||
MKLINK "%ConfigPath%\glfw3.dll" "libs\glfw-3.0.4\lib\%Configuration%\glfw3.dll" /H
|
COPY "libs\glfw-3.0.4\lib\%Configuration%\glfw3.dll" "%ConfigPath%\glfw3.dll"
|
||||||
MKLINK "%ConfigPath%\fmodex.dll" "libs\FMOD\lib\fmodex.dll" /H
|
COPY "libs\FMOD\lib\fmodex.dll" "%ConfigPath%\fmodex.dll"
|
||||||
IF %~1==Debug (
|
IF %~1==Debug (
|
||||||
MKLINK "%ConfigPath%\glew32d.dll" "libs\glew-1.10.0\bin\%Configuration%\Win32\glew32d.dll" /H
|
COPY "libs\glew-1.10.0\bin\%Configuration%\Win32\glew32d.dll" "%ConfigPath%\glew32d.dll"
|
||||||
)
|
)
|
||||||
IF %~1==Release (
|
IF %~1==Release (
|
||||||
MKLINK "%ConfigPath%\glew32.dll" "libs\glew-1.10.0\bin\%Configuration%\Win32\glew32.dll" /H
|
COPY "libs\glew-1.10.0\bin\%Configuration%\Win32\glew32.dll" "%ConfigPath%\glew32.dll"
|
||||||
)
|
)
|
||||||
GOTO:eof
|
GOTO:eof
|
||||||
@@ -16,13 +16,38 @@ struct Physics : Component
|
|||||||
EXPLOSION = 4,
|
EXPLOSION = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class MotionTypeEnum
|
||||||
|
{
|
||||||
|
Dynamic,
|
||||||
|
Fixed,
|
||||||
|
Keyframed
|
||||||
|
};
|
||||||
|
|
||||||
Physics()
|
Physics()
|
||||||
: Mass(1.f), Static(false), Phantom(false), CalculateCenterOfMass(true), CenterOfMass(glm::vec3(0)), InitialLinearVelocity(glm::vec3(0)), InitialAngularVelocity(glm::vec3(0)),
|
: Mass(1.f)
|
||||||
LinearDamping(0.f), AngularDamping(0.05f), GravityFactor(1.f), Friction(0.5f), Restitution(0.4f), MaxLinearVelocity(200.f), MaxAngularVelocity(200.f),
|
//, Static(false)
|
||||||
CollisionLayer(0), CollisionSystemGroup(0), CollisionSubSystemId(0), CollisionSubSystemDontCollideWith(0), CollisionEvent(false){}
|
, MotionType(MotionTypeEnum::Fixed)
|
||||||
|
, Phantom(false)
|
||||||
|
, CalculateCenterOfMass(true)
|
||||||
|
, CenterOfMass(glm::vec3(0))
|
||||||
|
, InitialLinearVelocity(glm::vec3(0))
|
||||||
|
, InitialAngularVelocity(glm::vec3(0))
|
||||||
|
, LinearDamping(0.f)
|
||||||
|
, AngularDamping(0.05f)
|
||||||
|
, GravityFactor(1.f)
|
||||||
|
, Friction(0.5f)
|
||||||
|
, Restitution(0.4f)
|
||||||
|
, MaxLinearVelocity(200.f)
|
||||||
|
, MaxAngularVelocity(200.f)
|
||||||
|
, CollisionLayer(0)
|
||||||
|
, CollisionSystemGroup(0)
|
||||||
|
, CollisionSubSystemId(0)
|
||||||
|
, CollisionSubSystemDontCollideWith(0)
|
||||||
|
, CollisionEvent(false)
|
||||||
|
{ }
|
||||||
|
|
||||||
float Mass;
|
float Mass;
|
||||||
bool Static;
|
MotionTypeEnum MotionType;
|
||||||
bool Phantom;
|
bool Phantom;
|
||||||
|
|
||||||
bool CalculateCenterOfMass;
|
bool CalculateCenterOfMass;
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef Components_VehicleSpawn_h__
|
||||||
|
#define Components_VehicleSpawn_h__
|
||||||
|
|
||||||
|
#include "Component.h"
|
||||||
|
|
||||||
|
namespace Components
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SpawnPoint : Component
|
||||||
|
{
|
||||||
|
virtual SpawnPoint* Clone() const override { return new SpawnPoint(*this); }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Components_VehicleSpawn_h__
|
||||||
@@ -10,10 +10,9 @@ namespace Components
|
|||||||
struct Vehicle : Component
|
struct Vehicle : Component
|
||||||
{
|
{
|
||||||
Vehicle()
|
Vehicle()
|
||||||
: MaxTorque(1000.0f), MinRPM(0.0f), OptimalRPM(2000.0f), MaxRPM(3000.0f), MaxSteeringAngle(35), TopSpeed(70.0f),
|
: MaxTorque(1000.0f), MinRPM(200.0f), OptimalRPM(3000.0f), MaxRPM(6000.0f), MaxSteeringAngle(35), TopSpeed(90.0f),
|
||||||
MaxSpeedFullSteeringAngle(40.0f), SpringDamping(1.f), UpshiftRPM(2500.0f), DownshiftRPM(500.0f),
|
MaxSpeedFullSteeringAngle(40.0f), SpringDamping(1.f), UpshiftRPM(5500.0f), DownshiftRPM(1000.0f),
|
||||||
gearsRatio0(4.5f), gearsRatio1(2.5f), gearsRatio2(1.0f), gearsRatio3(0.5f){ }
|
gearsRatio0(3.0f), gearsRatio1(2.25f), gearsRatio2(1.5f), gearsRatio3(1.0f){ }
|
||||||
//gearsRatio0(3.0f), gearsRatio1(2.25f), gearsRatio2(1.5f), gearsRatio3(1.0f)
|
|
||||||
float MaxTorque;
|
float MaxTorque;
|
||||||
float MinRPM;
|
float MinRPM;
|
||||||
float OptimalRPM;
|
float OptimalRPM;
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef Components_Wall_h__
|
||||||
|
#define Components_Wall_h__
|
||||||
|
|
||||||
|
#include "Component.h"
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Components
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Wall : Component
|
||||||
|
{
|
||||||
|
std::vector<EntityID> Walldebris;
|
||||||
|
|
||||||
|
virtual Wall* Clone() const override { return new Wall(*this); }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Components_TankShell_h__
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef Events_OnDead_h__
|
||||||
|
#define Events_OnDead_h__
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "EventBroker.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
struct OnDead : Event
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // Events_OnDead_h__
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef Events_SpawnVehicle_h__
|
||||||
|
#define Events_SpawnVehicle_h__
|
||||||
|
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "EventBroker.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
struct SpawnVehicle : Event
|
||||||
|
{
|
||||||
|
int PlayerID;
|
||||||
|
std::string VehicleType;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // Events_SpawnVehicle_h__
|
||||||
+18
-6
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#include "Util/Rectangle.h"
|
#include "Util/Rectangle.h"
|
||||||
#include "EventBroker.h"
|
#include "EventBroker.h"
|
||||||
|
#include "Events/KeyDown.h"
|
||||||
|
#include "Events/KeyUp.h"
|
||||||
|
#include "Events/InputCommand.h"
|
||||||
#include "ResourceManager.h"
|
#include "ResourceManager.h"
|
||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "RenderQueue.h"
|
#include "RenderQueue.h"
|
||||||
@@ -79,7 +82,13 @@ public:
|
|||||||
std::string Name() const { return m_Name; }
|
std::string Name() const { return m_Name; }
|
||||||
void SetName(std::string val) { m_Name = val; }
|
void SetName(std::string val) { m_Name = val; }
|
||||||
int Layer() const { return m_Layer; }
|
int Layer() const { return m_Layer; }
|
||||||
bool Hidden() const { return m_Hidden; }
|
bool Hidden() const
|
||||||
|
{
|
||||||
|
if (m_Parent)
|
||||||
|
return m_Parent->Hidden() || m_Hidden;
|
||||||
|
else
|
||||||
|
return m_Hidden;
|
||||||
|
}
|
||||||
void Hide() { m_Hidden = true; }
|
void Hide() { m_Hidden = true; }
|
||||||
void Show() { m_Hidden = false; }
|
void Show() { m_Hidden = false; }
|
||||||
|
|
||||||
@@ -129,11 +138,6 @@ public:
|
|||||||
return Rectangle(left, top, width, height);
|
return Rectangle(left, top, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool OnKeyDown(const Events::KeyDown &event) { return false; }
|
|
||||||
virtual bool OnKeyUp(const Events::KeyUp &event) { return false; }
|
|
||||||
//virtual bool OnMouseDown(const Events::KeyDown &event) { }
|
|
||||||
//virtual bool OnMouseUp(const Events::KeyDown &event) { }
|
|
||||||
|
|
||||||
void UpdateLayered(double dt)
|
void UpdateLayered(double dt)
|
||||||
{
|
{
|
||||||
if (this->Hidden())
|
if (this->Hidden())
|
||||||
@@ -196,14 +200,22 @@ protected:
|
|||||||
typedef std::multimap<std::string, std::shared_ptr<Frame>> Children_t; // name -> frame
|
typedef std::multimap<std::string, std::shared_ptr<Frame>> Children_t; // name -> frame
|
||||||
std::map<int, Children_t> m_Children; // layer -> Children_t
|
std::map<int, Children_t> m_Children; // layer -> Children_t
|
||||||
|
|
||||||
|
virtual bool OnKeyDown(const Events::KeyDown &event) { return false; }
|
||||||
|
virtual bool OnKeyUp(const Events::KeyUp &event) { return false; }
|
||||||
|
//virtual bool OnMouseDown(const Events::KeyDown &event) { }
|
||||||
|
//virtual bool OnMouseUp(const Events::KeyDown &event) { }
|
||||||
|
virtual bool OnCommand(const Events::InputCommand &event) { return false; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EventRelay<Frame, Events::KeyDown> m_EKeyDown;
|
EventRelay<Frame, Events::KeyDown> m_EKeyDown;
|
||||||
EventRelay<Frame, Events::KeyUp> m_EKeyUp;
|
EventRelay<Frame, Events::KeyUp> m_EKeyUp;
|
||||||
|
EventRelay<Frame, Events::InputCommand> m_EInputCommand;
|
||||||
|
|
||||||
void Initialize()
|
void Initialize()
|
||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Frame::OnKeyDown);
|
EVENT_SUBSCRIBE_MEMBER(m_EKeyDown, &Frame::OnKeyDown);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Frame::OnKeyUp);
|
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &Frame::OnKeyUp);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &Frame::OnCommand);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -25,13 +25,13 @@ public:
|
|||||||
vp1 = new Viewport(worldFrame, "Viewport1", m_World);
|
vp1 = new Viewport(worldFrame, "Viewport1", m_World);
|
||||||
vp1->X = 0;
|
vp1->X = 0;
|
||||||
vp1->Width = this->Width / 2.f;
|
vp1->Width = this->Width / 2.f;
|
||||||
new PlayerHUD(vp1, "PlayerHUD", m_World, 1);
|
//new PlayerHUD(vp1, "PlayerHUD", m_World, 1);
|
||||||
//new VehicleSelection(vp1, "VehicleSelection", m_World, 1);
|
auto vehicleSelection = new VehicleSelection(vp1, "VehicleSelection", m_World, 1);
|
||||||
|
|
||||||
vp2 = new Viewport(worldFrame, "Viewport2", m_World);
|
vp2 = new Viewport(worldFrame, "Viewport2", m_World);
|
||||||
vp2->X = vp1->Right();
|
vp2->X = vp1->Right();
|
||||||
vp2->Width = this->Width / 2.f;
|
vp2->Width = this->Width / 2.f;
|
||||||
new PlayerHUD(vp2, "PlayerHUD", m_World, 2);
|
//new PlayerHUD(vp2, "PlayerHUD", m_World, 2);
|
||||||
|
|
||||||
m_FreeCamViewport = new Viewport(worldFrame, "ViewportFreeCam", m_World);
|
m_FreeCamViewport = new Viewport(worldFrame, "ViewportFreeCam", m_World);
|
||||||
m_FreeCamViewport->Hide();
|
m_FreeCamViewport->Hide();
|
||||||
|
|||||||
+72
-27
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include "GUI/Frame.h"
|
#include "GUI/Frame.h"
|
||||||
#include "GUI/HealthOverlay.h"
|
#include "GUI/HealthOverlay.h"
|
||||||
|
#include "Events/SpawnVehicle.h"
|
||||||
|
|
||||||
namespace GUI
|
namespace GUI
|
||||||
{
|
{
|
||||||
@@ -37,35 +38,8 @@ namespace GUI
|
|||||||
m_Background->SetTexture("Textures/GUI/VehicleSelection/1.png");
|
m_Background->SetTexture("Textures/GUI/VehicleSelection/1.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OnKeyUp(const Events::KeyUp &event) override
|
|
||||||
{
|
|
||||||
if (event.KeyCode == GLFW_KEY_LEFT)
|
|
||||||
{
|
|
||||||
m_CurrentSelection--;
|
|
||||||
}
|
|
||||||
else if (event.KeyCode == GLFW_KEY_RIGHT)
|
|
||||||
{
|
|
||||||
m_CurrentSelection++;
|
|
||||||
}
|
|
||||||
m_CurrentSelection = (m_CurrentSelection < 0) ? 0 : ((m_CurrentSelection > 3) ? 3 : m_CurrentSelection);
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "Textures/GUI/VehicleSelection/" << m_CurrentSelection + 1 << ".png";
|
|
||||||
m_Background->FadeToTexture(ss.str(), 1.f);
|
|
||||||
|
|
||||||
glm::vec2 scale = Scale();
|
|
||||||
glm::vec2 coord = -m_SelectionCoordinates[m_CurrentSelection];
|
|
||||||
m_TargetCoordinate = coord * scale + glm::vec2(Width / 2.f, Height / 2.f);
|
|
||||||
glm::vec2 size = m_SelectionSizes[m_CurrentSelection];
|
|
||||||
m_TargetSize = size * scale;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Update(double dt) override
|
void Update(double dt) override
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
glm::vec2 posDiff = m_TargetCoordinate - m_CurrentCoordinate;
|
glm::vec2 posDiff = m_TargetCoordinate - m_CurrentCoordinate;
|
||||||
m_CurrentCoordinate += posDiff * 2.f * (float)dt;
|
m_CurrentCoordinate += posDiff * 2.f * (float)dt;
|
||||||
|
|
||||||
@@ -94,6 +68,77 @@ namespace GUI
|
|||||||
float m_CurrentAlpha;
|
float m_CurrentAlpha;
|
||||||
|
|
||||||
TextureFrame* m_Background;
|
TextureFrame* m_Background;
|
||||||
|
|
||||||
|
bool OnCommand(const Events::InputCommand &event) override
|
||||||
|
{
|
||||||
|
if (Hidden())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (event.PlayerID != m_PlayerID)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Menu movement
|
||||||
|
if (event.Command == "interface_horizontal" || event.Command == "interface_vertical")
|
||||||
|
{
|
||||||
|
// Horizontal scrolling
|
||||||
|
if (event.Command == "interface_horizontal")
|
||||||
|
{
|
||||||
|
if (event.Value > 0)
|
||||||
|
m_CurrentSelection++;
|
||||||
|
else if (event.Value < 0)
|
||||||
|
m_CurrentSelection--;
|
||||||
|
}
|
||||||
|
// Vertical scrolling to switch between "rows" in an intuitive way
|
||||||
|
else if (event.Command == "interface_vertical")
|
||||||
|
{
|
||||||
|
if (event.Value > 0)
|
||||||
|
{
|
||||||
|
if (m_CurrentSelection == 0)
|
||||||
|
m_CurrentSelection++;
|
||||||
|
else if (m_CurrentSelection == 3)
|
||||||
|
m_CurrentSelection--;
|
||||||
|
}
|
||||||
|
else if (event.Value < 0)
|
||||||
|
{
|
||||||
|
if (m_CurrentSelection == 1)
|
||||||
|
m_CurrentSelection--;
|
||||||
|
else if (m_CurrentSelection == 2)
|
||||||
|
m_CurrentSelection++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_CurrentSelection = (m_CurrentSelection < 0) ? 0 : ((m_CurrentSelection > 3) ? 3 : m_CurrentSelection);
|
||||||
|
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "Textures/GUI/VehicleSelection/" << m_CurrentSelection + 1 << ".png";
|
||||||
|
m_Background->FadeToTexture(ss.str(), 1.f);
|
||||||
|
|
||||||
|
glm::vec2 scale = Scale();
|
||||||
|
glm::vec2 coord = -m_SelectionCoordinates[m_CurrentSelection];
|
||||||
|
m_TargetCoordinate = coord * scale + glm::vec2(Width / 2.f, Height / 2.f);
|
||||||
|
glm::vec2 size = m_SelectionSizes[m_CurrentSelection];
|
||||||
|
m_TargetSize = size * scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vehicle select
|
||||||
|
if (event.Command == "interface_confirm" && event.Value > 0)
|
||||||
|
{
|
||||||
|
Events::SpawnVehicle e;
|
||||||
|
e.PlayerID = m_PlayerID;
|
||||||
|
if (m_CurrentSelection == 0)
|
||||||
|
e.VehicleType = "Tank"; // HACK: Base on selected vehicle ID
|
||||||
|
else if (m_CurrentSelection == 1)
|
||||||
|
e.VehicleType = "Helicopter";
|
||||||
|
else if (m_CurrentSelection == 2)
|
||||||
|
e.VehicleType = "HRSV";
|
||||||
|
else if (m_CurrentSelection == 3)
|
||||||
|
e.VehicleType = "Jeep";
|
||||||
|
EventBroker->Publish(e);
|
||||||
|
Hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
glm::vec2 VehicleSelection::m_SelectionCoordinates[4] = {
|
glm::vec2 VehicleSelection::m_SelectionCoordinates[4] = {
|
||||||
|
|||||||
+575
-316
File diff suppressed because it is too large
Load Diff
+4
-1
@@ -22,6 +22,7 @@
|
|||||||
#include "Systems/DamageSystem.h"
|
#include "Systems/DamageSystem.h"
|
||||||
#include "Systems/WheelPairSystem.h"
|
#include "Systems/WheelPairSystem.h"
|
||||||
#include "Systems/FollowSystem.h"
|
#include "Systems/FollowSystem.h"
|
||||||
|
#include "Systems/WallSystem.h"
|
||||||
#include "Systems/GarageSystem.h"
|
#include "Systems/GarageSystem.h"
|
||||||
|
|
||||||
#include "Components/Camera.h"
|
#include "Components/Camera.h"
|
||||||
@@ -77,10 +78,12 @@ private:
|
|||||||
void BindGamepadAxis(Gamepad::Axis axis, 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);
|
void BindGamepadButton(Gamepad::Button button, std::string command, float value);
|
||||||
|
|
||||||
EntityID CreateTank(int playerID);
|
|
||||||
void CreateGate(glm::vec3 Position);
|
void CreateGate(glm::vec3 Position);
|
||||||
void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering);
|
void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool steering);
|
||||||
EntityID CreateJeep(int playerID);
|
EntityID CreateJeep(int playerID);
|
||||||
|
EntityID CreateWall(glm::vec3 pos, glm::quat orientation);
|
||||||
|
EntityID CreateGarage(glm::vec3 Position, int playerID);
|
||||||
|
std::vector<EntityID> m_WallDebrisTemplates;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // GameWorld_h__
|
#endif // GameWorld_h__
|
||||||
|
|||||||
+1
-1
@@ -93,7 +93,7 @@ Model::Model(std::shared_ptr<ResourceManager> rm, OBJ &obj)
|
|||||||
if (Vertices.size() > 0)
|
if (Vertices.size() > 0)
|
||||||
{
|
{
|
||||||
CreateTangents();
|
CreateTangents();
|
||||||
getSimilarVertexIndex();
|
//getSimilarVertexIndex();
|
||||||
CreateBuffers(Vertices, Normals, TangentNormals, BiTangentNormals, TextureCoords);
|
CreateBuffers(Vertices, Normals, TangentNormals, BiTangentNormals, TextureCoords);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
+15
-17
@@ -377,9 +377,9 @@ void Renderer::DrawWorld(RenderQueuePair &rq)
|
|||||||
for(auto job : rq.Forward)
|
for(auto job : rq.Forward)
|
||||||
{
|
{
|
||||||
glm::mat4 cameraProjection = m_Camera->ProjectionMatrix((float)m_Viewport.Width / m_Viewport.Height);
|
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->ViewMatrix();
|
||||||
|
|
||||||
glm::vec3 spritePos = glm::vec3(cameraMatrix * job->ModelMatrix * glm::vec4(1, 1, 1, 0));
|
glm::vec3 spritePos = glm::vec3((cameraMatrix * job->ModelMatrix) * glm::vec4(1, 1, 1, 1));
|
||||||
job->Depth = spritePos.z;
|
job->Depth = spritePos.z;
|
||||||
}
|
}
|
||||||
rq.Forward.Jobs.sort(Renderer::DepthSort);
|
rq.Forward.Jobs.sort(Renderer::DepthSort);
|
||||||
@@ -389,7 +389,7 @@ void Renderer::DrawWorld(RenderQueuePair &rq)
|
|||||||
/*
|
/*
|
||||||
Base pass
|
Base pass
|
||||||
*/
|
*/
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbBasePass);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_fbBasePass);
|
||||||
glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height);
|
glViewport(m_Viewport.X, m_Height - m_Viewport.Y - m_Viewport.Height, m_Viewport.Width, m_Viewport.Height);
|
||||||
glScissor(m_Scissor.X, m_Height - m_Scissor.Y - m_Scissor.Height, m_Scissor.Width, m_Scissor.Height);
|
glScissor(m_Scissor.X, m_Height - m_Scissor.Y - m_Scissor.Height, m_Scissor.Width, m_Scissor.Height);
|
||||||
//glViewport(0, 0, m_Width, m_Height);
|
//glViewport(0, 0, m_Width, m_Height);
|
||||||
@@ -475,10 +475,10 @@ void Renderer::ForwardRendering(RenderQueue &rq)
|
|||||||
glScissor(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);
|
||||||
|
|
||||||
// Clear G-buffer
|
// Clear G-buffer
|
||||||
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
|
GLenum attachments[] = { GL_COLOR_ATTACHMENT0, GL_NONE , GL_NONE , GL_NONE };
|
||||||
glDrawBuffers(4, attachments);
|
glDrawBuffers(4, attachments);
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
//glClearColor(0.f, 0.f, 0.f, 1.f);
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
//glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
@@ -512,23 +512,21 @@ void Renderer::ForwardRendering(RenderQueue &rq)
|
|||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture);
|
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture);
|
||||||
if (modelJob->NormalTexture != 0)
|
/*if (modelJob->NormalTexture != 0)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL_TEXTURE_2D, modelJob->NormalTexture);
|
glBindTexture(GL_TEXTURE_2D, modelJob->NormalTexture);
|
||||||
}
|
}
|
||||||
if (modelJob->SpecularTexture)
|
if (modelJob->SpecularTexture)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE3);
|
glActiveTexture(GL_TEXTURE3);
|
||||||
glBindTexture(GL_TEXTURE_2D, modelJob->SpecularTexture);
|
glBindTexture(GL_TEXTURE_2D, modelJob->SpecularTexture);
|
||||||
}
|
}*/
|
||||||
glDrawArrays(GL_TRIANGLES, modelJob->StartIndex, modelJob->EndIndex - modelJob->StartIndex + 1);
|
glDrawArrays(GL_TRIANGLES, modelJob->StartIndex, modelJob->EndIndex - modelJob->StartIndex + 1);
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
auto spriteJob = std::dynamic_pointer_cast<SpriteJob>(job);
|
||||||
if (spriteJob)
|
if (spriteJob)
|
||||||
{
|
{
|
||||||
@@ -559,9 +557,9 @@ void Renderer::ForwardRendering(RenderQueue &rq)
|
|||||||
glViewport(0, 0, m_Width, m_Height);
|
glViewport(0, 0, m_Width, m_Height);
|
||||||
glScissor(0, 0, m_Width, m_Height);
|
glScissor(0, 0, m_Width, m_Height);
|
||||||
|
|
||||||
|
glDepthMask(GL_FALSE);
|
||||||
glDisable(GL_DEPTH_TEST);
|
glDisable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
|
|
||||||
m_FinalForwardPassProgram.Bind();
|
m_FinalForwardPassProgram.Bind();
|
||||||
//ShaderProgramHandle = m_FinalForwardPassProgram.GetHandle();
|
//ShaderProgramHandle = m_FinalForwardPassProgram.GetHandle();
|
||||||
@@ -947,7 +945,7 @@ void Renderer::FrameBufferTextures()
|
|||||||
//Generate and bind diffuse texture
|
//Generate and bind diffuse texture
|
||||||
glGenTextures(1, &m_fDiffuseTexture);
|
glGenTextures(1, &m_fDiffuseTexture);
|
||||||
glBindTexture(GL_TEXTURE_2D, m_fDiffuseTexture);
|
glBindTexture(GL_TEXTURE_2D, m_fDiffuseTexture);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||||
|
|||||||
+1
-1
@@ -219,7 +219,7 @@ private:
|
|||||||
void CreateNormalMapTangent();
|
void CreateNormalMapTangent();
|
||||||
void ForwardRendering(RenderQueue &rq);
|
void ForwardRendering(RenderQueue &rq);
|
||||||
|
|
||||||
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth > j->Depth); }
|
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth < j->Depth); }
|
||||||
|
|
||||||
GLuint CreateQuad();
|
GLuint CreateQuad();
|
||||||
void DrawDebugShadowMap();
|
void DrawDebugShadowMap();
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#include "PrecompiledHeader.h"
|
#include "PrecompiledHeader.h"
|
||||||
#include "DamageSystem.h"
|
#include "DamageSystem.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
|
||||||
void Systems::DamageSystem::RegisterComponents( ComponentFactory* cf )
|
void Systems::DamageSystem::RegisterComponents( ComponentFactory* cf )
|
||||||
{
|
{
|
||||||
cf->Register<Components::Health>([]() { return new Components::Health(); });
|
cf->Register<Components::Health>([]() { return new Components::Health(); });
|
||||||
@@ -15,8 +14,16 @@ void Systems::DamageSystem::Initialize()
|
|||||||
|
|
||||||
bool Systems::DamageSystem::OnDamage( const Events::Damage &event )
|
bool Systems::DamageSystem::OnDamage( const Events::Damage &event )
|
||||||
{
|
{
|
||||||
|
if(!m_World->ValidEntity(event.Entity))
|
||||||
|
return false;
|
||||||
auto health = m_World->GetComponent<Components::Health>(event.Entity);
|
auto health = m_World->GetComponent<Components::Health>(event.Entity);
|
||||||
health->Amount -= event.Amount;
|
health->Amount -= event.Amount;
|
||||||
|
if(health->Amount <= 0)
|
||||||
|
{
|
||||||
|
Events::OnDead e;
|
||||||
|
e.Entity = event.Entity;
|
||||||
|
EventBroker->Publish(e);
|
||||||
|
}
|
||||||
LOG_INFO("Damaged entity %i, Health left: %f", event.Entity, health->Amount);
|
LOG_INFO("Damaged entity %i, Health left: %f", event.Entity, health->Amount);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "System.h"
|
#include "System.h"
|
||||||
#include "Components/Health.h"
|
#include "Components/Health.h"
|
||||||
#include "Events/Damage.h"
|
#include "Events/Damage.h"
|
||||||
|
#include "Events/OnDead.h"
|
||||||
|
|
||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -5,12 +5,14 @@
|
|||||||
void Systems::GarageSystem::RegisterComponents( ComponentFactory* cf )
|
void Systems::GarageSystem::RegisterComponents( ComponentFactory* cf )
|
||||||
{
|
{
|
||||||
cf->Register<Components::Garage>([]() { return new Components::Garage(); });
|
cf->Register<Components::Garage>([]() { return new Components::Garage(); });
|
||||||
|
cf->Register<Components::SpawnPoint>([]() { return new Components::SpawnPoint(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::GarageSystem::Initialize()
|
void Systems::GarageSystem::Initialize()
|
||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EEnterTrigger, &Systems::GarageSystem::OnEnterTrigger);
|
EVENT_SUBSCRIBE_MEMBER(m_EEnterTrigger, &Systems::GarageSystem::OnEnterTrigger);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ELeaveTrigger, &Systems::GarageSystem::OnLeaveTrigger);
|
EVENT_SUBSCRIBE_MEMBER(m_ELeaveTrigger, &Systems::GarageSystem::OnLeaveTrigger);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ECommand, &Systems::GarageSystem::OnCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Systems::GarageSystem::Update(double dt)
|
void Systems::GarageSystem::Update(double dt)
|
||||||
@@ -34,11 +36,13 @@ bool Systems::GarageSystem::OnEnterTrigger(const Events::EnterTrigger &event)
|
|||||||
|
|
||||||
std::string name = m_World->GetProperty<std::string>(event.Trigger, "Name");
|
std::string name = m_World->GetProperty<std::string>(event.Trigger, "Name");
|
||||||
|
|
||||||
if (name == "BoundsTrigger" || name == "ElevatorShaftTrigger")
|
if (name == "BoundsTrigger")
|
||||||
{
|
{
|
||||||
ToggleGarage(garageComponent);
|
ToggleGarage(garageComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_EntitiesInTrigger[event.Trigger].insert(event.Entity);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,6 +63,40 @@ bool Systems::GarageSystem::OnLeaveTrigger(const Events::LeaveTrigger &event)
|
|||||||
ToggleGarage(garageComponent);
|
ToggleGarage(garageComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_EntitiesInTrigger[event.Trigger].erase(event.Entity);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Systems::GarageSystem::OnCommand(const Events::InputCommand &event)
|
||||||
|
{
|
||||||
|
if (event.Command == "use" && event.Value > 0)
|
||||||
|
{
|
||||||
|
for (auto &pair : m_EntitiesInTrigger)
|
||||||
|
{
|
||||||
|
EntityID trigger = pair.first;
|
||||||
|
auto entities = pair.second;
|
||||||
|
|
||||||
|
std::string name = m_World->GetProperty<std::string>(trigger, "Name");
|
||||||
|
if (name != "ElevatorShaftTrigger")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
auto triggerBaseParent = m_World->GetEntityBaseParent(trigger);
|
||||||
|
auto triggerPlayerComponent = m_World->GetComponent<Components::Player>(triggerBaseParent);
|
||||||
|
|
||||||
|
for (EntityID entity : entities)
|
||||||
|
{
|
||||||
|
auto entityPlayerComponent = m_World->GetComponent<Components::Player>(triggerBaseParent);
|
||||||
|
if (triggerPlayerComponent == entityPlayerComponent)
|
||||||
|
{
|
||||||
|
EntityID garage = m_World->GetEntityParent(trigger);
|
||||||
|
auto garageComponent = m_World->GetComponent<Components::Garage>(garage);
|
||||||
|
ToggleGarage(garageComponent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,17 @@
|
|||||||
#ifndef GarageSystem_h__
|
#ifndef GarageSystem_h__
|
||||||
#define GarageSystem_h__
|
#define GarageSystem_h__
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
#include "Components/Transform.h"
|
#include "Components/Transform.h"
|
||||||
#include "Components/Trigger.h"
|
#include "Components/Trigger.h"
|
||||||
#include "Components/Garage.h"
|
#include "Components/Garage.h"
|
||||||
|
#include "Components/SpawnPoint.h"
|
||||||
#include "Events/EnterTrigger.h"
|
#include "Events/EnterTrigger.h"
|
||||||
#include "Events/LeaveTrigger.h"
|
#include "Events/LeaveTrigger.h"
|
||||||
|
#include "Events/SpawnVehicle.h"
|
||||||
|
#include "Events/InputCommand.h"
|
||||||
|
|
||||||
#include "Components/Player.h"
|
#include "Components/Player.h"
|
||||||
#include "Events/Move.h"
|
#include "Events/Move.h"
|
||||||
@@ -30,12 +34,17 @@ namespace Systems
|
|||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::map<EntityID, std::set<EntityID>> m_EntitiesInTrigger;
|
||||||
|
|
||||||
EventRelay<GarageSystem, Events::EnterTrigger> m_EEnterTrigger;
|
EventRelay<GarageSystem, Events::EnterTrigger> m_EEnterTrigger;
|
||||||
bool OnEnterTrigger(const Events::EnterTrigger &event);
|
bool OnEnterTrigger(const Events::EnterTrigger &event);
|
||||||
EventRelay<GarageSystem, Events::LeaveTrigger> m_ELeaveTrigger;
|
EventRelay<GarageSystem, Events::LeaveTrigger> m_ELeaveTrigger;
|
||||||
bool OnLeaveTrigger(const Events::LeaveTrigger &event);
|
bool OnLeaveTrigger(const Events::LeaveTrigger &event);
|
||||||
|
EventRelay<GarageSystem, Events::InputCommand> m_ECommand;
|
||||||
|
bool OnCommand(const Events::InputCommand &event);
|
||||||
|
|
||||||
void ToggleGarage(Components::Garage* garageComponent);
|
void ToggleGarage(Components::Garage* garageComponent);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+30
-47
@@ -46,8 +46,8 @@ void Systems::InputSystem::Update(double dt)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnKeyDown(const Events::KeyDown &event)
|
bool Systems::InputSystem::OnKeyDown(const Events::KeyDown &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_KeyBindings.find(event.KeyCode);
|
auto range = m_KeyBindings.equal_range(event.KeyCode);
|
||||||
if (bindingIt != m_KeyBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -61,8 +61,8 @@ bool Systems::InputSystem::OnKeyDown(const Events::KeyDown &event)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnKeyUp(const Events::KeyUp &event)
|
bool Systems::InputSystem::OnKeyUp(const Events::KeyUp &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_KeyBindings.find(event.KeyCode);
|
auto range = m_KeyBindings.equal_range(event.KeyCode);
|
||||||
if (bindingIt != m_KeyBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -76,8 +76,8 @@ bool Systems::InputSystem::OnKeyUp(const Events::KeyUp &event)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnMousePress(const Events::MousePress &event)
|
bool Systems::InputSystem::OnMousePress(const Events::MousePress &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_MouseButtonBindings.find(event.Button);
|
auto range = m_MouseButtonBindings.equal_range(event.Button);
|
||||||
if (bindingIt != m_MouseButtonBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -91,8 +91,8 @@ bool Systems::InputSystem::OnMousePress(const Events::MousePress &event)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnMouseRelease(const Events::MouseRelease &event)
|
bool Systems::InputSystem::OnMouseRelease(const Events::MouseRelease &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_MouseButtonBindings.find(event.Button);
|
auto range = m_MouseButtonBindings.equal_range(event.Button);
|
||||||
if (bindingIt != m_MouseButtonBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -106,8 +106,8 @@ bool Systems::InputSystem::OnMouseRelease(const Events::MouseRelease &event)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnGamepadAxis(const Events::GamepadAxis &event)
|
bool Systems::InputSystem::OnGamepadAxis(const Events::GamepadAxis &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_GamepadAxisBindings.find(event.Axis);
|
auto range = m_GamepadAxisBindings.equal_range(event.Axis);
|
||||||
if (bindingIt != m_GamepadAxisBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -121,8 +121,8 @@ bool Systems::InputSystem::OnGamepadAxis(const Events::GamepadAxis &event)
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnGamepadButtonDown(const Events::GamepadButtonDown &event)
|
bool Systems::InputSystem::OnGamepadButtonDown(const Events::GamepadButtonDown &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_GamepadButtonBindings.find(event.Button);
|
auto range = m_GamepadButtonBindings.equal_range(event.Button);
|
||||||
if (bindingIt != m_GamepadButtonBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -136,8 +136,8 @@ bool Systems::InputSystem::OnGamepadButtonDown(const Events::GamepadButtonDown &
|
|||||||
|
|
||||||
bool Systems::InputSystem::OnGamepadButtonUp(const Events::GamepadButtonUp &event)
|
bool Systems::InputSystem::OnGamepadButtonUp(const Events::GamepadButtonUp &event)
|
||||||
{
|
{
|
||||||
auto bindingIt = m_GamepadButtonBindings.find(event.Button);
|
auto range = m_GamepadButtonBindings.equal_range(event.Button);
|
||||||
if (bindingIt != m_GamepadButtonBindings.end())
|
for (auto bindingIt = range.first; bindingIt != range.second; bindingIt++)
|
||||||
{
|
{
|
||||||
std::string command;
|
std::string command;
|
||||||
float value;
|
float value;
|
||||||
@@ -149,18 +149,13 @@ bool Systems::InputSystem::OnGamepadButtonUp(const Events::GamepadButtonUp &even
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Systems::InputSystem::OnBindKey(const Events::BindKey &event)
|
bool Systems::InputSystem::OnBindKey(const Events::BindKey &event)
|
||||||
{
|
{
|
||||||
if (event.Command.empty())
|
if (event.Command.empty())
|
||||||
{
|
return false;
|
||||||
m_KeyBindings.erase(event.KeyCode);
|
|
||||||
}
|
m_KeyBindings.insert(std::make_pair(event.KeyCode, std::make_tuple(event.Command, event.Value)));
|
||||||
else
|
LOG_DEBUG("Input: Bound key %i to %s", event.KeyCode, event.Command.c_str());
|
||||||
{
|
|
||||||
m_KeyBindings[event.KeyCode] = std::make_tuple(event.Command, event.Value);
|
|
||||||
LOG_DEBUG("Input: Bound key %i:%c to %s", event.KeyCode, (char)event.KeyCode, event.Command.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -168,14 +163,10 @@ bool Systems::InputSystem::OnBindKey(const Events::BindKey &event)
|
|||||||
bool Systems::InputSystem::OnBindMouseButton(const Events::BindMouseButton &event)
|
bool Systems::InputSystem::OnBindMouseButton(const Events::BindMouseButton &event)
|
||||||
{
|
{
|
||||||
if (event.Command.empty())
|
if (event.Command.empty())
|
||||||
{
|
return false;
|
||||||
m_MouseButtonBindings.erase(event.Button);
|
|
||||||
}
|
m_MouseButtonBindings.insert(std::make_pair(event.Button, std::make_tuple(event.Command, event.Value)));
|
||||||
else
|
LOG_DEBUG("Input: Bound mouse button %i to %s", event.Button, event.Command.c_str());
|
||||||
{
|
|
||||||
m_MouseButtonBindings[event.Button] = std::make_tuple(event.Command, event.Value);
|
|
||||||
LOG_DEBUG("Input: Bound mouse button %i to %s", event.Button, event.Command.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -183,14 +174,10 @@ bool Systems::InputSystem::OnBindMouseButton(const Events::BindMouseButton &even
|
|||||||
bool Systems::InputSystem::OnBindGamepadAxis(const Events::BindGamepadAxis &event)
|
bool Systems::InputSystem::OnBindGamepadAxis(const Events::BindGamepadAxis &event)
|
||||||
{
|
{
|
||||||
if (event.Command.empty())
|
if (event.Command.empty())
|
||||||
{
|
return false;
|
||||||
m_GamepadAxisBindings.erase(event.Axis);
|
|
||||||
}
|
m_GamepadAxisBindings.insert(std::make_pair(event.Axis, std::make_tuple(event.Command, event.Value)));
|
||||||
else
|
LOG_DEBUG("Input: Bound gamepad axis %i to %s", event.Axis, event.Command.c_str());
|
||||||
{
|
|
||||||
m_GamepadAxisBindings[event.Axis] = std::make_tuple(event.Command, event.Value);
|
|
||||||
LOG_DEBUG("Input: Bound gamepad axis %i to %s", event.Axis, event.Command.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -198,14 +185,10 @@ bool Systems::InputSystem::OnBindGamepadAxis(const Events::BindGamepadAxis &even
|
|||||||
bool Systems::InputSystem::OnBindGamepadButton(const Events::BindGamepadButton &event)
|
bool Systems::InputSystem::OnBindGamepadButton(const Events::BindGamepadButton &event)
|
||||||
{
|
{
|
||||||
if (event.Command.empty())
|
if (event.Command.empty())
|
||||||
{
|
return false;
|
||||||
m_GamepadButtonBindings.erase(event.Button);
|
|
||||||
}
|
m_GamepadButtonBindings.insert(std::make_pair(event.Button, std::make_tuple(event.Command, event.Value)));
|
||||||
else
|
LOG_DEBUG("Input: Bound gamepad axis %i to %s", event.Button, event.Command.c_str());
|
||||||
{
|
|
||||||
m_GamepadButtonBindings[event.Button] = std::make_tuple(event.Command, event.Value);
|
|
||||||
LOG_DEBUG("Input: Bound gamepad axis %i to %s", event.Button, event.Command.c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ private:
|
|||||||
std::unordered_map<std::string, std::unordered_map<Gamepad::Axis, float>> m_CommandGamepadAxisValues; // command string -> gamepad axis value for command
|
std::unordered_map<std::string, std::unordered_map<Gamepad::Axis, float>> m_CommandGamepadAxisValues; // command string -> gamepad axis value for command
|
||||||
std::unordered_map<std::string, std::unordered_map<Gamepad::Button, float>> m_CommandGamepadButtonValues; // command string -> gamepad button value for command
|
std::unordered_map<std::string, std::unordered_map<Gamepad::Button, float>> m_CommandGamepadButtonValues; // command string -> gamepad button value for command
|
||||||
// Input binding tables
|
// Input binding tables
|
||||||
std::unordered_map<int, std::tuple<std::string, float>> m_KeyBindings; // GLFW_KEY... -> command string & value
|
std::unordered_multimap<int, std::tuple<std::string, float>> m_KeyBindings; // GLFW_KEY... -> command string & value
|
||||||
std::unordered_map<int, std::tuple<std::string, float>> m_MouseButtonBindings; // GLFW_MOUSE_BUTTON... -> command string
|
std::unordered_multimap<int, std::tuple<std::string, float>> m_MouseButtonBindings; // GLFW_MOUSE_BUTTON... -> command string
|
||||||
std::unordered_map<Gamepad::Axis, std::tuple<std::string, float>> m_GamepadAxisBindings; // Gamepad::Axis -> command string & value
|
std::unordered_multimap<Gamepad::Axis, std::tuple<std::string, float>> m_GamepadAxisBindings; // Gamepad::Axis -> command string & value
|
||||||
std::unordered_map<Gamepad::Button, std::tuple<std::string, float>> m_GamepadButtonBindings; // Gamepad::Button -> command string
|
std::unordered_multimap<Gamepad::Button, std::tuple<std::string, float>> m_GamepadButtonBindings; // Gamepad::Button -> command string
|
||||||
|
|
||||||
// Input events
|
// Input events
|
||||||
EventRelay<InputSystem, Events::KeyDown> m_EKeyDown;
|
EventRelay<InputSystem, Events::KeyDown> m_EKeyDown;
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ void Systems::PhysicsSystem::Initialize()
|
|||||||
worldInfo.m_broadPhaseBorderBehaviour = hkpWorldCinfo::BROADPHASE_BORDER_FIX_ENTITY;
|
worldInfo.m_broadPhaseBorderBehaviour = hkpWorldCinfo::BROADPHASE_BORDER_FIX_ENTITY;
|
||||||
|
|
||||||
// You must specify the size of the broad phase - objects should not be simulated outside this region
|
// You must specify the size of the broad phase - objects should not be simulated outside this region
|
||||||
worldInfo.setBroadPhaseWorldSize(1500.0f);
|
worldInfo.setBroadPhaseWorldSize(500.0f);
|
||||||
m_PhysicsWorld = new hkpWorld(worldInfo);
|
m_PhysicsWorld = new hkpWorld(worldInfo);
|
||||||
|
|
||||||
// When the simulation type is SIMULATION_TYPE_MULTITHREADED, in the debug build, the sdk performs checks
|
// When the simulation type is SIMULATION_TYPE_MULTITHREADED, in the debug build, the sdk performs checks
|
||||||
@@ -151,6 +151,10 @@ void Systems::PhysicsSystem::Update(double dt)
|
|||||||
EntityID entity = pair.first;
|
EntityID entity = pair.first;
|
||||||
EntityID parent = pair.second;
|
EntityID parent = pair.second;
|
||||||
|
|
||||||
|
auto templateComponent = m_World->GetComponent<Components::Template>(entity);
|
||||||
|
if(templateComponent)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (m_RigidBodies.find(entity) == m_RigidBodies.end())
|
if (m_RigidBodies.find(entity) == m_RigidBodies.end())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -218,6 +222,10 @@ void Systems::PhysicsSystem::Update(double dt)
|
|||||||
|
|
||||||
void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
|
void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID parent)
|
||||||
{
|
{
|
||||||
|
auto templateComponent = m_World->GetComponent<Components::Template>(entity);
|
||||||
|
if(templateComponent)
|
||||||
|
return;
|
||||||
|
|
||||||
auto transformComponent = m_World->GetComponent<Components::Transform>(entity);
|
auto transformComponent = m_World->GetComponent<Components::Transform>(entity);
|
||||||
if (!transformComponent)
|
if (!transformComponent)
|
||||||
return;
|
return;
|
||||||
@@ -229,6 +237,19 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
|
|||||||
if(m_Vehicles.find(car) != m_Vehicles.end())
|
if(m_Vehicles.find(car) != m_Vehicles.end())
|
||||||
{
|
{
|
||||||
m_PhysicsWorld->markForWrite();
|
m_PhysicsWorld->markForWrite();
|
||||||
|
|
||||||
|
/*auto player = m_World->GetComponent<Components::Player>(car);
|
||||||
|
if(player)
|
||||||
|
{
|
||||||
|
if(player->ID == 1)
|
||||||
|
{
|
||||||
|
LOG_INFO("Speed: %f, Gear: %i, RPM: %f", m_Vehicles[car]->calcKMPH(), m_Vehicles[car]->m_currentGear, m_Vehicles[car]->m_rpm);
|
||||||
|
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_Vehicles[car]->getChassis()->activate();
|
m_Vehicles[car]->getChassis()->activate();
|
||||||
|
|
||||||
hkVector4 hardPoint = m_Vehicles[car]->m_suspension->m_wheelParams[wheelComponent->ID].m_hardpointChassisSpace;
|
hkVector4 hardPoint = m_Vehicles[car]->m_suspension->m_wheelParams[wheelComponent->ID].m_hardpointChassisSpace;
|
||||||
@@ -297,14 +318,14 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity);
|
auto physicsComponent = m_World->GetComponent<Components::Physics>(entity);
|
||||||
if (physicsComponent && m_Shapes[entity].size() > 0)
|
if (physicsComponent && m_Shapes[entity].size() > 0)
|
||||||
{
|
{
|
||||||
if(entityParent != 0 && !physicsComponent->Static)
|
if(entityParent != 0 && physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Dynamic)
|
||||||
{
|
{
|
||||||
LOG_ERROR("Entity: %i, Only the baseparent can have a dynamic PhysicsComponent", entity);
|
LOG_ERROR("Entity: %i, Only the baseparent can have a dynamic PhysicsComponent", entity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
hkpShape* shape;
|
hkpShape* shape;
|
||||||
if(! physicsComponent->Static) // Not static
|
if(physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Dynamic)
|
||||||
{
|
{
|
||||||
hkArray<hkpShape*> shapeArray;
|
hkArray<hkpShape*> shapeArray;
|
||||||
for (auto &shapeData : m_Shapes[entity])
|
for (auto &shapeData : m_Shapes[entity])
|
||||||
@@ -368,6 +389,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
rigidBodyInfo.m_inertiaTensor = massProperties.m_inertiaTensor;
|
rigidBodyInfo.m_inertiaTensor = massProperties.m_inertiaTensor;
|
||||||
if(physicsComponent->CalculateCenterOfMass)
|
if(physicsComponent->CalculateCenterOfMass)
|
||||||
physicsComponent->CenterOfMass = HKVECTOR4_TO_GLMVEC3(massProperties.m_centerOfMass);
|
physicsComponent->CenterOfMass = HKVECTOR4_TO_GLMVEC3(massProperties.m_centerOfMass);
|
||||||
|
|
||||||
rigidBodyInfo.m_centerOfMass = GLMVEC3_TO_HKVECTOR4(physicsComponent->CenterOfMass);
|
rigidBodyInfo.m_centerOfMass = GLMVEC3_TO_HKVECTOR4(physicsComponent->CenterOfMass);
|
||||||
rigidBodyInfo.m_mass = massProperties.m_mass;
|
rigidBodyInfo.m_mass = massProperties.m_mass;
|
||||||
rigidBodyInfo.m_linearVelocity = GLMVEC3_TO_HKVECTOR4(physicsComponent->InitialLinearVelocity);
|
rigidBodyInfo.m_linearVelocity = GLMVEC3_TO_HKVECTOR4(physicsComponent->InitialLinearVelocity);
|
||||||
@@ -381,7 +403,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
rigidBodyInfo.m_maxLinearVelocity = physicsComponent->MaxLinearVelocity;
|
rigidBodyInfo.m_maxLinearVelocity = physicsComponent->MaxLinearVelocity;
|
||||||
rigidBodyInfo.m_maxAngularVelocity = physicsComponent->MaxAngularVelocity;
|
rigidBodyInfo.m_maxAngularVelocity = physicsComponent->MaxAngularVelocity;
|
||||||
rigidBodyInfo.m_collisionFilterInfo = hkpGroupFilter::calcFilterInfo(physicsComponent->CollisionLayer, physicsComponent->CollisionSystemGroup, physicsComponent->CollisionSubSystemId, physicsComponent->CollisionSubSystemDontCollideWith);
|
rigidBodyInfo.m_collisionFilterInfo = hkpGroupFilter::calcFilterInfo(physicsComponent->CollisionLayer, physicsComponent->CollisionSystemGroup, physicsComponent->CollisionSubSystemId, physicsComponent->CollisionSubSystemDontCollideWith);
|
||||||
rigidBodyInfo.m_enableDeactivation = false;
|
rigidBodyInfo.m_enableDeactivation = true;;
|
||||||
}
|
}
|
||||||
// Create RigidBody
|
// Create RigidBody
|
||||||
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
|
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
|
||||||
@@ -400,7 +422,6 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VehicleSetup vehicleSetup;
|
VehicleSetup vehicleSetup;
|
||||||
// Create the basic vehicle.
|
// Create the basic vehicle.
|
||||||
m_Vehicles[entity] = new hkpVehicleInstance(m_RigidBodies[entity]);
|
m_Vehicles[entity] = new hkpVehicleInstance(m_RigidBodies[entity]);
|
||||||
@@ -438,7 +459,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
rigidBody->removeReference();
|
rigidBody->removeReference();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // Static
|
else if(physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Fixed || physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Keyframed)
|
||||||
{
|
{
|
||||||
// Create the hkpStaticCompoundShape and add the instances.
|
// Create the hkpStaticCompoundShape and add the instances.
|
||||||
// "meshShape" should not be modified by the user in any way after adding it as an instance.
|
// "meshShape" should not be modified by the user in any way after adding it as an instance.
|
||||||
@@ -490,7 +511,15 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
hkpRigidBodyCinfo rigidBodyInfo;
|
hkpRigidBodyCinfo rigidBodyInfo;
|
||||||
{
|
{
|
||||||
rigidBodyInfo.m_shape = shape;
|
rigidBodyInfo.m_shape = shape;
|
||||||
rigidBodyInfo.m_motionType = hkpMotion::MOTION_KEYFRAMED;
|
if(physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Fixed)
|
||||||
|
{
|
||||||
|
rigidBodyInfo.m_motionType = hkpMotion::MOTION_FIXED;
|
||||||
|
}
|
||||||
|
else if(physicsComponent->MotionType == Components::Physics::MotionTypeEnum::Keyframed)
|
||||||
|
{
|
||||||
|
rigidBodyInfo.m_motionType = hkpMotion::MOTION_KEYFRAMED;
|
||||||
|
}
|
||||||
|
|
||||||
auto absoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(entity);
|
auto absoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(entity);
|
||||||
hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position);
|
hkVector4 position = GLMVEC3_TO_HKVECTOR4(absoluteTransform.Position);
|
||||||
hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation);
|
hkQuaternion rotation = GLMQUAT_TO_HKQUATERNION(absoluteTransform.Orientation);
|
||||||
@@ -513,7 +542,7 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
rigidBodyInfo.m_maxLinearVelocity = physicsComponent->MaxLinearVelocity;
|
rigidBodyInfo.m_maxLinearVelocity = physicsComponent->MaxLinearVelocity;
|
||||||
rigidBodyInfo.m_maxAngularVelocity = physicsComponent->MaxAngularVelocity;
|
rigidBodyInfo.m_maxAngularVelocity = physicsComponent->MaxAngularVelocity;
|
||||||
rigidBodyInfo.m_collisionFilterInfo = hkpGroupFilter::calcFilterInfo(physicsComponent->CollisionLayer, physicsComponent->CollisionSystemGroup, physicsComponent->CollisionSubSystemId, physicsComponent->CollisionSubSystemDontCollideWith);
|
rigidBodyInfo.m_collisionFilterInfo = hkpGroupFilter::calcFilterInfo(physicsComponent->CollisionLayer, physicsComponent->CollisionSystemGroup, physicsComponent->CollisionSubSystemId, physicsComponent->CollisionSubSystemDontCollideWith);
|
||||||
rigidBodyInfo.m_enableDeactivation = false;
|
rigidBodyInfo.m_enableDeactivation = true;
|
||||||
}
|
}
|
||||||
// Create RigidBody
|
// Create RigidBody
|
||||||
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
|
hkpRigidBody* rigidBody = new hkpRigidBody(rigidBodyInfo);
|
||||||
@@ -621,6 +650,8 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
|
|||||||
std::vector<hkReal>* vertices = new std::vector<hkReal>;
|
std::vector<hkReal>* vertices = new std::vector<hkReal>;
|
||||||
std::vector<hkUint16>* vertexIndices = new std::vector<hkUint16>;
|
std::vector<hkUint16>* vertexIndices = new std::vector<hkUint16>;
|
||||||
auto meshShape = ResourceManager->Load<OBJ>("OBJ", meshShapeComponent->ResourceName);
|
auto meshShape = ResourceManager->Load<OBJ>("OBJ", meshShapeComponent->ResourceName);
|
||||||
|
if(!meshShape)
|
||||||
|
return;
|
||||||
|
|
||||||
for (auto &vertex : meshShape->Vertices)
|
for (auto &vertex : meshShape->Vertices)
|
||||||
{
|
{
|
||||||
@@ -732,7 +763,7 @@ bool Systems::PhysicsSystem::OnTankSteer(const Events::TankSteer &event)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
deviceStatus->m_positionX = steeringX;
|
deviceStatus->m_positionX = event.PositionX;
|
||||||
deviceStatus->m_positionY = event.PositionY;
|
deviceStatus->m_positionY = event.PositionY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -752,6 +783,7 @@ bool Systems::PhysicsSystem::OnSetVelocity( const Events::SetVelocity &event )
|
|||||||
{
|
{
|
||||||
|
|
||||||
m_PhysicsWorld->markForWrite();
|
m_PhysicsWorld->markForWrite();
|
||||||
|
m_RigidBodies[event.Entity]->activate();
|
||||||
m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity));
|
m_RigidBodies[event.Entity]->setLinearVelocity(GLMVEC3_TO_HKVECTOR4(event.Velocity));
|
||||||
auto transformComponent = m_World->GetComponent<Components::Transform>(event.Entity);
|
auto transformComponent = m_World->GetComponent<Components::Transform>(event.Entity);
|
||||||
transformComponent->Velocity = event.Velocity;
|
transformComponent->Velocity = event.Velocity;
|
||||||
@@ -795,7 +827,6 @@ void Systems::PhysicsSystem::OnComponentRemoved(EntityID entity, std::string typ
|
|||||||
m_RigidBodies.erase(entity);
|
m_RigidBodies.erase(entity);
|
||||||
m_PhysicsWorld->unmarkForWrite();
|
m_PhysicsWorld->unmarkForWrite();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "Components/HingeConstraint.h"
|
#include "Components/HingeConstraint.h"
|
||||||
#include "Components/WheelPair.h"
|
#include "Components/WheelPair.h"
|
||||||
#include "Components/TowerSteering.h"
|
#include "Components/TowerSteering.h"
|
||||||
|
#include "Components/Player.h"
|
||||||
#include "Events/TankSteer.h"
|
#include "Events/TankSteer.h"
|
||||||
#include "Events/SetVelocity.h"
|
#include "Events/SetVelocity.h"
|
||||||
#include "Events/ApplyForce.h"
|
#include "Events/ApplyForce.h"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
#include "TankSteeringSystem.h"
|
#include "TankSteeringSystem.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
|
||||||
void Systems::TankSteeringSystem::RegisterComponents( ComponentFactory* cf )
|
void Systems::TankSteeringSystem::RegisterComponents(ComponentFactory* cf)
|
||||||
{
|
{
|
||||||
cf->Register<Components::TankSteering>([]() { return new Components::TankSteering(); });
|
cf->Register<Components::TankSteering>([]() { return new Components::TankSteering(); });
|
||||||
cf->Register<Components::TowerSteering>([]() { return new Components::TowerSteering(); });
|
cf->Register<Components::TowerSteering>([]() { return new Components::TowerSteering(); });
|
||||||
@@ -12,6 +12,7 @@ void Systems::TankSteeringSystem::RegisterComponents( ComponentFactory* cf )
|
|||||||
void Systems::TankSteeringSystem::Initialize()
|
void Systems::TankSteeringSystem::Initialize()
|
||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ECollision, &Systems::TankSteeringSystem::OnCollision);
|
EVENT_SUBSCRIBE_MEMBER(m_ECollision, &Systems::TankSteeringSystem::OnCollision);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ESpawnVehicle, &Systems::TankSteeringSystem::OnSpawnVehicle);
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
@@ -124,7 +125,7 @@ void Systems::TankSteeringSystem::UpdateEntity(double dt, EntityID entity, Entit
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e )
|
bool Systems::TankSteeringSystem::OnCollision(const Events::Collision &e)
|
||||||
{
|
{
|
||||||
if(m_World->ValidEntity(e.Entity1) && m_World->ValidEntity(e.Entity2))
|
if(m_World->ValidEntity(e.Entity1) && m_World->ValidEntity(e.Entity2))
|
||||||
{
|
{
|
||||||
@@ -152,6 +153,9 @@ bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e )
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(m_World->GetComponent<Components::Template>(shellEntity))
|
||||||
|
return false;
|
||||||
|
|
||||||
auto physicsComponents = m_World->GetComponentsOfType<Components::Physics>();
|
auto physicsComponents = m_World->GetComponentsOfType<Components::Physics>();
|
||||||
auto shellTransform = m_World->GetComponent<Components::Transform>(shellEntity);
|
auto shellTransform = m_World->GetComponent<Components::Transform>(shellEntity);
|
||||||
//auto otherTransform = m_World->GetComponent<Components::Transform>(otherEntity);
|
//auto otherTransform = m_World->GetComponent<Components::Transform>(otherEntity);
|
||||||
@@ -218,8 +222,6 @@ bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e )
|
|||||||
EventBroker->Publish(d);
|
EventBroker->Publish(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_World->RemoveEntity(shellEntity);
|
m_World->RemoveEntity(shellEntity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -300,6 +302,319 @@ bool Systems::TankSteeringSystem::OnCollision( const Events::Collision &e )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Systems::TankSteeringSystem::OnSpawnVehicle(const Events::SpawnVehicle &event)
|
||||||
|
{
|
||||||
|
if (event.VehicleType != "Tank")
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto spawnPointComponents = m_World->GetComponentsOfType<Components::SpawnPoint>();
|
||||||
|
if (!spawnPointComponents)
|
||||||
|
{
|
||||||
|
LOG_ERROR("Found no spawn points!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &spawnPointComponent : *spawnPointComponents)
|
||||||
|
{
|
||||||
|
auto spawnPoint = spawnPointComponent->Entity;
|
||||||
|
auto spawnPointBaseParent = m_World->GetEntityBaseParent(spawnPoint);
|
||||||
|
auto playerComponent = m_World->GetComponent<Components::Player>(spawnPointBaseParent);
|
||||||
|
if (!playerComponent || playerComponent->ID != event.PlayerID)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Components::Transform absoluteTransform = m_World->GetSystem<Systems::TransformSystem>()->AbsoluteTransform(spawnPoint);
|
||||||
|
|
||||||
|
// Create a tank
|
||||||
|
EntityID tank = CreateTank(event.PlayerID);
|
||||||
|
auto tankTransform = m_World->GetComponent<Components::Transform>(tank);
|
||||||
|
tankTransform->Position = absoluteTransform.Position;
|
||||||
|
tankTransform->Orientation = absoluteTransform.Orientation;
|
||||||
|
// Set the viewport correctly
|
||||||
|
Events::SetViewportCamera e;
|
||||||
|
e.CameraEntity = m_World->GetProperty<EntityID>(tank, "Camera");
|
||||||
|
if (event.PlayerID == 1)
|
||||||
|
e.ViewportFrame = "Viewport1";
|
||||||
|
else if (event.PlayerID == 2)
|
||||||
|
e.ViewportFrame = "Viewport2";
|
||||||
|
EventBroker->Publish(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
EntityID Systems::TankSteeringSystem::CreateTank(int playerID)
|
||||||
|
{
|
||||||
|
auto tank = m_World->CreateEntity();
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(tank);
|
||||||
|
transform->Position = glm::vec3(0, 5, 0);
|
||||||
|
//transform->Orientation = glm::angleAxis(0.f, glm::vec3(0, 1, 0));
|
||||||
|
auto physics = m_World->AddComponent<Components::Physics>(tank);
|
||||||
|
physics->Mass = 63000 - 16000;
|
||||||
|
physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic;
|
||||||
|
auto vehicle = m_World->AddComponent<Components::Vehicle>(tank);
|
||||||
|
vehicle->MaxTorque = 8000.f;
|
||||||
|
vehicle->MaxSteeringAngle = 90.f;
|
||||||
|
vehicle->MaxSpeedFullSteeringAngle = 4.f;
|
||||||
|
auto player = m_World->AddComponent<Components::Player>(tank);
|
||||||
|
player->ID = playerID;
|
||||||
|
auto tankSteering = m_World->AddComponent<Components::TankSteering>(tank);
|
||||||
|
m_World->AddComponent<Components::Input>(tank);
|
||||||
|
auto health = m_World->AddComponent<Components::Health>(tank);
|
||||||
|
health->Amount = 100.f;
|
||||||
|
|
||||||
|
{
|
||||||
|
auto shape = m_World->CreateEntity(tank);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(shape);
|
||||||
|
auto meshShape = m_World->AddComponent<Components::MeshShape>(shape);
|
||||||
|
meshShape->ResourceName = "Models/Tank/TankCollisionShape.obj";
|
||||||
|
m_World->CommitEntity(shape);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto shapeTower = m_World->CreateEntity(tank);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(shapeTower);
|
||||||
|
transform->Position = glm::vec3(0, 1.10633f, 1.03024f);
|
||||||
|
auto box = m_World->AddComponent<Components::BoxShape>(shapeTower);
|
||||||
|
box->Width = 1.298f;
|
||||||
|
box->Height = 0.502f;
|
||||||
|
box->Depth = 1.211f;
|
||||||
|
m_World->CommitEntity(shapeTower);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto chassis = m_World->CreateEntity(tank);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(chassis);
|
||||||
|
transform->Position = glm::vec3(0, 0, 0);
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(chassis);
|
||||||
|
model->ModelFile = "Models/Tank/tankBody.obj";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto tower = m_World->CreateEntity(tank);
|
||||||
|
m_World->SetProperty(tower, "Name", "tower");
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(tower);
|
||||||
|
transform->Position = glm::vec3(0.f, 0.68f, 0.9f);
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(tower);
|
||||||
|
model->ModelFile = "Models/Tank/tankTop.obj";
|
||||||
|
auto towerSteering = m_World->AddComponent<Components::TowerSteering>(tower);
|
||||||
|
towerSteering->Axis = glm::vec3(0.f, 1.f, 0.f);
|
||||||
|
towerSteering->TurnSpeed = glm::pi<float>() / 4.f;
|
||||||
|
{
|
||||||
|
auto barrel = m_World->CreateEntity(tower);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(barrel);
|
||||||
|
transform->Position = glm::vec3(-0.012f, 0.3f, -0.95);
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(barrel);
|
||||||
|
model->ModelFile = "Models/Tank/tankBarrel.obj";
|
||||||
|
auto barrelSteering = m_World->AddComponent<Components::BarrelSteering>(barrel);
|
||||||
|
barrelSteering->Axis = glm::vec3(1.f, 0.f, 0.f);
|
||||||
|
barrelSteering->TurnSpeed = glm::pi<float>() / 4.f;
|
||||||
|
barrelSteering->ShotSpeed = 70.f;
|
||||||
|
barrelSteering->LowerRotationLimit = glm::radians(-10.f);
|
||||||
|
barrelSteering->UpperRotationLimit = glm::radians(40.f);
|
||||||
|
{
|
||||||
|
auto shot = m_World->CreateEntity(barrel);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(shot);
|
||||||
|
transform->Position = glm::vec3(0.35f, 0.f, -2.f);
|
||||||
|
transform->Orientation = glm::angleAxis(-glm::pi<float>() / 2.f, glm::vec3(1, 0, 0));
|
||||||
|
transform->Scale = glm::vec3(3.f);
|
||||||
|
m_World->AddComponent<Components::Template>(shot);
|
||||||
|
auto physics = m_World->AddComponent<Components::Physics>(shot);
|
||||||
|
physics->Mass = 25.f;
|
||||||
|
physics->MotionType = Components::Physics::MotionTypeEnum::Dynamic;
|
||||||
|
physics->CollisionEvent = true;
|
||||||
|
auto modelComponent = m_World->AddComponent<Components::Model>(shot);
|
||||||
|
modelComponent->ModelFile = "Models/Placeholders/rocket/Rocket.obj";
|
||||||
|
auto tankShellComponent = m_World->AddComponent<Components::TankShell>(shot);
|
||||||
|
tankShellComponent->Damage = 20.f;
|
||||||
|
tankShellComponent->ExplosionRadius = 30.f;
|
||||||
|
tankShellComponent->ExplosionStrength = 300000.f;
|
||||||
|
{
|
||||||
|
auto shape = m_World->CreateEntity(shot);
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(shape);
|
||||||
|
auto boxShape = m_World->AddComponent<Components::BoxShape>(shape);
|
||||||
|
boxShape->Width = 0.5f;
|
||||||
|
boxShape->Height = 0.5f;
|
||||||
|
boxShape->Depth = 0.5f;
|
||||||
|
m_World->CommitEntity(shape);
|
||||||
|
}
|
||||||
|
m_World->CommitEntity(shot);
|
||||||
|
barrelSteering->ShotTemplate = shot;
|
||||||
|
|
||||||
|
|
||||||
|
auto cameraTower = m_World->CreateEntity(barrel);
|
||||||
|
{
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(cameraTower);
|
||||||
|
transform->Position.z = 16.f;
|
||||||
|
transform->Position.y = 4.f;
|
||||||
|
transform->Orientation = glm::quat(glm::vec3(-glm::radians(5.f), 0.f, 0.f));
|
||||||
|
auto cameraComp = m_World->AddComponent<Components::Camera>(cameraTower);
|
||||||
|
cameraComp->FarClip = 2000.f;
|
||||||
|
/*auto follow = m_World->AddComponent<Components::Follow>(cameraTower);
|
||||||
|
follow->Entity = barrel;
|
||||||
|
follow->Distance = 15.f;
|
||||||
|
follow->FollowAxis = glm::vec3(1, 1, 1);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
m_World->SetProperty(tank, "Camera", cameraTower);
|
||||||
|
}
|
||||||
|
m_World->CommitEntity(barrel);
|
||||||
|
tankSteering->Barrel = barrel;
|
||||||
|
}
|
||||||
|
m_World->CommitEntity(tower);
|
||||||
|
tankSteering->Turret = tower;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//{
|
||||||
|
// auto lightentity = m_World->CreateEntity(tank);
|
||||||
|
// auto transform = m_World->AddComponent<Components::Transform>(lightentity);
|
||||||
|
// transform->Position = glm::vec3(0, 0, 0);
|
||||||
|
// auto light = m_World->AddComponent<Components::PointLight>(lightentity);
|
||||||
|
// //light->Diffuse = glm::vec3(128.f/255.f, 172.f/255.f, 242.f/255.f);
|
||||||
|
// //light->Specular = glm::vec3(1.f);
|
||||||
|
// /*light->ConstantAttenuation = 0.3f;
|
||||||
|
// light->LinearAttenuation = 0.003f;
|
||||||
|
// light->QuadraticAttenuation = 0.002f;*/
|
||||||
|
//}
|
||||||
|
|
||||||
|
// auto wheelpair = m_World->CreateEntity(tank);
|
||||||
|
// SetProperty(wheelpair, "Name", "WheelPair");
|
||||||
|
// AddComponent(wheelpair, "WheelPairThingy");
|
||||||
|
|
||||||
|
#pragma region Wheels
|
||||||
|
//Create wheels
|
||||||
|
float wheelOffset = -0.83f;
|
||||||
|
const float suspensionStrength = 15.f;
|
||||||
|
const float springLength = 0.3f;
|
||||||
|
|
||||||
|
AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, -1.715f), 0, true);
|
||||||
|
AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, -1.715f), 0, true);
|
||||||
|
AddTankWheelPair(tank, glm::vec3(1.68f, wheelOffset, 2.375), 1, false);
|
||||||
|
AddTankWheelPair(tank, glm::vec3(-1.68f, wheelOffset, 2.375), 1, false);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
{
|
||||||
|
auto entity = m_World->CreateEntity(tank);
|
||||||
|
auto transformComponent = m_World->AddComponent<Components::Transform>(entity);
|
||||||
|
transformComponent->Position = glm::vec3(-2, -1.7, 2.0);
|
||||||
|
transformComponent->Scale = glm::vec3(3, 3, 3);
|
||||||
|
transformComponent->Orientation = glm::angleAxis(glm::pi<float>() / 2, glm::vec3(1, 0, 0));
|
||||||
|
auto emitterComponent = m_World->AddComponent<Components::ParticleEmitter>(entity);
|
||||||
|
emitterComponent->SpawnCount = 2;
|
||||||
|
emitterComponent->SpawnFrequency = 0.005;
|
||||||
|
emitterComponent->SpreadAngle = glm::pi<float>();
|
||||||
|
emitterComponent->UseGoalVelocity = false;
|
||||||
|
emitterComponent->LifeTime = 0.5;
|
||||||
|
//emitterComponent->AngularVelocitySpectrum.push_back(glm::pi<float>() / 100);
|
||||||
|
emitterComponent->ScaleSpectrum.push_back(glm::vec3(0.05));
|
||||||
|
m_World->CommitEntity(entity);
|
||||||
|
|
||||||
|
auto particleEntity = m_World->CreateEntity(entity);
|
||||||
|
auto TEMP = m_World->AddComponent<Components::Transform>(particleEntity);
|
||||||
|
TEMP->Scale = glm::vec3(0);
|
||||||
|
auto spriteComponent = m_World->AddComponent<Components::Sprite>(particleEntity);
|
||||||
|
spriteComponent->SpriteFile = "Models/Textures/Sprites/Dust.png";
|
||||||
|
emitterComponent->ParticleTemplate = particleEntity;
|
||||||
|
|
||||||
|
m_World->CommitEntity(particleEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
m_World->CommitEntity(tank);
|
||||||
|
|
||||||
|
return tank;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Systems::TankSteeringSystem::AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front)
|
||||||
|
{
|
||||||
|
const float separation = 1.77f;
|
||||||
|
const float suspensionStrength = 15.f;
|
||||||
|
const float springLength = 0.3f;
|
||||||
|
|
||||||
|
bool steering = front;
|
||||||
|
|
||||||
|
auto wheelFront = m_World->CreateEntity(tankEntity);
|
||||||
|
{
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(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<float>(), glm::vec3(0, 1, 0));
|
||||||
|
#ifdef DEBUG
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(wheelFront);
|
||||||
|
model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj";
|
||||||
|
#endif
|
||||||
|
auto Wheel = m_World->AddComponent<Components::Wheel>(wheelFront);
|
||||||
|
Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f);
|
||||||
|
Wheel->AxleID = axleID;
|
||||||
|
Wheel->Mass = 2000;
|
||||||
|
Wheel->Radius = 0.6f;
|
||||||
|
Wheel->Steering = steering;
|
||||||
|
Wheel->SuspensionStrength = suspensionStrength;
|
||||||
|
Wheel->Friction = 4.f;
|
||||||
|
Wheel->ConnectedToHandbrake = true;
|
||||||
|
Wheel->TorqueRatio = 0.125f;
|
||||||
|
Wheel->Width = 0.6f;
|
||||||
|
m_World->CommitEntity(wheelFront);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto wheelBack = m_World->CreateEntity(tankEntity);
|
||||||
|
{
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(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<float>(), glm::vec3(0, 1, 0));
|
||||||
|
#ifdef DEBUG
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(wheelBack);
|
||||||
|
model->ModelFile = "Models/Tank/Fix/WheelPhysics.obj";
|
||||||
|
#endif
|
||||||
|
auto Wheel = m_World->AddComponent<Components::Wheel>(wheelBack);
|
||||||
|
Wheel->Hardpoint = transform->Position + glm::vec3(0.f, springLength, 0.f);
|
||||||
|
Wheel->AxleID = axleID;
|
||||||
|
Wheel->Mass = 2000;
|
||||||
|
Wheel->Radius = 0.6f;
|
||||||
|
Wheel->Steering = steering;
|
||||||
|
Wheel->SuspensionStrength = suspensionStrength;
|
||||||
|
Wheel->Friction = 4.f;
|
||||||
|
Wheel->ConnectedToHandbrake = true;
|
||||||
|
Wheel->TorqueRatio = 0.125f;
|
||||||
|
Wheel->Width = 0.6f;
|
||||||
|
m_World->CommitEntity(wheelBack);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto wheelPair = m_World->CreateEntity(tankEntity);
|
||||||
|
{
|
||||||
|
{
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(wheelPair);
|
||||||
|
transform->Position = position;
|
||||||
|
//transform->Orientation = glm::quat(glm::vec3(0, glm::pi<float>() / 4.f, 0));
|
||||||
|
|
||||||
|
auto pair = m_World->AddComponent<Components::WheelPair>(wheelPair);
|
||||||
|
pair->FakeWheelFront = wheelFront;
|
||||||
|
pair->FakeWheelBack = wheelBack;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto modelEntity = m_World->CreateEntity(wheelPair);
|
||||||
|
{
|
||||||
|
auto transform = m_World->AddComponent<Components::Transform>(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<float>(), 0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
transform->Position = glm::vec3(0.f, 0.17f, 0.f);
|
||||||
|
transform->Scale = glm::vec3(1.f, 1.2f, 1.2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto model = m_World->AddComponent<Components::Model>(modelEntity);
|
||||||
|
model->ModelFile = "Models/Tank/tankWheel.obj";
|
||||||
|
}
|
||||||
|
m_World->CommitEntity(modelEntity);
|
||||||
|
}
|
||||||
|
m_World->CommitEntity(wheelPair);
|
||||||
|
}
|
||||||
|
|
||||||
void Systems::TankSteeringSystem::TankSteeringInputController::Update( double dt )
|
void Systems::TankSteeringSystem::TankSteeringInputController::Update( double dt )
|
||||||
{
|
{
|
||||||
PositionX = m_Horizontal;
|
PositionX = m_Horizontal;
|
||||||
@@ -364,5 +679,3 @@ bool Systems::TankSteeringSystem::TankSteeringInputController::OnCommand(const E
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,18 @@
|
|||||||
#include "Components/Vehicle.h"
|
#include "Components/Vehicle.h"
|
||||||
#include "Components/Player.h"
|
#include "Components/Player.h"
|
||||||
|
|
||||||
|
#include "Events/SpawnVehicle.h"
|
||||||
|
#include "Components/SpawnPoint.h"
|
||||||
|
|
||||||
|
#include "Components/Wheel.h"
|
||||||
|
#include "Components/MeshShape.h"
|
||||||
|
#include "Components/Camera.h"
|
||||||
|
#include "Components/BoxShape.h"
|
||||||
|
#include "Components/WheelPair.h"
|
||||||
|
#include "Components/Input.h"
|
||||||
|
|
||||||
|
#include "Events/SetViewportCamera.h"
|
||||||
|
|
||||||
namespace Systems
|
namespace Systems
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -53,13 +65,18 @@ namespace Systems
|
|||||||
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
void UpdateEntity(double dt, EntityID entity, EntityID parent) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::map<EntityID, double> m_TimeSinceLastShot;
|
||||||
|
|
||||||
EventRelay<TankSteeringSystem, Events::Collision> m_ECollision;
|
EventRelay<TankSteeringSystem, Events::Collision> m_ECollision;
|
||||||
bool OnCollision(const Events::Collision &e);
|
bool OnCollision(const Events::Collision &e);
|
||||||
|
EventRelay<TankSteeringSystem, Events::SpawnVehicle> m_ESpawnVehicle;
|
||||||
|
bool OnSpawnVehicle(const Events::SpawnVehicle &e);
|
||||||
|
|
||||||
class TankSteeringInputController;
|
class TankSteeringInputController;
|
||||||
std::array<std::shared_ptr<TankSteeringInputController>, 4> m_TankInputControllers;
|
std::array<std::shared_ptr<TankSteeringInputController>, 4> m_TankInputControllers;
|
||||||
|
|
||||||
std::map<EntityID, double> m_TimeSinceLastShot;
|
EntityID CreateTank(int playerID);
|
||||||
|
void AddTankWheelPair(EntityID tankEntity, glm::vec3 position, int axleID, bool front);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TankSteeringSystem::TankSteeringInputController : InputController<TankSteeringSystem>
|
class TankSteeringSystem::TankSteeringInputController : InputController<TankSteeringSystem>
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
#include "PrecompiledHeader.h"
|
||||||
|
#include "WallSystem.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
void Systems::WallSystem::RegisterComponents( ComponentFactory* cf )
|
||||||
|
{
|
||||||
|
cf->Register<Components::Wall>([]() { return new Components::Wall(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
void Systems::WallSystem::Initialize()
|
||||||
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_eDamage, &Systems::WallSystem::Damage);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Systems::WallSystem::Damage( const Events::Damage &event )
|
||||||
|
{
|
||||||
|
auto wallComponent = m_World->GetComponent<Components::Wall>(event.Entity);
|
||||||
|
if(!wallComponent)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
LOG_INFO("WallSystem::Damage");
|
||||||
|
auto wallhealthcomponent = m_World->GetComponent<Components::Health>(event.Entity);
|
||||||
|
if(wallhealthcomponent->Amount > 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LOG_INFO("You are dead");
|
||||||
|
auto transformComponent = m_World->GetComponent<Components::Transform>(event.Entity);
|
||||||
|
|
||||||
|
for(auto d : wallComponent->Walldebris)
|
||||||
|
{
|
||||||
|
auto debris = m_World->CloneEntity(d);
|
||||||
|
|
||||||
|
auto transform = m_World->GetComponent<Components::Transform>(debris);
|
||||||
|
transform->Position += transformComponent->Position;
|
||||||
|
|
||||||
|
// DO STUFF! :D
|
||||||
|
float distance = glm::distance(transform->Position, transformComponent->Position);
|
||||||
|
float radius = 5.f;
|
||||||
|
float strength = (1.f - pow(distance / radius, 2)) * 500.f;
|
||||||
|
glm::vec3 direction = glm::normalize(transformComponent->Position - transform->Position);
|
||||||
|
|
||||||
|
Events::ApplyPointImpulse e;
|
||||||
|
e.Entity = debris;
|
||||||
|
e.Impulse = direction * strength;
|
||||||
|
e.Position = transformComponent->Position;
|
||||||
|
EventBroker->Publish(e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
m_World->RemoveEntity(event.Entity);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
#ifndef WallSystem_h__
|
||||||
|
#define WallSystem_h__
|
||||||
|
|
||||||
|
|
||||||
|
#include "System.h"
|
||||||
|
#include "Events/OnDead.h"
|
||||||
|
#include "Events/Damage.h"
|
||||||
|
#include "Events/ApplyPointImpulse.h"
|
||||||
|
#include "Components/Model.h"
|
||||||
|
#include "Components/Wall.h"
|
||||||
|
#include "Components/Transform.h"
|
||||||
|
#include "Components/Physics.h"
|
||||||
|
#include "Components/MeshShape.h"
|
||||||
|
#include "Components/Tankshell.h"
|
||||||
|
#include "Components/Health.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Systems
|
||||||
|
{
|
||||||
|
class WallSystem : public System
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
WallSystem(World* world, std::shared_ptr<::EventBroker> eventBroker, std::shared_ptr<::ResourceManager> resourceManager)
|
||||||
|
: System(world, eventBroker, resourceManager) { }
|
||||||
|
|
||||||
|
|
||||||
|
void Initialize() override;
|
||||||
|
void RegisterComponents(ComponentFactory* cf) override;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
EventRelay<WallSystem, Events::Damage> m_eDamage;
|
||||||
|
bool Damage(const Events::Damage &event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // WallSystem_h__
|
||||||
@@ -124,6 +124,7 @@
|
|||||||
<ClCompile Include="..\..\src\Systems\TimerSystem.cpp" />
|
<ClCompile Include="..\..\src\Systems\TimerSystem.cpp" />
|
||||||
<ClCompile Include="..\..\src\Systems\TransformSystem.cpp" />
|
<ClCompile Include="..\..\src\Systems\TransformSystem.cpp" />
|
||||||
<ClCompile Include="..\..\src\Systems\TriggerSystem.cpp" />
|
<ClCompile Include="..\..\src\Systems\TriggerSystem.cpp" />
|
||||||
|
<ClCompile Include="..\..\src\Systems\WallSystem.cpp" />
|
||||||
<ClCompile Include="..\..\src\Systems\WheelPairSystem.cpp" />
|
<ClCompile Include="..\..\src\Systems\WheelPairSystem.cpp" />
|
||||||
<ClCompile Include="..\..\src\Texture.cpp" />
|
<ClCompile Include="..\..\src\Texture.cpp" />
|
||||||
<ClCompile Include="..\..\src\World.cpp" />
|
<ClCompile Include="..\..\src\World.cpp" />
|
||||||
@@ -171,7 +172,9 @@
|
|||||||
<ClInclude Include="..\..\src\Components\Trigger.h" />
|
<ClInclude Include="..\..\src\Components\Trigger.h" />
|
||||||
<ClInclude Include="..\..\src\Components\TriggerRotate.h" />
|
<ClInclude Include="..\..\src\Components\TriggerRotate.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Vehicle.h" />
|
<ClInclude Include="..\..\src\Components\Vehicle.h" />
|
||||||
|
<ClInclude Include="..\..\src\Components\SpawnPoint.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Viewport.h" />
|
<ClInclude Include="..\..\src\Components\Viewport.h" />
|
||||||
|
<ClInclude Include="..\..\src\Components\Wall.h" />
|
||||||
<ClInclude Include="..\..\src\Components\Wheel.h" />
|
<ClInclude Include="..\..\src\Components\Wheel.h" />
|
||||||
<ClInclude Include="..\..\src\Components\WheelPair.h" />
|
<ClInclude Include="..\..\src\Components\WheelPair.h" />
|
||||||
<ClInclude Include="..\..\src\CubemapTexture.h" />
|
<ClInclude Include="..\..\src\CubemapTexture.h" />
|
||||||
@@ -184,8 +187,8 @@
|
|||||||
<ClInclude Include="..\..\src\Events\BindKey.h" />
|
<ClInclude Include="..\..\src\Events\BindKey.h" />
|
||||||
<ClInclude Include="..\..\src\Events\BindMouseButton.h" />
|
<ClInclude Include="..\..\src\Events\BindMouseButton.h" />
|
||||||
<ClInclude Include="..\..\src\Events\Collision.h" />
|
<ClInclude Include="..\..\src\Events\Collision.h" />
|
||||||
<ClInclude Include="..\..\src\Events\ComponentCreated.h" />
|
|
||||||
<ClInclude Include="..\..\src\Events\CreateExplosion.h" />
|
<ClInclude Include="..\..\src\Events\CreateExplosion.h" />
|
||||||
|
<ClInclude Include="..\..\src\Events\ComponentCreated.h" />
|
||||||
<ClInclude Include="..\..\src\Events\Damage.h" />
|
<ClInclude Include="..\..\src\Events\Damage.h" />
|
||||||
<ClInclude Include="..\..\src\Events\DisableCollisions.h" />
|
<ClInclude Include="..\..\src\Events\DisableCollisions.h" />
|
||||||
<ClInclude Include="..\..\src\Events\EnableCollisions.h" />
|
<ClInclude Include="..\..\src\Events\EnableCollisions.h" />
|
||||||
@@ -199,12 +202,14 @@
|
|||||||
<ClInclude Include="..\..\src\Events\MouseMove.h" />
|
<ClInclude Include="..\..\src\Events\MouseMove.h" />
|
||||||
<ClInclude Include="..\..\src\Events\MousePress.h" />
|
<ClInclude Include="..\..\src\Events\MousePress.h" />
|
||||||
<ClInclude Include="..\..\src\Events\MouseRelease.h" />
|
<ClInclude Include="..\..\src\Events\MouseRelease.h" />
|
||||||
|
<ClInclude Include="..\..\src\Events\OnDead.h" />
|
||||||
<ClInclude Include="..\..\src\Events\Move.h" />
|
<ClInclude Include="..\..\src\Events\Move.h" />
|
||||||
<ClInclude Include="..\..\src\Events\PlayBGM.h" />
|
<ClInclude Include="..\..\src\Events\PlayBGM.h" />
|
||||||
<ClInclude Include="..\..\src\Events\PlaySFX.h" />
|
<ClInclude Include="..\..\src\Events\PlaySFX.h" />
|
||||||
<ClInclude Include="..\..\src\Events\Rotate.h" />
|
<ClInclude Include="..\..\src\Events\Rotate.h" />
|
||||||
<ClInclude Include="..\..\src\Events\SetVelocity.h" />
|
<ClInclude Include="..\..\src\Events\SetVelocity.h" />
|
||||||
<ClInclude Include="..\..\src\Events\SetViewportCamera.h" />
|
<ClInclude Include="..\..\src\Events\SetViewportCamera.h" />
|
||||||
|
<ClInclude Include="..\..\src\Events\SpawnVehicle.h" />
|
||||||
<ClInclude Include="..\..\src\Events\StopSound.h" />
|
<ClInclude Include="..\..\src\Events\StopSound.h" />
|
||||||
<ClInclude Include="..\..\src\Events\TankSteer.h" />
|
<ClInclude Include="..\..\src\Events\TankSteer.h" />
|
||||||
<ClInclude Include="..\..\src\Events\EnterTrigger.h" />
|
<ClInclude Include="..\..\src\Events\EnterTrigger.h" />
|
||||||
@@ -247,6 +252,7 @@
|
|||||||
<ClInclude Include="..\..\src\Systems\TimerSystem.h" />
|
<ClInclude Include="..\..\src\Systems\TimerSystem.h" />
|
||||||
<ClInclude Include="..\..\src\Systems\TransformSystem.h" />
|
<ClInclude Include="..\..\src\Systems\TransformSystem.h" />
|
||||||
<ClInclude Include="..\..\src\Systems\TriggerSystem.h" />
|
<ClInclude Include="..\..\src\Systems\TriggerSystem.h" />
|
||||||
|
<ClInclude Include="..\..\src\Systems\WallSystem.h" />
|
||||||
<ClInclude Include="..\..\src\Systems\WheelPairSystem.h" />
|
<ClInclude Include="..\..\src\Systems\WheelPairSystem.h" />
|
||||||
<ClInclude Include="..\..\src\Texture.h" />
|
<ClInclude Include="..\..\src\Texture.h" />
|
||||||
<ClInclude Include="..\..\src\Util\GLError.h" />
|
<ClInclude Include="..\..\src\Util\GLError.h" />
|
||||||
|
|||||||
@@ -78,6 +78,9 @@
|
|||||||
<ClCompile Include="..\..\src\Systems\FollowSystem.cpp">
|
<ClCompile Include="..\..\src\Systems\FollowSystem.cpp">
|
||||||
<Filter>Game\Systems</Filter>
|
<Filter>Game\Systems</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\src\Systems\WallSystem.cpp">
|
||||||
|
<Filter>Gameplay\Systems</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\Systems\GarageSystem.cpp">
|
<ClCompile Include="..\..\src\Systems\GarageSystem.cpp">
|
||||||
<Filter>Game\Systems</Filter>
|
<Filter>Game\Systems</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -185,10 +188,9 @@
|
|||||||
<Filter Include="Particle System\Events">
|
<Filter Include="Particle System\Events">
|
||||||
<UniqueIdentifier>{ddd3c442-7c2f-4690-9308-fcef62deee0b}</UniqueIdentifier>
|
<UniqueIdentifier>{ddd3c442-7c2f-4690-9308-fcef62deee0b}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="Gameplay\Systems">
|
<Filter Include="Game\Systems">
|
||||||
<UniqueIdentifier>{3c2ea0e5-41a1-4b11-a891-1d59ead7223c}</UniqueIdentifier>
|
<UniqueIdentifier>{3c2ea0e5-41a1-4b11-a891-1d59ead7223c}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
|
||||||
<Filter Include="Base\Events">
|
<Filter Include="Base\Events">
|
||||||
<UniqueIdentifier>{3cbe68d9-2446-45ee-8637-ffb805997dcd}</UniqueIdentifier>
|
<UniqueIdentifier>{3cbe68d9-2446-45ee-8637-ffb805997dcd}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -521,6 +523,12 @@
|
|||||||
<ClInclude Include="..\..\src\Events\Move.h">
|
<ClInclude Include="..\..\src\Events\Move.h">
|
||||||
<Filter>Base\Events</Filter>
|
<Filter>Base\Events</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Components\BlendMap.h">
|
||||||
|
<Filter>Rendering\Components</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Systems\WallSystem.h">
|
||||||
|
<Filter>Gameplay\Systems</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\Events\LeaveTrigger.h">
|
<ClInclude Include="..\..\src\Events\LeaveTrigger.h">
|
||||||
<Filter>Physics\Events</Filter>
|
<Filter>Physics\Events</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -557,6 +565,18 @@
|
|||||||
<ClInclude Include="..\..\src\GUI\VehicleSelection.h">
|
<ClInclude Include="..\..\src\GUI\VehicleSelection.h">
|
||||||
<Filter>GUI</Filter>
|
<Filter>GUI</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Events\OnDead.h">
|
||||||
|
<Filter>Gameplay\Events</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Events\SpawnVehicle.h">
|
||||||
|
<Filter>Game\Events</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Components\Wall.h">
|
||||||
|
<Filter>Game\Components</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\src\Components\SpawnPoint.h">
|
||||||
|
<Filter>Game\Components</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\..\src\Shaders\Fragment2.glsl">
|
<None Include="..\..\src\Shaders\Fragment2.glsl">
|
||||||
|
|||||||
Reference in New Issue
Block a user