Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0516794db6 |
+1
-1
Submodule assets updated: 504752c949...bc6e7df04c
@@ -48,13 +48,13 @@ bool RayVsTriangle(const Ray& ray,
|
|||||||
bool trueOnNegativeDistance = false);
|
bool trueOnNegativeDistance = false);
|
||||||
//Return true if the ray hits any of the triangles in the model. Stops checking when a hit is detected.
|
//Return true if the ray hits any of the triangles in the model. Stops checking when a hit is detected.
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix);
|
const glm::mat4& modelMatrix);
|
||||||
//Return true if the ray hits any of the triangles in the model.
|
//Return true if the ray hits any of the triangles in the model.
|
||||||
//Also returns the position of the intersection point. Will loop through all the whole model indices.
|
//Also returns the position of the intersection point. Will loop through all the whole model indices.
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
glm::vec3& outHitPosition);
|
glm::vec3& outHitPosition);
|
||||||
@@ -62,7 +62,7 @@ bool RayVsModel(const Ray& ray,
|
|||||||
//Also returns the distance from the ray origin to the closest
|
//Also returns the distance from the ray origin to the closest
|
||||||
//intersection point, and the barycentric u,v-coordinates. Will loop through all the whole model indices.
|
//intersection point, and the barycentric u,v-coordinates. Will loop through all the whole model indices.
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
float& outDistance,
|
float& outDistance,
|
||||||
@@ -70,7 +70,7 @@ bool RayVsModel(const Ray& ray,
|
|||||||
float& outVCoord);
|
float& outVCoord);
|
||||||
|
|
||||||
bool AABBvsTriangles(const AABB& box,
|
bool AABBvsTriangles(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
glm::vec3& boxVelocity,
|
glm::vec3& boxVelocity,
|
||||||
@@ -80,7 +80,7 @@ bool AABBvsTriangles(const AABB& box,
|
|||||||
|
|
||||||
//Detects collision, but does not resolve.
|
//Detects collision, but does not resolve.
|
||||||
bool AABBvsTriangles(const AABB& box,
|
bool AABBvsTriangles(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix);
|
const glm::mat4& modelMatrix);
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ enum Output
|
|||||||
};
|
};
|
||||||
//Detects intersection and containment.
|
//Detects intersection and containment.
|
||||||
Output AABBvsTrianglesWContainment(const AABB& box,
|
Output AABBvsTrianglesWContainment(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix);
|
const glm::mat4& modelMatrix);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#ifndef Events_Captured_h__
|
#ifndef ECaptured_h__
|
||||||
#define Events_Captured_h__
|
#define ECaptured_h__
|
||||||
|
|
||||||
#include "EventBroker.h"
|
#include "EventBroker.h"
|
||||||
#include "../Core/Entity.h"
|
#include "../Core/Entity.h"
|
||||||
|
|||||||
@@ -32,9 +32,6 @@
|
|||||||
#include "../Game/Events/EDashAbility.h"
|
#include "../Game/Events/EDashAbility.h"
|
||||||
#include "Network/EDisplayServerlist.h"
|
#include "Network/EDisplayServerlist.h"
|
||||||
#include "Network/EConnectRequest.h"
|
#include "Network/EConnectRequest.h"
|
||||||
#include "Network/EPlayerDisconnected.h"
|
|
||||||
#include "Game/Events/EReset.h"
|
|
||||||
|
|
||||||
class Client : public Network
|
class Client : public Network
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -43,7 +40,7 @@ public:
|
|||||||
~Client();
|
~Client();
|
||||||
|
|
||||||
void Connect(std::string address, int port);
|
void Connect(std::string address, int port);
|
||||||
void Update(double dt) override;
|
void Update() override;
|
||||||
private:
|
private:
|
||||||
UDPClient m_Unreliable;
|
UDPClient m_Unreliable;
|
||||||
TCPClient m_Reliable;
|
TCPClient m_Reliable;
|
||||||
@@ -77,10 +74,10 @@ private:
|
|||||||
// Network logic
|
// Network logic
|
||||||
PlayerDefinition m_PlayerDefinitions[8];
|
PlayerDefinition m_PlayerDefinitions[8];
|
||||||
SnapshotDefinitions m_NextSnapshot;
|
SnapshotDefinitions m_NextSnapshot;
|
||||||
double m_DurationOfPingTime = 0;
|
double m_DurationOfPingTime;
|
||||||
double m_StartPingTime = 0;
|
std::clock_t m_StartPingTime;
|
||||||
double m_TimeSinceSentInputs = 0;
|
std::clock_t m_TimeSinceSentInputs;
|
||||||
double m_SendInputInterval = 0.033;
|
unsigned int m_SendInputIntervalMs;
|
||||||
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
@@ -103,7 +100,6 @@ private:
|
|||||||
void parseDoubleJump(Packet& packet);
|
void parseDoubleJump(Packet& packet);
|
||||||
void parseDashEffect(Packet& packet);
|
void parseDashEffect(Packet& packet);
|
||||||
void parseAmmoPickup(Packet& packet);
|
void parseAmmoPickup(Packet& packet);
|
||||||
void parseRemoveWorld(Packet& packet);
|
|
||||||
void InterpolateFields(Packet& packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
void InterpolateFields(Packet& packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
||||||
void parseSnapshot(Packet& packet);
|
void parseSnapshot(Packet& packet);
|
||||||
void identifyPacketLoss();
|
void identifyPacketLoss();
|
||||||
@@ -113,6 +109,7 @@ private:
|
|||||||
void sendLocalPlayerTransform();
|
void sendLocalPlayerTransform();
|
||||||
void becomePlayer();
|
void becomePlayer();
|
||||||
void displayServerlist();
|
void displayServerlist();
|
||||||
|
void removeWorld();
|
||||||
void createMainMenu();
|
void createMainMenu();
|
||||||
// Mapping Logic
|
// Mapping Logic
|
||||||
// Returns if local EntityID exist in map
|
// Returns if local EntityID exist in map
|
||||||
@@ -141,8 +138,8 @@ private:
|
|||||||
UDPClient m_ServerlistRequest;
|
UDPClient m_ServerlistRequest;
|
||||||
std::vector<ServerInfo> m_Serverlist;
|
std::vector<ServerInfo> m_Serverlist;
|
||||||
bool m_SearchingForServers = false;
|
bool m_SearchingForServers = false;
|
||||||
double m_TimeSearched = 0;
|
std::clock_t m_StartSearchTime;
|
||||||
double m_SearchingTime = 0.2; // Config I guess
|
double m_SearchingTime = 200; // Config I guess
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ enum class MessageType
|
|||||||
OnDashEffect,
|
OnDashEffect,
|
||||||
ServerlistRequest,
|
ServerlistRequest,
|
||||||
AmmoPickup,
|
AmmoPickup,
|
||||||
RemoveWorld,
|
|
||||||
Invalid
|
Invalid
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ public:
|
|||||||
Network(World* world, EventBroker* eventBroker);
|
Network(World* world, EventBroker* eventBroker);
|
||||||
virtual ~Network() { };
|
virtual ~Network() { };
|
||||||
|
|
||||||
virtual void Update(double dt) = 0;
|
virtual void Update() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
World* m_World;
|
World* m_World;
|
||||||
@@ -40,7 +40,6 @@ protected:
|
|||||||
void saveToFile();
|
void saveToFile();
|
||||||
void updateNetworkData();
|
void updateNetworkData();
|
||||||
void popNetworkSegmentOfHeader(Packet& packet);
|
void popNetworkSegmentOfHeader(Packet& packet);
|
||||||
void removeWorld();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -11,7 +11,6 @@
|
|||||||
#include "Network/MessageType.h"
|
#include "Network/MessageType.h"
|
||||||
#include "Network/PlayerDefinition.h"
|
#include "Network/PlayerDefinition.h"
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
#include "Core/EntityFile.h"
|
|
||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
#include "../Network/Network.h"
|
#include "../Network/Network.h"
|
||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
@@ -25,8 +24,6 @@
|
|||||||
#include "Core/EPlayerDeath.h"
|
#include "Core/EPlayerDeath.h"
|
||||||
#include "Network/EPlayerConnected.h"
|
#include "Network/EPlayerConnected.h"
|
||||||
#include "Network/EKillDeath.h"
|
#include "Network/EKillDeath.h"
|
||||||
#include "Core/EWin.h"
|
|
||||||
#include "Game/Events/EReset.h"
|
|
||||||
|
|
||||||
class Server : public Network
|
class Server : public Network
|
||||||
{
|
{
|
||||||
@@ -34,7 +31,7 @@ public:
|
|||||||
Server(World* world, EventBroker* eventBroker, int port);
|
Server(World* world, EventBroker* eventBroker, int port);
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
void Update(double dt) override;
|
void Update() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Network channels
|
// Network channels
|
||||||
@@ -44,7 +41,6 @@ private:
|
|||||||
// dont forget to set these in the childrens receive logic
|
// dont forget to set these in the childrens receive logic
|
||||||
boost::asio::ip::address m_Address;
|
boost::asio::ip::address m_Address;
|
||||||
int m_Port = 27666;
|
int m_Port = 27666;
|
||||||
bool m_GameIsOver = false;
|
|
||||||
// Sending messages to client logic
|
// Sending messages to client logic
|
||||||
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
|
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
|
||||||
std::vector<PlayerID> m_PlayersToDisconnect;
|
std::vector<PlayerID> m_PlayersToDisconnect;
|
||||||
@@ -52,14 +48,14 @@ private:
|
|||||||
char readBuffer[BUFFERSIZE] = { 0 };
|
char readBuffer[BUFFERSIZE] = { 0 };
|
||||||
size_t bytesRead = 0;
|
size_t bytesRead = 0;
|
||||||
// time for previouse message
|
// time for previouse message
|
||||||
double previousPingMessage = 0;
|
std::clock_t previousePingMessage = std::clock();
|
||||||
double previousSnapshotMessage = 0;
|
std::clock_t previousSnapshotMessage = std::clock();
|
||||||
double timeOutTimer = 0;
|
std::clock_t timOutTimer = std::clock();
|
||||||
|
|
||||||
// How often we send messages (seconds)
|
// How often we send messages (milliseconds)
|
||||||
double pingInterval = 1;
|
float pingIntervalMs;
|
||||||
double snapshotInterval = 0.05;
|
float snapshotInterval;
|
||||||
double checkTimeOutInterval = 0.1;
|
int checkTimeOutInterval = 100;
|
||||||
int m_NextPlayerID = 0;
|
int m_NextPlayerID = 0;
|
||||||
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
||||||
//Timers
|
//Timers
|
||||||
@@ -75,7 +71,6 @@ private:
|
|||||||
void reliableBroadcast(Packet& packet);
|
void reliableBroadcast(Packet& packet);
|
||||||
void unreliableBroadcast(Packet& packet);
|
void unreliableBroadcast(Packet& packet);
|
||||||
void sendSnapshot();
|
void sendSnapshot();
|
||||||
void createWorldSnapshot(Packet& packet);
|
|
||||||
void addPlayersToPacket(Packet& packet, EntityID entityID);
|
void addPlayersToPacket(Packet& packet, EntityID entityID);
|
||||||
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
||||||
void addInputCommandsToPacket(Packet& packet);
|
void addInputCommandsToPacket(Packet& packet);
|
||||||
@@ -88,7 +83,6 @@ private:
|
|||||||
void kick(PlayerID player);
|
void kick(PlayerID player);
|
||||||
PlayerID getPlayerIDFromEndpoint();
|
PlayerID getPlayerIDFromEndpoint();
|
||||||
PlayerID getPlayerIDFromEntityID(EntityID entityID);
|
PlayerID getPlayerIDFromEntityID(EntityID entityID);
|
||||||
void resetMap();
|
|
||||||
void parsePlayerTransform(Packet& packet);
|
void parsePlayerTransform(Packet& packet);
|
||||||
void parseOnInputCommand(Packet& packet);
|
void parseOnInputCommand(Packet& packet);
|
||||||
void parseClientPing();
|
void parseClientPing();
|
||||||
@@ -116,8 +110,6 @@ private:
|
|||||||
bool OnAmmoPickup(const Events::AmmoPickup& e);
|
bool OnAmmoPickup(const Events::AmmoPickup& e);
|
||||||
EventRelay<Server, Events::PlayerDeath> m_EPlayerDeath;
|
EventRelay<Server, Events::PlayerDeath> m_EPlayerDeath;
|
||||||
bool OnPlayerDeath(const Events::PlayerDeath& e);
|
bool OnPlayerDeath(const Events::PlayerDeath& e);
|
||||||
EventRelay<Server, Events::Win> m_EWin;
|
|
||||||
bool OnWin(const Events::Win& e);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -76,7 +76,6 @@ private:
|
|||||||
const ShadowPass* m_ShadowPass;
|
const ShadowPass* m_ShadowPass;
|
||||||
|
|
||||||
ShaderProgram* m_ForwardPlusProgram;
|
ShaderProgram* m_ForwardPlusProgram;
|
||||||
ShaderProgram* m_ForwardPlusNoShadowsProgram;
|
|
||||||
ShaderProgram* m_ExplosionEffectProgram;
|
ShaderProgram* m_ExplosionEffectProgram;
|
||||||
ShaderProgram* m_ExplosionEffectSplatMapProgram;
|
ShaderProgram* m_ExplosionEffectSplatMapProgram;
|
||||||
ShaderProgram* m_SpriteProgram;
|
ShaderProgram* m_SpriteProgram;
|
||||||
|
|||||||
@@ -16,15 +16,18 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
~Model();
|
~Model();
|
||||||
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_RawModel->m_Materials; }
|
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_Materials; }
|
||||||
const glm::mat4& Matrix() const { return m_RawModel->m_Matrix; }
|
//const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
|
||||||
const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
|
unsigned int NumberOfVertices() const { return m_Vertices.size(); }
|
||||||
unsigned int NumberOfVertices() const { return m_RawModel->NumVertices(); }
|
|
||||||
const AABB& Box() const { return m_Box; }
|
const AABB& Box() const { return m_Box; }
|
||||||
bool IsSkinned() const { return m_RawModel->IsSkinned(); }
|
bool IsSkinned() const { return m_IsSkinned; }
|
||||||
GLuint VAO;
|
GLuint VAO;
|
||||||
GLuint ElementBuffer;
|
GLuint ElementBuffer;
|
||||||
RawModel* m_RawModel;
|
//RawModel* m_RawModel;
|
||||||
|
|
||||||
|
Skeleton* m_Skeleton = nullptr;
|
||||||
|
std::vector<glm::vec3> m_Vertices;
|
||||||
|
std::vector<unsigned int> m_Indices;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
AABB m_Box;
|
AABB m_Box;
|
||||||
@@ -34,6 +37,9 @@ private:
|
|||||||
GLuint TangentNormalsBuffer;
|
GLuint TangentNormalsBuffer;
|
||||||
GLuint BiTangentNormalsBuffer;
|
GLuint BiTangentNormalsBuffer;
|
||||||
GLuint TextureCoordBuffer;
|
GLuint TextureCoordBuffer;
|
||||||
|
|
||||||
|
std::vector<RawModel::MaterialProperties> m_Materials;
|
||||||
|
bool m_IsSkinned;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ struct ModelJob : RenderJob
|
|||||||
IsShielded = isShielded;
|
IsShielded = isShielded;
|
||||||
|
|
||||||
if (model->IsSkinned()) {
|
if (model->IsSkinned()) {
|
||||||
Skeleton = Model->m_RawModel->m_Skeleton;
|
Skeleton = Model->m_Skeleton;
|
||||||
|
|
||||||
if (Skeleton != nullptr) {
|
if (Skeleton != nullptr) {
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
#include <boost/endian/buffers.hpp>
|
||||||
#include "../Common.h"
|
#include "../Common.h"
|
||||||
#include "../GLM.h"
|
#include "../GLM.h"
|
||||||
#include "../Core/ResourceManager.h"
|
#include "../Core/ResourceManager.h"
|
||||||
@@ -20,14 +21,10 @@
|
|||||||
#include "Skeleton.h"
|
#include "Skeleton.h"
|
||||||
#include "ShaderProgram.h"
|
#include "ShaderProgram.h"
|
||||||
|
|
||||||
#include "boost\endian\buffers.hpp"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class RawModelCustom : public Resource
|
class RawModelCustom : public Resource
|
||||||
{
|
{
|
||||||
friend class ResourceManager;
|
friend class ResourceManager;
|
||||||
|
friend class Model;
|
||||||
protected:
|
protected:
|
||||||
RawModelCustom(std::string fileName);
|
RawModelCustom(std::string fileName);
|
||||||
|
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ private:
|
|||||||
bool m_ResizeWindow = false;
|
bool m_ResizeWindow = false;
|
||||||
int m_SSAO_Quality = 0;
|
int m_SSAO_Quality = 0;
|
||||||
int m_GLOW_Quality = 2;
|
int m_GLOW_Quality = 2;
|
||||||
bool m_Shadow_Enabled = true;
|
|
||||||
|
|
||||||
PickingPass* m_PickingPass;
|
PickingPass* m_PickingPass;
|
||||||
LightCullingPass* m_LightCullingPass;
|
LightCullingPass* m_LightCullingPass;
|
||||||
|
|||||||
@@ -38,8 +38,6 @@ public:
|
|||||||
void ClearBuffer();
|
void ClearBuffer();
|
||||||
void Draw(RenderScene& scene);
|
void Draw(RenderScene& scene);
|
||||||
|
|
||||||
void CheckStatus(bool status);
|
|
||||||
|
|
||||||
void DebugGUI();
|
void DebugGUI();
|
||||||
|
|
||||||
GLuint DepthMap() const { return m_DepthMap; }
|
GLuint DepthMap() const { return m_DepthMap; }
|
||||||
@@ -47,7 +45,6 @@ public:
|
|||||||
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
|
std::array<glm::mat4, MAX_SPLITS> LightV() const { return m_LightView; }
|
||||||
std::array<float, MAX_SPLITS> FarDistance() const { std::array<float, MAX_SPLITS> f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; }
|
std::array<float, MAX_SPLITS> FarDistance() const { std::array<float, MAX_SPLITS> f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; }
|
||||||
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
|
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
|
||||||
bool EnableShadows() const { return m_EnableShadows; }
|
|
||||||
|
|
||||||
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
|
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
|
||||||
private:
|
private:
|
||||||
@@ -66,8 +63,8 @@ private:
|
|||||||
|
|
||||||
GLuint m_DepthMap;
|
GLuint m_DepthMap;
|
||||||
FrameBuffer m_DepthBuffer;
|
FrameBuffer m_DepthBuffer;
|
||||||
ShaderProgram* m_ShadowProgram;
|
ShaderProgram* m_ShadowProgram;
|
||||||
ShaderProgram* m_ShadowProgramSkinned;
|
ShaderProgram* m_ShadowProgramSkinned;
|
||||||
|
|
||||||
std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
|
std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
|
||||||
std::array<glm::mat4, MAX_SPLITS> m_LightView;
|
std::array<glm::mat4, MAX_SPLITS> m_LightView;
|
||||||
@@ -78,7 +75,7 @@ private:
|
|||||||
|
|
||||||
bool m_TransparentObjects = false;
|
bool m_TransparentObjects = false;
|
||||||
bool m_TexturedShadows = false;
|
bool m_TexturedShadows = false;
|
||||||
bool m_EnableShadows = false;
|
bool m_EnableShadows = true;
|
||||||
|
|
||||||
int m_CurrentNrOfSplits = 4;
|
int m_CurrentNrOfSplits = 4;
|
||||||
float m_SplitWeight = 0.962f;
|
float m_SplitWeight = 0.962f;
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
#ifndef Events_Reset_h__
|
|
||||||
#define Events_Reset_h__
|
|
||||||
|
|
||||||
#include "Core/EventBroker.h"
|
|
||||||
#include "Core/EntityWrapper.h"
|
|
||||||
|
|
||||||
namespace Events
|
|
||||||
{
|
|
||||||
|
|
||||||
struct Reset : Event
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -9,7 +9,6 @@
|
|||||||
#include "Engine/Collision/ETrigger.h"
|
#include "Engine/Collision/ETrigger.h"
|
||||||
#include "Core/ECaptured.h"
|
#include "Core/ECaptured.h"
|
||||||
#include "Core/EWin.h"
|
#include "Core/EWin.h"
|
||||||
#include "Game/Events/EReset.h"
|
|
||||||
|
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -24,7 +23,6 @@ public:
|
|||||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Init();
|
|
||||||
//methods which will take care of specific events
|
//methods which will take care of specific events
|
||||||
EventRelay<CapturePointSystem, Events::TriggerTouch> m_ETriggerTouch;
|
EventRelay<CapturePointSystem, Events::TriggerTouch> m_ETriggerTouch;
|
||||||
bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e);
|
bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e);
|
||||||
@@ -32,8 +30,6 @@ private:
|
|||||||
bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e);
|
bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e);
|
||||||
EventRelay<CapturePointSystem, Events::Captured> m_ECaptured;
|
EventRelay<CapturePointSystem, Events::Captured> m_ECaptured;
|
||||||
bool CapturePointSystem::OnCaptured(const Events::Captured& e);
|
bool CapturePointSystem::OnCaptured(const Events::Captured& e);
|
||||||
EventRelay<CapturePointSystem, Events::Reset> m_EReset;
|
|
||||||
bool CapturePointSystem::OnReset(const Events::Reset& e);
|
|
||||||
void ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner);
|
void ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner);
|
||||||
|
|
||||||
bool m_WinnerWasFound = false;
|
bool m_WinnerWasFound = false;
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
#include "Core/EPlayerSpawned.h"
|
#include "Core/EPlayerSpawned.h"
|
||||||
#include "Network/EPlayerConnected.h"
|
#include "Network/EPlayerConnected.h"
|
||||||
#include "Network/EPlayerDisconnected.h"
|
#include "Network/EPlayerDisconnected.h"
|
||||||
#include "Game/Events/EReset.h"
|
|
||||||
#include "Engine/Input/EInputCommand.h"
|
|
||||||
#include "GLM.h"
|
#include "GLM.h"
|
||||||
|
|
||||||
class ScoreScreenSystem : public PureSystem
|
class ScoreScreenSystem : public PureSystem
|
||||||
@@ -27,10 +25,6 @@ public:
|
|||||||
bool OnPlayerConnected(const Events::PlayerConnected& e);
|
bool OnPlayerConnected(const Events::PlayerConnected& e);
|
||||||
EventRelay<ScoreScreenSystem, Events::PlayerDisconnected> m_EPlayerDisconnected;
|
EventRelay<ScoreScreenSystem, Events::PlayerDisconnected> m_EPlayerDisconnected;
|
||||||
bool OnPlayerDisconnected(const Events::PlayerDisconnected& e);
|
bool OnPlayerDisconnected(const Events::PlayerDisconnected& e);
|
||||||
EventRelay<ScoreScreenSystem, Events::Reset> m_EReset;
|
|
||||||
bool OnReset(const Events::Reset& e);
|
|
||||||
EventRelay<ScoreScreenSystem, Events::InputCommand> m_EInputCommand;
|
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct PlayerData {
|
struct PlayerData {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "Events/ESpawnerSpawn.h"
|
#include "Events/ESpawnerSpawn.h"
|
||||||
#include "Core/TransformSystem.h"
|
#include "Core/TransformSystem.h"
|
||||||
#include "Core/EntityFile.h"
|
#include "Core/EntityFile.h"
|
||||||
|
#include "Rendering/Model.h"
|
||||||
|
|
||||||
class SpawnerSystem : public System
|
class SpawnerSystem : public System
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "Core/System.h"
|
#include "Core/System.h"
|
||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
#include "Network/EPlayerDisconnected.h"
|
#include "Network/EPlayerDisconnected.h"
|
||||||
#include "Game/Events/EReset.h"
|
|
||||||
|
|
||||||
class SpectatorCameraSystem : public ImpureSystem
|
class SpectatorCameraSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
@@ -16,14 +15,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
int m_PickedTeam;
|
int m_PickedTeam;
|
||||||
bool m_CamSetToTeamPick;
|
bool m_CamSetToTeamPick;
|
||||||
void reset();
|
|
||||||
|
|
||||||
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
|
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
EventRelay<SpectatorCameraSystem, Events::PlayerDisconnected> m_EDisconnect;
|
EventRelay<SpectatorCameraSystem, Events::PlayerDisconnected> m_EDisconnect;
|
||||||
bool OnDisconnect(const Events::PlayerDisconnected& e);
|
bool OnDisconnect(const Events::PlayerDisconnected& e);
|
||||||
EventRelay<SpectatorCameraSystem, Events::Reset> m_EReset;
|
|
||||||
bool OnReset(const Events::Reset& e);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -2,5 +2,4 @@
|
|||||||
<CapturePointGameMode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CapturePointGameMode.xsd">
|
<CapturePointGameMode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CapturePointGameMode.xsd">
|
||||||
<RespawnTime>0.0</RespawnTime>
|
<RespawnTime>0.0</RespawnTime>
|
||||||
<MaxRespawnTime>8.0</MaxRespawnTime>
|
<MaxRespawnTime>8.0</MaxRespawnTime>
|
||||||
<ResetCountdown>10.0</ResetCountdown>
|
|
||||||
</CapturePointGameMode>
|
</CapturePointGameMode>
|
||||||
@@ -12,9 +12,6 @@
|
|||||||
<xs:element name="MaxRespawnTime" type="t:double" minOccurs="0">
|
<xs:element name="MaxRespawnTime" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Players will be spawned when RespawnTime reaches this.</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Players will be spawned when RespawnTime reaches this.</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
<xs:element name="ResetCountdown" type="t:double" minOccurs="0">
|
|
||||||
<xs:annotation><xs:documentation>The map will be reset when time reaches 0.</xs:documentation></xs:annotation>
|
|
||||||
</xs:element>
|
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
+7376
-9313
File diff suppressed because it is too large
Load Diff
@@ -1,126 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
|
||||||
<Entity name="BlueCapturepointBorde" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
|
||||||
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.271661639" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
|
|
||||||
<Children>
|
|
||||||
<Entity name="Bottom">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>3</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-0" Y="-8.74227801e-09" Z="-0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.392156869" B="10" G="0.784313738" R="0"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.5" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="LowerMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>2</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025388" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.313725501" B="10" G="0.784313738" R="0"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.899999976" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="UpperMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>1</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025463" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.196078435" B="10" G="0.784313738" R="0"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.29999995" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="Top">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform/>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.117647059" B="10" G="0.784313738" R="0"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.70000005" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
|
|
||||||
</Entity>
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
|
||||||
<Entity name="RedCapturepointBorde" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
|
||||||
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.271661639" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
|
|
||||||
<Children>
|
|
||||||
<Entity name="Bottom">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>3</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-0" Y="-8.74227801e-09" Z="-0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.392156869" B="0" G="0.235294119" R="21.9607849"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.5" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="LowerMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>2</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025388" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.313725501" B="0" G="0.235294119" R="21.9607849"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.899999976" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="UpperMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>1</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025463" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.196078435" B="0" G="0.235294119" R="21.9607849"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.29999995" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="Top">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform/>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.117647059" B="0" G="0.235294119" R="21.9607849"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.70000005" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
|
|
||||||
</Entity>
|
|
||||||
@@ -1,126 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
|
||||||
<Entity name="SpectatorCapturepointBorde" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
|
||||||
|
|
||||||
<Components>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.271661639" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
|
|
||||||
<Children>
|
|
||||||
<Entity name="Bottom">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>3</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="-0" Y="-8.74227801e-09" Z="-0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.392156869" B="8.03921604" G="8.03921604" R="8.03921604"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.5" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="LowerMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>2</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025388" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.313725501" B="10" G="8.03921604" R="8.03921604"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.899999976" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="UpperMid">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Time>1</Time>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="0.0866025463" Z="0"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.196078435" B="8.03921604" G="8.03921604" R="8.03921604"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.29999995" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
<Entity name="Top">
|
|
||||||
<Components>
|
|
||||||
<c:FloatingEffect>
|
|
||||||
<Period>6</Period>
|
|
||||||
<Axis X="0" Y="1" Z="0"/>
|
|
||||||
<Amplitude>0.10000000149011612</Amplitude>
|
|
||||||
</c:FloatingEffect>
|
|
||||||
<c:Transform/>
|
|
||||||
</Components>
|
|
||||||
<Children>
|
|
||||||
<Entity>
|
|
||||||
<Components>
|
|
||||||
<c:Model>
|
|
||||||
<Resource>Models/Props/CapturePoint/DoubleSidedCylinder.mesh</Resource>
|
|
||||||
<Color A="0.117647059" B="8.03921604" G="8.03921604" R="8.03921604"/>
|
|
||||||
<Transparent>true</Transparent>
|
|
||||||
</c:Model>
|
|
||||||
<c:Transform>
|
|
||||||
<Position X="0" Y="1.70000005" Z="0"/>
|
|
||||||
<Scale X="8.19999981" Y="0.0199999996" Z="8.19999981"/>
|
|
||||||
</c:Transform>
|
|
||||||
</Components>
|
|
||||||
<Children/>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
</Entity>
|
|
||||||
</Children>
|
|
||||||
|
|
||||||
</Entity>
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
#version 430
|
|
||||||
|
|
||||||
#define MIN_AMBIENT_LIGHT 0.3
|
|
||||||
#define MAX_SPLITS 4
|
|
||||||
|
|
||||||
uniform mat4 VM;
|
|
||||||
uniform mat4 M;
|
|
||||||
uniform mat4 V;
|
|
||||||
uniform mat4 P;
|
|
||||||
uniform vec4 Color;
|
|
||||||
uniform vec4 DiffuseColor;
|
|
||||||
uniform vec2 ScreenDimensions;
|
|
||||||
uniform vec4 FillColor;
|
|
||||||
uniform vec4 AmbientColor;
|
|
||||||
uniform float FillPercentage;
|
|
||||||
uniform float GlowIntensity;
|
|
||||||
uniform vec3 CameraPosition;
|
|
||||||
uniform int SSAOQuality;
|
|
||||||
uniform float FarDistance[MAX_SPLITS];
|
|
||||||
|
|
||||||
uniform vec2 DiffuseUVRepeat;
|
|
||||||
uniform vec2 NormalUVRepeat;
|
|
||||||
uniform vec2 SpecularUVRepeat;
|
|
||||||
uniform vec2 GlowUVRepeat;
|
|
||||||
layout (binding = 0) uniform sampler2D AOTexture;
|
|
||||||
layout (binding = 1) uniform sampler2D DiffuseTexture;
|
|
||||||
layout (binding = 2) uniform sampler2D NormalMapTexture;
|
|
||||||
layout (binding = 3) uniform sampler2D SpecularMapTexture;
|
|
||||||
layout (binding = 4) uniform sampler2D GlowMapTexture;
|
|
||||||
layout (binding = 5) uniform samplerCube CubeMap;
|
|
||||||
|
|
||||||
#define TILE_SIZE 16
|
|
||||||
|
|
||||||
struct LightSource {
|
|
||||||
vec4 Position;
|
|
||||||
vec4 Direction;
|
|
||||||
vec4 Color;
|
|
||||||
float Radius;
|
|
||||||
float Intensity;
|
|
||||||
float Falloff;
|
|
||||||
int Type;
|
|
||||||
};
|
|
||||||
|
|
||||||
layout (std430, binding = 1) buffer LightBuffer
|
|
||||||
{
|
|
||||||
LightSource List[];
|
|
||||||
} LightSources;
|
|
||||||
|
|
||||||
struct LightGrid {
|
|
||||||
float Start;
|
|
||||||
float Amount;
|
|
||||||
vec2 Padding;
|
|
||||||
};
|
|
||||||
|
|
||||||
layout (std430, binding = 2) buffer LightGridBuffer
|
|
||||||
{
|
|
||||||
LightGrid Data[];
|
|
||||||
} LightGrids;
|
|
||||||
|
|
||||||
layout (std430, binding = 4) buffer LightIndexBuffer
|
|
||||||
{
|
|
||||||
float LightIndex[];
|
|
||||||
};
|
|
||||||
|
|
||||||
in VertexData{
|
|
||||||
vec3 Position;
|
|
||||||
vec3 Normal;
|
|
||||||
vec3 Tangent;
|
|
||||||
vec3 BiTangent;
|
|
||||||
vec2 TextureCoordinate;
|
|
||||||
vec4 ExplosionColor;
|
|
||||||
float ExplosionPercentageElapsed;
|
|
||||||
vec4 PositionLightSpace[MAX_SPLITS];
|
|
||||||
}Input;
|
|
||||||
|
|
||||||
out vec4 sceneColor;
|
|
||||||
out vec4 bloomColor;
|
|
||||||
|
|
||||||
struct LightResult {
|
|
||||||
vec4 Diffuse;
|
|
||||||
vec4 Specular;
|
|
||||||
};
|
|
||||||
|
|
||||||
float CalcAttenuation(float radius, float dist, float falloff) {
|
|
||||||
return 1.0 - smoothstep(radius * falloff, radius, dist);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 CalcSpecular(vec4 lightColor, vec4 viewVec, vec4 lightVec, vec4 normal) {
|
|
||||||
vec4 R = normalize( reflect(-lightVec, normal));
|
|
||||||
float RdotV = max( dot(R, viewVec), 0.0);
|
|
||||||
return lightColor * pow(RdotV, 90.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 CalcDiffuse(vec4 lightColor, vec4 lightVec, vec4 normal) {
|
|
||||||
float power = max( dot(normal, lightVec), 0.0);
|
|
||||||
return lightColor * power;
|
|
||||||
}
|
|
||||||
|
|
||||||
LightResult CalcPointLightSource(vec4 lightPos, float lightRadius, vec4 lightColor, float intensity, vec4 viewVec, vec4 position, vec4 normal, float falloff)
|
|
||||||
{
|
|
||||||
vec4 L = lightPos - position;
|
|
||||||
float dist = length(L);
|
|
||||||
L = normalize(L);
|
|
||||||
|
|
||||||
float attenuation = CalcAttenuation(lightRadius, dist, falloff);
|
|
||||||
|
|
||||||
LightResult result;
|
|
||||||
result.Diffuse = CalcDiffuse(lightColor, L, normal) * attenuation * intensity;
|
|
||||||
result.Specular = CalcSpecular(lightColor, viewVec, L, normal) * attenuation * intensity;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
LightResult CalcDirectionalLightSource(vec4 direction, vec4 color, float intensity, vec4 viewVec, vec4 vertNormal)
|
|
||||||
{
|
|
||||||
vec4 L = normalize( -vec4(direction.xyz, 0) );
|
|
||||||
|
|
||||||
LightResult result;
|
|
||||||
result.Diffuse = CalcDiffuse(color, L, vertNormal) * intensity;
|
|
||||||
result.Specular = CalcSpecular(color, viewVec, L, vertNormal) * intensity;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap)
|
|
||||||
{
|
|
||||||
mat3 TBN = mat3(tangent, bitangent, normal);
|
|
||||||
vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0);
|
|
||||||
return vec4(TBN * normalize(NormalMap), 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main()
|
|
||||||
{
|
|
||||||
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r;
|
|
||||||
ao = (clamp(1.0 - (1.0 - ao), 0.0, 1.0) + MIN_AMBIENT_LIGHT) / (1.0 + MIN_AMBIENT_LIGHT);
|
|
||||||
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
|
||||||
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
|
||||||
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
|
||||||
vec4 position = VM * vec4(Input.Position, 1.0);
|
|
||||||
vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture);
|
|
||||||
normal = normalize(normal);
|
|
||||||
//vec4 normal = normalize(V * vec4(Input.Normal, 0.0));
|
|
||||||
vec4 viewVec = normalize(-position);
|
|
||||||
vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition);
|
|
||||||
vec3 R = reflect(-I, Input.Normal);
|
|
||||||
//R = vec3(P * vec4(R, 1.0));
|
|
||||||
vec4 reflectionColor = texture(CubeMap, R);
|
|
||||||
|
|
||||||
vec2 tilePos;
|
|
||||||
tilePos.x = int(gl_FragCoord.x/TILE_SIZE);
|
|
||||||
tilePos.y = int(gl_FragCoord.y/TILE_SIZE);
|
|
||||||
|
|
||||||
LightResult totalLighting;
|
|
||||||
totalLighting.Diffuse = vec4(AmbientColor.rgb * ao, 1.0);
|
|
||||||
int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE)));
|
|
||||||
|
|
||||||
int start = int(LightGrids.Data[currentTile].Start);
|
|
||||||
int amount = int(LightGrids.Data[currentTile].Amount);
|
|
||||||
|
|
||||||
for(int i = start; i < start + amount; i++) {
|
|
||||||
|
|
||||||
int l = int(LightIndex[i]);
|
|
||||||
LightSource light = LightSources.List[l];
|
|
||||||
|
|
||||||
LightResult light_result;
|
|
||||||
//These if statements should be removed.
|
|
||||||
if(light.Type == 1) { // point
|
|
||||||
light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff);
|
|
||||||
} else if (light.Type == 2) { //Directional
|
|
||||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
|
||||||
}
|
|
||||||
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
|
||||||
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
|
||||||
color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
|
||||||
float specularResult = (specularTexel.r + specularTexel.g + specularTexel.b)/3.0;
|
|
||||||
vec4 reflectionTotal = reflectionColor * (1-specularTexel.a) * color_result.a * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel));
|
|
||||||
color_result = color_result * clamp(1/specularTexel.a, 0, 1) + reflectionTotal;
|
|
||||||
//vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color;
|
|
||||||
|
|
||||||
|
|
||||||
float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0;
|
|
||||||
|
|
||||||
if(pos <= FillPercentage) {
|
|
||||||
color_result += FillColor;
|
|
||||||
}
|
|
||||||
sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1));
|
|
||||||
//sceneColor = CommonUniforms.testColour;
|
|
||||||
//sceneColor = vec4(reflectionColor.xyz, 1);
|
|
||||||
color_result.xyz += glowTexel.xyz*GlowIntensity;
|
|
||||||
|
|
||||||
bloomColor = vec4(max(color_result.xyz - 1.0, 0.0), clamp(color_result.a, 0, 1));
|
|
||||||
|
|
||||||
//Tiled Debug Code
|
|
||||||
/*
|
|
||||||
if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) {
|
|
||||||
sceneColor += vec4(0.5, 0, 0, 0);
|
|
||||||
} else {
|
|
||||||
sceneColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/LightSources.List.length(), 0, 0, 1);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -146,14 +146,14 @@ bool RayVsTriangle(const Ray& ray,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix)
|
const glm::mat4& modelMatrix)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < modelIndices.size();) {
|
for (int i = 0; i < modelIndices.size();) {
|
||||||
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
if (RayVsTriangle(ray, v0, v1, v2)) {
|
if (RayVsTriangle(ray, v0, v1, v2)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ bool RayVsTriangle(const Ray& ray,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
float& outDistance,
|
float& outDistance,
|
||||||
@@ -204,9 +204,9 @@ bool RayVsModel(const Ray& ray,
|
|||||||
outDistance = INFINITY;
|
outDistance = INFINITY;
|
||||||
bool hit = false;
|
bool hit = false;
|
||||||
for (int i = 0; i < modelIndices.size();) {
|
for (int i = 0; i < modelIndices.size();) {
|
||||||
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||||
float dist = outDistance;
|
float dist = outDistance;
|
||||||
float u;
|
float u;
|
||||||
float v;
|
float v;
|
||||||
@@ -221,7 +221,7 @@ bool RayVsModel(const Ray& ray,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool RayVsModel(const Ray& ray,
|
bool RayVsModel(const Ray& ray,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
glm::vec3& outHitPosition)
|
glm::vec3& outHitPosition)
|
||||||
@@ -548,7 +548,7 @@ BoxTriRes AABBvsTriangle(const AABB& box,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Output AABBvsTriangles(const AABB& box,
|
Output AABBvsTriangles(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
glm::vec3& boxVelocity,
|
glm::vec3& boxVelocity,
|
||||||
@@ -565,9 +565,9 @@ Output AABBvsTriangles(const AABB& box,
|
|||||||
glm::vec3 originalBoxVelocity(boxVelocity);
|
glm::vec3 originalBoxVelocity(boxVelocity);
|
||||||
for (int i = 0; i < modelIndices.size(); ) {
|
for (int i = 0; i < modelIndices.size(); ) {
|
||||||
std::array<glm::vec3, 3> triVertices = {
|
std::array<glm::vec3, 3> triVertices = {
|
||||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
|
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
|
||||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
|
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
|
||||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix)
|
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix)
|
||||||
};
|
};
|
||||||
glm::vec3 outVec;
|
glm::vec3 outVec;
|
||||||
bool collideWithGround = isOnGround;
|
bool collideWithGround = isOnGround;
|
||||||
@@ -595,7 +595,7 @@ Output AABBvsTriangles(const AABB& box,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AABBvsTriangles(const AABB& box,
|
bool AABBvsTriangles(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix,
|
const glm::mat4& modelMatrix,
|
||||||
glm::vec3& boxVelocity,
|
glm::vec3& boxVelocity,
|
||||||
@@ -615,7 +615,7 @@ bool AABBvsTriangles(const AABB& box,
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AABBvsTriangles(const AABB& box,
|
bool AABBvsTriangles(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix)
|
const glm::mat4& modelMatrix)
|
||||||
{
|
{
|
||||||
@@ -633,7 +633,7 @@ bool AABBvsTriangles(const AABB& box,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Output AABBvsTrianglesWContainment(const AABB& box,
|
Output AABBvsTrianglesWContainment(const AABB& box,
|
||||||
const RawModel::Vertex* modelVertices,
|
const std::vector<glm::vec3>& modelVertices,
|
||||||
const std::vector<unsigned int>& modelIndices,
|
const std::vector<unsigned int>& modelIndices,
|
||||||
const glm::mat4& modelMatrix)
|
const glm::mat4& modelMatrix)
|
||||||
{
|
{
|
||||||
@@ -741,7 +741,7 @@ boost::optional<EntityAABB> EntityFirstHitByRay(const Ray& ray, std::vector<Enti
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
float u, v;
|
float u, v;
|
||||||
if (RayVsModel(ray, model->Vertices(), model->m_RawModel->m_Indices, TransformSystem::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
|
if (RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
|
||||||
outIntersectPos = ray.Origin() + outDistance * ray.Direction();
|
outIntersectPos = ray.Origin() + outDistance * ray.Direction();
|
||||||
return entityBox;
|
return entityBox;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,15 +41,15 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
// Don't collide against invisible models.
|
// Don't collide against invisible models.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
RawModel* model;
|
Model* model;
|
||||||
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
|
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
|
||||||
try {
|
try {
|
||||||
model = ResourceManager::Load<RawModel, true>(res);
|
model = ResourceManager::Load<Model, true>(res);
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
float u, v;
|
float u, v;
|
||||||
hit = Collision::RayVsModel(ray, model->Vertices(), model->m_Indices, TransformSystem::ModelMatrix(boxB.Entity), dist, u, v);
|
hit = Collision::RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(boxB.Entity), dist, u, v);
|
||||||
} else {
|
} else {
|
||||||
hit = Collision::RayVsAABB(ray, boxB, dist);
|
hit = Collision::RayVsAABB(ray, boxB, dist);
|
||||||
}
|
}
|
||||||
@@ -86,9 +86,9 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
// Don't collide against invisible models.
|
// Don't collide against invisible models.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
RawModel* model;
|
Model* model;
|
||||||
try {
|
try {
|
||||||
model = ResourceManager::Load<RawModel, true>(boxB.Entity["Model"]["Resource"]);
|
model = ResourceManager::Load<Model, true>(boxB.Entity["Model"]["Resource"]);
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
|||||||
glm::vec3 inOutVelocity = (glm::vec3)cPhysics["Velocity"];
|
glm::vec3 inOutVelocity = (glm::vec3)cPhysics["Velocity"];
|
||||||
bool isOnGround = (bool)cPhysics["IsOnGround"];
|
bool isOnGround = (bool)cPhysics["IsOnGround"];
|
||||||
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
|
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
|
||||||
if (Collision::AABBvsTriangles(boxA, model->Vertices(), model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
if (Collision::AABBvsTriangles(boxA, model->m_Vertices, model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
||||||
//Move the position to previous position if it is not moving in the xz-plane, else resolve with the resolution vector.
|
//Move the position to previous position if it is not moving in the xz-plane, else resolve with the resolution vector.
|
||||||
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
|
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
|
||||||
boxA = *Collision::EntityAbsoluteAABB(entity);
|
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||||
|
|||||||
@@ -10,11 +10,11 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RawModel* triggerModel = nullptr;
|
Model* triggerModel = nullptr;
|
||||||
glm::mat4 triggerModelMat;
|
glm::mat4 triggerModelMat;
|
||||||
if (triggerEntity.HasComponent("Model")) {
|
if (triggerEntity.HasComponent("Model")) {
|
||||||
try {
|
try {
|
||||||
triggerModel = ResourceManager::Load<RawModel, true>(triggerEntity["Model"]["Resource"]);
|
triggerModel = ResourceManager::Load<Model, true>(triggerEntity["Model"]["Resource"]);
|
||||||
triggerModelMat = TransformSystem::ModelMatrix(triggerEntity);
|
triggerModelMat = TransformSystem::ModelMatrix(triggerEntity);
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
|||||||
? Collision::Output::OutContained
|
? Collision::Output::OutContained
|
||||||
: Collision::AABBvsTrianglesWContainment(
|
: Collision::AABBvsTrianglesWContainment(
|
||||||
colliderBox,
|
colliderBox,
|
||||||
triggerModel->Vertices(),
|
triggerModel->m_Vertices,
|
||||||
triggerModel->m_Indices,
|
triggerModel->m_Indices,
|
||||||
triggerModelMat);
|
triggerModelMat);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#include "Network/Client.h"
|
#include "Network/Client.h"
|
||||||
|
#include "Network/EPlayerDisconnected.h"
|
||||||
using namespace boost::asio::ip;
|
using namespace boost::asio::ip;
|
||||||
|
|
||||||
Client::Client(World* world, EventBroker* eventBroker)
|
Client::Client(World* world, EventBroker* eventBroker)
|
||||||
@@ -12,7 +12,7 @@ Client::Client(World* world, EventBroker* eventBroker)
|
|||||||
|
|
||||||
auto config = ResourceManager::Load<ConfigFile>("Config.ini");
|
auto config = ResourceManager::Load<ConfigFile>("Config.ini");
|
||||||
m_PlayerName = config->Get<std::string>("Networking.Name", "Raptorcopter");
|
m_PlayerName = config->Get<std::string>("Networking.Name", "Raptorcopter");
|
||||||
m_SendInputInterval = config->Get<int>("Networking.SendInputIntervalMs", 33) / 1000.0;
|
m_SendInputIntervalMs = config->Get<int>("Networking.SendInputIntervalMs", 33);
|
||||||
LOG_INFO("Client initialized");
|
LOG_INFO("Client initialized");
|
||||||
|
|
||||||
m_ServerlistRequest.Connect(m_PlayerName, "192.168.1.255", 32554);
|
m_ServerlistRequest.Connect(m_PlayerName, "192.168.1.255", 32554);
|
||||||
@@ -48,7 +48,7 @@ void Client::Connect(std::string address, int port)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::Update(double dt)
|
void Client::Update()
|
||||||
{
|
{
|
||||||
m_EventBroker->Process<Client>();
|
m_EventBroker->Process<Client>();
|
||||||
while (m_Unreliable.IsSocketAvailable()) {
|
while (m_Unreliable.IsSocketAvailable()) {
|
||||||
@@ -85,9 +85,7 @@ void Client::Update(double dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (m_SearchingForServers) {
|
if (m_SearchingForServers) {
|
||||||
m_TimeSearched += dt;
|
if (m_SearchingTime < (1000* (std::clock() - m_StartSearchTime) / (double)CLOCKS_PER_SEC)) {
|
||||||
if (m_SearchingTime < m_TimeSearched) {
|
|
||||||
m_TimeSearched = 0;
|
|
||||||
m_SearchingForServers = false;
|
m_SearchingForServers = false;
|
||||||
//displayServerlist();
|
//displayServerlist();
|
||||||
Events::DisplayServerlist e;
|
Events::DisplayServerlist e;
|
||||||
@@ -98,10 +96,9 @@ void Client::Update(double dt)
|
|||||||
|
|
||||||
if (m_IsConnected) {
|
if (m_IsConnected) {
|
||||||
// Don't send 1 input in 1 packet, bunch em up.
|
// Don't send 1 input in 1 packet, bunch em up.
|
||||||
m_TimeSinceSentInputs += dt;
|
if (m_SendInputIntervalMs < (1000 * (std::clock() - m_TimeSinceSentInputs) / (double)CLOCKS_PER_SEC)) {
|
||||||
if (m_SendInputInterval < m_TimeSinceSentInputs) {
|
|
||||||
sendInputCommands();
|
sendInputCommands();
|
||||||
m_TimeSinceSentInputs = 0;
|
m_TimeSinceSentInputs = std::clock();
|
||||||
}
|
}
|
||||||
// HACK: Send absolute player positions for now to avoid desync until we have reliable messages
|
// HACK: Send absolute player positions for now to avoid desync until we have reliable messages
|
||||||
sendLocalPlayerTransform();
|
sendLocalPlayerTransform();
|
||||||
@@ -162,9 +159,6 @@ void Client::parseMessageType(Packet& packet)
|
|||||||
case MessageType::AmmoPickup:
|
case MessageType::AmmoPickup:
|
||||||
parseAmmoPickup(packet);
|
parseAmmoPickup(packet);
|
||||||
break;
|
break;
|
||||||
case MessageType::RemoveWorld:
|
|
||||||
parseRemoveWorld(packet);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -342,13 +336,6 @@ void Client::parseAmmoPickup(Packet & packet)
|
|||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::parseRemoveWorld(Packet & packet)
|
|
||||||
{
|
|
||||||
removeWorld();
|
|
||||||
Events::Reset e;
|
|
||||||
m_EventBroker->Publish(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID)
|
void Client::updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID)
|
||||||
{
|
{
|
||||||
for (auto field : componentInfo.FieldsInOrder) {
|
for (auto field : componentInfo.FieldsInOrder) {
|
||||||
@@ -596,7 +583,7 @@ bool Client::OnConnectRequest(const Events::ConnectRequest& e)
|
|||||||
bool Client::OnSearchForServers(const Events::SearchForServers& e)
|
bool Client::OnSearchForServers(const Events::SearchForServers& e)
|
||||||
{
|
{
|
||||||
m_SearchingForServers = true;
|
m_SearchingForServers = true;
|
||||||
m_TimeSearched = 0;
|
m_StartSearchTime = std::clock();
|
||||||
m_Serverlist.clear();
|
m_Serverlist.clear();
|
||||||
Packet packet(MessageType::ServerlistRequest);
|
Packet packet(MessageType::ServerlistRequest);
|
||||||
m_ServerlistRequest.Broadcast(packet, 13); // TODO: Config
|
m_ServerlistRequest.Broadcast(packet, 13); // TODO: Config
|
||||||
@@ -719,6 +706,19 @@ void Client::displayServerlist()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Client::removeWorld()
|
||||||
|
{
|
||||||
|
std::vector<EntityID> childrenToBeDeleted;
|
||||||
|
auto rootEntites = m_World->GetDirectChildren(EntityID_Invalid);
|
||||||
|
for (auto it = rootEntites.first; it != rootEntites.second; it++) {
|
||||||
|
childrenToBeDeleted.push_back(it->second);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < childrenToBeDeleted.size(); ++i) {
|
||||||
|
m_World->DeleteEntity(childrenToBeDeleted[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Client::createMainMenu()
|
void Client::createMainMenu()
|
||||||
{
|
{
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/StartMenu.xml");
|
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/StartMenu.xml");
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Network::Network(World* world, EventBroker* eventBroker)
|
|||||||
m_TimeoutMs = config->Get<int>("Networking.TimeoutMs", 20000);
|
m_TimeoutMs = config->Get<int>("Networking.TimeoutMs", 20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Network::Update(double dt)
|
void Network::Update()
|
||||||
{
|
{
|
||||||
updateNetworkData();
|
updateNetworkData();
|
||||||
}
|
}
|
||||||
@@ -92,15 +92,3 @@ void Network::popNetworkSegmentOfHeader(Packet & packet)
|
|||||||
packet.ReadPrimitive<int>();
|
packet.ReadPrimitive<int>();
|
||||||
packet.ReadPrimitive<int>();
|
packet.ReadPrimitive<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Network::removeWorld()
|
|
||||||
{
|
|
||||||
std::vector<EntityID> childrenToBeDeleted;
|
|
||||||
auto rootEntites = m_World->GetDirectChildren(EntityID_Invalid);
|
|
||||||
for (auto it = rootEntites.first; it != rootEntites.second; it++) {
|
|
||||||
childrenToBeDeleted.push_back(it->second);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < childrenToBeDeleted.size(); ++i) {
|
|
||||||
m_World->DeleteEntity(childrenToBeDeleted[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,8 +5,8 @@ Server::Server(World* world, EventBroker* eventBroker, int port)
|
|||||||
, m_ServerlistRequest(13)
|
, m_ServerlistRequest(13)
|
||||||
{
|
{
|
||||||
ConfigFile* config = ResourceManager::Load<ConfigFile>("Config.ini");
|
ConfigFile* config = ResourceManager::Load<ConfigFile>("Config.ini");
|
||||||
snapshotInterval = config->Get<float>("Networking.SnapshotInterval", 0.05);
|
snapshotInterval = 1000 * config->Get<float>("Networking.SnapshotInterval", 0.05f);
|
||||||
pingInterval = config->Get<float>("Networking.PingIntervalMs", 1000) / 1000.0;
|
pingIntervalMs = config->Get<float>("Networking.PingIntervalMs", 1000);
|
||||||
m_ServerName = config->Get<std::string>("Networking.Name", "Unnamed");
|
m_ServerName = config->Get<std::string>("Networking.Name", "Unnamed");
|
||||||
|
|
||||||
// Subscribe to events
|
// Subscribe to events
|
||||||
@@ -17,7 +17,6 @@ Server::Server(World* world, EventBroker* eventBroker, int port)
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Server::OnPlayerDamage);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDamage, &Server::OnPlayerDamage);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EAmmoPickup, &Server::OnAmmoPickup);
|
EVENT_SUBSCRIBE_MEMBER(m_EAmmoPickup, &Server::OnAmmoPickup);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDeath, &Server::OnPlayerDeath);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDeath, &Server::OnPlayerDeath);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EWin, &Server::OnWin);
|
|
||||||
// BindWW
|
// BindWW
|
||||||
if (port == 0) {
|
if (port == 0) {
|
||||||
port = config->Get<float>("Networking.Port", 27666);
|
port = config->Get<float>("Networking.Port", 27666);
|
||||||
@@ -31,7 +30,7 @@ Server::~Server()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::Update(double dt)
|
void Server::Update()
|
||||||
{
|
{
|
||||||
m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
|
m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
|
||||||
|
|
||||||
@@ -87,44 +86,26 @@ void Server::Update(double dt)
|
|||||||
}
|
}
|
||||||
m_PlayersToDisconnect.clear();
|
m_PlayersToDisconnect.clear();
|
||||||
|
|
||||||
|
std::clock_t currentTime = std::clock();
|
||||||
// Send snapshot
|
// Send snapshot
|
||||||
previousSnapshotMessage += dt;
|
if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) {
|
||||||
if (snapshotInterval < previousSnapshotMessage) {
|
|
||||||
sendSnapshot();
|
sendSnapshot();
|
||||||
previousSnapshotMessage = 0;
|
previousSnapshotMessage = currentTime;
|
||||||
}
|
}
|
||||||
// Send pings each
|
// Send pings each
|
||||||
previousPingMessage += dt;
|
if (pingIntervalMs < (1000 * (currentTime - previousePingMessage) / (double)CLOCKS_PER_SEC)) {
|
||||||
if (pingInterval < previousPingMessage) {
|
|
||||||
sendPing();
|
sendPing();
|
||||||
previousPingMessage = 0;
|
previousePingMessage = currentTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Time out logic
|
// Time out logic
|
||||||
timeOutTimer += dt;
|
if (checkTimeOutInterval < (1000 * (currentTime - timOutTimer) / (double)CLOCKS_PER_SEC)) {
|
||||||
if (checkTimeOutInterval < timeOutTimer) {
|
|
||||||
checkForTimeOuts();
|
checkForTimeOuts();
|
||||||
timeOutTimer = 0;
|
timOutTimer = currentTime;
|
||||||
}
|
}
|
||||||
m_EventBroker->Process<Server>();
|
m_EventBroker->Process<Server>();
|
||||||
if (isReadingData) {
|
if (isReadingData) {
|
||||||
Network::Update(dt);
|
Network::Update();
|
||||||
}
|
|
||||||
|
|
||||||
if (m_GameIsOver) {
|
|
||||||
auto pool = m_World->GetComponents("CapturePointGameMode");
|
|
||||||
if (pool != nullptr && pool->size() > 0) {
|
|
||||||
// Take the first CapturePointGameMode component found.
|
|
||||||
ComponentWrapper& modeComponent = *pool->begin();
|
|
||||||
// Decrease timer.
|
|
||||||
Field<double> timer = modeComponent["ResetCountdown"];
|
|
||||||
timer -= dt;
|
|
||||||
if (timer < 0) {
|
|
||||||
resetMap();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
resetMap();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +164,7 @@ void Server::reliableBroadcast(Packet& packet)
|
|||||||
|
|
||||||
void Server::unreliableBroadcast(Packet& packet)
|
void Server::unreliableBroadcast(Packet& packet)
|
||||||
{
|
{
|
||||||
m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers);
|
m_Unreliable.SendToConnectedPlayers(packet, m_ConnectedPlayers);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send snapshot fields
|
// Send snapshot fields
|
||||||
@@ -192,16 +173,10 @@ void Server::sendSnapshot()
|
|||||||
Packet packet(MessageType::Snapshot);
|
Packet packet(MessageType::Snapshot);
|
||||||
addInputCommandsToPacket(packet);
|
addInputCommandsToPacket(packet);
|
||||||
addPlayersToPacket(packet, EntityID_Invalid);
|
addPlayersToPacket(packet, EntityID_Invalid);
|
||||||
|
//addChildrenToPacket(packet, EntityID_Invalid);
|
||||||
unreliableBroadcast(packet);
|
unreliableBroadcast(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send snapshot fields
|
|
||||||
void Server::createWorldSnapshot(Packet& packet)
|
|
||||||
{
|
|
||||||
addInputCommandsToPacket(packet);
|
|
||||||
addChildrenToPacket(packet, EntityID_Invalid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Server::addInputCommandsToPacket(Packet& packet)
|
void Server::addInputCommandsToPacket(Packet& packet)
|
||||||
{
|
{
|
||||||
// Number of input commands
|
// Number of input commands
|
||||||
@@ -404,7 +379,8 @@ void Server::parseTCPConnect(Packet & packet)
|
|||||||
m_Reliable.Send(connnectPacket, m_ConnectedPlayers.at(playerID));
|
m_Reliable.Send(connnectPacket, m_ConnectedPlayers.at(playerID));
|
||||||
|
|
||||||
Packet firstSnapshot(MessageType::Snapshot);
|
Packet firstSnapshot(MessageType::Snapshot);
|
||||||
createWorldSnapshot(firstSnapshot);
|
addInputCommandsToPacket(firstSnapshot);
|
||||||
|
addChildrenToPacket(firstSnapshot, EntityID_Invalid);
|
||||||
m_Reliable.Send(firstSnapshot);
|
m_Reliable.Send(firstSnapshot);
|
||||||
|
|
||||||
// Send notification that a player has connected
|
// Send notification that a player has connected
|
||||||
@@ -566,13 +542,6 @@ bool Server::OnPlayerDeath(const Events::PlayerDeath& e)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Server::OnWin(const Events::Win & e)
|
|
||||||
{
|
|
||||||
// Postpone the gameover reset
|
|
||||||
m_GameIsOver = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Server::parseClientPing()
|
void Server::parseClientPing()
|
||||||
{
|
{
|
||||||
LOG_INFO("%i: Parsing ping", m_PacketID);
|
LOG_INFO("%i: Parsing ping", m_PacketID);
|
||||||
@@ -694,20 +663,4 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
|
||||||
|
|
||||||
void Server::resetMap()
|
|
||||||
{
|
|
||||||
m_GameIsOver = false;
|
|
||||||
Events::Reset reset;
|
|
||||||
m_EventBroker->Publish(reset);
|
|
||||||
Packet removeMap(MessageType::RemoveWorld);
|
|
||||||
reliableBroadcast(removeMap);
|
|
||||||
removeWorld();
|
|
||||||
// Hardcoded for now.
|
|
||||||
auto entityFile = ResourceManager::Load<EntityFile>("Schema/Entities/CP_Rocky2.xml");
|
|
||||||
entityFile->MergeInto(m_World);
|
|
||||||
Packet newWorld(MessageType::Snapshot);
|
|
||||||
createWorldSnapshot(newWorld);
|
|
||||||
reliableBroadcast(newWorld);
|
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@ void AnimationSystem::CreateBlendTrees()
|
|||||||
continue;;
|
continue;;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ void AnimationSystem::UpdateAnimations(double dt)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -175,7 +175,7 @@ bool AnimationSystem::OnAutoAnimationBlend(Events::AutoAnimationBlend& e)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -294,7 +294,7 @@ bool AnimationSystem::OnEntityDeleted(Events::EntityDeleted& e)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -325,7 +325,7 @@ bool AnimationSystem::OnSetBlendWeight(Events::SetBlendWeight& e)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ void AutoBlendQueue::Insert(AutoBlendJob autoBlendJob)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ bool AutoBlendQueue::HasActiveBlendJob()
|
|||||||
return HasActiveBlendJob();
|
return HasActiveBlendJob();
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
m_BlendQueue.pop_front();
|
m_BlendQueue.pop_front();
|
||||||
return HasActiveBlendJob();
|
return HasActiveBlendJob();
|
||||||
@@ -173,7 +173,7 @@ std::shared_ptr<BlendTree> AutoBlendQueue::GetBlendTree()
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
if (skeleton == nullptr) {
|
if (skeleton == nullptr) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ void BoneAttachmentSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapp
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Skeleton* skeleton = model->m_RawModel->m_Skeleton;
|
Skeleton* skeleton = model->m_Skeleton;
|
||||||
|
|
||||||
if(skeleton == nullptr) {
|
if(skeleton == nullptr) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -65,15 +65,6 @@ void DrawFinalPass::InitializeShaderPrograms()
|
|||||||
m_ForwardPlusProgram->Link();
|
m_ForwardPlusProgram->Link();
|
||||||
GLERROR("Creating forward+ program");
|
GLERROR("Creating forward+ program");
|
||||||
|
|
||||||
m_ForwardPlusNoShadowsProgram = ResourceManager::Load<ShaderProgram>("#ForwardPlusNoShadowProgram");
|
|
||||||
m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ForwardPlus.vert.glsl")));
|
|
||||||
m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/ForwardPlusNoShadows.frag.glsl")));
|
|
||||||
m_ForwardPlusNoShadowsProgram->Compile();
|
|
||||||
m_ForwardPlusNoShadowsProgram->BindFragDataLocation(0, "sceneColor");
|
|
||||||
m_ForwardPlusNoShadowsProgram->BindFragDataLocation(1, "bloomColor");
|
|
||||||
m_ForwardPlusNoShadowsProgram->Link();
|
|
||||||
GLERROR("Creating forward+ program without shadows");
|
|
||||||
|
|
||||||
m_ExplosionEffectProgram = ResourceManager::Load<ShaderProgram>("#ExplosionEffectProgram");
|
m_ExplosionEffectProgram = ResourceManager::Load<ShaderProgram>("#ExplosionEffectProgram");
|
||||||
m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ForwardPlus.vert.glsl")));
|
m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ForwardPlus.vert.glsl")));
|
||||||
m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new GeometryShader("Shaders/ExplosionEffect.geom.glsl")));
|
m_ExplosionEffectProgram->AddShader(std::shared_ptr<Shader>(new GeometryShader("Shaders/ExplosionEffect.geom.glsl")));
|
||||||
@@ -363,12 +354,7 @@ void DrawFinalPass::OnWindowResize()
|
|||||||
|
|
||||||
void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
||||||
{
|
{
|
||||||
GLuint forwardHandle;
|
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
||||||
if (m_ShadowPass->EnableShadows()) {
|
|
||||||
forwardHandle = m_ForwardPlusProgram->GetHandle();
|
|
||||||
} else {
|
|
||||||
forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle();
|
|
||||||
}
|
|
||||||
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
||||||
GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle();
|
GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle();
|
||||||
GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle();
|
GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle();
|
||||||
@@ -544,19 +530,15 @@ void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>&
|
|||||||
std::vector<glm::mat4> frameBones;
|
std::vector<glm::mat4> frameBones;
|
||||||
if (modelJob->BlendTree != nullptr) {
|
if (modelJob->BlendTree != nullptr) {
|
||||||
frameBones = modelJob->BlendTree->GetFinalPose();
|
frameBones = modelJob->BlendTree->GetFinalPose();
|
||||||
} else {
|
} else if (modelJob->Skeleton != nullptr) {
|
||||||
frameBones = modelJob->Skeleton->GetTPose();
|
frameBones = modelJob->Skeleton->GetTPose();
|
||||||
}
|
}
|
||||||
glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (lastShader != forwardHandle) {
|
if (lastShader != m_ForwardPlusProgram->GetHandle()) {
|
||||||
if (forwardHandle == m_ForwardPlusProgram->GetHandle()) {
|
m_ForwardPlusProgram->Bind();
|
||||||
m_ForwardPlusProgram->Bind();
|
lastShader = m_ForwardPlusProgram->GetHandle();
|
||||||
} else {
|
|
||||||
m_ForwardPlusNoShadowsProgram->Bind();
|
|
||||||
}
|
|
||||||
lastShader = forwardHandle;
|
|
||||||
GLERROR("Bind ForwardPlusProgram program");
|
GLERROR("Bind ForwardPlusProgram program");
|
||||||
glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
||||||
glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
@@ -641,12 +623,7 @@ void DrawFinalPass::DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>&
|
|||||||
|
|
||||||
void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
||||||
{
|
{
|
||||||
GLuint forwardHandle;
|
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
||||||
if (m_ShadowPass->EnableShadows()) {
|
|
||||||
forwardHandle = m_ForwardPlusProgram->GetHandle();
|
|
||||||
} else {
|
|
||||||
forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle();
|
|
||||||
}
|
|
||||||
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
||||||
GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle();
|
GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle();
|
||||||
GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle();
|
GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle();
|
||||||
@@ -1047,14 +1024,9 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_p
|
|||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (lastShader != forwardHandle) {
|
if (lastShader != m_ForwardPlusProgram->GetHandle()) {
|
||||||
if (forwardHandle == m_ForwardPlusProgram->GetHandle()) {
|
m_ForwardPlusProgram->Bind();
|
||||||
m_ForwardPlusProgram->Bind();
|
lastShader = m_ForwardPlusProgram->GetHandle();
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ForwardPlusNoShadowsProgram->Bind();
|
|
||||||
}
|
|
||||||
lastShader = forwardHandle;
|
|
||||||
GLERROR("Bind ForwardPlusProgram program");
|
GLERROR("Bind ForwardPlusProgram program");
|
||||||
glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality());
|
||||||
glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix()));
|
||||||
@@ -1140,12 +1112,7 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_p
|
|||||||
|
|
||||||
void DrawFinalPass::DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
void DrawFinalPass::DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene)
|
||||||
{
|
{
|
||||||
GLuint forwardHandle;
|
GLuint forwardHandle = m_ForwardPlusProgram->GetHandle();
|
||||||
if (m_ShadowPass->EnableShadows()) {
|
|
||||||
forwardHandle = m_ForwardPlusProgram->GetHandle();
|
|
||||||
} else {
|
|
||||||
forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle();
|
|
||||||
}
|
|
||||||
GLERROR("forwardHandle");
|
GLERROR("forwardHandle");
|
||||||
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle();
|
||||||
GLERROR("explosionHandle");
|
GLERROR("explosionHandle");
|
||||||
@@ -1204,11 +1171,7 @@ void DrawFinalPass::DrawShieldedModelRenderQueue(std::list<std::shared_ptr<Rende
|
|||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(job);
|
||||||
if (modelJob) {
|
if (modelJob) {
|
||||||
//bind forward program
|
//bind forward program
|
||||||
if (m_ShadowPass->EnableShadows()) {
|
m_ForwardPlusProgram->Bind();
|
||||||
m_ForwardPlusProgram->Bind();
|
|
||||||
} else {
|
|
||||||
m_ForwardPlusNoShadowsProgram->Bind();
|
|
||||||
}
|
|
||||||
glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
|
||||||
//bind uniforms
|
//bind uniforms
|
||||||
|
|||||||
@@ -2,8 +2,10 @@
|
|||||||
|
|
||||||
Model::Model(std::string fileName)
|
Model::Model(std::string fileName)
|
||||||
{
|
{
|
||||||
|
//fileName = "Models/Core/ScreenQuad.mesh";
|
||||||
//Try loading the model asyncronously, if it throws any exceptions then let it propagate back to caller.
|
//Try loading the model asyncronously, if it throws any exceptions then let it propagate back to caller.
|
||||||
m_RawModel = ResourceManager::Load<RawModel, true>(fileName);
|
auto m_RawModel = ResourceManager::Load<RawModel, true>(fileName);
|
||||||
|
//throw FailedLoadingException("Test");
|
||||||
|
|
||||||
for (auto& materialProperty : m_RawModel->m_Materials) {
|
for (auto& materialProperty : m_RawModel->m_Materials) {
|
||||||
switch (materialProperty.type) {
|
switch (materialProperty.type) {
|
||||||
@@ -99,14 +101,24 @@ Model::Model(std::string fileName)
|
|||||||
|
|
||||||
glm::vec3 mini(INFINITY);
|
glm::vec3 mini(INFINITY);
|
||||||
glm::vec3 maxi(-INFINITY);
|
glm::vec3 maxi(-INFINITY);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < m_RawModel->NumVertices(); i++) {
|
for (unsigned int i = 0; i < m_RawModel->NumVertices(); i++) {
|
||||||
const auto& v = m_RawModel->Vertices()[i];
|
const auto& v = m_RawModel->Vertices()[i];
|
||||||
mini = glm::min(mini, v.Position);
|
mini = glm::min(mini, v.Position);
|
||||||
maxi = glm::max(maxi, v.Position);
|
maxi = glm::max(maxi, v.Position);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Box = AABB(mini, maxi);
|
m_Box = AABB(mini, maxi);
|
||||||
|
|
||||||
|
//m_Skeleton = m_RawModel->m_Skeleton;
|
||||||
|
delete m_RawModel->m_Skeleton;
|
||||||
|
m_Materials = m_RawModel->m_Materials;
|
||||||
|
//m_Indices = m_RawModel->m_Indices;
|
||||||
|
m_IsSkinned = m_RawModel->IsSkinned();
|
||||||
|
// Copy vertex positions for collisions later
|
||||||
|
for (auto& v : m_RawModel->m_Vertices) {
|
||||||
|
//m_Vertices.push_back(v.Position);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResourceManager::Release("RawModel", fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
Model::~Model()
|
Model::~Model()
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ void PickingPass::Draw(RenderScene& scene)
|
|||||||
std::vector<glm::mat4> frameBones;
|
std::vector<glm::mat4> frameBones;
|
||||||
if (modelJob->BlendTree != nullptr) {
|
if (modelJob->BlendTree != nullptr) {
|
||||||
frameBones = modelJob->BlendTree->GetFinalPose();
|
frameBones = modelJob->BlendTree->GetFinalPose();
|
||||||
} else {
|
} else if (modelJob->Skeleton != nullptr) {
|
||||||
frameBones = modelJob->Skeleton->GetTPose();
|
frameBones = modelJob->Skeleton->GetTPose();
|
||||||
}
|
}
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
|
|||||||
@@ -493,12 +493,13 @@ void RawModelCustom::ReadAnimationKeyFrame(std::size_t& offset, char* fileData,
|
|||||||
|
|
||||||
RawModelCustom::~RawModelCustom()
|
RawModelCustom::~RawModelCustom()
|
||||||
{
|
{
|
||||||
if (m_Skeleton != nullptr) {
|
// Ownership of skeleton and materials get transferred to Model
|
||||||
delete m_Skeleton;
|
// if (m_Skeleton != nullptr) {
|
||||||
}
|
// delete m_Skeleton;
|
||||||
for (auto material : m_Materials) {
|
// }
|
||||||
delete material.material;
|
//for (auto material : m_Materials) {
|
||||||
}
|
// delete material.material;
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -168,10 +168,8 @@ void Renderer::Draw(RenderFrame& frame)
|
|||||||
|
|
||||||
ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3);
|
ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3);
|
||||||
ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3);
|
ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3);
|
||||||
ImGui::Checkbox("EnableShadows", &m_Shadow_Enabled);
|
|
||||||
m_SSAOPass->ChangeQuality(m_SSAO_Quality);
|
m_SSAOPass->ChangeQuality(m_SSAO_Quality);
|
||||||
m_DrawBloomPass->ChangeQuality(m_GLOW_Quality);
|
m_DrawBloomPass->ChangeQuality(m_GLOW_Quality);
|
||||||
m_ShadowPass->CheckStatus(m_Shadow_Enabled);
|
|
||||||
GLERROR("SSAO Settings");
|
GLERROR("SSAO Settings");
|
||||||
//clear buffer 0
|
//clear buffer 0
|
||||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||||
|
|||||||
+127
-148
@@ -6,7 +6,7 @@ ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y)
|
|||||||
m_ResolutionSizeWidth = shadow_res_x;
|
m_ResolutionSizeWidth = shadow_res_x;
|
||||||
m_ResolutionSizeHeight = shadow_res_y;
|
m_ResolutionSizeHeight = shadow_res_y;
|
||||||
|
|
||||||
CheckStatus(true);
|
InitializeFrameBuffers();
|
||||||
InitializeShaderPrograms();
|
InitializeShaderPrograms();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,17 +14,18 @@ ShadowPass::ShadowPass(IRenderer * renderer)
|
|||||||
{
|
{
|
||||||
m_Renderer = renderer;
|
m_Renderer = renderer;
|
||||||
|
|
||||||
CheckStatus(true);
|
InitializeFrameBuffers();
|
||||||
InitializeShaderPrograms();
|
InitializeShaderPrograms();
|
||||||
}
|
}
|
||||||
|
|
||||||
ShadowPass::~ShadowPass()
|
ShadowPass::~ShadowPass()
|
||||||
{
|
{
|
||||||
CommonFunctions::DeleteTexture(&m_DepthMap);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::DebugGUI()
|
void ShadowPass::DebugGUI()
|
||||||
{
|
{
|
||||||
|
ImGui::Checkbox("EnableShadows", &m_EnableShadows);
|
||||||
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f);
|
ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f);
|
||||||
ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f);
|
ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f);
|
||||||
ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects);
|
ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects);
|
||||||
@@ -125,7 +126,6 @@ float ShadowPass::FindRadius(ShadowFrustum& frustum)
|
|||||||
void ShadowPass::InitializeFrameBuffers()
|
void ShadowPass::InitializeFrameBuffers()
|
||||||
{
|
{
|
||||||
// Depth texture
|
// Depth texture
|
||||||
glDeleteTextures(1, &m_DepthMap);
|
|
||||||
glGenTextures(1, &m_DepthMap);
|
glGenTextures(1, &m_DepthMap);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap);
|
||||||
@@ -156,12 +156,12 @@ void ShadowPass::InitializeShaderPrograms()
|
|||||||
m_ShadowProgram->BindFragDataLocation(0, "ShadowMap");
|
m_ShadowProgram->BindFragDataLocation(0, "ShadowMap");
|
||||||
m_ShadowProgram->Link();
|
m_ShadowProgram->Link();
|
||||||
|
|
||||||
m_ShadowProgramSkinned = ResourceManager::Load<ShaderProgram>("#ShadowProgramSkinned");
|
m_ShadowProgramSkinned = ResourceManager::Load<ShaderProgram>("#ShadowProgramSkinned");
|
||||||
m_ShadowProgramSkinned->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ShadowSkinned.vert.glsl")));
|
m_ShadowProgramSkinned->AddShader(std::shared_ptr<Shader>(new VertexShader("Shaders/ShadowSkinned.vert.glsl")));
|
||||||
m_ShadowProgramSkinned->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Shadow.frag.glsl")));
|
m_ShadowProgramSkinned->AddShader(std::shared_ptr<Shader>(new FragmentShader("Shaders/Shadow.frag.glsl")));
|
||||||
m_ShadowProgramSkinned->Compile();
|
m_ShadowProgramSkinned->Compile();
|
||||||
m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap");
|
m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap");
|
||||||
m_ShadowProgramSkinned->Link();
|
m_ShadowProgramSkinned->Link();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::ClearBuffer()
|
void ShadowPass::ClearBuffer()
|
||||||
@@ -209,109 +209,53 @@ void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum)
|
|||||||
frustum.LRBT = { left, right, bottom, top };
|
frustum.LRBT = { left, right, bottom, top };
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShadowPass::CheckStatus(bool shadowStatus)
|
|
||||||
{
|
|
||||||
if (m_EnableShadows == shadowStatus) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_EnableShadows = shadowStatus;
|
|
||||||
|
|
||||||
if (m_EnableShadows == false) {
|
|
||||||
CommonFunctions::DeleteTexture(&m_DepthMap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
InitializeFrameBuffers();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ShadowPass::Draw(RenderScene & scene)
|
void ShadowPass::Draw(RenderScene & scene)
|
||||||
{
|
{
|
||||||
if (!m_EnableShadows) {
|
if (m_EnableShadows) {
|
||||||
return;
|
InitializeCameras(scene);
|
||||||
}
|
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
||||||
|
|
||||||
InitializeCameras(scene);
|
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
||||||
UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip());
|
|
||||||
|
|
||||||
ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle());
|
|
||||||
|
glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight);
|
||||||
|
|
||||||
glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight);
|
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
||||||
|
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
|
||||||
|
|
||||||
for (int i = 0; i < m_CurrentNrOfSplits; i++) {
|
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
||||||
UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward());
|
|
||||||
|
|
||||||
glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i);
|
|
||||||
|
|
||||||
GLuint shaderHandle;
|
|
||||||
|
|
||||||
for (auto &job : scene.Jobs.DirectionalLight) {
|
|
||||||
|
|
||||||
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
|
||||||
|
|
||||||
if (directionalLightJob) {
|
|
||||||
m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f));
|
|
||||||
|
|
||||||
PointsToLightspace(m_shadowFrusta[i], m_LightView[i]);
|
|
||||||
//FindRadius(m_shadowFrusta[i]);
|
|
||||||
//RadiusToLightspace(m_shadowFrusta[i]);
|
|
||||||
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
|
|
||||||
|
|
||||||
|
|
||||||
m_ShadowProgram->Bind();
|
GLuint shaderHandle;
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
|
||||||
|
|
||||||
m_ShadowProgramSkinned->Bind();
|
for (auto &job : scene.Jobs.DirectionalLight) {
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
auto directionalLightJob = std::dynamic_pointer_cast<DirectionalLightJob>(job);
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
|
||||||
|
if (directionalLightJob) {
|
||||||
|
m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f));
|
||||||
|
|
||||||
|
PointsToLightspace(m_shadowFrusta[i], m_LightView[i]);
|
||||||
|
//FindRadius(m_shadowFrusta[i]);
|
||||||
|
//RadiusToLightspace(m_shadowFrusta[i]);
|
||||||
|
m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]);
|
||||||
|
|
||||||
|
|
||||||
|
m_ShadowProgram->Bind();
|
||||||
|
shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||||
|
|
||||||
|
m_ShadowProgramSkinned->Bind();
|
||||||
|
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i]));
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i]));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
GLERROR("ShadowLight ERROR");
|
GLERROR("ShadowLight ERROR");
|
||||||
|
|
||||||
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
for (auto &objectJob : scene.Jobs.OpaqueObjects) {
|
||||||
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
|
||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
|
||||||
|
|
||||||
if (!modelJob->Shadow) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (modelJob->Model->IsSkinned()) {
|
|
||||||
m_ShadowProgramSkinned->Bind();
|
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
|
||||||
|
|
||||||
std::vector<glm::mat4> frameBones;
|
|
||||||
if (modelJob->BlendTree != nullptr) {
|
|
||||||
frameBones = modelJob->BlendTree->GetFinalPose();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
frameBones = modelJob->Skeleton->GetTPose();
|
|
||||||
}
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
m_ShadowProgram->Bind();
|
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
|
||||||
}
|
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
|
||||||
|
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
|
||||||
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
|
||||||
|
|
||||||
GLERROR("Shadow Draw ERROR");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m_TransparentObjects) {
|
|
||||||
state->CullFace(GL_BACK);
|
|
||||||
for (auto &objectJob : scene.Jobs.TransparentObjects) {
|
|
||||||
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
||||||
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
||||||
|
|
||||||
@@ -319,53 +263,25 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (modelJob->Model->IsSkinned()) {
|
if(modelJob->Model->IsSkinned()) {
|
||||||
m_ShadowProgramSkinned->Bind();
|
m_ShadowProgramSkinned->Bind();
|
||||||
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||||
|
|
||||||
std::vector<glm::mat4> frameBones;
|
std::vector<glm::mat4> frameBones;
|
||||||
if (modelJob->BlendTree != nullptr) {
|
if (modelJob->BlendTree != nullptr) {
|
||||||
frameBones = modelJob->BlendTree->GetFinalPose();
|
frameBones = modelJob->BlendTree->GetFinalPose();
|
||||||
}
|
} else if (modelJob->Skeleton != nullptr) {
|
||||||
else {
|
frameBones = modelJob->Skeleton->GetTPose();
|
||||||
frameBones = modelJob->Skeleton->GetTPose();
|
}
|
||||||
}
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
|
||||||
|
|
||||||
}
|
} else {
|
||||||
else {
|
m_ShadowProgram->Bind();
|
||||||
m_ShadowProgram->Bind();
|
shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
shaderHandle = m_ShadowProgram->GetHandle();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f);
|
||||||
|
|
||||||
if (m_TexturedShadows) {
|
|
||||||
switch (modelJob->Type) {
|
|
||||||
case RawModel::MaterialType::SingleTextures:
|
|
||||||
case RawModel::MaterialType::Basic:
|
|
||||||
{
|
|
||||||
glActiveTexture(GL_TEXTURE24);
|
|
||||||
if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) {
|
|
||||||
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture);
|
|
||||||
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
|
||||||
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case RawModel::MaterialType::SplatMapping:
|
|
||||||
{
|
|
||||||
glActiveTexture(GL_TEXTURE24);
|
|
||||||
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
|
||||||
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
glBindVertexArray(modelJob->Model->VAO);
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
@@ -374,13 +290,76 @@ void ShadowPass::Draw(RenderScene & scene)
|
|||||||
GLERROR("Shadow Draw ERROR");
|
GLERROR("Shadow Draw ERROR");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
state->CullFace(GL_FRONT);
|
if (m_TransparentObjects) {
|
||||||
|
state->CullFace(GL_BACK);
|
||||||
|
for (auto &objectJob : scene.Jobs.TransparentObjects) {
|
||||||
|
if (!std::dynamic_pointer_cast<ExplosionEffectJob>(objectJob)) {
|
||||||
|
auto modelJob = std::dynamic_pointer_cast<ModelJob>(objectJob);
|
||||||
|
|
||||||
|
if (!modelJob->Shadow) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modelJob->Model->IsSkinned()) {
|
||||||
|
m_ShadowProgramSkinned->Bind();
|
||||||
|
shaderHandle = m_ShadowProgramSkinned->GetHandle();
|
||||||
|
|
||||||
|
std::vector<glm::mat4> frameBones;
|
||||||
|
if (modelJob->BlendTree != nullptr) {
|
||||||
|
frameBones = modelJob->BlendTree->GetFinalPose();
|
||||||
|
} else {
|
||||||
|
frameBones = modelJob->Skeleton->GetTPose();
|
||||||
|
}
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0]));
|
||||||
|
|
||||||
|
} else {
|
||||||
|
m_ShadowProgram->Bind();
|
||||||
|
shaderHandle = m_ShadowProgram->GetHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix));
|
||||||
|
glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a);
|
||||||
|
|
||||||
|
if (m_TexturedShadows) {
|
||||||
|
switch (modelJob->Type) {
|
||||||
|
case RawModel::MaterialType::SingleTextures:
|
||||||
|
case RawModel::MaterialType::Basic:
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE24);
|
||||||
|
if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case RawModel::MaterialType::SplatMapping:
|
||||||
|
{
|
||||||
|
glActiveTexture(GL_TEXTURE24);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture);
|
||||||
|
glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindVertexArray(modelJob->Model->VAO);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer);
|
||||||
|
glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int)));
|
||||||
|
|
||||||
|
GLERROR("Shadow Draw ERROR");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state->CullFace(GL_FRONT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
||||||
|
m_DepthBuffer.Unbind();
|
||||||
|
delete state;
|
||||||
}
|
}
|
||||||
|
|
||||||
glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height);
|
|
||||||
m_DepthBuffer.Unbind();
|
|
||||||
delete state;
|
|
||||||
}
|
}
|
||||||
+2
-2
@@ -232,10 +232,10 @@ void Game::Tick()
|
|||||||
PerformanceTimer::StartTimerAndStopPrevious("Network");
|
PerformanceTimer::StartTimerAndStopPrevious("Network");
|
||||||
m_EventBroker->Process<MultiplayerSnapshotFilter>();
|
m_EventBroker->Process<MultiplayerSnapshotFilter>();
|
||||||
if (m_NetworkClient != nullptr) {
|
if (m_NetworkClient != nullptr) {
|
||||||
m_NetworkClient->Update(dt);
|
m_NetworkClient->Update();
|
||||||
}
|
}
|
||||||
if (m_NetworkServer != nullptr) {
|
if (m_NetworkServer != nullptr) {
|
||||||
m_NetworkServer->Update(dt);
|
m_NetworkServer->Update();
|
||||||
}
|
}
|
||||||
//m_SoundManager->Update(dt);
|
//m_SoundManager->Update(dt);
|
||||||
|
|
||||||
|
|||||||
@@ -10,26 +10,8 @@ CapturePointSystem::CapturePointSystem(SystemParams params)
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &CapturePointSystem::OnTriggerTouch);
|
EVENT_SUBSCRIBE_MEMBER(m_ETriggerTouch, &CapturePointSystem::OnTriggerTouch);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &CapturePointSystem::OnTriggerLeave);
|
EVENT_SUBSCRIBE_MEMBER(m_ETriggerLeave, &CapturePointSystem::OnTriggerLeave);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ECaptured, &CapturePointSystem::OnCaptured);
|
EVENT_SUBSCRIBE_MEMBER(m_ECaptured, &CapturePointSystem::OnCaptured);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EReset, &CapturePointSystem::OnReset);
|
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void CapturePointSystem::Init()
|
|
||||||
{
|
|
||||||
m_WinnerWasFound = false;
|
|
||||||
//need to track these variables for the captureSystem to work as per design!
|
|
||||||
m_RedTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
|
||||||
m_BlueTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
|
||||||
m_RedTeamHomeCapturePoint = m_NotACapturePoint;
|
|
||||||
m_BlueTeamHomeCapturePoint = m_NotACapturePoint;
|
|
||||||
m_NumberOfCapturePoints = 0;
|
|
||||||
m_ResetTimers = false;
|
|
||||||
m_RecentlyCapturedNeedNextCapturePointNow = false;
|
|
||||||
m_CapturePointNumberToEntityMap.clear();
|
|
||||||
//vectors which will keep track of enter/leave changes
|
|
||||||
m_ETriggerTouchVector.clear();
|
|
||||||
m_ETriggerLeaveVector.clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//here all capturepoints will update their component
|
//here all capturepoints will update their component
|
||||||
@@ -42,9 +24,6 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp
|
|||||||
if (m_WinnerWasFound) {
|
if (m_WinnerWasFound) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!capturePointEntity.Valid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const int capturePointNumber = cCapturePoint["CapturePointNumber"];
|
const int capturePointNumber = cCapturePoint["CapturePointNumber"];
|
||||||
const bool hasTeamComponent = capturePointEntity.HasComponent("Team");
|
const bool hasTeamComponent = capturePointEntity.HasComponent("Team");
|
||||||
|
|
||||||
@@ -81,7 +60,7 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp
|
|||||||
}
|
}
|
||||||
|
|
||||||
//if we havent received all capturepoints yet, just return
|
//if we havent received all capturepoints yet, just return
|
||||||
if (m_NumberOfCapturePoints == 0 || m_NumberOfCapturePoints > m_CapturePointNumberToEntityMap.size()) {
|
if (m_NumberOfCapturePoints == 0 || m_NumberOfCapturePoints != m_CapturePointNumberToEntityMap.size()) {
|
||||||
m_CapturePointNumberToEntityMap.insert(std::make_pair(capturePointNumber, capturePointEntity));
|
m_CapturePointNumberToEntityMap.insert(std::make_pair(capturePointNumber, capturePointEntity));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -253,10 +232,10 @@ void CapturePointSystem::UpdateComponent(EntityWrapper& capturePointEntity, Comp
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner)
|
void CapturePointSystem::ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner) {
|
||||||
{
|
|
||||||
(Field<bool>)capturePointModels["Model"]["Visible"] = isOwner;
|
(Field<bool>)capturePointModels["Model"]["Visible"] = isOwner;
|
||||||
for (auto& capModel : capturePointModels.ChildrenWithComponent("Transform")) {
|
for (auto& capModel : capturePointModels.ChildrenWithComponent("Transform"))
|
||||||
|
{
|
||||||
if (capModel.HasComponent("Model")) {
|
if (capModel.HasComponent("Model")) {
|
||||||
(Field<bool>)capModel["Model"]["Visible"] = isOwner;
|
(Field<bool>)capModel["Model"]["Visible"] = isOwner;
|
||||||
}
|
}
|
||||||
@@ -290,9 +269,3 @@ bool CapturePointSystem::OnCaptured(const Events::Captured& e)
|
|||||||
m_ResetTimers = true;
|
m_ResetTimers = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CapturePointSystem::OnReset(const Events::Reset& e)
|
|
||||||
{
|
|
||||||
Init();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -9,8 +9,6 @@ ScoreScreenSystem::ScoreScreenSystem(SystemParams params)
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &ScoreScreenSystem::OnPlayerSpawn);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerSpawned, &ScoreScreenSystem::OnPlayerSpawn);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerConnected, &ScoreScreenSystem::OnPlayerConnected);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerConnected, &ScoreScreenSystem::OnPlayerConnected);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDisconnected, &ScoreScreenSystem::OnPlayerDisconnected);
|
EVENT_SUBSCRIBE_MEMBER(m_EPlayerDisconnected, &ScoreScreenSystem::OnPlayerDisconnected);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EReset, &ScoreScreenSystem::OnReset);
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &ScoreScreenSystem::OnInputCommand);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ScoreScreenSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt)
|
void ScoreScreenSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt)
|
||||||
@@ -158,25 +156,3 @@ bool ScoreScreenSystem::OnPlayerDisconnected(const Events::PlayerDisconnected& e
|
|||||||
m_DisconnectedIdentities.push_back(e.PlayerID);
|
m_DisconnectedIdentities.push_back(e.PlayerID);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ScoreScreenSystem::OnReset(const Events::Reset & e)
|
|
||||||
{
|
|
||||||
for (auto& it : m_PlayerIdentities) {
|
|
||||||
it.second.Deaths = 0;
|
|
||||||
it.second.Kills = 0;
|
|
||||||
it.second.Team = 1;
|
|
||||||
it.second.Player = EntityWrapper::Invalid;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ScoreScreenSystem::OnInputCommand(const Events::InputCommand & e)
|
|
||||||
{
|
|
||||||
if (e.Command != "PickTeam" || e.PlayerID == -1 || e.Value == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_PlayerIdentities.at(e.PlayerID).Team = e.Value;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -103,15 +103,15 @@ bool SpawnerSystem::spawnedEntityIsColliding(EntityWrapper spawnedEntity, Entity
|
|||||||
if (!spawnedBox.Entity.HasComponent("Model")) {
|
if (!spawnedBox.Entity.HasComponent("Model")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
RawModel* model = nullptr;
|
Model* model = nullptr;
|
||||||
try {
|
try {
|
||||||
model = ResourceManager::Load<RawModel, true>(otherEntity["Model"]["Resource"]);
|
model = ResourceManager::Load<Model, true>(otherEntity["Model"]["Resource"]);
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (model != nullptr && Collision::AABBvsTriangles(
|
if (model != nullptr && Collision::AABBvsTriangles(
|
||||||
spawnedBox,
|
spawnedBox,
|
||||||
model->Vertices(),
|
model->m_Vertices,
|
||||||
model->m_Indices,
|
model->m_Indices,
|
||||||
TransformSystem::ModelMatrix(otherEntity))) {
|
TransformSystem::ModelMatrix(otherEntity))) {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ SpectatorCameraSystem::SpectatorCameraSystem(SystemParams params)
|
|||||||
{
|
{
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &SpectatorCameraSystem::OnInputCommand);
|
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &SpectatorCameraSystem::OnInputCommand);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EDisconnect, &SpectatorCameraSystem::OnDisconnect);
|
EVENT_SUBSCRIBE_MEMBER(m_EDisconnect, &SpectatorCameraSystem::OnDisconnect);
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EReset, &SpectatorCameraSystem::OnReset);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpectatorCameraSystem::Update(double dt)
|
void SpectatorCameraSystem::Update(double dt)
|
||||||
@@ -28,14 +27,6 @@ void SpectatorCameraSystem::Update(double dt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpectatorCameraSystem::reset()
|
|
||||||
{
|
|
||||||
m_CamSetToTeamPick = false;
|
|
||||||
// They will also be set to menu, so unlock mouse just in case they were in game with locked mouse.
|
|
||||||
Events::UnlockMouse unlock;
|
|
||||||
m_EventBroker->Publish(unlock);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SpectatorCameraSystem::OnInputCommand(const Events::InputCommand& e)
|
bool SpectatorCameraSystem::OnInputCommand(const Events::InputCommand& e)
|
||||||
{
|
{
|
||||||
// Only the client should do this, and only if player is not spawned.
|
// Only the client should do this, and only if player is not spawned.
|
||||||
@@ -104,13 +95,10 @@ bool SpectatorCameraSystem::OnDisconnect(const Events::PlayerDisconnected& e)
|
|||||||
// If local player gets disconnected, they should be set to
|
// If local player gets disconnected, they should be set to
|
||||||
// the spectator camera next time a map loads that has one.
|
// the spectator camera next time a map loads that has one.
|
||||||
if (e.Entity == LocalPlayer.ID) {
|
if (e.Entity == LocalPlayer.ID) {
|
||||||
reset();
|
m_CamSetToTeamPick = false;
|
||||||
|
// They will also be set to menu, so unlock mouse just in case they were in game with locked mouse.
|
||||||
|
Events::UnlockMouse unlock;
|
||||||
|
m_EventBroker->Publish(unlock);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SpectatorCameraSystem::OnReset(const Events::Reset & e)
|
|
||||||
{
|
|
||||||
reset();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ bool Material::findColorTexture(MaterialNode& material_node, MFnDependencyNode&
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
||||||
MGlobal::displayInfo(MString() + "found color splat map");
|
MGlobal::displayInfo(MString() + "find splat map");
|
||||||
return findSplatTextures(material_node, material_node.ColorMaps, MFnDependencyNode(AllConnections[i].node()));
|
return findSplatTextures(material_node, material_node.ColorMaps, MFnDependencyNode(AllConnections[i].node()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -162,9 +162,9 @@ bool Material::findNormalTexture(MaterialNode& material_node, MFnDependencyNode&
|
|||||||
|
|
||||||
material_node.NormalMaps.push_back(newTexture);
|
material_node.NormalMaps.push_back(newTexture);
|
||||||
return true;
|
return true;
|
||||||
} else if (AllBumpConnections[j].node().hasFn(MFn::kLayeredTexture)) {
|
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
||||||
MGlobal::displayInfo(MString() + "found normal splat map");
|
MGlobal::displayInfo(MString() + "find splat map");
|
||||||
return findSplatTextures(material_node, material_node.NormalMaps, MFnDependencyNode(AllBumpConnections[j].node()));
|
return findSplatTextures(material_node, material_node.NormalMaps, MFnDependencyNode(AllConnections[i].node()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,7 +218,7 @@ bool Material::findSpecularTexture(MaterialNode& material_node, MFnDependencyNod
|
|||||||
material_node.type = MaterialNode::MaterialType::SingleTextures;
|
material_node.type = MaterialNode::MaterialType::SingleTextures;
|
||||||
return true;
|
return true;
|
||||||
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
||||||
MGlobal::displayInfo(MString() + "found specular splat map");
|
MGlobal::displayInfo(MString() + "find splat map");
|
||||||
return findSplatTextures(material_node, material_node.SpecularMaps, MFnDependencyNode(AllConnections[i].node()));
|
return findSplatTextures(material_node, material_node.SpecularMaps, MFnDependencyNode(AllConnections[i].node()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,7 +270,7 @@ bool Material::findIncandescenceTexture(MaterialNode& material_node, MFnDependen
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
} else if (AllConnections[i].node().hasFn(MFn::kLayeredTexture)) {
|
||||||
MGlobal::displayInfo(MString() + "found incandescens splat map");
|
MGlobal::displayInfo(MString() + "find splat map");
|
||||||
return findSplatTextures(material_node, material_node.IncandescenceMaps, MFnDependencyNode(AllConnections[i].node()));
|
return findSplatTextures(material_node, material_node.IncandescenceMaps, MFnDependencyNode(AllConnections[i].node()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user