Compare commits

..

2 Commits

Author SHA1 Message Date
Jace 73064c7257 Broken undo 2016-02-26 13:12:49 +01:00
Jace fa78991795 World::MemoryUsage returns approximate value of component pool memory usage 2016-02-26 12:53:33 +01:00
386 changed files with 6155 additions and 111212 deletions
+1 -1
Submodule assets updated: 33455a9d10...10a611659d
-12
View File
@@ -84,18 +84,6 @@ bool AABBvsTriangles(const AABB& box,
const std::vector<unsigned int>& modelIndices, const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix); const glm::mat4& modelMatrix);
enum Output
{
OutContained,
OutSeparated,
OutIntersecting
};
//Detects intersection and containment.
Output AABBvsTrianglesWContainment(const AABB& box,
const RawModel::Vertex* modelVertices,
const std::vector<unsigned int>& modelIndices,
const glm::mat4& modelMatrix);
//Return true if the boxes are intersecting. //Return true if the boxes are intersecting.
bool AABBVsAABB(const AABB& a, const AABB& b); bool AABBVsAABB(const AABB& a, const AABB& b);
//Return true if the boxes are intersecting. //Return true if the boxes are intersecting.
+2
View File
@@ -65,6 +65,8 @@ public:
iterator end() const; iterator end() const;
size_t size() const; size_t size() const;
std::size_t MemoryUsage() const;
//Dumps information about what the pool memory looks like right now //Dumps information about what the pool memory looks like right now
//into an output stream (e.g. file/std::cout, anything that has an operator<<) //into an output stream (e.g. file/std::cout, anything that has an operator<<)
//Interpret the data in the memory as InterpretType. //Interpret the data in the memory as InterpretType.
+1 -3
View File
@@ -12,9 +12,7 @@ namespace Events
struct Captured : Event struct Captured : Event
{ {
int TeamNumberThatCapturedCapturePoint; int TeamNumberThatCapturedCapturePoint;
EntityID CapturePointTakenID; EntityID CapturePointID;
EntityWrapper BlueTeamNextCapturePoint;
EntityWrapper RedTeamNextCapturePoint;
}; };
} }
+2 -3
View File
@@ -10,9 +10,8 @@ namespace Events
struct PlayerDeath : Event struct PlayerDeath : Event
{ {
//KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system //KilledBy,KilledByWhat is optional for now. It might be used later in the playerlog-system
EntityWrapper Player = EntityWrapper::Invalid; EntityWrapper Player;
EntityWrapper Killer = EntityWrapper::Invalid; std::string KilledByWhat;
std::string KilledByWhat = "";
}; };
} }
+153 -10
View File
@@ -1,21 +1,164 @@
#ifndef EntityFile_h__ #ifndef EntityFile_h__
#define EntityFile_h__ #define EntityFile_h__
#include "World.h" #include <stack>
#include "EntityXMLFile.h" #include <boost/lexical_cast.hpp>
#include "EntityXMLFilePreprocessor.h" #include <xercesc/util/XercesDefs.hpp>
#include "EntityXMLFileParser.h" #include <xercesc/util/PlatformUtils.hpp>
#include "EntityWrapper.h" #include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLChar.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
#include <xercesc/framework/psvi/XSParticle.hpp>
#include <xercesc/framework/psvi/XSModelGroup.hpp>
#include <xercesc/framework/psvi/XSAnnotation.hpp>
#include <xercesc/framework/psvi/XSValue.hpp>
#include <xercesc/framework/XMLGrammarPoolImpl.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMLSInput.hpp>
#include <xercesc/dom/DOMElement.hpp>
class EntityFile : private World, public Resource #include "../GLM.h"
#include "Util/XercesString.h"
#include "ResourceManager.h"
#include "Entity.h"
#include "ComponentInfo.h"
class EntityFileHandler
{ {
friend class EntityFileSAXHandler;
public: public:
EntityFile(std::string path); // @param EntityID The entity found
// @param EntityID The parent of the entity
EntityWrapper MergeInto(World* other); typedef std::function<void(EntityID, EntityID, const std::string&)> OnStartEntityCallback;
void SetStartEntityCallback(OnStartEntityCallback c) { m_OnStartEntityCallback = c; }
// @param EntityID The entity the component corresponds to
// @param std::string Type name of the component
typedef std::function<void(EntityID, const std::string&)> OnStartComponentCallback;
void SetStartComponentCallback(OnStartComponentCallback c) { m_OnStartComponentCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param std::map<std::string, std::string> Field attribute names and values
typedef std::function<void(EntityID, const std::string&, const std::string&, const std::map<std::string, std::string>&)> OnStartFieldCallback;
void SetStartFieldCallback(OnStartFieldCallback c) { m_OnStartFieldCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param char* Field data
typedef std::function<void(EntityID, const std::string&, const std::string&, const char*)> OnStartFieldDataCallback;
void SetStartFieldDataCallback(OnStartFieldDataCallback c) { m_OnStartFieldDataCallback = c; }
private: private:
EntityID m_RootEntity = EntityID_Invalid; OnStartEntityCallback m_OnStartEntityCallback = nullptr;
OnStartComponentCallback m_OnStartComponentCallback = nullptr;
OnStartFieldCallback m_OnStartFieldCallback = nullptr;
OnStartFieldDataCallback m_OnStartFieldDataCallback = nullptr;
};
class EntityFileSAXHandler : public xercesc::DefaultHandler
{
public:
enum class State
{
Unknown,
Entity,
Component,
ComponentField
};
EntityFileSAXHandler(const EntityFileHandler* handler, xercesc::SAX2XMLReader* reader);
void startElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname, const xercesc::Attributes& attrs) override;
void characters(const XMLCh* const chars, const XMLSize_t length) override;
void endElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname) override;
void warning(const xercesc::SAXParseException& e);
void error(const xercesc::SAXParseException& e);
void fatalError(const xercesc::SAXParseException& e);
private:
const EntityFileHandler* m_Handler;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_Reader;
//State m_CurrentScope = State::Unknown;
std::stack<State> m_StateStack;
unsigned int m_NextEntityID = 0;
std::stack<EntityID> m_EntityStack;
std::string m_CurrentComponent;
std::string m_CurrentField;
std::map<std::string, std::string> m_CurrentAttributes;
void onStartEntity(const xercesc::Attributes& attrs);
void onEndEntity();
void onStartEntityRef(const xercesc::Attributes& attrs);
void onStartComponent(const std::string& name);
void onEndComponent(const std::string& name);
void onStartComponentField(const std::string& field, const xercesc::Attributes& attrs);
void onEndComponentField(const std::string& field);
void onFieldData(char* data);
};
class EntityFileXMLErrorHandler : public xercesc::ErrorHandler
{
public:
void warning(const xercesc::SAXParseException& e) override
{
reportParseException("Warning", e);
}
void error(const xercesc::SAXParseException& e) override
{
reportParseException("Error", e);
}
void fatalError(const xercesc::SAXParseException& e) override
{
reportParseException("FATAL ERROR", e);
}
void resetErrors() override { }
private:
void reportParseException(std::string type, const xercesc::SAXParseException& e)
{
char* message = xercesc::XMLString::transcode(e.getMessage());
char* systemID = xercesc::XMLString::transcode(e.getSystemId());
std::cerr << systemID << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << std::endl;
std::cerr << type << ": " << message << std::endl;
xercesc::XMLString::release(&systemID);
xercesc::XMLString::release(&message);
}
};
class EntityFile : public Resource
{
friend class ResourceManager;
friend class EntityFileSAXHandler;
private:
EntityFile(boost::filesystem::path path);
~EntityFile();
public:
static unsigned int GetTypeStride(std::string typeName);
static void WriteAttributeData(char* outData, const ComponentInfo::Field_t& field, const std::map<std::string, std::string>& attributes);
static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
xercesc::XMLGrammarPool* GrammarPool() const { return m_GrammarPool; }
void Parse(const EntityFileHandler* handler) const;
private:
boost::filesystem::path m_FilePath;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_SAX2XMLReader;
//std::map<std::string, ::ComponentInfo> m_ComponentInfo;
//std::vector<std::string> m_EntityReferences;
static void setReaderFeatures(xercesc::SAX2XMLReader* reader);
}; };
#endif #endif
@@ -1,19 +1,18 @@
#ifndef EntityXMLFileParser_h__ #ifndef EntityFileParser_h__
#define EntityXMLFileParser_h__ #define EntityFileParser_h__
#include "EntityXMLFile.h" #include "EntityFile.h"
#include "World.h" #include "World.h"
class EntityXMLFileParser class EntityFileParser
{ {
friend class EntityFile;
public: public:
EntityXMLFileParser(const EntityXMLFile* entityFile); EntityFileParser(const EntityFile* entityFile);
private:
EntityID MergeEntities(World* world, EntityID baseParent = EntityID_Invalid); EntityID MergeEntities(World* world, EntityID baseParent = EntityID_Invalid);
const EntityXMLFile* m_EntityFile; private:
const EntityFile* m_EntityFile;
EntityFileHandler m_Handler; EntityFileHandler m_Handler;
World* m_World = nullptr; World* m_World = nullptr;
EntityID m_FirstEntity = EntityID_Invalid; EntityID m_FirstEntity = EntityID_Invalid;
@@ -1,5 +1,5 @@
#ifndef EntityXMLFilePreprocessor_h__ #ifndef EntityFilePreprocessor_h__
#define EntityXMLFilePreprocessor_h__ #define EntityFilePreprocessor_h__
#include <xercesc/framework/psvi/XSElementDeclaration.hpp> #include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp> #include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
@@ -17,18 +17,17 @@
#include "Util/XercesString.h" #include "Util/XercesString.h"
#include "ResourceManager.h" #include "ResourceManager.h"
#include "World.h" #include "World.h"
#include "EntityXMLFile.h" #include "EntityFile.h"
class EntityXMLFilePreprocessor class EntityFilePreprocessor
{ {
friend class EntityFile;
public: public:
EntityXMLFilePreprocessor(const EntityXMLFile* entityFile); EntityFilePreprocessor(const EntityFile* entityFile);
private:
void RegisterComponents(World* world); void RegisterComponents(World* world);
const EntityXMLFile* m_EntityFile; private:
const EntityFile* m_EntityFile;
std::map<std::string, unsigned int> m_ComponentCounts; std::map<std::string, unsigned int> m_ComponentCounts;
std::map<std::string, ComponentInfo> m_ComponentInfo; std::map<std::string, ComponentInfo> m_ComponentInfo;
@@ -1,5 +1,5 @@
#ifndef EntityXMLFileWriter_h__ #ifndef EntityFileWriter_h__
#define EntityXMLFileWriter_h__ #define EntityFileWriter_h__
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <xercesc/dom/DOM.hpp> #include <xercesc/dom/DOM.hpp>
@@ -8,13 +8,13 @@
#include <xercesc/framework/LocalFileFormatTarget.hpp> #include <xercesc/framework/LocalFileFormatTarget.hpp>
#include "Util/XercesString.h" #include "Util/XercesString.h"
#include "EntityXMLFile.h" #include "EntityFile.h"
#include "World.h" #include "World.h"
class EntityXMLFileWriter class EntityFileWriter
{ {
public: public:
EntityXMLFileWriter(boost::filesystem::path file) EntityFileWriter(boost::filesystem::path file)
: m_FilePath(file) : m_FilePath(file)
{ {
using namespace xercesc; using namespace xercesc;
+2 -7
View File
@@ -23,22 +23,18 @@ struct EntityWrapper
static const EntityWrapper Invalid; static const EntityWrapper Invalid;
const std::string Name() const; const std::string Name();
bool HasComponent(const std::string& componentType); bool HasComponent(const std::string& componentType);
void AttachComponent(const char* componentName); void AttachComponent(const char* componentName);
EntityWrapper Parent(); EntityWrapper Parent();
EntityWrapper FirstParentByName(const std::string& parentEntityName); EntityWrapper BaseParent();
EntityWrapper FirstChildByName(const std::string& name); EntityWrapper FirstChildByName(const std::string& name);
EntityWrapper FirstLevelChildByName(const std::string& name);
EntityWrapper FirstParentWithComponent(const std::string& componentType); EntityWrapper FirstParentWithComponent(const std::string& componentType);
EntityWrapper Clone(EntityWrapper parent = EntityWrapper::Invalid); EntityWrapper Clone(EntityWrapper parent = EntityWrapper::Invalid);
std::vector<EntityWrapper> ChildrenWithComponent(const std::string& componentType);
void DeleteChildren();
bool IsChildOf(EntityWrapper potentialParent); bool IsChildOf(EntityWrapper potentialParent);
bool Valid() const; bool Valid() const;
ComponentWrapper operator[](const char* componentName); ComponentWrapper operator[](const char* componentName);
ComponentWrapper operator[](const std::string& componentName);
bool operator==(const EntityWrapper& e) const; bool operator==(const EntityWrapper& e) const;
bool operator!=(const EntityWrapper& e) const; bool operator!=(const EntityWrapper& e) const;
explicit operator EntityID() const; explicit operator EntityID() const;
@@ -46,7 +42,6 @@ struct EntityWrapper
private: private:
EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent); EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent);
EntityWrapper cloneRecursive(EntityWrapper entity, EntityWrapper parent); EntityWrapper cloneRecursive(EntityWrapper entity, EntityWrapper parent);
void childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent);
}; };
namespace std namespace std
-164
View File
@@ -1,164 +0,0 @@
#ifndef EntityXMLFile_h__
#define EntityXMLFile_h__
#include <stack>
#include <boost/lexical_cast.hpp>
#include <xercesc/util/XercesDefs.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/util/XMLChar.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/framework/XMLDocumentHandler.hpp>
#include <xercesc/framework/psvi/XSElementDeclaration.hpp>
#include <xercesc/framework/psvi/XSComplexTypeDefinition.hpp>
#include <xercesc/framework/psvi/XSParticle.hpp>
#include <xercesc/framework/psvi/XSModelGroup.hpp>
#include <xercesc/framework/psvi/XSAnnotation.hpp>
#include <xercesc/framework/psvi/XSValue.hpp>
#include <xercesc/framework/XMLGrammarPoolImpl.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/dom/DOMLSInput.hpp>
#include <xercesc/dom/DOMElement.hpp>
#include "../GLM.h"
#include "Util/XercesString.h"
#include "ResourceManager.h"
#include "Entity.h"
#include "ComponentInfo.h"
class EntityFileHandler
{
friend class EntityFileSAXHandler;
public:
// @param EntityID The entity found
// @param EntityID The parent of the entity
typedef std::function<void(EntityID, EntityID, const std::string&)> OnStartEntityCallback;
void SetStartEntityCallback(OnStartEntityCallback c) { m_OnStartEntityCallback = c; }
// @param EntityID The entity the component corresponds to
// @param std::string Type name of the component
typedef std::function<void(EntityID, const std::string&)> OnStartComponentCallback;
void SetStartComponentCallback(OnStartComponentCallback c) { m_OnStartComponentCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param std::map<std::string, std::string> Field attribute names and values
typedef std::function<void(EntityID, const std::string&, const std::string&, const std::map<std::string, std::string>&)> OnStartFieldCallback;
void SetStartFieldCallback(OnStartFieldCallback c) { m_OnStartFieldCallback = c; }
// @param EntityID Entity
// @param std::string Component name
// @param std::string Field name
// @param char* Field data
typedef std::function<void(EntityID, const std::string&, const std::string&, const char*)> OnStartFieldDataCallback;
void SetStartFieldDataCallback(OnStartFieldDataCallback c) { m_OnStartFieldDataCallback = c; }
private:
OnStartEntityCallback m_OnStartEntityCallback = nullptr;
OnStartComponentCallback m_OnStartComponentCallback = nullptr;
OnStartFieldCallback m_OnStartFieldCallback = nullptr;
OnStartFieldDataCallback m_OnStartFieldDataCallback = nullptr;
};
class EntityFileSAXHandler : public xercesc::DefaultHandler
{
public:
enum class State
{
Unknown,
Entity,
Component,
ComponentField
};
EntityFileSAXHandler(const EntityFileHandler* handler, xercesc::SAX2XMLReader* reader);
void startElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname, const xercesc::Attributes& attrs) override;
void characters(const XMLCh* const chars, const XMLSize_t length) override;
void endElement(const XMLCh* const _uri, const XMLCh* const _localName, const XMLCh* const _qname) override;
void warning(const xercesc::SAXParseException& e);
void error(const xercesc::SAXParseException& e);
void fatalError(const xercesc::SAXParseException& e);
private:
const EntityFileHandler* m_Handler;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_Reader;
//State m_CurrentScope = State::Unknown;
std::stack<State> m_StateStack;
unsigned int m_NextEntityID = 0;
std::stack<EntityID> m_EntityStack;
std::string m_CurrentComponent;
std::string m_CurrentField;
std::map<std::string, std::string> m_CurrentAttributes;
void onStartEntity(const xercesc::Attributes& attrs);
void onEndEntity();
void onStartEntityRef(const xercesc::Attributes& attrs);
void onStartComponent(const std::string& name);
void onEndComponent(const std::string& name);
void onStartComponentField(const std::string& field, const xercesc::Attributes& attrs);
void onEndComponentField(const std::string& field);
void onFieldData(char* data);
};
class EntityFileXMLErrorHandler : public xercesc::ErrorHandler
{
public:
void warning(const xercesc::SAXParseException& e) override
{
reportParseException("Warning", e);
}
void error(const xercesc::SAXParseException& e) override
{
reportParseException("Error", e);
}
void fatalError(const xercesc::SAXParseException& e) override
{
reportParseException("FATAL ERROR", e);
}
void resetErrors() override { }
private:
void reportParseException(std::string type, const xercesc::SAXParseException& e)
{
char* message = xercesc::XMLString::transcode(e.getMessage());
char* systemID = xercesc::XMLString::transcode(e.getSystemId());
std::cerr << systemID << ":" << e.getLineNumber() << ":" << e.getColumnNumber() << std::endl;
std::cerr << type << ": " << message << std::endl;
xercesc::XMLString::release(&systemID);
xercesc::XMLString::release(&message);
}
};
class EntityXMLFile : public Resource
{
friend class ResourceManager;
friend class EntityFileSAXHandler;
private:
EntityXMLFile(boost::filesystem::path path);
~EntityXMLFile();
public:
static unsigned int GetTypeStride(std::string typeName);
static void WriteAttributeData(char* outData, const ComponentInfo::Field_t& field, const std::map<std::string, std::string>& attributes);
static void WriteValueData(char* outData, const ComponentInfo::Field_t& field, const char* valueData);
xercesc::XMLGrammarPool* GrammarPool() const { return m_GrammarPool; }
void Parse(const EntityFileHandler* handler) const;
private:
boost::filesystem::path m_FilePath;
xercesc::XMLGrammarPool* m_GrammarPool;
xercesc::SAX2XMLReader* m_SAX2XMLReader;
//std::map<std::string, ::ComponentInfo> m_ComponentInfo;
//std::vector<std::string> m_EntityReferences;
static void setReaderFeatures(xercesc::SAX2XMLReader* reader);
};
#endif
+8
View File
@@ -118,6 +118,9 @@ public:
else { else {
m_ExtraMemory.push_back((char*)malloc(m_Stride)); m_ExtraMemory.push_back((char*)malloc(m_Stride));
//We should preferably not enter here to avoid performance issues. Set more numMaxElements in constructor instead. //We should preferably not enter here to avoid performance issues. Set more numMaxElements in constructor instead.
if (!DisableMemoryPool::Value) {
LOG_DEBUG("Allocated slots exceed Pool size, extra memory allocated dynamically. Pool size: %u, dynamic size: %u.", m_NumSlots, m_ExtraMemory.size());
}
return m_ExtraMemory.back(); return m_ExtraMemory.back();
} }
} }
@@ -191,6 +194,11 @@ public:
return m_ExtraMemory.size(); return m_ExtraMemory.size();
} }
std::size_t MemoryUsage() const
{
return size() * m_Stride;
}
//Dumps information about what the pool memory looks like right now //Dumps information about what the pool memory looks like right now
//into an output stream (e.g. file/std::cout, anything that has an operator<<) //into an output stream (e.g. file/std::cout, anything that has an operator<<)
//Interpret the data in the memory as InterpretType. //Interpret the data in the memory as InterpretType.
+1 -1
View File
@@ -68,7 +68,7 @@ protected:
const std::string m_ComponentType; const std::string m_ComponentType;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) = 0; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cPlayer, double dt) = 0;
}; };
class ImpureSystem : public virtual System class ImpureSystem : public virtual System
+3 -7
View File
@@ -6,7 +6,6 @@
#include "ObjectPool.h" #include "ObjectPool.h"
#include "ComponentPool.h" #include "ComponentPool.h"
#include "EventBroker.h" #include "EventBroker.h"
struct EntityWrapper;
class World class World
{ {
@@ -25,7 +24,7 @@ public:
// Check if an entity exists // Check if an entity exists
bool ValidEntity(EntityID entity) const; bool ValidEntity(EntityID entity) const;
// Register a component type and allocate space for it // Register a component type and allocate space for it
void RegisterComponent(const ComponentInfo& ci); void RegisterComponent(ComponentInfo& ci);
// Attach a component to an entity and fill it with default values // Attach a component to an entity and fill it with default values
ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType); ComponentWrapper AttachComponent(EntityID entity, const std::string& componentType);
// Check if an entity has a component // Check if an entity has a component
@@ -50,12 +49,9 @@ public:
void SetName(EntityID entity, const std::string& name); void SetName(EntityID entity, const std::string& name);
// Get the textual name of an entity // Get the textual name of an entity
std::string GetName(EntityID entity) const; std::string GetName(EntityID entity) const;
// Get the first entity in the world with the name.
EntityWrapper GetFirstEntityByName(const std::string& name);
// Merge another world into this one // Get an approximate number for component pool memory usage
// Returns a map that maps entities from the other world to their copies in this one std::size_t MemoryUsage() const;
std::unordered_map<EntityID, EntityID> Merge(const World* other);
private: private:
EventBroker* m_EventBroker = nullptr; EventBroker* m_EventBroker = nullptr;
@@ -12,8 +12,8 @@ template <typename EventContext>
class EditorCameraInputController : public FirstPersonInputController<EventContext> class EditorCameraInputController : public FirstPersonInputController<EventContext>
{ {
public: public:
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID, EntityWrapper playerEntity) EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID)
: FirstPersonInputController(eventBroker, playerID, playerEntity) : FirstPersonInputController(eventBroker, playerID)
{ {
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress); EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress);
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease); EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease);
@@ -104,11 +104,6 @@ protected:
if (!m_Enabled) { if (!m_Enabled) {
return false; return false;
} }
ImGuiIO& io = ImGui::GetIO();
if (io.WantCaptureMouse || io.WantCaptureKeyboard) {
return false;
}
m_SpeedMultiplier += e.DeltaY * (0.1 * m_SpeedMultiplier); m_SpeedMultiplier += e.DeltaY * (0.1 * m_SpeedMultiplier);
m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier); m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier);
+9 -2
View File
@@ -22,7 +22,6 @@
#include "../Core/ELockMouse.h" #include "../Core/ELockMouse.h"
#include "../Core/EFileDropped.h" #include "../Core/EFileDropped.h"
#include "../Rendering/Texture.h" #include "../Rendering/Texture.h"
#include "Game/Events/ESpawnerSpawn.h"
class EditorGUI class EditorGUI
{ {
@@ -92,7 +91,13 @@ public:
// Called when the user selects a widget space. // Called when the user selects a widget space.
typedef std::function<void(WidgetSpace)> OnWidgetSpace_t; typedef std::function<void(WidgetSpace)> OnWidgetSpace_t;
void SetWidgetSpaceCallback(OnWidgetSpace_t f) { m_OnWidgetSpace = f; } void SetWidgetSpaceCallback(OnWidgetSpace_t f) { m_OnWidgetSpace = f; }
// Called when anything is modified making the world dirty
// @param EntityWrapper The entity that was changed and marked as dirty
typedef std::function<void(EntityWrapper)> OnDirty_t;
void SetDirtyCallback(OnDirty_t f) { m_OnDirty = f; }
// Called when the user wishes to undo
typedef std::function<void()> OnUndo_t;
void SetUndoCallback(OnUndo_t f) { m_OnUndo = f; }
private: private:
World* m_World; World* m_World;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
@@ -133,6 +138,8 @@ private:
OnWidgetMode_t m_OnWidgetMode = nullptr; OnWidgetMode_t m_OnWidgetMode = nullptr;
OnWidgetSpace_t m_OnWidgetSpace = nullptr; OnWidgetSpace_t m_OnWidgetSpace = nullptr;
OnEntityPaste_t m_OnEntityPaste = nullptr; OnEntityPaste_t m_OnEntityPaste = nullptr;
OnDirty_t m_OnDirty = nullptr;
OnUndo_t m_OnUndo = nullptr;
// Events // Events
EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown; EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown;
+7 -3
View File
@@ -5,8 +5,9 @@
#include "../Core/World.h" #include "../Core/World.h"
#include "../Core/SystemPipeline.h" #include "../Core/SystemPipeline.h"
#include "../Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "../Core/EntityFile.h" #include "../Core/EntityFilePreprocessor.h"
#include "../Core/EntityXMLFileWriter.h" #include "../Core/EntityFileParser.h"
#include "../Core/EntityFileWriter.h"
#include "../Core/EMousePress.h" #include "../Core/EMousePress.h"
#include "../Input/EInputCommand.h" #include "../Input/EInputCommand.h"
#include "EditorGUI.h" #include "EditorGUI.h"
@@ -35,6 +36,7 @@ private:
EditorCameraInputController<EditorSystem>* m_EditorCameraInputController; EditorCameraInputController<EditorSystem>* m_EditorCameraInputController;
EditorGUI* m_EditorGUI; EditorGUI* m_EditorGUI;
EditorStats* m_EditorStats; EditorStats* m_EditorStats;
std::vector<World> m_UndoLevels;
// State // State
double m_LastTime = 0.f; double m_LastTime = 0.f;
@@ -43,11 +45,11 @@ private:
EditorGUI::WidgetSpace m_WidgetSpace = EditorGUI::WidgetSpace::Global; EditorGUI::WidgetSpace m_WidgetSpace = EditorGUI::WidgetSpace::Global;
EntityWrapper m_Widget = EntityWrapper::Invalid; EntityWrapper m_Widget = EntityWrapper::Invalid;
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid; EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
bool m_SaveUndoLevel = false; // Only save undo state once per update
// Utility functions // Utility functions
EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath); EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
void setWidgetMode(EditorGUI::WidgetMode mode); void setWidgetMode(EditorGUI::WidgetMode mode);
bool isAnyParentMissingTransform(EntityID entityID);
// GUI callbacks // GUI callbacks
void OnEntitySelected(EntityWrapper entity); void OnEntitySelected(EntityWrapper entity);
@@ -60,6 +62,8 @@ private:
void OnComponentAttach(EntityWrapper entity, const std::string& componentType); void OnComponentAttach(EntityWrapper entity, const std::string& componentType);
void OnComponentDelete(EntityWrapper entity, const std::string& componentType); void OnComponentDelete(EntityWrapper entity, const std::string& componentType);
void OnWidgetSpace(EditorGUI::WidgetSpace widgetSpace); void OnWidgetSpace(EditorGUI::WidgetSpace widgetSpace);
void OnDirty(EntityWrapper entity);
void OnUndo();
// Events // Events
EventRelay<EditorSystem, Events::MousePress> m_EMousePress; EventRelay<EditorSystem, Events::MousePress> m_EMousePress;
@@ -1,18 +1,15 @@
#ifndef MainMenuSystem_h__ #ifndef MainMenuSystem_h__
#define MainMenuSystem_h__ #define MainMenuSystem_h__
#include "Core/System.h" #include "../Core/System.h"
#include "Rendering/IRenderer.h" #include "../Rendering/IRenderer.h"
#include "Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "Core/Event.h" #include "../Core/Event.h"
#include "Systems/SpawnerSystem.h"
#include "GUI/EButtonClicked.h"
#include "GUI/EButtonPressed.h" #include "EButtonClicked.h"
#include "GUI/EButtonReleased.h" #include "EButtonPressed.h"
#include "Input/EInputCommand.h" #include "EButtonReleased.h"
#include "Network/ESearchForServers.h"
#include "Network/EConnectRequest.h"
class MainMenuSystem : public ImpureSystem class MainMenuSystem : public ImpureSystem
@@ -23,7 +20,6 @@ public:
private: private:
IRenderer* m_Renderer; IRenderer* m_Renderer;
void OpenSubMenu(const Events::InputCommand& e);
EventRelay<MainMenuSystem, Events::ButtonClicked> m_EClicked; EventRelay<MainMenuSystem, Events::ButtonClicked> m_EClicked;
bool OnButtonClick(const Events::ButtonClicked& e); bool OnButtonClick(const Events::ButtonClicked& e);
@@ -31,11 +27,6 @@ private:
bool OnButtonRelease(const Events::ButtonReleased& e); bool OnButtonRelease(const Events::ButtonReleased& e);
EventRelay<MainMenuSystem, Events::ButtonPressed> m_EPressed; EventRelay<MainMenuSystem, Events::ButtonPressed> m_EPressed;
bool OnButtonPress(const Events::ButtonPressed& e); bool OnButtonPress(const Events::ButtonPressed& e);
EventRelay<MainMenuSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
std::string m_CurrentCommand = "";
EntityWrapper m_OpenSubMenu = EntityWrapper::Invalid;
}; };
+30 -202
View File
@@ -6,20 +6,17 @@
#include "../Core/ELockMouse.h" #include "../Core/ELockMouse.h"
#include "../Game/Events/EDashAbility.h" #include "../Game/Events/EDashAbility.h"
#include "InputHandler.h" #include "InputHandler.h"
#include "Rendering/EAutoAnimationBlend.h"
#include "Rendering/ESetBlendWeight.h"
template <typename EventContext> template <typename EventContext>
class FirstPersonInputController : public InputController<EventContext> class FirstPersonInputController : public InputController<EventContext>
{ {
public: public:
FirstPersonInputController(EventBroker* eventBroker, int playerID, EntityWrapper playerEntity); FirstPersonInputController(EventBroker* eventBroker, int playerID);
virtual const glm::vec3 Movement() const { return m_Movement; } virtual const glm::vec3 Movement() const { return m_Movement; }
virtual const glm::vec3 Rotation() const { return m_Rotation; } virtual const glm::vec3 Rotation() const { return m_Rotation; }
virtual bool Jumping() const { return m_Jumping; } virtual bool Jumping() const { return m_Jumping; }
virtual bool Crouching() const { return m_Crouching; } virtual bool Crouching() const { return m_Crouching; }
virtual bool CrouchingLastFrame() const { return m_CrouchingLastFrame; }
virtual bool DoubleJumping() const { return m_DoubleJumping; } virtual bool DoubleJumping() const { return m_DoubleJumping; }
virtual void SetDoubleJumping(bool isDoubleJumping) { virtual void SetDoubleJumping(bool isDoubleJumping) {
m_DoubleJumping = isDoubleJumping; m_DoubleJumping = isDoubleJumping;
@@ -30,24 +27,21 @@ public:
virtual bool OnCommand(const Events::InputCommand& e) override; virtual bool OnCommand(const Events::InputCommand& e) override;
virtual void Reset(); virtual void Reset();
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID); void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer);
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; } virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; } virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
bool SpecialAbilityKeyDown() const { return m_SpecialAbilityKeyDown; }
protected: protected:
const int m_PlayerID; const int m_PlayerID;
EntityWrapper m_PlayerEntity;
bool m_MouseLocked = false; bool m_MouseLocked = false;
glm::vec3 m_Rotation; glm::vec3 m_Rotation;
glm::vec3 m_Movement; glm::vec3 m_Movement;
bool m_Jumping = false; bool m_Jumping = false;
bool m_DoubleJumping = false; bool m_DoubleJumping = false;
bool m_Crouching = false; bool m_Crouching = false;
bool m_CrouchingLastFrame = false;
//assault dash membervariables - needed to calculate the doubletap- and dashlogic //assault dash membervariables - needed to calculate the doubletap- and dashlogic
double m_AssaultDashDoubleTapDeltaTime = 0.0; double m_AssaultDashDoubleTapDeltaTime = 0.0;
double m_AssaultDashCoolDownTimer = 0.0;
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable), //i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
//and its very unlikely that someone wants to change that value //and its very unlikely that someone wants to change that value
const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f; const float m_AssaultDashDoubleTapSensitivityTimer = 0.25f;
@@ -58,7 +52,7 @@ protected:
bool m_ShiftDashing = false; bool m_ShiftDashing = false;
bool m_ValidDoubleTap = false; bool m_ValidDoubleTap = false;
//specialabilities //specialabilitys
bool m_MovementKeyDown = false; bool m_MovementKeyDown = false;
bool m_SpecialAbilityKeyDown = false; bool m_SpecialAbilityKeyDown = false;
int m_NumberOfMovementKeysDown = 0; int m_NumberOfMovementKeysDown = 0;
@@ -70,10 +64,9 @@ protected:
}; };
template <typename EventContext> template <typename EventContext>
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID, EntityWrapper playerEntity) FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID)
: InputController(eventBroker) : InputController(eventBroker)
, m_PlayerID(playerID) , m_PlayerID(playerID)
, m_PlayerEntity(playerEntity)
{ {
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse); EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse); EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
@@ -84,7 +77,6 @@ void FirstPersonInputController<EventContext>::Reset()
{ {
m_Rotation = glm::vec3(0.f, 0.f, 0.f); m_Rotation = glm::vec3(0.f, 0.f, 0.f);
m_Jumping = false; m_Jumping = false;
m_CrouchingLastFrame = m_Crouching;
} }
template <typename EventContext> template <typename EventContext>
@@ -113,6 +105,7 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Pitch") { if (e.Command == "Pitch") {
float val = glm::radians(e.Value); float val = glm::radians(e.Value);
m_Rotation.x += -val; m_Rotation.x += -val;
//m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
} }
if (e.Command == "Yaw") { if (e.Command == "Yaw") {
@@ -124,155 +117,16 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Forward") { if (e.Command == "Forward") {
float val = glm::clamp(e.Value, -1.f, 1.f); float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.z = -val; m_Movement.z = -val;
//Animation
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (val > 0) { // Walk/Run
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if (m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) { // Walk/run Backwards
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
if (m_Crouching) {
aeb.NodeName = "Walk";
} else {
aeb.NodeName = "Run";
}
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.SingleLevelBlend = true;
aeb.Reverse = true;
m_EventBroker->Publish(aeb);
}
}
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
if (firstPersonModel.Valid()) {
if (val > 0) { // Walk/Run
if (!m_Crouching) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Run";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
} else if (val < 0) { // Walk/run Backwards
if (!m_Crouching) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Run";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
aeb.Reverse = true;
m_EventBroker->Publish(aeb);
}
}
}
}
} }
if (e.Command == "Right") { if (e.Command == "Right") {
float val = glm::clamp(e.Value, -1.f, 1.f); float val = glm::clamp(e.Value, -1.f, 1.f);
m_Movement.x = val; m_Movement.x = val;
}
if (glm::length2(m_Movement) > 0) {
//Animation m_Movement = glm::normalize(m_Movement);
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) { //Right Strafe
if (val > 0) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Right";
aeb.RootNode = playerModel;
aeb.SingleLevelBlend = true;
aeb.Start = true;
m_EventBroker->Publish(aeb);
} else if (val < 0) { //LeftStrafe
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Left";
aeb.RootNode = playerModel;
aeb.SingleLevelBlend = true;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
}
}
} }
} }
//Animation
if (glm::length2(m_Movement) < 0.25f) {
//Blend to Idle
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Idle";
aeb.RootNode = playerModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
EntityWrapper firstPersonModel = m_PlayerEntity.FirstChildByName("Hands");
if (firstPersonModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "Idle";
aeb.RootNode = firstPersonModel;
aeb.Start = true;
m_EventBroker->Publish(aeb);
}
}
} else {
//Blend to movement
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.1;
aeb.NodeName = "DirectionBlend";
aeb.RootNode = playerModel;
m_EventBroker->Publish(aeb);
}
}
}
if (glm::length2(m_Movement) > 0) {
m_Movement = glm::normalize(m_Movement);
//Animation
// movement direction blend
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
glm::vec2 direction = glm::normalize(glm::vec2(m_Movement.x, m_Movement.z));
double weight = glm::abs(glm::dot(glm::vec2(1, 0), direction));
Events::SetBlendWeight sbw;
sbw.NodeName = "DirectionBlend";
sbw.Weight = weight;
sbw.RootNode = playerModel;
m_EventBroker->Publish(sbw);
}
}
}
if (e.Command == "Forward" || e.Command == "Right") { if (e.Command == "Forward" || e.Command == "Right") {
if (e.Value != 0) { if (e.Value != 0) {
m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward"); m_CurrentDirectionVector = e.Command == "Right" ? (e.Value > 0 ? "Right" : "Left") : (e.Value > 0 ? "Forward" : "Backward");
@@ -291,10 +145,10 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (m_NumberOfMovementKeysDown == 0) { if (m_NumberOfMovementKeysDown == 0) {
m_MovementKeyDown = false; m_MovementKeyDown = false;
} }
//you have just released the key, store what key it was and reset the doubletap-sensitivity-timer //you have just released the key, store what key it was and reset the doubletap-sensitivity-timer
m_AssaultDashTapDirection = m_CurrentDirectionVector; m_AssaultDashTapDirection = m_CurrentDirectionVector;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
} }
} }
@@ -304,41 +158,20 @@ bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputComm
if (e.Command == "Crouch") { if (e.Command == "Crouch") {
m_Crouching = e.Value > 0; m_Crouching = e.Value > 0;
//Animation
if (m_PlayerEntity.Valid()) {
EntityWrapper playerModel = m_PlayerEntity.FirstChildByName("PlayerModel");
if (playerModel.Valid()) {
if (e.Value == 0.f) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.3;
aeb.NodeName = "StandMovement";
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.Restart = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
} else if(e.Value == 1.0f) {
Events::AutoAnimationBlend aeb;
aeb.Duration = 0.3;
aeb.NodeName = "CrouchMovement";
aeb.RootNode = playerModel;
aeb.Start = true;
aeb.Restart = true;
aeb.SingleLevelBlend = true;
m_EventBroker->Publish(aeb);
}
}
}
} }
if (e.Command == "SpecialAbility") { if (e.Command == "SpecialAbility") {
m_SpecialAbilityKeyDown = e.Value > 0; if (e.Value > 0) {
m_SpecialAbilityKeyDown = true;
} else {
m_SpecialAbilityKeyDown = false;
}
}
if (m_SpecialAbilityKeyDown && m_MovementKeyDown) {
m_ShiftDashing = true;
} else {
m_ShiftDashing = false;
} }
m_ShiftDashing = m_SpecialAbilityKeyDown && m_MovementKeyDown;
return true; return true;
} }
@@ -358,27 +191,23 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
} }
template <typename EventContext> template <typename EventContext>
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) { void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer) {
m_AssaultDashDoubleTapDeltaTime += dt; m_AssaultDashDoubleTapDeltaTime += dt;
assaultDashCoolDownTimer -= dt; m_AssaultDashCoolDownTimer -= dt;
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work) //cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
if (assaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) { if (m_AssaultDashCoolDownTimer > (assaultDashCoolDownMaxTimer - 0.25f)) {
m_PlayerIsDashing = true; m_PlayerIsDashing = true;
} else { } else {
m_PlayerIsDashing = false; m_PlayerIsDashing = false;
} }
//dashing with shift //dashing with shift
if (m_ShiftDashing && assaultDashCoolDownTimer <= 0.0f) { if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f) {
//player is dashing with shift //player is dashing with shift
//the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in! //the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer; m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
m_AssaultDashDoubleTapped = true; m_AssaultDashDoubleTapped = true;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e);
return; return;
} }
@@ -398,7 +227,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
} }
m_ValidDoubleTap = false; m_ValidDoubleTap = false;
if (!(assaultDashCoolDownTimer <= 0.0f)) { if (!(m_AssaultDashCoolDownTimer <= 0.0f)) {
//if we cant dash at the moment, then just reset the tap-sensitivity-timer //if we cant dash at the moment, then just reset the tap-sensitivity-timer
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
return; return;
@@ -406,10 +235,9 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
//ok, we have a valid tap, lets do it //ok, we have a valid tap, lets do it
m_AssaultDashDoubleTapped = true; m_AssaultDashDoubleTapped = true;
m_AssaultDashDoubleTapDeltaTime = 0.f; m_AssaultDashDoubleTapDeltaTime = 0.f;
assaultDashCoolDownTimer = assaultDashCoolDownMaxTimer; m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
Events::DashAbility e; Events::DashAbility e;
e.Player = playerID;
m_EventBroker->Publish(e); m_EventBroker->Publish(e);
} }
+1 -1
View File
@@ -18,7 +18,7 @@ public:
void LoadBindings(std::string file); void LoadBindings(std::string file);
void Update(double dt); void Update(double dt);
void Process(bool suppressNewEvents = false); void Process();
template <typename T> template <typename T>
void AddHandler(); void AddHandler();
void Publish(const Events::InputCommand& e); void Publish(const Events::InputCommand& e);
+16 -17
View File
@@ -17,7 +17,6 @@
#include "Network/TCPClient.h" #include "Network/TCPClient.h"
#include "Network/SnapshotDefinitions.h" #include "Network/SnapshotDefinitions.h"
#include "Core/World.h" #include "Core/World.h"
#include "Core/EntityFile.h"
#include "Core/EventBroker.h" #include "Core/EventBroker.h"
#include "Core/ConfigFile.h" #include "Core/ConfigFile.h"
#include "Core/EPlayerDeath.h" #include "Core/EPlayerDeath.h"
@@ -27,11 +26,20 @@
#include "Network/EInterpolate.h" #include "Network/EInterpolate.h"
#include "Network/SnapshotFilter.h" #include "Network/SnapshotFilter.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "Core/EAmmoPickup.h"
#include "Network/ESearchForServers.h" #include "Network/ESearchForServers.h"
#include "../Game/Events/EDashAbility.h"
#include "Network/EDisplayServerlist.h" struct ServerInfo
#include "Network/EConnectRequest.h" {
ServerInfo(std::string a, int b, std::string c, int d)
{
Address = a; Port = b; Name = c; PlayersConnected = d;
}
std::string Address = "";
int Port = 0;
std::string Name = "";
int PlayersConnected = 0;
};
class Client : public Network class Client : public Network
{ {
public: public:
@@ -81,7 +89,7 @@ private:
std::vector<Events::InputCommand> m_InputCommandBuffer; std::vector<Events::InputCommand> m_InputCommandBuffer;
// Private member functions // Private member functions
size_t receive(char* data); size_t receive(char* data);
void disconnect(); void disconnect();
void parseMessageType(Packet& packet); void parseMessageType(Packet& packet);
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID); void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
@@ -98,9 +106,7 @@ private:
void parsePlayerDamage(Packet& packet); void parsePlayerDamage(Packet& packet);
void parseComponentDeletion(Packet& packet); void parseComponentDeletion(Packet& packet);
void parseDoubleJump(Packet& packet); void parseDoubleJump(Packet& packet);
void parseDashEffect(Packet& packet); void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
void parseAmmoPickup(Packet& packet);
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();
void hasServerTimedOut(); void hasServerTimedOut();
@@ -109,8 +115,6 @@ private:
void sendLocalPlayerTransform(); void sendLocalPlayerTransform();
void becomePlayer(); void becomePlayer();
void displayServerlist(); void displayServerlist();
void removeWorld();
void createMainMenu();
// Mapping Logic // Mapping Logic
// Returns if local EntityID exist in map // Returns if local EntityID exist in map
bool clientServerMapsHasEntity(EntityID clientEntityID); bool clientServerMapsHasEntity(EntityID clientEntityID);
@@ -129,17 +133,12 @@ private:
EventRelay< Client, Events::SearchForServers> m_ESearchForServers; EventRelay< Client, Events::SearchForServers> m_ESearchForServers;
EventRelay<Client, Events::DoubleJump> m_EDoubleJump; EventRelay<Client, Events::DoubleJump> m_EDoubleJump;
bool OnDoubleJump(Events::DoubleJump & e); bool OnDoubleJump(Events::DoubleJump & e);
EventRelay<Client, Events::DashAbility> m_EDashAbility;
bool OnDashAbility(const Events::DashAbility& e);
EventRelay<Client, Events::ConnectRequest> m_EConnectRequest;
bool OnConnectRequest(const Events::ConnectRequest& e);
bool OnSearchForServers(const Events::SearchForServers& e); bool OnSearchForServers(const Events::SearchForServers& e);
UDPClient m_ServerlistRequest; UDPClient m_ServerlistRequest;
std::vector<ServerInfo> m_Serverlist; std::vector<ServerInfo> m_Serverlist;
bool m_SearchingForServers = false; bool m_SearchingForServers = false;
std::clock_t m_StartSearchTime; std::clock_t m_StartSearchTime;
double m_SearchingTime = 200; // Config I guess double m_SearchingTime = 2000; // Config I guess
}; };
#endif #endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef Events_ConnectRequest_h__
#define Events_ConnectRequest_h__
#include "Core/EventBroker.h"
namespace Events
{
struct ConnectRequest : public Event
{
std::string IP = "";
int Port = 0;
};
}
#endif
@@ -1,29 +0,0 @@
#ifndef Events_DisplayServerlist_h__
#define Events_DisplayServerlist_h__
#include <string>
#include <vector>
#include "Core/Event.h"
struct ServerInfo
{
ServerInfo(std::string address, int port, std::string name, int players)
{
Address = address; Port = port; Name = name; PlayersConnected = players;
}
std::string Address = "";
int Port = 0;
std::string Name = "";
int PlayersConnected = 0;
};
namespace Events
{
struct DisplayServerlist : public Event
{
std::vector<ServerInfo> Serverlist;
};
}
#endif
-19
View File
@@ -1,19 +0,0 @@
#ifndef Events_KillDeath_h__
#define Events_KillDeath_h__
#include "Core/EventBroker.h"
typedef unsigned int PlayerID;
namespace Events
{
struct KillDeath : public Event
{
PlayerID Casualty = -1;
PlayerID Killer = -1;
};
}
#endif
-17
View File
@@ -1,17 +0,0 @@
#ifndef Events_PlayerConnected
#define Events_PlayerConnected
#include "Core/EventBroker.h"
namespace Events
{
struct PlayerConnected : public Event
{
std::string PlayerName = "";
int PlayerID = -1;
};
}
#endif // !Events_PlayerConnected
-2
View File
@@ -20,9 +20,7 @@ enum class MessageType
ComponentDeleted, ComponentDeleted,
PlayerTransform, PlayerTransform,
OnDoubleJump, OnDoubleJump,
OnDashEffect,
ServerlistRequest, ServerlistRequest,
AmmoPickup,
Invalid Invalid
}; };
-1
View File
@@ -39,7 +39,6 @@ protected:
void logReceivedData(int bytesReceived); void logReceivedData(int bytesReceived);
void saveToFile(); void saveToFile();
void updateNetworkData(); void updateNetworkData();
void popNetworkSegmentOfHeader(Packet& packet);
}; };
#endif #endif
+1 -1
View File
@@ -11,7 +11,7 @@ class NetworkClient
public: public:
NetworkClient(); NetworkClient();
virtual ~NetworkClient(); virtual ~NetworkClient();
virtual bool Connect(std::string playerName, std::string address, int port) = 0; virtual void Connect(std::string playerName, std::string address, int port) = 0;
virtual void Disconnect() = 0; virtual void Disconnect() = 0;
virtual void Receive(Packet& packet) = 0; virtual void Receive(Packet& packet) = 0;
virtual void Send(Packet & packet) = 0; virtual void Send(Packet & packet) = 0;
+3 -21
View File
@@ -16,9 +16,7 @@ public:
Packet(char* data, const size_t sizeOfPacket); Packet(char* data, const size_t sizeOfPacket);
Packet(MessageType type); Packet(MessageType type);
~Packet(); ~Packet();
void Init(MessageType type, unsigned int& packetID, void Init(MessageType type, unsigned int& packetID);
int groupIndex, int groupSize,
int packetGroup);
// Add primitive types like int, float, char... // Add primitive types like int, float, char...
template<typename T> template<typename T>
@@ -26,10 +24,7 @@ public:
{ {
// Check if we are trying to add more than the package can fit. // Check if we are trying to add more than the package can fit.
if (m_MaxPacketSize < m_Offset + sizeof(T)) { if (m_MaxPacketSize < m_Offset + sizeof(T)) {
if (m_MaxPacketSize >= 32000) { LOG_WARNING("Packet AddPrimitive(): You are trying to add more than we have allocated for! New size is %i bytes\n", m_MaxPacketSize*2);
// This will spam couse 8 players are over 100 000 bytes
//LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
}
resizeData(); resizeData();
} }
memcpy(m_Data + m_Offset, &val, sizeof(T)); memcpy(m_Data + m_Offset, &val, sizeof(T));
@@ -60,19 +55,13 @@ public:
void UpdateSize(); void UpdateSize();
char* ReadData(int SizeOfData); char* ReadData(int SizeOfData);
void ChangePacketID(unsigned int& packetID); void ChangePacketID(unsigned int& packetID);
void ChangeGroupIndex(int groupIndex);
void ChangeGroupSize(int groupSize);
void ChangeGroup(int group);
size_t Size() { return m_Offset; }; size_t Size() { return m_Offset; };
char* Data() { return m_Data; }; char* Data() { return m_Data; };
MessageType GetMessageType(); MessageType GetMessageType();
size_t Group();
size_t DataReadSize() { return m_ReturnDataOffset; } size_t DataReadSize() { return m_ReturnDataOffset; }
size_t MaxSize() { return m_MaxPacketSize; } size_t MaxSize() { return m_MaxPacketSize; }
size_t HeaderSize() { return m_HeaderSize; } size_t HeaderSize() { return m_HeaderSize; }
size_t GroupIndex();
size_t GroupSize();
size_t PacketID();
private: private:
char* m_Data; char* m_Data;
size_t m_ReturnDataOffset = 0; size_t m_ReturnDataOffset = 0;
@@ -81,13 +70,6 @@ private:
size_t m_HeaderSize = 0; size_t m_HeaderSize = 0;
void resizeData(); void resizeData();
void resizeData(int size); void resizeData(int size);
size_t packetSizeOffset = 0;
size_t groupOffset = 0;
size_t groupIndexOffset = 0;
size_t groupSizeOffset = 0;
size_t messageTypeOffset = 0;
size_t packetIDOffset = 0;
}; };
#endif #endif
@@ -14,7 +14,6 @@ struct PlayerDefinition {
unsigned short TCPPort; unsigned short TCPPort;
// use for tcp connections // use for tcp connections
boost::shared_ptr<boost::asio::ip::tcp::socket> TCPSocket; boost::shared_ptr<boost::asio::ip::tcp::socket> TCPSocket;
int PacketGroup = 1;
}; };
#endif #endif
+2 -13
View File
@@ -20,10 +20,6 @@
#include "../Game/Events/EDoubleJump.h" #include "../Game/Events/EDoubleJump.h"
#include "Core/EEntityDeleted.h" #include "Core/EEntityDeleted.h"
#include "Core/EComponentDeleted.h" #include "Core/EComponentDeleted.h"
#include "Core/EAmmoPickup.h"
#include "Core/EPlayerDeath.h"
#include "Network/EPlayerConnected.h"
#include "Network/EKillDeath.h"
class Server : public Network class Server : public Network
{ {
@@ -60,7 +56,6 @@ private:
std::vector<Events::InputCommand> m_InputCommandsToBroadcast; std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
//Timers //Timers
std::clock_t m_StartPingTime; std::clock_t m_StartPingTime;
std::string m_ServerName = "";
// Packet loss logic // Packet loss logic
PacketID m_PacketID = 0; PacketID m_PacketID = 0;
@@ -81,21 +76,19 @@ private:
void parseOnPlayerDamage(Packet& packet); void parseOnPlayerDamage(Packet& packet);
void identifyPacketLoss(); void identifyPacketLoss();
void kick(PlayerID player); void kick(PlayerID player);
PlayerID getPlayerIDFromEndpoint(); PlayerID GetPlayerIDFromEndpoint();
PlayerID getPlayerIDFromEntityID(EntityID entityID);
void parsePlayerTransform(Packet& packet); void parsePlayerTransform(Packet& packet);
void parseOnInputCommand(Packet& packet); void parseOnInputCommand(Packet& packet);
void parseClientPing(); void parseClientPing();
void parsePing(); void parsePing();
bool parseDoubleJump(Packet& packet); bool parseDoubleJump(Packet& packet);
void parseDashEffect(Packet& packet);
void parseUDPConnect(Packet& packet); void parseUDPConnect(Packet& packet);
void parseTCPConnect(Packet& packet); void parseTCPConnect(Packet& packet);
void parseDisconnect(); void parseDisconnect();
void parseServerlistRequest(boost::asio::ip::udp::endpoint endpoint); void parseServerlistRequest(boost::asio::ip::udp::endpoint endpoint);
bool shouldSendToClient(EntityWrapper childEntity); bool shouldSendToClient(EntityWrapper childEntity);
// Events // Debug event
EventRelay<Server, Events::InputCommand> m_EInputCommand; EventRelay<Server, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e); bool OnInputCommand(const Events::InputCommand& e);
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned; EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
@@ -106,10 +99,6 @@ private:
bool OnComponentDeleted(const Events::ComponentDeleted& e); bool OnComponentDeleted(const Events::ComponentDeleted& e);
EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage; EventRelay<Server, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(const Events::PlayerDamage& e); bool OnPlayerDamage(const Events::PlayerDamage& e);
EventRelay<Server, Events::AmmoPickup> m_EAmmoPickup;
bool OnAmmoPickup(const Events::AmmoPickup& e);
EventRelay<Server, Events::PlayerDeath> m_EPlayerDeath;
bool OnPlayerDeath(const Events::PlayerDeath& e);
}; };
#endif #endif
+1 -1
View File
@@ -10,7 +10,7 @@ public:
TCPClient(); TCPClient();
~TCPClient(); ~TCPClient();
bool Connect(std::string playerName, std::string address, int port); void Connect(std::string playerName, std::string address, int port);
void Disconnect(); void Disconnect();
void Receive(Packet& packet); void Receive(Packet& packet);
void Send(Packet & packet); void Send(Packet & packet);
+2 -15
View File
@@ -1,7 +1,5 @@
#ifndef UDPClient_h__ #ifndef UDPClient_h__
#define UDPClient_h__ #define UDPClient_h__
#include <map>
#include <algorithm>
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include "Network/NetworkClient.h" #include "Network/NetworkClient.h"
@@ -12,30 +10,19 @@ public:
UDPClient(); UDPClient();
~UDPClient(); ~UDPClient();
bool Connect(std::string playerName, std::string address, int port); void Connect(std::string playerName, std::string address, int port);
void Disconnect(); void Disconnect();
void Receive(Packet& packet); void Receive(Packet& packet);
void ReceivePackets(); void Send(Packet & packet);
void Send(Packet& packet);
void Broadcast(Packet& packet, int port); void Broadcast(Packet& packet, int port);
bool IsSocketAvailable(); bool IsSocketAvailable();
// Returns false if no packets are available
bool GetNextPacket(Packet& packet);
private: private:
typedef std::map<unsigned int, std::vector<std::pair<int, boost::shared_ptr<char>>>> PacketMap;
// Assio UDP logic // Assio UDP logic
boost::asio::io_service m_IOService; boost::asio::io_service m_IOService;
boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket; boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
int m_LastReceivedSnapshotGroup = 0;
int readBuffer(); int readBuffer();
void readPartOfPacket();
PacketID m_SendPacketID = 0; PacketID m_SendPacketID = 0;
//map:(packetGroup, vector:(pair:(groupIndex, packetData)))
PacketMap m_PacketSegmentMap;
bool hasReceivedPacket(int packetGroup, int groupIndex);
// 2^19
const int m_SizeOfSocketBuffer = 524288;
}; };
#endif #endif
-2
View File
@@ -3,7 +3,6 @@
#include "NetworkServer.h" #include "NetworkServer.h"
#include <boost/asio/ip/udp.hpp> #include <boost/asio/ip/udp.hpp>
#define MAXPACKETSIZE 64000
class UDPServer : public NetworkServer class UDPServer : public NetworkServer
{ {
@@ -14,7 +13,6 @@ public:
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers); void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
void Receive(Packet & packet, PlayerDefinition & playerDefinition); void Receive(Packet & packet, PlayerDefinition & playerDefinition);
void Send(Packet & packet, PlayerDefinition & playerDefinition); void Send(Packet & packet, PlayerDefinition & playerDefinition);
void SendToConnectedPlayers(Packet & packet, std::map<PlayerID, PlayerDefinition>& playersTosendTo);
void Send(Packet & packet); void Send(Packet & packet);
void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint); void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint);
void Broadcast(Packet & packet, int port); void Broadcast(Packet & packet, int port);
+13 -27
View File
@@ -3,41 +3,27 @@
#include "GLM.h" #include "GLM.h"
#include "../Common.h" #include "Common.h"
#include "../Core/System.h" #include "Core/System.h"
#include "../Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Rendering/Model.h" #include "Rendering/Model.h"
#include "Rendering/EAnimationComplete.h"
#include "Rendering/Skeleton.h" #include "Rendering/Skeleton.h"
#include "Rendering/BlendTree.h" #include <imgui/imgui.h>
#include "Rendering/EAutoAnimationBlend.h"
#include "../Core/EntityWrapper.h"
#include "Rendering/AutoBlendQueue.h"
#include "../Input/EInputCommand.h"
#include "../Core/EEntityDeleted.h"
#include "Rendering/ESetBlendWeight.h"
#include "imgui/imgui.h"
class AnimationSystem : public ImpureSystem class AnimationSystem : public PureSystem
{ {
public: public:
AnimationSystem(SystemParams params); AnimationSystem(SystemParams params)
: System(params)
, PureSystem("Animation")
{
}
~AnimationSystem() { } ~AnimationSystem() { }
virtual void Update(double dt) override; virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& animationComponent, double dt) override;
private: private:
void CreateBlendTrees();
void UpdateAnimations(double dt);
void UpdateWeights(double dt);
EventRelay<AnimationSystem, Events::AutoAnimationBlend> m_EAutoAnimationBlend;
bool OnAutoAnimationBlend(Events::AutoAnimationBlend& e);
EventRelay<AnimationSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(Events::EntityDeleted& e);
EventRelay<AnimationSystem, Events::SetBlendWeight> m_ESetBlendWeight;
bool OnSetBlendWeight(Events::SetBlendWeight& e);
std::unordered_map<EntityWrapper, AutoBlendQueue> m_AutoBlendQueues;
}; };
#endif #endif
-48
View File
@@ -1,48 +0,0 @@
#ifndef AutoBlendQueue_h__
#define AutoBlendQueue_h__
#include "../Core/ResourceManager.h"
#include "Skeleton.h"
#include "Model.h"
#include "BlendTree.h"
#include "../Core/EntityWrapper.h"
class AutoBlendQueue
{
public:
struct AutoBlendJob
{
EntityWrapper RootNode = EntityWrapper::Invalid;
double Duration;
double CurrentTime = 0.0;
double Delay = 0.0;
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
BlendTree::AutoBlendInfo BlendInfo;
};
struct AutoblendNode
{
AutoBlendJob BlendJob;
double StartTime;
double EndTime;
};
AutoBlendQueue() { };
void Insert(AutoBlendJob autoBlendJob);
void UpdateTime(double dt);
void PrintQueue();
bool HasActiveBlendJob();
std::shared_ptr<BlendTree> GetBlendTree();
AutoBlendQueue::AutoBlendJob& GetActiveBlendJob();
bool Empty() { return m_BlendQueue.empty(); }
private:
std::list<AutoblendNode> m_BlendQueue;
};
#endif
-104
View File
@@ -1,104 +0,0 @@
#ifndef BlendTree_h__
#define BlendTree_h__
#include "Common.h"
#include "../GLM.h"
#include "Skeleton.h"
#include "../Core/EntityWrapper.h"
#include "../Core/World.h"
#include <stack>
class BlendTree
{
public:
enum class NodeType
{
Additive,
Blend,
Override,
Animation,
};
struct Node
{
std::string Name;
EntityWrapper Entity;
Node* Parent = nullptr;
Node* Child[2] = { nullptr, nullptr };
NodeType Type;
std::map<int, Skeleton::PoseData> Pose;
bool SubTreeRoot = false;
double Weight = 0.0;
Node* Next() {
Node* next = this;
if (next->Child[1] == nullptr) {
// Node has no right child
next = this;
while (next->Parent != nullptr && next == next->Parent->Child[1]) {
next = next->Parent;
}
next = next->Parent;
} else {
// Find the leftmost node in the right subtree
next = next->Child[1];
while (next->Child[0] != nullptr) {
next = next->Child[0];
}
}
return next;
}
};
struct AutoBlendInfo
{
std::string NodeName;
double progress;
bool Start;
bool SingleBlend;
double Weight;
std::unordered_map<EntityWrapper, double> StartWeights;
};
BlendTree(EntityWrapper ModelEntity, Skeleton* skeleton);
~BlendTree();
std::vector<glm::mat4> GetFinalPose() { return m_FinalPose; }
glm::mat4 GetBoneTransform(int boneID);
bool IsValid() { return (m_Root == nullptr ? false : true); }
void PrintTree();
BlendTree::AutoBlendInfo AutoBlendStep(AutoBlendInfo blendInfo);
BlendTree::Node* GetCommonParent(std::string NodeName1, std::string NodeName2);
BlendTree::Node* FirstCommonParent(Node* node1, Node* node2);
EntityWrapper GetSubTreeRoot(std::string nodeName);
std::vector<EntityWrapper> GetSingleLevelRoots(std::string name);
std::vector<EntityWrapper> GetEntitesByName(std::string name);
void SetWeightByName(std::string name, double weight);
private:
Skeleton* m_Skeleton = nullptr;
Node* m_Root = nullptr;
std::vector<glm::mat4> m_FinalPose;
std::map<int, glm::mat4> m_FinalBoneTransforms;
std::vector<BlendTree::Node*> FindNodesByName(std::string name);
std::vector<glm::mat4> AccumulateFinalPose();
BlendTree::Node* FillTreeByName(Node* parentNode, std::string name, EntityWrapper parentEntity);
void Blend(std::map<int, Skeleton::PoseData>& pose);
};
#endif
-70
View File
@@ -1,70 +0,0 @@
#ifndef BlurHUD_h__
#define BlurHUD_h__
#include "IRenderer.h"
#include "DrawBloomPassState.h"
//#include "LightCullingPass.h" Finalpass om den skall skickas in
#include "FrameBuffer.h"
#include "ShaderProgram.h"
//#include "Util/UnorderedMapVec2.h"
#include "Texture.h"
class BlurHUD
{
public:
BlurHUD(IRenderer* renderer);
~BlurHUD() { }
void InitializeTextures();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void InitializeBuffers();
void ClearBuffer();
void FillGaussianBuffer(FrameBuffer* fb);
GLuint Draw(GLuint texture, RenderScene& scene);
void OnWindowResize();
void FillStencil(RenderScene& scene);
GLuint CombineTextures(GLuint texture1, GLuint texture2);
//Getters
//Return the blurred result of the texture that was sent into draw
GLuint GaussianTexture() const {
if (m_Quality == 0) {
return m_BlackTexture->m_Texture;
} else {
return m_GaussianTexture_vert;
}
}
private:
Texture* m_BlackTexture;
Model* m_ScreenQuad;
const IRenderer* m_Renderer;
ConfigFile* m_Config;
//const LightCullingPass* m_LightCullingPass
int m_Iterations = 3;
int m_Quality = 0;
float m_BlurQuality = 4.f;
GLuint m_GaussianTexture_horiz = 0;
GLuint m_GaussianTexture_vert = 0;
GLuint m_DepthStencil_horiz = 0;
GLuint m_DepthStencil_vert = 0;
GLuint m_CombinedTexture = 0;
FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer m_GaussianFrameBuffer_vert;
FrameBuffer m_CombinedTextureBuffer;
ShaderProgram* m_GaussianProgram_horiz;
ShaderProgram* m_GaussianProgram_vert;
ShaderProgram* m_FillDepthStencilProgram;
ShaderProgram* m_CombineTexturesProgram;
};
#endif
@@ -8,7 +8,6 @@
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Rendering/Model.h" #include "Rendering/Model.h"
#include "Rendering/Skeleton.h" #include "Rendering/Skeleton.h"
#include "Rendering/BlendTree.h"
//Needs to be a higher orderlevel than AnimationSystem //Needs to be a higher orderlevel than AnimationSystem
class BoneAttachmentSystem : public PureSystem class BoneAttachmentSystem : public PureSystem
+1 -1
View File
@@ -15,7 +15,7 @@ public:
void GenerateCubeMapTexture(); void GenerateCubeMapTexture();
//GLuint CubeMapTexture() const { return m_CubeMapTexture; } //GLuint CubeMapTexture() const { return m_CubeMapTexture; }
GLuint m_CubeMapTexture = 0; GLuint m_CubeMapTexture = -1;
private: private:
IRenderer* m_Renderer; IRenderer* m_Renderer;
+11 -24
View File
@@ -12,8 +12,8 @@
class DrawBloomPass class DrawBloomPass
{ {
public: public:
DrawBloomPass(IRenderer* renderer, ConfigFile* config); DrawBloomPass(IRenderer* renderer /* ,Texture or finalpass*/ );
~DrawBloomPass(); ~DrawBloomPass() { }
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
@@ -23,45 +23,32 @@ public:
void FillGaussianBuffer(FrameBuffer* fb); void FillGaussianBuffer(FrameBuffer* fb);
void Draw(GLuint texture); void Draw(GLuint texture);
void ChangeQuality(int quality);
void OnWindowResize(); void OnWindowResize();
//Getters //Getters
//Return the blurred result of the texture that was sent into draw //Return the blurred result of the texture that was sent into draw
GLuint GaussianTexture() const { GLuint GaussianTexture() const { return m_GaussianTexture_vert; }
if (m_Quality == 0) {
return m_BlackTexture->m_Texture;
} else {
return m_FinalGaussianTexture;
}
}
private: private:
void GaussianLodPass(GLuint mipMap, GLuint texture); void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
void CombineGaussianBlur();
Texture* m_BlackTexture; Texture* m_WhiteTexture;
Model* m_ScreenQuad; Model* m_ScreenQuad;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
ConfigFile* m_Config;
//const LightCullingPass* m_LightCullingPass //const LightCullingPass* m_LightCullingPass
int m_Iterations; GLuint m_iterations = 9;
int m_Quality = 0;
int m_BloomLod = 5;
GLuint m_GaussianTexture_horiz = 0; GLuint m_GaussianTexture_horiz;
GLuint m_GaussianTexture_vert = 0; GLuint m_GaussianTexture_vert;
GLuint m_FinalGaussianTexture = 0;
FrameBuffer* m_GaussianFrameBuffer_horiz = nullptr; FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer* m_GaussianFrameBuffer_vert = nullptr; FrameBuffer m_GaussianFrameBuffer_vert;
FrameBuffer m_GaussianCombineBuffer;
ShaderProgram* m_GaussianProgram_horiz; ShaderProgram* m_GaussianProgram_horiz;
ShaderProgram* m_GaussianProgram_vert; ShaderProgram* m_GaussianProgram_vert;
ShaderProgram* m_GaussianCombineProgram;
}; };
@@ -17,7 +17,7 @@ public:
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
void Draw(GLuint sceneTexture, GLuint bloomTexture, GLfloat gamma, GLfloat exposure); void Draw(GLuint sceneTexture, GLuint bloomTexture, GLuint sceneTextureLowRes, GLuint bloomTextureLowRes, GLfloat gamma, GLfloat exposure);
private: private:
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
+24 -38
View File
@@ -5,44 +5,43 @@
#include "DrawFinalPassState.h" #include "DrawFinalPassState.h"
#include "LightCullingPass.h" #include "LightCullingPass.h"
#include "CubeMapPass.h" #include "CubeMapPass.h"
#include "SSAOPass.h"
#include "FrameBuffer.h" #include "FrameBuffer.h"
#include "ShaderProgram.h" #include "ShaderProgram.h"
#include "Util/UnorderedMapVec2.h" #include "Util/UnorderedMapVec2.h"
#include "Util/CommonFunctions.h" #include "Util/CommonFunctions.h"
#include "Texture.h" #include "Texture.h"
#include "ShadowPass.h"
#include "BlurHUD.h"
class DrawFinalPass class DrawFinalPass
{ {
public: public:
DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass); DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass);
~DrawFinalPass(); ~DrawFinalPass() { }
void InitializeTextures(); void InitializeTextures();
void InitializeFrameBuffers(); void InitializeFrameBuffers();
void InitializeShaderPrograms(); void InitializeShaderPrograms();
void Draw(RenderScene& scene, BlurHUD* blurHUDPass); void Draw(RenderScene& scene, GLuint SSAOTexture);
void ClearBuffer(); void ClearBuffer();
void OnWindowResize(); void OnWindowResize();
//Return the texture that is used in later stages to apply the bloom effect //Return the texture that is used in later stages to apply the bloom effect
GLuint BloomTexture() const { return m_BloomTexture; } GLuint BloomTexture() const { return m_BloomTexture; }
GLuint BloomTextureLowRes() const { return m_BloomTextureLowRes; }
//Return the texture with diffuse and lighting of the scene. //Return the texture with diffuse and lighting of the scene.
GLuint SceneTexture() const { return m_SceneTexture; } GLuint SceneTexture() const { return m_SceneTexture; }
//Return the SceneTexture with the blurred HUD bits. GLuint SceneTextureLowRes() const { return m_SceneTextureLowRes; }
GLuint CombinedSceneTexture() const { return m_CombinedTexture; }
//Return the blurred scene texture.
GLuint FullBlurredTexture() const { return m_FullBlurredTexture; }
//Return the framebuffer used in the scene rendering stage. //Return the framebuffer used in the scene rendering stage.
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; } FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
FrameBuffer* FinalPassFrameBufferLowRes() { return &m_FinalPassFrameBufferLowRes; }
private: private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) const;
void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene); void DrawSprites(std::list<std::shared_ptr<RenderJob>>&jobs, RenderScene& scene);
void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene); void DrawModelRenderQueues(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene, GLuint SSAOTexture);
void DrawModelRenderQueuesWithShieldCheck(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene); void DrawShieldToStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene); void DrawShieldedModelRenderQueue(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void DrawToDepthStencilBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene); void DrawToDepthBuffer(std::list<std::shared_ptr<RenderJob>>& jobs, RenderScene& scene);
void BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<ExplosionEffectJob>& job, RenderScene& scene); void BindExplosionUniforms(GLuint shaderHandle, std::shared_ptr<ExplosionEffectJob>& job, RenderScene& scene);
void BindModelUniforms(GLuint shaderHandle, std::shared_ptr<ModelJob>& job, RenderScene& scene); void BindModelUniforms(GLuint shaderHandle, std::shared_ptr<ModelJob>& job, RenderScene& scene);
@@ -57,14 +56,14 @@ private:
Texture* m_ErrorTexture; Texture* m_ErrorTexture;
FrameBuffer m_FinalPassFrameBuffer; FrameBuffer m_FinalPassFrameBuffer;
FrameBuffer m_ShieldDepthFrameBuffer; FrameBuffer m_FinalPassFrameBufferLowRes;
GLuint m_BloomTexture = 0; GLuint m_BloomTexture;
GLuint m_SceneTexture = 0; GLuint m_SceneTexture;
GLuint m_DepthBuffer = 0; GLuint m_BloomTextureLowRes;
GLuint m_ShieldBuffer = 0; GLuint m_SceneTextureLowRes;
GLuint m_CubeMapTexture = 0; GLuint m_DepthBuffer;
GLuint m_FullBlurredTexture; GLuint m_DepthBufferLowRes;
GLuint m_CombinedTexture; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures GLuint m_CubeMapTexture;
//maqke this component based i guess? //maqke this component based i guess?
GLuint m_ShieldPixelRate = 16; GLuint m_ShieldPixelRate = 16;
@@ -72,35 +71,22 @@ private:
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
const LightCullingPass* m_LightCullingPass; const LightCullingPass* m_LightCullingPass;
const CubeMapPass* m_CubeMapPass; const CubeMapPass* m_CubeMapPass;
const SSAOPass* m_SSAOPass;
const ShadowPass* m_ShadowPass;
ShaderProgram* m_ForwardPlusProgram; ShaderProgram* m_ForwardPlusProgram;
ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectProgram;
ShaderProgram* m_ExplosionEffectSplatMapProgram; ShaderProgram* m_ExplosionEffectSplatMapProgram;
ShaderProgram* m_SpriteProgram; ShaderProgram* m_SpriteProgram;
ShaderProgram* m_ForwardPlusSplatMapProgram; ShaderProgram* m_ForwardPlusSplatMapProgram;
ShaderProgram* m_FillDepthStencilBufferProgram; ShaderProgram* m_ShieldToStencilProgram;
ShaderProgram* m_FillDepthBufferProgram;
ShaderProgram* m_ForwardPlusShieldCheckProgram;
ShaderProgram* m_ExplosionEffectShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSplatMapShieldCheckProgram;
ShaderProgram* m_SpriteShieldCheckProgram;
ShaderProgram* m_ForwardPlusSplatMapShieldCheckProgram;
ShaderProgram* m_ForwardPlusSkinnedProgram; ShaderProgram* m_ForwardPlusSkinnedProgram;
ShaderProgram* m_ExplosionEffectSkinnedProgram; ShaderProgram* m_ExplosionEffectSkinnedProgram;
ShaderProgram* m_ExplosionEffectSplatMapSkinnedProgram; ShaderProgram* m_ExplosionEffectSplatMapSkinnedProgram;
ShaderProgram* m_ForwardPlusSplatMapSkinnedProgram; ShaderProgram* m_ForwardPlusSplatMapSkinnedProgram;
ShaderProgram* m_FillDepthStencilBufferSkinnedProgram; ShaderProgram* m_ShieldToStencilSkinnedProgram;
ShaderProgram* m_FillDepthBufferSkinnedProgram;
ShaderProgram* m_ForwardPlusSkinnedShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSkinnedShieldCheckProgram;
ShaderProgram* m_ExplosionEffectSplatMapSkinnedShieldCheckProgram;
ShaderProgram* m_ForwardPlusSplatMapSkinnedShieldCheckProgram;
ShaderProgram* m_FillDepthBufferSkinnedShieldCheckProgram;
}; };
#endif #endif
@@ -1,28 +0,0 @@
#ifndef Events_AutoAnimationBlend_h__
#define Events_AutoAnimationBlend_h__
#include "../Core/EventBroker.h"
#include "../Core/EntityWrapper.h"
namespace Events
{
struct AutoAnimationBlend : Event
{
EntityWrapper RootNode = EntityWrapper::Invalid;
std::string NodeName;
double Duration = 0.0;
double Delay = 0.0;
bool Start = false;
bool Reverse = false;
bool Restart = false;
bool SingleLevelBlend = false;
double Weight = -1.0;
EntityWrapper AnimationEntity = EntityWrapper::Invalid;
};
}
#endif
@@ -1,19 +0,0 @@
#ifndef EResolutionChanged_h__
#define EResolutionChanged_h__
#include "../Core/Event.h"
#include "../Core/Util/Rectangle.h"
namespace Events
{
// Fired when the framebuffer size changes
struct ResolutionChanged : Event
{
Rectangle OldResolution;
Rectangle NewResolution;
};
}
#endif
@@ -1,20 +0,0 @@
#ifndef Events_SetBlendWeight_h__
#define Events_SetBlendWeight_h__
#include "../Core/EventBroker.h"
#include "../Core/EntityWrapper.h"
namespace Events
{
//Sets the blend weight for all nodes with "NodeName"
struct SetBlendWeight : Event
{
EntityWrapper RootNode = EntityWrapper::Invalid;
std::string NodeName;
double Weight;
};
}
#endif
@@ -15,8 +15,8 @@
struct ExplosionEffectJob : ModelJob struct ExplosionEffectJob : ModelJob
{ {
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow) ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage)
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded, shadow) : ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage)
{ {
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"]; ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"]; TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
+6 -17
View File
@@ -7,12 +7,11 @@
class BufferResource class BufferResource
{ {
public: public:
BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod); BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment);
GLuint* m_ResourceHandle; GLuint* m_ResourceHandle;
GLenum m_ResourceType; GLenum m_ResourceType;
GLenum m_Attachment; GLenum m_Attachment;
GLuint m_MipMapLod = 0;
private: private:
}; };
@@ -21,15 +20,15 @@ template <GLenum RESOURCETYPE>
class ResourceType : public BufferResource class ResourceType : public BufferResource
{ {
public: public:
ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod) ResourceType(GLuint* resourceHandle, GLenum attachment)
: BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod) { } : BufferResource(resourceHandle, RESOURCETYPE, attachment) { }
}; };
class Texture2D : public ResourceType<GL_TEXTURE_2D> class Texture2D : public ResourceType<GL_TEXTURE_2D>
{ {
public: public:
Texture2D(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0) Texture2D(GLuint* resourceHandle, GLenum attachment)
: ResourceType(resourceHandle, attachment, mipMapLod) { }; : ResourceType(resourceHandle, attachment) { };
~Texture2D(); ~Texture2D();
}; };
@@ -38,22 +37,12 @@ class RenderBuffer : public ResourceType<GL_RENDERBUFFER>
{ {
public: public:
RenderBuffer(GLuint* resourceHandle, GLenum attachment) RenderBuffer(GLuint* resourceHandle, GLenum attachment)
: ResourceType(resourceHandle, attachment, 0) : ResourceType(resourceHandle, attachment)
{ }; { };
~RenderBuffer(); ~RenderBuffer();
}; };
class Texture2DArray : public ResourceType<GL_TEXTURE_2D_ARRAY>
{
public:
Texture2DArray(GLuint* resourceHandle, GLenum attachment)
: ResourceType(resourceHandle, attachment, 0)
{ };
~Texture2DArray();
};
class FrameBuffer class FrameBuffer
{ {
public: public:
-2
View File
@@ -5,13 +5,11 @@
#include "../OpenGL.h" #include "../OpenGL.h"
#include "../GLM.h" #include "../GLM.h"
#include "../Core/Util/Rectangle.h" #include "../Core/Util/Rectangle.h"
#include "../Core/ConfigFile.h"
#include "Util/ScreenCoords.h" #include "Util/ScreenCoords.h"
#include "Camera.h" #include "Camera.h"
#include "RenderQueue.h" #include "RenderQueue.h"
#include "Model.h" #include "Model.h"
#include "../Core/World.h" //So temp #include "../Core/World.h" //So temp
#include "Util/CommonFunctions.h"
struct PickData struct PickData
+3 -3
View File
@@ -54,7 +54,7 @@ private:
struct Frustum { struct Frustum {
Plane Planes[4]; Plane Planes[4];
}; };
Frustum* m_Frustums = nullptr; Frustum* m_Frustums;
//This should be a component //This should be a component
struct LightSource { struct LightSource {
@@ -74,11 +74,11 @@ private:
glm::vec2 Padding = glm::vec2(1.f, 2.f); glm::vec2 Padding = glm::vec2(1.f, 2.f);
}; };
LightGrid* m_LightGrid = nullptr; LightGrid* m_LightGrid;
int m_LightOffset = 0; int m_LightOffset = 0;
float* m_LightIndex = nullptr; float* m_LightIndex;
}; };
+48 -16
View File
@@ -15,24 +15,34 @@
#include "../Core/Transform.h" #include "../Core/Transform.h"
#include "Skeleton.h" #include "Skeleton.h"
#include "ShaderProgram.h" #include "ShaderProgram.h"
#include "BlendTree.h"
struct ModelJob : RenderJob struct ModelJob : RenderJob
{ {
ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow) ModelJob(Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matProp, ComponentWrapper modelComponent, World* world, glm::vec4 fillColor, float fillPercentage)
: RenderJob() : RenderJob()
{ {
Model = model; Model = model;
ModelID = model->ResourceID; ModelID = model->ResourceID;
Type = matProp.type; Type = matProp.type;
::RawModel::MaterialBasic* matGroup = matProp.material; ::RawModel::MaterialBasic* matGroup = matProp.material;
ShaderID = matProp.ShaderID;
switch(matProp.type){ switch(matProp.type){
case ::RawModel::MaterialType::Basic: case ::RawModel::MaterialType::Basic:
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
TextureID = 0; TextureID = 0;
break; break;
case ::RawModel::MaterialType::SingleTextures: case ::RawModel::MaterialType::SingleTextures:
{ {
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
}
::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material); ::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material);
TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0; TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0;
if (modelComponent["DiffuseTexture"]) { if (modelComponent["DiffuseTexture"]) {
@@ -54,6 +64,12 @@ struct ModelJob : RenderJob
break; break;
case ::RawModel::MaterialType::SplatMapping: case ::RawModel::MaterialType::SplatMapping:
{ {
if (Model->IsSkinned()) {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapSkinnedProgram")->ResourceID;
}
else {
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapProgram")->ResourceID;
}
::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material); ::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material);
SplatMap = &SplatTextures->SplatMap; SplatMap = &SplatTextures->SplatMap;
@@ -94,28 +110,45 @@ struct ModelJob : RenderJob
Color = modelComponent["Color"]; Color = modelComponent["Color"];
GlowIntensity = ((double)modelComponent["GlowIntensity"]); GlowIntensity = ((double)modelComponent["GlowIntensity"]);
Entity = modelComponent.EntityID; Entity = modelComponent.EntityID;
glm::vec3 abspos = glm::vec3(matrix[3][0], matrix[3][1], matrix[3][2]); glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID);
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1)); glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
Depth = worldpos.z; Depth = worldpos.z;
World = world; World = world;
Shadow = shadow;
FillColor = fillColor; FillColor = fillColor;
FillPercentage = fillPercentage; FillPercentage = fillPercentage;
IsShielded = isShielded;
if (model->IsSkinned()) { if (model->IsSkinned()) {
Skeleton = Model->m_RawModel->m_Skeleton; Skeleton = Model->m_RawModel->m_Skeleton;
if (Skeleton != nullptr) { if (Skeleton != nullptr) {
if (world->HasComponent(Entity, "Animation")) {
EntityWrapper entityWrapper = EntityWrapper(world, modelComponent.EntityID); auto animationComponent = world->GetComponent(Entity, "Animation");
if(Skeleton->BlendTrees.find(entityWrapper) != Skeleton->BlendTrees.end()) { for (int i = 1; i <= 3; i++) {
BlendTree = Skeleton->BlendTrees.at(entityWrapper); ::Skeleton::AnimationData animationData;
animationData.animation = model->m_RawModel->m_Skeleton->GetAnimation(animationComponent["AnimationName" + std::to_string(i)]);
if (animationData.animation == nullptr) {
continue;
}
animationData.time = (double)animationComponent["Time" + std::to_string(i)];
animationData.weight = (double)animationComponent["Weight" + std::to_string(i)];
Animations.push_back(animationData);
}
}
if (world->HasComponent(Entity, "AnimationOffset")) {
auto animationOffsetComponent = world->GetComponent(Entity, "AnimationOffset");
AnimationOffset.animation = model->m_RawModel->m_Skeleton->GetAnimation(animationOffsetComponent["AnimationName"]);
AnimationOffset.time = (double)animationOffsetComponent["Time"];
} else {
AnimationOffset.animation = nullptr;
} }
} }
} }
}; };
unsigned int TextureID; unsigned int TextureID;
@@ -134,7 +167,10 @@ struct ModelJob : RenderJob
glm::vec4 Color; glm::vec4 Color;
const ::Model* Model = nullptr; const ::Model* Model = nullptr;
::Skeleton* Skeleton = nullptr; ::Skeleton* Skeleton = nullptr;
std::shared_ptr<::BlendTree> BlendTree = nullptr; std::vector<::Skeleton::AnimationData> Animations;
::Skeleton::AnimationOffset AnimationOffset;
float GlowIntensity = 8.0; float GlowIntensity = 8.0;
glm::vec4 DiffuseColor; glm::vec4 DiffuseColor;
glm::vec4 SpecularColor; glm::vec4 SpecularColor;
@@ -145,14 +181,10 @@ struct ModelJob : RenderJob
glm::vec4 FillColor = glm::vec4(0); glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0; float FillPercentage = 0.0;
bool IsShielded;
bool Shadow;
void CalculateHash() override void CalculateHash() override
{ {
Hash = TextureID; Hash = ShaderID << 20 + ModelID << 10 + TextureID;
Hash += ModelID << 10;
Hash += ShaderID << 20;
} }
}; };
+5 -3
View File
@@ -28,13 +28,15 @@ public:
const ShaderProgram& PickingProgram() const { return *m_PickingProgram; } const ShaderProgram& PickingProgram() const { return *m_PickingProgram; }
//const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; } //const std::unordered_map<glm::ivec2, EntityID>& PickingColorsToEntity() const { return m_PickingColorsToEntity; }
GLuint PickingTexture() const { return m_PickingTexture; } GLuint PickingTexture() const { return m_PickingTexture; }
GLuint* DepthBuffer() { return &m_DepthBuffer; } GLuint DepthBuffer() const { return m_DepthBuffer; }
const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; } const FrameBuffer& PickingBuffer() const { return m_PickingBuffer; }
PickData Pick(glm::vec2 screenCoord); PickData Pick(glm::vec2 screenCoord);
private: private:
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
@@ -52,8 +54,8 @@ private:
std::unordered_map<glm::ivec2, PickingInfo> m_PickingColorsToEntity; std::unordered_map<glm::ivec2, PickingInfo> m_PickingColorsToEntity;
GLuint m_PickingTexture = 0; GLuint m_PickingTexture;
GLuint m_DepthBuffer = 0; GLuint m_DepthBuffer;
FrameBuffer m_PickingBuffer; FrameBuffer m_PickingBuffer;
@@ -18,7 +18,6 @@
#include "../Core/ResourceManager.h" #include "../Core/ResourceManager.h"
#include "Texture.h" #include "Texture.h"
#include "Skeleton.h" #include "Skeleton.h"
#include "ShaderProgram.h"
#include "boost\endian\buffers.hpp" #include "boost\endian\buffers.hpp"
@@ -88,7 +87,6 @@ public:
struct MaterialProperties { struct MaterialProperties {
MaterialType type; MaterialType type;
MaterialBasic* material; MaterialBasic* material;
unsigned int ShaderID = 0;
}; };
const Vertex* Vertices() const { const Vertex* Vertices() const {
+6 -5
View File
@@ -16,15 +16,16 @@ struct RenderJob
public: public:
float Depth; float Depth;
bool operator<(const RenderJob& rhs)
{
return this->Hash < rhs.Hash;
}
protected: protected:
uint64_t Hash; uint64_t Hash;
virtual void CalculateHash() = 0; virtual void CalculateHash() = 0;
bool operator<(const RenderJob& rhs)
{
return this->Hash < rhs.Hash;
}
}; };
#endif #endif
+2 -1
View File
@@ -24,6 +24,7 @@ struct RenderScene
std::list<std::shared_ptr<RenderJob>> OpaqueObjects; std::list<std::shared_ptr<RenderJob>> OpaqueObjects;
std::list<std::shared_ptr<RenderJob>> TransparentObjects; std::list<std::shared_ptr<RenderJob>> TransparentObjects;
std::list<std::shared_ptr<RenderJob>> OpaqueShieldedObjects; std::list<std::shared_ptr<RenderJob>> OpaqueShieldedObjects;
std::list<std::shared_ptr<RenderJob>> TransparentShieldedObjects;
std::list<std::shared_ptr<RenderJob>> ShieldObjects; std::list<std::shared_ptr<RenderJob>> ShieldObjects;
std::list<std::shared_ptr<RenderJob>> SpriteJob; std::list<std::shared_ptr<RenderJob>> SpriteJob;
std::list<std::shared_ptr<RenderJob>> PointLight; std::list<std::shared_ptr<RenderJob>> PointLight;
@@ -33,7 +34,6 @@ struct RenderScene
Rectangle Viewport; Rectangle Viewport;
bool ClearDepth = false; bool ClearDepth = false;
bool ShouldBlur = false;
glm::vec4 AmbientColor; glm::vec4 AmbientColor;
void Clear() void Clear()
@@ -41,6 +41,7 @@ struct RenderScene
Jobs.OpaqueObjects.clear(); Jobs.OpaqueObjects.clear();
Jobs.TransparentObjects.clear(); Jobs.TransparentObjects.clear();
Jobs.OpaqueShieldedObjects.clear(); Jobs.OpaqueShieldedObjects.clear();
Jobs.TransparentShieldedObjects.clear();
Jobs.ShieldObjects.clear(); Jobs.ShieldObjects.clear();
Jobs.SpriteJob.clear(); Jobs.SpriteJob.clear();
Jobs.DirectionalLight.clear(); Jobs.DirectionalLight.clear();
-2
View File
@@ -24,8 +24,6 @@ public:
bool StencilFunc(GLenum func, GLint ref, GLuint mask); bool StencilFunc(GLenum func, GLint ref, GLuint mask);
bool StencilMask(GLuint mask); bool StencilMask(GLuint mask);
bool DepthMask(GLboolean flag); bool DepthMask(GLboolean flag);
bool DepthFunc(GLenum func);
bool AlphaFunc(GLenum func, GLclampf thresholder);
private: private:
std::vector<std::function<void(void)>> m_ResetFunctions; std::vector<std::function<void(void)>> m_ResetFunctions;
-3
View File
@@ -19,7 +19,6 @@
#include "../Core/Octree.h" #include "../Core/Octree.h"
#include "../Collision/EntityAABB.h" #include "../Collision/EntityAABB.h"
#include "../Core/ConfigFile.h" #include "../Core/ConfigFile.h"
#include "EResolutionChanged.h"
class RenderSystem : public ImpureSystem class RenderSystem : public ImpureSystem
{ {
@@ -37,8 +36,6 @@ private:
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid; EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
Octree<EntityAABB>* m_Octree; Octree<EntityAABB>* m_Octree;
EventRelay<RenderSystem, Events::ResolutionChanged> m_EResolutionChanged;
bool OnResolutionChanged(Events::ResolutionChanged &event);
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera; EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
bool OnSetCamera(Events::SetCamera &event); bool OnSetCamera(Events::SetCamera &event);
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand; EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
+10 -19
View File
@@ -18,7 +18,6 @@
#include "DrawColorCorrectionPass.h" #include "DrawColorCorrectionPass.h"
#include "SSAOPass.h" #include "SSAOPass.h"
#include "CubeMapPass.h" #include "CubeMapPass.h"
#include "BlurHUD.h"
#include "../Core/EventBroker.h" #include "../Core/EventBroker.h"
#include "ImGuiRenderPass.h" #include "ImGuiRenderPass.h"
#include "Camera.h" #include "Camera.h"
@@ -27,22 +26,15 @@
#include "TextPass.h" #include "TextPass.h"
#include "Util/CommonFunctions.h" #include "Util/CommonFunctions.h"
#include "Core/PerformanceTimer.h" #include "Core/PerformanceTimer.h"
#include "ShadowPass.h"
#include "EResolutionChanged.h"
class Renderer : public IRenderer class Renderer : public IRenderer
{ {
static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height); static void glfwFrameBufferCallback(GLFWwindow* window, int width, int height);
static void glfwWindowSizeCallback(GLFWwindow* window, int width, int height);
public: public:
Renderer(EventBroker* eventBroker, ConfigFile* config) Renderer(EventBroker* eventBroker)
: m_EventBroker(eventBroker) : m_EventBroker(eventBroker)
, m_Config(config)
{ } { }
~Renderer();
virtual void SetResolution(const Rectangle& resolution) override;
virtual void Initialize() override; virtual void Initialize() override;
virtual void Update(double dt) override; virtual void Update(double dt) override;
@@ -50,11 +42,11 @@ public:
virtual PickData Pick(glm::vec2 screenCoord) override; virtual PickData Pick(glm::vec2 screenCoord) override;
private: private:
//----------------------Variables----------------------// //----------------------Variables----------------------//
static std::unordered_map <GLFWwindow*, Renderer*> m_WindowToRenderer; static std::unordered_map <GLFWwindow*, Renderer*> m_WindowToRenderer;
ConfigFile* m_Config;
EventBroker* m_EventBroker; EventBroker* m_EventBroker;
TextPass* m_TextPass; TextPass* m_TextPass;
@@ -69,8 +61,12 @@ private:
int m_DebugTextureToDraw = 0; int m_DebugTextureToDraw = 0;
int m_CubeMapTexture = 0; int m_CubeMapTexture = 0;
bool m_ResizeWindow = false; bool m_ResizeWindow = false;
int m_SSAO_Quality = 0; float m_SSAO_Radius = 1.0f;
int m_GLOW_Quality = 2; float m_SSAO_Bias = 0.05f;
float m_SSAO_Contrast = 1.5f;
float m_SSAO_IntensityScale = 1.0f;
int m_SSAO_NumOfSamples = 24;
int m_SSAO_NumOfTurns = 7;
PickingPass* m_PickingPass; PickingPass* m_PickingPass;
LightCullingPass* m_LightCullingPass; LightCullingPass* m_LightCullingPass;
@@ -81,8 +77,6 @@ private:
DrawColorCorrectionPass* m_DrawColorCorrectionPass; DrawColorCorrectionPass* m_DrawColorCorrectionPass;
SSAOPass* m_SSAOPass; SSAOPass* m_SSAOPass;
CubeMapPass* m_CubeMapPass; CubeMapPass* m_CubeMapPass;
ShadowPass* m_ShadowPass;
BlurHUD* m_BlurHUDPass;
//----------------------Functions----------------------// //----------------------Functions----------------------//
void InitializeWindow(); void InitializeWindow();
@@ -93,14 +87,11 @@ private:
void InputUpdate(double dt); void InputUpdate(double dt);
//void PickingPass(RenderQueueCollection& rq); //void PickingPass(RenderQueueCollection& rq);
//void DrawScreenQuad(GLuint textureToDraw); //void DrawScreenQuad(GLuint textureToDraw);
void setWindowSize(Rectangle size);
void updateFramebufferSize();
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth < j->Depth); } static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j) { return (i->Depth < j->Depth); }
void SortRenderJobsByDepth(RenderScene &scene); void SortRenderJobsByDepth(RenderScene &scene);
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
//--------------------ShaderPrograms-------------------//
//--------------------ShaderPrograms-------------------//
ShaderProgram* m_BasicForwardProgram; ShaderProgram* m_BasicForwardProgram;
ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectProgram;
+12 -36
View File
@@ -13,32 +13,18 @@
class SSAOPass class SSAOPass
{ {
public: public:
SSAOPass(IRenderer* renderer, ConfigFile* config); SSAOPass(IRenderer* rendere);
~SSAOPass(); ~SSAOPass() {
delete m_DrawBloomPass;
void ChangeQuality(int quality); };
void Draw(GLuint depthBuffer, Camera* camera); void Draw(GLuint depthBuffer, Camera* camera);
void Setting(float radius, float bias, float contrast, float intensityScale, int numOfSamples, int numOfTurns, int iterations, int quality); void Setting(float radius, float bias, float contrast, float intensityScale, int numOfSamples, int NumOfTurns);
void ClearBuffer(); void ClearBuffer();
void OnWindowResize(); void OnWindowResize();
//Return the SSAO of the texture sent to Draw //Return the SSAO of the texture sent to Draw
GLuint SSAOTexture() const { GLuint SSAOTexture() const { return m_DrawBloomPass->GaussianTexture(); }
if (m_Quality == 0) {
return m_WhiteTexture->m_Texture;
} else {
return m_Gaussian_vert;
}
}
int TextureQuality() const {
if (m_Quality == 0) {
return 13;
} else {
return m_TextureQuality;
}
}
private: private:
void InitializeTexture(); void InitializeTexture();
@@ -46,13 +32,14 @@ private:
void InitializeShaderProgram(); void InitializeShaderProgram();
void InitializeBuffer(); void InitializeBuffer();
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
//void blurHorizontal(GLuint depthBuffer); //void blurHorizontal(GLuint depthBuffer);
//void blurVertical(GLuint depthBuffer); //void blurVertical(GLuint depthBuffer);
Model* m_ScreenQuad; Model* m_ScreenQuad;
const IRenderer* m_Renderer; const IRenderer* m_Renderer;
ConfigFile* m_Config;
float m_Radius; float m_Radius;
float m_Bias; float m_Bias;
@@ -60,28 +47,17 @@ private:
float m_IntensityScale; float m_IntensityScale;
int m_NumOfSamples; int m_NumOfSamples;
int m_NumOfTurns; int m_NumOfTurns;
int m_Iterations;
int m_TextureQuality;
int m_Quality = 0;
Texture* m_WhiteTexture; GLuint m_SSAOTexture;
GLuint m_SSAOTexture = 0;
FrameBuffer m_SSAOFramBuffer; FrameBuffer m_SSAOFramBuffer;
GLuint m_SSAOViewSpaceZTexture = 0; GLuint m_SSAOViewSpaceZTexture;
FrameBuffer m_SSAOViewSpaceZFramBuffer; FrameBuffer m_SSAOViewSpaceZFramBuffer;
GLuint m_Gaussian_horiz = 0;
GLuint m_Gaussian_vert = 0;
FrameBuffer m_GaussianFrameBuffer_horiz;
FrameBuffer m_GaussianFrameBuffer_vert;
ShaderProgram* m_SSAOProgram; ShaderProgram* m_SSAOProgram;
ShaderProgram* m_SSAOViewSpaceZProgram; ShaderProgram* m_SSAOViewSpaceZProgram;
ShaderProgram* m_GaussianProgram_horiz;
ShaderProgram* m_GaussianProgram_vert; DrawBloomPass* m_DrawBloomPass;
}; };
#endif #endif
-2
View File
@@ -21,8 +21,6 @@ public:
std::string GetFileName() const; std::string GetFileName() const;
GLuint GetHandle() const; GLuint GetHandle() const;
bool IsCompiled() const; bool IsCompiled() const;
static std::string ReadFile(std::string fileName);
private:
protected: protected:
GLenum m_ShaderType; GLenum m_ShaderType;
std::string m_FileName; std::string m_FileName;
-88
View File
@@ -1,88 +0,0 @@
#ifndef ShadowPass_h__
#define ShadowPass_h__
#include "IRenderer.h"
#include "FrameBuffer.h"
#include "ShaderProgram.h"
#include "../Core/EventBroker.h"
#include "../Core/World.h"
#include "ShadowPassState.h"
#include "imgui/imgui.h"
#define MAX_SPLITS 4
enum NearFar { NEAR = 0, FAR = 1 };
enum LRBT { LEFT = 0, RIGHT = 1, BOTTOM = 2, TOP = 3 };
struct ShadowFrustum
{
float NearClip;
float FarClip;
float FOV;
float AspectRatio;
glm::vec3 MiddlePoint;
float Radius;
std::array<float, 4> LRBT;
std::array<glm::vec3, 8> CornerPoint;
};
class ShadowPass
{
public:
ShadowPass(IRenderer* renderer);
ShadowPass(IRenderer * renderer, int ShadowResX, int ShadowResY);
~ShadowPass();
void InitializeFrameBuffers();
void InitializeShaderPrograms();
void ClearBuffer();
void Draw(RenderScene& scene);
void DebugGUI();
GLuint DepthMap() const { return m_DepthMap; }
std::array<glm::mat4, MAX_SPLITS> LightP() const { return m_LightProjection; }
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; }
int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; }
void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; };
private:
void InitializeCameras(RenderScene & scene);
void UpdateSplitDist(std::array<ShadowFrustum, MAX_SPLITS>& frusta, float near_distance, float far_distance);
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::vec3 camera_position, glm::vec3 view_dir);
void UpdateFrustumPoints(ShadowFrustum& frustum, glm::mat4 p, glm::mat4 v);
void PointsToLightspace(ShadowFrustum& frustum, glm::mat4 v);
float FindRadius(ShadowFrustum& frustum);
void RadiusToLightspace(ShadowFrustum& frustum);
EventBroker* m_EventBroker;
const IRenderer* m_Renderer;
GLuint m_DepthMap;
FrameBuffer m_DepthBuffer;
ShaderProgram* m_ShadowProgram;
ShaderProgram* m_ShadowProgramSkinned;
std::array<glm::mat4, MAX_SPLITS> m_LightProjection;
std::array<glm::mat4, MAX_SPLITS> m_LightView;
GLfloat m_NearFarPlane[2] = { -34.f, 27.f };
GLuint m_ResolutionSizeWidth = 1024 * 2;
GLuint m_ResolutionSizeHeight = 1024 * 2;
bool m_TransparentObjects = false;
bool m_TexturedShadows = false;
bool m_EnableShadows = true;
int m_CurrentNrOfSplits = 4;
float m_SplitWeight = 0.962f;
std::array<ShadowFrustum, MAX_SPLITS> m_shadowFrusta;
Texture* m_WhiteTexture = ResourceManager::Load<Texture>("Textures/Core/White.png");
};
#endif
@@ -1,15 +0,0 @@
#ifndef ShadowPassState_h_
#define ShadowPassState_h_
#include "Rendering/RenderState.h"
class ShadowPassState : public RenderState
{
public:
ShadowPassState(GLuint frameBuffer);
~ShadowPassState();
private:
};
#endif
+55 -22
View File
@@ -6,9 +6,27 @@
#include "../GLM.h" #include "../GLM.h"
#include <glm/gtx/matrix_decompose.hpp> #include <glm/gtx/matrix_decompose.hpp>
#include <imgui/imgui.h> #include <imgui/imgui.h>
#include "../Core/EntityWrapper.h"
class BlendTree; //struct Bone
//{
// Bone(std::string name, glm::mat4 offsetMatrix)
// : Name(name)
// , OffsetMatrix(offsetMatrix)
// { }
//
// ~Bone()
// {
// for (auto kv : Children) {
// delete kv.second;
// }
// }
//
// std::string Name;
// glm::mat4 OffsetMatrix;
// glm::mat4 LocalMatrix;
//
// std::map<std::string, Bone*> Children;
//};
class Skeleton class Skeleton
{ {
@@ -50,43 +68,58 @@ public:
std::map<int, std::vector<Keyframe>> JointAnimations; std::map<int, std::vector<Keyframe>> JointAnimations;
}; };
struct PoseData { struct AnimationData
glm::vec3 Translation; {
glm::quat Orientation; const Animation* animation;
glm::vec3 Scale; float time;
float weight;
};
struct JointFrameTransform {
glm::vec3 PositionInterp = glm::vec3(0);
glm::quat RotationInterp = glm::quat();
glm::vec3 ScaleInterp = glm::vec3(0);
float Weight;
};
struct AnimationOffset {
const Animation* animation;
float time;
}; };
Skeleton() { } Skeleton() { }
~Skeleton(); ~Skeleton();
Bone* RootBone; Bone* RootBone;
std::map<int, Bone*> Bones;
std::unordered_map<EntityWrapper, std::shared_ptr<BlendTree>> BlendTrees; std::map<int, Bone*> Bones;
// Attach a new bone to the skeleton // Attach a new bone to the skeleton
// Returns: New bone index // Returns: New bone index
int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix); int CreateBone(int ID, int parentID, std::string name, glm::mat4 offsetMatrix);
int GetBoneID(std::string name); int GetBoneID(std::string name);
std::vector<glm::mat4> GetFrameBones(std::vector<AnimationData> animations, AnimationOffset animationOffset, bool noRootMotion = false);
std::vector<glm::mat4> GetFrameBones(std::vector<AnimationData> animations, bool noRootMotion = false);
const Animation* GetAnimation(std::string name); const Animation* GetAnimation(std::string name);
std::map<int, Skeleton::PoseData> GetFrameBones(const Animation* animation, double time, bool additive, bool noRootMotion = false); void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, std::map<int, glm::mat4>& frameBones, const Bone* bone, glm::mat4 parentMatrix);
void AccumulateBoneTransforms(bool noRootMotion, std::vector<AnimationData> animations, AnimationOffset animationOffset, std::map<int, glm::mat4>& frameBones, const Bone* bone, glm::mat4 parentMatrix);
std::map<int, Skeleton::PoseData> BlendPoses(const std::map<int, PoseData>& pose1, const std::map<int, PoseData>& pose2, double weight);
std::map<int, Skeleton::PoseData> OverridePose(const std::map<int, PoseData>& overridePose, const std::map<int, PoseData>& targetPose);
std::map<int, Skeleton::PoseData> BlendPoseAdditive(const std::map<int, PoseData>& additivePose, const std::map<int, PoseData>& targetPose);
void GetFinalPose(std::map<int, Skeleton::PoseData>& boneMatrices, std::vector<glm::mat4>& finalPose, std::map<int, glm::mat4>& boneTransforms);
std::vector<glm::mat4> GetTPose();
void PrintSkeleton();
void PrintSkeleton(const Bone* parent, int depthCount);
std::map<std::string, Animation> Animations;
glm::mat4 GetBoneTransform(const Bone* bone, const Animation* animation, float time, glm::mat4 childMatrix);
glm::mat4 GetBoneTransform(bool noRootMotion, const Bone* bone, std::vector<AnimationData> animations, AnimationOffset animationOffset, glm::mat4 childMatrix);
glm::mat4 GetBoneTransform(bool noRootMotion, const Bone* bone, std::vector<AnimationData> animations, glm::mat4 childMatrix);
int GetKeyframe(const Animation& animation, double time);
std::map<std::string, Animation> Animations;
private: private:
Skeleton::PoseData GetAdditiveBonePose(const Bone* bone, const Animation* animation, double time);
glm::mat4 GetOffsetTransform(const Bone* bone, AnimationOffset animationOffset);
void AccumulateFinalPose(std::map<int, glm::mat4>& boneMatrices, std::map<int, Skeleton::PoseData>& poseDatas, std::map<int, glm::mat4>& boneTransforms, const Bone* bone, glm::mat4 parentMatrix);
void AdditiveBoneTransforms(const Animation* animation, double time, std::map<int, PoseData>& boneMatrices, const Bone* bone);
void AccumulateBoneTransforms(bool noRootMotion, const Animation* animation, double time, std::map<int, PoseData>& boneMatrices, const Bone* bone);
std::map<std::string, Bone*> m_BonesByName; std::map<std::string, Bone*> m_BonesByName;
+3 -31
View File
@@ -7,7 +7,6 @@
#include "../GLM.h" #include "../GLM.h"
#include "../Core/ComponentWrapper.h" #include "../Core/ComponentWrapper.h"
#include "Texture.h" #include "Texture.h"
#include "TextureSprite.h"
#include "Model.h" #include "Model.h"
#include "RenderJob.h" #include "RenderJob.h"
#include "../Core/ResourceManager.h" #include "../Core/ResourceManager.h"
@@ -21,21 +20,18 @@ struct SpriteJob : RenderJob
SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator) SpriteJob(ComponentWrapper cSprite, Camera* camera, glm::mat4 matrix, World* world, glm::vec4 fillColor, float fillPercentage, bool depthSorted, bool isIndicator)
: RenderJob() : RenderJob()
{ {
Model = ResourceManager::Load<::Model>((std::string)cSprite["Model"]); Model = ResourceManager::Load<::Model>("Models/Core/UnitQuad.mesh");
::RawModel::MaterialProperties matProp = Model->MaterialGroups().front(); ::RawModel::MaterialProperties matProp = Model->MaterialGroups().front();
TextureID = 0; TextureID = 0;
DiffuseTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["DiffuseTexture"]); DiffuseTexture = CommonFunctions::LoadTexture(cSprite["DiffuseTexture"], true);
IncandescenceTexture = CommonFunctions::TryLoadResource<TextureSprite, true>(cSprite["GlowMap"]);
Linear = (bool)cSprite["Linear"]; IncandescenceTexture = CommonFunctions::LoadTexture(cSprite["GlowMap"], true);
StartIndex = matProp.material->StartIndex; StartIndex = matProp.material->StartIndex;
EndIndex = matProp.material->EndIndex; EndIndex = matProp.material->EndIndex;
Matrix = matrix; Matrix = matrix;
Color = cSprite["Color"]; Color = cSprite["Color"];
BlurBackground = (bool)cSprite["BlurBackground"];
Entity = cSprite.EntityID; Entity = cSprite.EntityID;
Position = Transform::AbsolutePosition(world, cSprite.EntityID); Position = Transform::AbsolutePosition(world, cSprite.EntityID);
Depth = 0; Depth = 0;
@@ -49,26 +45,6 @@ struct SpriteJob : RenderJob
FillColor = fillColor; FillColor = fillColor;
FillPercentage = fillPercentage; FillPercentage = fillPercentage;
glm::vec3 scale = Transform::AbsoluteScale(world, cSprite.EntityID);
if((bool)cSprite["KeepRatio"] == true) {
if(scale.y >= scale.x) {
ScaleY = (scale.x)/(scale.y);
ScaleX = 1.f;
} else {
ScaleY = 1.f;
ScaleX = (scale.x)/(scale.y);
}
} else {
if ((bool)cSprite["KeepRatioX"] == true) {
ScaleX = scale.x;
}
if ((bool)cSprite["KeepRatioY"] == true) {
ScaleY = scale.y;
}
}
}; };
unsigned int TextureID; unsigned int TextureID;
@@ -89,10 +65,6 @@ struct SpriteJob : RenderJob
bool Pickable; bool Pickable;
bool IsIndicator = false; bool IsIndicator = false;
bool BlurBackground = false;
float ScaleX = 1;
float ScaleY = 1;
bool Linear = false;
glm::vec4 FillColor = glm::vec4(0); glm::vec4 FillColor = glm::vec4(0);
float FillPercentage = 0.0; float FillPercentage = 0.0;
+1 -1
View File
@@ -9,7 +9,7 @@ class Texture : public BaseTexture
{ {
friend class ResourceManager; friend class ResourceManager;
protected: private:
Texture(std::string path); Texture(std::string path);
public: public:
-26
View File
@@ -1,26 +0,0 @@
#ifndef TextureSprite_h__
#define TextureSprite_h__
#include "../OpenGL.h"
#include "BaseTexture.h"
#include "Texture.h"
#include "PNG.h"
class TextureSprite : public Texture
{
friend class ResourceManager;
protected:
TextureSprite(std::string path);
public:
~TextureSprite();
void Bind(GLenum textureUnit = GL_TEXTURE0);
GLuint m_Texture = 0;
unsigned char* Data = nullptr;
};
#endif
@@ -8,27 +8,7 @@
namespace CommonFunctions namespace CommonFunctions
{ {
Texture* LoadTexture(std::string path, bool threaded);
//Loads Texture/SpriteTexture and return null if it fails
template <typename T, bool threaded>
Texture* TryLoadResource(std::string path)
{
Texture* img;
try {
img = ResourceManager::Load<T, threaded>(path);
} catch (const Resource::StillLoadingException&) {
img = ResourceManager::Load<T>("Textures/Core/ErrorTexture.png");
} catch (const std::exception&) {
img = nullptr;
}
return img;
}
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat);
void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps);
void DeleteTexture(GLuint* texture);
}; };
#endif #endif
-4
View File
@@ -16,11 +16,7 @@ inline bool _GLERROR(const char* info, const char* file, const char* func, unsig
return false; return false;
} }
#ifdef DEBUG
#define GLERROR(function) \ #define GLERROR(function) \
_GLERROR(function, __BASE_FILE__, __func__, __LINE__) _GLERROR(function, __BASE_FILE__, __func__, __LINE__)
#else
#define GLERROR(function) false
#endif
#endif #endif
+1 -5
View File
@@ -2,15 +2,11 @@
#define Events_DashAbility_h__ #define Events_DashAbility_h__
#include "Core/Event.h" #include "Core/Event.h"
#include "Core/EntityWrapper.h"
namespace Events namespace Events
{ {
struct DashAbility : public Event struct DashAbility : public Event { };
{
EntityID Player;
};
} }
+3 -3
View File
@@ -13,13 +13,13 @@
#include "Input/KeyboardInputHandler.h" #include "Input/KeyboardInputHandler.h"
#include "Input/MouseInputHandler.h" #include "Input/MouseInputHandler.h"
#include "Core/EKeyDown.h" #include "Core/EKeyDown.h"
#include "Core/EntityXMLFilePreprocessor.h" #include "Core/EntityFilePreprocessor.h"
#include "Core/SystemPipeline.h" #include "Core/SystemPipeline.h"
#include "Systems/ExplosionEffectSystem.h" #include "Systems/ExplosionEffectSystem.h"
#include "Editor/EditorSystem.h" #include "Editor/EditorSystem.h"
#include "Core/EntityXMLFile.h" #include "Core/EntityFile.h"
#include "Rendering/RenderSystem.h" #include "Rendering/RenderSystem.h"
#include "Core/EntityXMLFileParser.h" #include "Core/EntityFileParser.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Rendering/Font.h" #include "Rendering/Font.h"
#include "Systems/InterpolationSystem.h" #include "Systems/InterpolationSystem.h"
@@ -1,18 +0,0 @@
#ifndef AbilityCooldownHUDSystem_h__
#define AbilityCooldownHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class AbilityCooldownHUDSystem : public ImpureSystem
{
public:
AbilityCooldownHUDSystem(SystemParams params)
: System(params)
{ }
virtual void Update(double dt) override;
private:
};
#endif
+1 -24
View File
@@ -4,7 +4,7 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFile.h" #include "Core/EntityFileParser.h"
#include "Core/EPickupSpawned.h" #include "Core/EPickupSpawned.h"
#include "Core/EAmmoPickup.h" #include "Core/EAmmoPickup.h"
#include "Engine/Collision/ETrigger.h" #include "Engine/Collision/ETrigger.h"
@@ -20,11 +20,6 @@ public:
private: private:
EventRelay<AmmoPickupSystem, Events::TriggerTouch> m_ETriggerTouch; EventRelay<AmmoPickupSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e); bool OnTriggerTouch(Events::TriggerTouch& e);
EventRelay<AmmoPickupSystem, Events::TriggerLeave> m_ETriggerLeave;
bool OnTriggerLeave(Events::TriggerLeave& e);
EventRelay<AmmoPickupSystem, Events::AmmoPickup> m_EAmmoPickup;
bool OnAmmoPickup(Events::AmmoPickup& e);
struct NewAmmoPickup { struct NewAmmoPickup {
glm::vec3 Pos; glm::vec3 Pos;
@@ -34,23 +29,5 @@ private:
EntityID parentID; EntityID parentID;
}; };
std::vector<NewAmmoPickup> m_ETriggerTouchVector; std::vector<NewAmmoPickup> m_ETriggerTouchVector;
struct EntityAtMaxValuePickupStruct {
EntityWrapper player;
EntityWrapper trigger;
};
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
//class
enum class PlayerClass {
Assault,
Defender,
Sniper,
None
};
//helper methods
bool DoesPlayerHaveMaxAmmo(EntityWrapper &player);
PlayerClass DetermineClass(EntityWrapper &player);
void SetPlayerAmmo(EntityWrapper &player, int ammoGain);
int GetPlayerMaxAmmo(EntityWrapper &player);
}; };
#endif #endif
@@ -0,0 +1,17 @@
#ifndef AmmunitionHUDSystem_h__
#define AmmunitionHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class AmmunitionHUDSystem : public ImpureSystem
{
public:
AmmunitionHUDSystem(SystemParams params)
: System(params)
{ }
virtual void Update(double dt) override;
};
#endif
@@ -1,19 +0,0 @@
#ifndef BoostIconsHUDSystem_h__
#define BoostIconsHUDSystem_h__
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class BoostIconsHUDSystem : public PureSystem
{
public:
BoostIconsHUDSystem(SystemParams params)
: System(params)
, PureSystem("BoostIconsHUD")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
};
#endif
-21
View File
@@ -1,21 +0,0 @@
#ifndef BoostSystem_h__
#define BoostSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Core/EPlayerDamage.h"
#include "Common.h"
class BoostSystem : public System
{
public:
BoostSystem(SystemParams params);
private:
EventRelay<BoostSystem, Events::PlayerDamage> m_EPlayerDamage;
bool OnPlayerDamage(Events::PlayerDamage& e);
std::string DetermineClass(EntityWrapper player);
};
#endif
@@ -1,30 +0,0 @@
#ifndef CapturePointArrowHUDSystem_h__
#define CapturePointArrowHUDSystem_h__
#include <GLFW/glfw3.h>
#include <glm/common.hpp>
#include <glm/gtx/vector_angle.hpp>
#include "Common.h"
#include "Core/System.h"
#include "Core/Transform.h"
#include "Core/ECaptured.h"
class CapturePointArrowHUDSystem : public ImpureSystem
{
public:
CapturePointArrowHUDSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EventRelay<CapturePointArrowHUDSystem, Events::Captured> m_ECapturedEvent;
bool OnCapturePointCaptured(Events::Captured& e);
bool m_InitialtargetsSet = false;
glm::vec3 m_RedTeamCurrentTarget;
glm::vec3 m_BlueTeamCurrentTarget;
};
#endif
+1 -1
View File
@@ -7,7 +7,7 @@
#include "Common.h" #include "Common.h"
#include "Core/System.h" #include "Core/System.h"
#include "Collision/ETrigger.h" #include "Engine/Collision/ETrigger.h"
class CapturePointHUDSystem : public ImpureSystem class CapturePointHUDSystem : public ImpureSystem
{ {
+2 -3
View File
@@ -30,7 +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);
void ChangeCapturePointModelsVisibility(EntityWrapper &capturePointModels, bool isOwner);
bool m_WinnerWasFound = false; bool m_WinnerWasFound = false;
//need to track these variables for the captureSystem to work as per design! //need to track these variables for the captureSystem to work as per design!
@@ -43,9 +42,9 @@ private:
int m_NumberOfCapturePoints = 0; int m_NumberOfCapturePoints = 0;
std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap; std::map<int, EntityWrapper> m_CapturePointNumberToEntityMap;
//std::vector<ComponentWrapper>
bool m_ResetTimers = false; bool m_ResetTimers = false;
bool m_RecentlyCapturedNeedNextCapturePointNow = false;
Events::Captured m_CapturedEvent;
//vectors which will keep track of enter/leave changes //vectors which will keep track of enter/leave changes
std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector; std::vector<std::tuple<EntityWrapper, EntityWrapper>> m_ETriggerTouchVector;
+1 -4
View File
@@ -4,7 +4,7 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFile.h" #include "Core/EntityFileParser.h"
#include "Core/EPlayerDamage.h" #include "Core/EPlayerDamage.h"
#include "Common.h" #include "Common.h"
#include <tuple> #include <tuple>
@@ -15,7 +15,6 @@
#include "Rendering/Util/CommonFunctions.h" #include "Rendering/Util/CommonFunctions.h"
//#define INDICATOR_TEST //#define INDICATOR_TEST
#include "Core/ConfigFile.h"
class DamageIndicatorSystem : public ImpureSystem class DamageIndicatorSystem : public ImpureSystem
{ {
@@ -41,8 +40,6 @@ private:
std::vector<DamageIndicatorStruct> updateDamageIndicatorVector; std::vector<DamageIndicatorStruct> updateDamageIndicatorVector;
float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos); float CalculateAngle(EntityWrapper player, glm::vec3 enemyPos);
bool m_NetworkEnabled;
//for tests //for tests
#ifdef INDICATOR_TEST #ifdef INDICATOR_TEST
glm::vec3 DamageIndicatorTest(EntityWrapper player); glm::vec3 DamageIndicatorTest(EntityWrapper player);
@@ -1,19 +0,0 @@
#include "Common.h"
#include "Core/System.h"
class FloatingEffectSystem : public PureSystem
{
public:
FloatingEffectSystem(SystemParams params)
: System(params)
, PureSystem("FloatingEffect")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
{
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
(double&)component["Time"] += dt;
(glm::vec3&)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
}
};
+1 -1
View File
@@ -10,7 +10,7 @@ public:
: System(params) : System(params)
, PureSystem("Lifetime") , PureSystem("Lifetime")
{ {
LOG_INFO("ASDASDASSA");
} }
virtual void Update(double dt) override; virtual void Update(double dt) override;
+2 -9
View File
@@ -4,11 +4,12 @@
#include "Core/System.h" #include "Core/System.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/ResourceManager.h" #include "Core/ResourceManager.h"
#include "Core/EntityFile.h" #include "Core/EntityFileParser.h"
#include "Core/EPickupSpawned.h" #include "Core/EPickupSpawned.h"
#include "Core/EPlayerHealthPickup.h" #include "Core/EPlayerHealthPickup.h"
#include "Engine/Collision/ETrigger.h" #include "Engine/Collision/ETrigger.h"
#include "Common.h" #include "Common.h"
#include <tuple>
class PickupSpawnSystem : public ImpureSystem class PickupSpawnSystem : public ImpureSystem
{ {
@@ -20,8 +21,6 @@ public:
private: private:
EventRelay<PickupSpawnSystem, Events::TriggerTouch> m_ETriggerTouch; EventRelay<PickupSpawnSystem, Events::TriggerTouch> m_ETriggerTouch;
bool OnTriggerTouch(Events::TriggerTouch& e); bool OnTriggerTouch(Events::TriggerTouch& e);
EventRelay<PickupSpawnSystem, Events::TriggerLeave> m_ETriggerLeave;
bool OnTriggerLeave(Events::TriggerLeave& e);
struct NewHealthPickup { struct NewHealthPickup {
glm::vec3 Pos; glm::vec3 Pos;
@@ -31,11 +30,5 @@ private:
EntityID parentID; EntityID parentID;
}; };
std::vector<NewHealthPickup> m_ETriggerTouchVector; std::vector<NewHealthPickup> m_ETriggerTouchVector;
struct EntityAtMaxValuePickupStruct {
EntityWrapper player;
EntityWrapper trigger;
};
std::vector<EntityAtMaxValuePickupStruct> m_PickupAtMaximum;
void DoPickup(EntityWrapper &player, EntityWrapper &trigger);
}; };
#endif #endif
+3 -8
View File
@@ -6,9 +6,11 @@
#include "GLM.h" #include "GLM.h"
#include "Rendering/ESetCamera.h" #include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h" #include "Core/ConfigFile.h"
#include "Core/EntityFile.h" #include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
#include "Core/EPlayerDeath.h" #include "Core/EPlayerDeath.h"
#include "Core/EEntityDeleted.h"
class PlayerDeathSystem : public ImpureSystem class PlayerDeathSystem : public ImpureSystem
{ {
@@ -18,16 +20,9 @@ public:
virtual void Update(double dt) override; virtual void Update(double dt) override;
private: private:
EntityWrapper m_LocalPlayerDeathEffect;
EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath; EventRelay<PlayerDeathSystem, Events::PlayerDeath> m_OnPlayerDeath;
bool OnPlayerDeath(Events::PlayerDeath& e); bool OnPlayerDeath(Events::PlayerDeath& e);
EventRelay<PlayerDeathSystem, Events::EntityDeleted> m_EEntityDeleted;
bool OnEntityDeleted(Events::EntityDeleted& e);
EventRelay<PlayerDeathSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(Events::InputCommand& e);
void setSpectatorCamera();
void createDeathEffect(EntityWrapper player); void createDeathEffect(EntityWrapper player);
}; };
+2 -4
View File
@@ -6,7 +6,9 @@
#include <imgui/imgui.h> #include <imgui/imgui.h>
#include "Events/EDoubleJump.h" #include "Events/EDoubleJump.h"
#include "../Engine/Sound/EPlaySoundOnEntity.h" #include "../Engine/Sound/EPlaySoundOnEntity.h"
#include "Core/EntityFile.h" #include "Core/EntityFile.h"
#include "Core/EntityFileParser.h"
class PlayerMovementSystem : public ImpureSystem class PlayerMovementSystem : public ImpureSystem
{ {
@@ -30,8 +32,6 @@ private:
bool m_LeftFoot = false; bool m_LeftFoot = false;
// To get a difference when calculating the walking state. // To get a difference when calculating the walking state.
glm::vec3 m_LastPosition = glm::vec3(); glm::vec3 m_LastPosition = glm::vec3();
// Used to track afterimages for sprint effect.
float m_SprintEffectTimer;
// The logic for making the sound play when player is moving // The logic for making the sound play when player is moving
void playerStep(double dt); void playerStep(double dt);
// Spawn a hexagon at origin of an Entity // Spawn a hexagon at origin of an Entity
@@ -41,8 +41,6 @@ private:
bool OnPlayerSpawned(Events::PlayerSpawned& e); bool OnPlayerSpawned(Events::PlayerSpawned& e);
EventRelay<PlayerMovementSystem, Events::DoubleJump> m_EDoubleJump; EventRelay<PlayerMovementSystem, Events::DoubleJump> m_EDoubleJump;
bool PlayerMovementSystem::OnDoubleJump(Events::DoubleJump & e); bool PlayerMovementSystem::OnDoubleJump(Events::DoubleJump & e);
EventRelay<PlayerMovementSystem, Events::DashAbility> m_EDashAbility;
bool PlayerMovementSystem::OnDashAbility(Events::DashAbility & e);
void updateMovementControllers(double dt); void updateMovementControllers(double dt);
void updateVelocity(EntityWrapper player, double dt); void updateVelocity(EntityWrapper player, double dt);
+4 -11
View File
@@ -13,21 +13,14 @@ public:
PlayerSpawnSystem(SystemParams params); PlayerSpawnSystem(SystemParams params);
virtual void Update(double dt) override; virtual void Update(double dt) override;
static void SetRespawnTime(float respawnTime) { m_RespawnTime = respawnTime; };
private: private:
// This enum must correspond to the command values for PickTeam buttons.
enum class PlayerClass
{
None = 0,
Assault,
Defender,
Sniper
};
struct SpawnRequest struct SpawnRequest
{ {
int PlayerID; int PlayerID;
ComponentInfo::EnumType Team; ComponentInfo::EnumType Team;
PlayerClass Class;
}; };
bool m_NetworkEnabled = false; bool m_NetworkEnabled = false;
@@ -38,8 +31,8 @@ private:
//EntityWrapper ID -> Player ID. //EntityWrapper ID -> Player ID.
std::map<EntityID, int> m_PlayerIDs; std::map<EntityID, int> m_PlayerIDs;
float m_ForcedRespawnTime; static float m_RespawnTime;
bool m_DbgConfigForceRespawn; float m_Timer;
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand; EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
bool OnInputCommand(Events::InputCommand& e); bool OnInputCommand(Events::InputCommand& e);
-44
View File
@@ -1,44 +0,0 @@
#ifndef ScoreScreenSystem_h__
#define ScoreScreenSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/EntityFile.h"
#include "Network/EKillDeath.h"
#include "Core/EPlayerSpawned.h"
#include "Network/EPlayerConnected.h"
#include "Network/EPlayerDisconnected.h"
#include "GLM.h"
class ScoreScreenSystem : public PureSystem
{
public:
ScoreScreenSystem(SystemParams params);
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& scoreScreen, double dt) override;
EventRelay<ScoreScreenSystem, Events::KillDeath> m_EPlayerDeath;
bool OnPlayerDeath(const Events::KillDeath& e);
EventRelay<ScoreScreenSystem, Events::PlayerSpawned> m_EPlayerSpawned;
bool OnPlayerSpawn(const Events::PlayerSpawned& e);
EventRelay<ScoreScreenSystem, Events::PlayerConnected> m_EPlayerConnected;
bool OnPlayerConnected(const Events::PlayerConnected& e);
EventRelay<ScoreScreenSystem, Events::PlayerDisconnected> m_EPlayerDisconnected;
bool OnPlayerDisconnected(const Events::PlayerDisconnected& e);
private:
struct PlayerData {
int ID = -1;
std::string Name = "";
int Team = 1;
int Kills = 0;
int Deaths = 0;
EntityWrapper Player = EntityWrapper::Invalid;
};
std::vector<int> m_DisconnectedIdentities;
int m_PlayerCounter = 0;
std::unordered_map<int, PlayerData> m_PlayerIdentities;
};
#endif
-29
View File
@@ -1,29 +0,0 @@
#ifndef ServerListSystem_h__
#define ServerListSystem_h__
#include "Core/System.h"
#include "Rendering/IRenderer.h"
#include "Core/ResourceManager.h"
#include "Core/Event.h"
#include "Systems/SpawnerSystem.h"
#include "Core/EventBroker.h"
#include "Network/ESearchForServers.h"
#include "Network/EDisplayServerlist.h"
class ServerListSystem : public PureSystem
{
public:
ServerListSystem(SystemParams params, IRenderer* renderer);
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cServerList, double dt) override;
void RefreshList();
private:
IRenderer* m_Renderer;
EventRelay<ServerListSystem, Events::DisplayServerlist> m_EServerListRecieved;
bool OnServerListRecieved(const Events::DisplayServerlist& e);
};
#endif
+2 -1
View File
@@ -7,7 +7,8 @@
#include "Core/System.h" #include "Core/System.h"
#include "Events/ESpawnerSpawn.h" #include "Events/ESpawnerSpawn.h"
#include "Core/Transform.h" #include "Core/Transform.h"
#include "Core/EntityFile.h" #include "Core/ResourceManager.h"
#include "Core/EntityFileParser.h"
class SpawnerSystem : public System class SpawnerSystem : public System
{ {
@@ -1,25 +0,0 @@
#ifndef SpectatorCameraSystem_h__
#define SpectatorCameraSystem_h__
#include "Core/System.h"
#include "Input/EInputCommand.h"
#include "Network/EPlayerDisconnected.h"
class SpectatorCameraSystem : public ImpureSystem
{
public:
SpectatorCameraSystem(SystemParams params);
virtual void Update(double dt) override;
private:
int m_PickedTeam;
bool m_CamSetToTeamPick;
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
bool OnInputCommand(const Events::InputCommand& e);
EventRelay<SpectatorCameraSystem, Events::PlayerDisconnected> m_EDisconnect;
bool OnDisconnect(const Events::PlayerDisconnected& e);
};
#endif
-23
View File
@@ -1,23 +0,0 @@
#ifndef StartSystem_h__
#define StartSystem_h__
#include "Core/System.h"
#include "Core/ResourceManager.h"
#include "Core/Event.h"
#include "Core/EventBroker.h"
#include "Rendering/ESetCamera.h"
class StartSystem : public ImpureSystem
{
public:
StartSystem(SystemParams params);
virtual void Update(double dt) override;
private:
EntityWrapper m_ActiveCamera = EntityWrapper::Invalid;
EventRelay<StartSystem, Events::SetCamera> m_ECameraActivated;
bool OnCameraActivated(const Events::SetCamera& e);
};
#endif
-21
View File
@@ -1,21 +0,0 @@
#ifndef AmmunitionHUDSystem_h__
#define AmmunitionHUDSystem_h__
#include <boost/lexical_cast.hpp>
#include <sstream>
#include <iomanip>
#include "../../Engine/Core/System.h"
#include "../../Engine/GLM.h"
class TextFieldReader : public PureSystem
{
public:
TextFieldReader(SystemParams params)
: System(params)
, PureSystem("TextFieldReader")
{ }
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cTextFieldReader, double dt) override;
};
#endif
@@ -1,42 +1,49 @@
#ifndef AssaultWeaponBehaviour_h__
#define AssaultWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Sound/EPlaySoundOnEntity.h" #include "Sound/EPlaySoundOnEntity.h"
#include "Rendering/EAutoAnimationBlend.h" #include "Collision/Collision.h"
#include "Rendering/AnimationSystem.h"
#include "Core/ConfigFile.h"
#include "WeaponBehaviour.h"
#include "../SpawnerSystem.h"
#include "Core/EPlayerDamage.h"
#include "Core/EShoot.h"
class AssaultWeaponBehaviour : public WeaponBehaviour<AssaultWeaponBehaviour>
class AssaultWeaponBehaviour : public WeaponBehaviour
{ {
public: public:
AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree) AssaultWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper weaponEntity);
: System(systemParams)
, WeaponBehaviour(systemParams, "AssaultWeapon", renderer, collisionOctree) virtual void Fire() override;
, m_RandomEngine(m_RandomDevice()) virtual void CeaseFire() override;
{ } virtual void Reload() override;
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override; virtual void Update(double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
//bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
private: private:
std::random_device m_RandomDevice; EntityWrapper m_FirstPersonModel;
std::mt19937 m_RandomEngine; EntityWrapper m_ThirdPersonModel;
// State
bool m_Firing = false;
bool m_Reloading = false;
double m_ReloadTimer = 0.0;
EntityWrapper m_FirstPersonReloadImpersonator;
EntityWrapper m_ThirdPersonReloadImpersonator;
double m_TimeSinceLastFire = 0.0;
// Weapon functions EventRelay<WeaponBehaviour, Events::AnimationComplete> m_EAnimationComplete;
void fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi); bool OnAnimationComplete(Events::AnimationComplete& e);
//void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage);
bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi);
bool dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi);
// Utility bool hasAmmo();
//Camera cameraFromEntity(EntityWrapper camera); void fireRound();
void spawnTracer();
float traceRayDistance(glm::vec3 origin, glm::vec3 direction);
void playFireSound();
void playEmptySound();
void viewPunch();
void finishReload();
void playShootAnimation();
void playIdleAnimation();
void playReloadAnimation();
bool shoot(double damage);
void showHitMarker();
}; };
#endif
@@ -1,39 +0,0 @@
#ifndef DefenderWeaponBehaviour_h__
#define DefenderWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
#include "Sound/EPlaySoundOnEntity.h"
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
{
public:
DefenderWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams)
, WeaponBehaviour(systemParams, "DefenderWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{ }
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) override;
private:
std::random_device m_RandomDevice;
std::mt19937 m_RandomEngine;
// Weapon functions
void fireShell(ComponentWrapper cWeapon, WeaponInfo& wi);
void dealDamage(ComponentWrapper cWeapon, WeaponInfo& wi, glm::vec3 direction, double damage);
bool canFire(ComponentWrapper cWeapon, WeaponInfo& wi);
// Utility
Camera cameraFromEntity(EntityWrapper camera);
};
#endif
@@ -1,38 +0,0 @@
#ifndef SidearmWeaponBehaviour_h__
#define SidearmWeaponBehaviour_h__
#include "WeaponBehaviour.h"
#include "Collision/Collision.h"
#include "Core/EPlayerDamage.h"
class SidearmWeaponBehaviour : public WeaponBehaviour<SidearmWeaponBehaviour>
{
public:
SidearmWeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree)
: System(systemParams)
, WeaponBehaviour(systemParams, "SidearmWeapon", renderer, collisionOctree)
, m_RandomEngine(m_RandomDevice())
{ }
void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override;
void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) override;
void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) override;
void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) override;
private:
std::random_device m_RandomDevice;
std::mt19937 m_RandomEngine;
// Weapon functions
void fireBullet(ComponentWrapper cWeapon, WeaponInfo& wi);
//void dealDamage(WeaponInfo& wi, glm::vec3 direction, double damage);
// Utility
bool canFire(ComponentWrapper cWeapon);
bool playerInFirstPerson(EntityWrapper player);
//float traceRayDistance(glm::vec3 origin, glm::vec3 direction);
};
#endif
+12 -313
View File
@@ -5,331 +5,30 @@
#include "Rendering/IRenderer.h" #include "Rendering/IRenderer.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Collision/EntityAABB.h" #include "Collision/EntityAABB.h"
#include "Input/EInputCommand.h"
#include "Systems/SpawnerSystem.h"
#include "Rendering/ESetCamera.h"
#include "Core/ConfigFile.h"
#include "Rendering/EAutoAnimationBlend.h"
template <typename ETYPE> class WeaponBehaviour : public System
class WeaponBehaviour : public PureSystem
{ {
friend class WeaponSystem;
public: public:
WeaponBehaviour(SystemParams params, std::string componentType, IRenderer* renderer, Octree<EntityAABB>* collisionOctree) WeaponBehaviour(SystemParams systemParams, IRenderer* renderer, Octree<EntityAABB>* collisionOctree, EntityWrapper player)
: System(params) : System(systemParams)
, PureSystem(componentType)
, m_Renderer(renderer) , m_Renderer(renderer)
, m_CollisionOctree(collisionOctree) , m_CollisionOctree(collisionOctree)
{ , m_Player(player)
EVENT_SUBSCRIBE_MEMBER(m_EInputCommand, &WeaponBehaviour::_OnInputCommand); { }
EVENT_SUBSCRIBE_MEMBER(m_ESetCamera, &WeaponBehaviour::_OnSetCamera);
auto config = ResourceManager::Load<ConfigFile>("Config.ini");
m_ConfigAutoReload = config->Get<bool>("Gameplay.AutoReload", true);
}
virtual ~WeaponBehaviour() = default; virtual ~WeaponBehaviour() = default;
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cWeapon, double dt) override WeaponBehaviour(const WeaponBehaviour&) = delete;
{ WeaponBehaviour& operator=(const WeaponBehaviour &) = delete;
/* EntityWrapper firstPersonWeapon = entity.FirstChildByName("Hands").FirstChildByName("AssaultWeapon");
EntityWrapper thirdPersonWeapon = entity.FirstChildByName("PlayerModel").FirstChildByName("AssaultWeapon");
if (IsClient && (firstPersonWeapon.Valid() || thirdPersonWeapon.Valid())) {
if (m_ActiveWeapons.count(entity) == 0) {
WeaponInfo& wi = m_ActiveWeapons[entity];
wi.Player = entity;
wi.WeaponEntity = entity;
wi.FirstPersonEntity = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
OnEquip(cWeapon, wi); virtual void Fire() = 0;
} virtual void CeaseFire() { }
}*/ virtual void Reload() { }
virtual void Update(double dt) { }
auto weapon = getActiveWeapon(entity);
if (!weapon) {
return;
} else {
UpdateWeapon(cWeapon, *weapon, dt);
}
}
protected: protected:
struct WeaponInfo
{
EntityWrapper Player;
EntityWrapper WeaponEntity;
EntityWrapper FirstPersonEntity;
EntityWrapper FirstPersonPlayerModel;
EntityWrapper ThirdPersonEntity;
EntityWrapper ThirdPersonPlayerModel;
};
IRenderer* m_Renderer; IRenderer* m_Renderer;
EntityWrapper m_CurrentCamera;
Octree<EntityAABB>* m_CollisionOctree; Octree<EntityAABB>* m_CollisionOctree;
std::unordered_map<EntityWrapper, WeaponInfo> m_ActiveWeapons; EntityWrapper m_Player;
bool m_ConfigAutoReload;
virtual void UpdateWeapon(ComponentWrapper cWeapon, WeaponInfo& wi, double dt) { }
virtual void OnPrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnCeasePrimaryFire(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnReload(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnEquip(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual void OnHolster(ComponentWrapper cWeapon, WeaponInfo& wi) { }
virtual bool OnInputCommand(ComponentWrapper cWeapon, WeaponInfo& wi, const Events::InputCommand& e) { return false; }
bool isPlayerInFirstPerson(EntityWrapper player)
{
if (!m_CurrentCamera.Valid()) {
return false;
} else {
return m_CurrentCamera == player || m_CurrentCamera.IsChildOf(player);
}
}
// Returns wi.FirstPersonEntity or wi.ThirdPersonEntity depending on
// if the player is in first person mode or not.
EntityWrapper getRelevantWeaponEntity(WeaponInfo& wi)
{
if (isPlayerInFirstPerson(wi.Player)) {
return wi.FirstPersonEntity;
} else {
return wi.ThirdPersonEntity;
}
}
float traceRayDistance(glm::vec3 origin, glm::vec3 direction)
{
float distance;
glm::vec3 pos;
auto entity = Collision::EntityFirstHitByRay(Ray(origin, direction), m_CollisionOctree, distance, pos);
if (entity) {
return distance;
} else {
return 100.f;
}
}
void playAnimation(EntityWrapper weaponModelEntity, const std::string& subTreeName, const std::string& animationNodeName)
{
EntityWrapper root = weaponModelEntity.FirstParentWithComponent("Model");
if (!root.Valid()) {
return;
}
EntityWrapper subTree = root.FirstChildByName(subTreeName);
if (!subTree.Valid()) {
return;
}
EntityWrapper animationNode = subTree.FirstChildByName(animationNodeName);
if (!animationNode.Valid()) {
return;
}
Events::AutoAnimationBlend eFireBlend;
eFireBlend.RootNode = root;
eFireBlend.NodeName = animationNodeName;
eFireBlend.Restart = true;
eFireBlend.Start = true;
m_EventBroker->Publish(eFireBlend);
}
void playAnimationAndReturn(EntityWrapper weaponModelEntity, const std::string& subTreeName, const std::string& animationNodeName)
{
EntityWrapper root = weaponModelEntity;
if (!root.Valid()) {
return;
}
EntityWrapper subTree = root.FirstChildByName(subTreeName);
if (!subTree.Valid()) {
return;
}
EntityWrapper animationNode = subTree.FirstChildByName(animationNodeName);
if (!animationNode.Valid()) {
return;
}
Events::AutoAnimationBlend eFireBlend;
eFireBlend.RootNode = root;
eFireBlend.NodeName = animationNodeName;
eFireBlend.Restart = true;
eFireBlend.Start = true;
m_EventBroker->Publish(eFireBlend);
Events::AutoAnimationBlend eIdleBlend;
eIdleBlend.RootNode = root;
eIdleBlend.NodeName = "Idle";
eIdleBlend.AnimationEntity = animationNode;
eIdleBlend.Delay = -0.2;
eIdleBlend.Duration = 0.2;
m_EventBroker->Publish(eIdleBlend);
}
private:
EventRelay<ETYPE, Events::SetCamera> m_ESetCamera;
bool _OnSetCamera(const Events::SetCamera& e)
{
m_CurrentCamera = e.CameraEntity;
return true;
}
EventRelay<ETYPE, Events::InputCommand> m_EInputCommand;
bool _OnInputCommand(const Events::InputCommand& e)
{
EntityWrapper player = e.Player;
if (e.PlayerID == -1) {
player = LocalPlayer;
}
// Make sure the player is alive
if (!player.Valid()) {
return false;
}
// Make sure the player has this weapon
auto cWeapon = getWeaponComponent(player);
if (!cWeapon) {
return false;
}
// Weapon selection
if (e.Command == "SelectWeapon") {
if (e.Value > 0) {
if (static_cast<ComponentInfo::EnumType>(e.Value) == static_cast<ComponentInfo::EnumType>((*cWeapon)["Slot"])) {
selectWeapon(*cWeapon, player);
} else {
holsterWeapon(*cWeapon, player);
}
}
}
// Only handle weapon actions if the weapon is active
auto activeWeapon = getActiveWeapon(player);
if (!activeWeapon) {
return false;
}
// Fire
if (e.Command == "PrimaryFire") {
if (e.Value > 0) {
OnPrimaryFire(*cWeapon, *activeWeapon);
} else {
OnCeasePrimaryFire(*cWeapon, *activeWeapon);
}
}
// Reload
if (e.Command == "Reload" && e.Value != 0) {
OnReload(*cWeapon, *activeWeapon);
}
return OnInputCommand(*cWeapon, *activeWeapon, e);
}
boost::optional<ComponentWrapper> getWeaponComponent(EntityWrapper player)
{
if (!player.HasComponent(m_ComponentType)) {
return boost::none;
}
return player[m_ComponentType];
}
boost::optional<WeaponInfo&> getActiveWeapon(EntityWrapper player)
{
auto it = m_ActiveWeapons.find(player);
if (it == m_ActiveWeapons.end()) {
return boost::none;
}
WeaponInfo& activeWeapon = it->second;
if (!activeWeapon.FirstPersonEntity.Valid() && !activeWeapon.ThirdPersonEntity.Valid()) {
return boost::none;
}
return activeWeapon;
}
void selectWeapon(ComponentWrapper cWeapon, EntityWrapper player)
{
//if (!IsServer) {
// return;
//}
// Don't reselect weapon if it's already active
if (getActiveWeapon(player)) {
return;
}
// Find the weapon attachments matching the weapon type
std::vector<EntityWrapper> weaponAttachments = player.ChildrenWithComponent("WeaponAttachment");
EntityWrapper firstPersonAttachment;
EntityWrapper thirdPersonAttachment;
for (auto& attachment : weaponAttachments) {
ComponentWrapper cWeaponAttachment = attachment["WeaponAttachment"];
if ((std::string&)cWeaponAttachment["Weapon"] == m_ComponentType) {
ComponentWrapper::SubscriptProxy person = cWeaponAttachment["Person"];
if ((ComponentInfo::EnumType)person == person.Enum("FirstPerson")) {
firstPersonAttachment = attachment;
} else if ((ComponentInfo::EnumType)person == person.Enum("ThirdPerson")) {
thirdPersonAttachment = attachment;
}
}
}
if (!firstPersonAttachment.Valid() && !thirdPersonAttachment.Valid()) {
LOG_WARNING("No weapon attachment found for %s of player #%i", m_ComponentType.c_str(), player.ID);
return;
}
// Spawn the weapon(s)
EntityWrapper firstPersonWeapon;
EntityWrapper thirdPersonWeapon;
if (IsClient) {
if (firstPersonAttachment.Valid()) {
firstPersonWeapon = SpawnerSystem::Spawn(firstPersonAttachment, firstPersonAttachment);
}
}
if (thirdPersonAttachment.Valid()) {
thirdPersonWeapon = SpawnerSystem::Spawn(thirdPersonAttachment, thirdPersonAttachment);
}
WeaponInfo& wi = m_ActiveWeapons[player];
wi.Player = player;
wi.WeaponEntity = player;
wi.FirstPersonEntity = firstPersonWeapon;
wi.FirstPersonPlayerModel = firstPersonWeapon;
wi.ThirdPersonEntity = thirdPersonWeapon;
wi.ThirdPersonPlayerModel = thirdPersonWeapon.FirstParentWithComponent("Model");
OnEquip(cWeapon, wi);
}
void holsterWeapon(ComponentWrapper cWeapon, EntityWrapper player)
{
auto activeWeapon = getActiveWeapon(player);
if (!activeWeapon) {
return;
}
WeaponInfo& wi = *activeWeapon;
// Send holster event
OnHolster(cWeapon, wi);
// Delete weapon entities
if (wi.FirstPersonEntity.Valid()) {
m_World->DeleteEntity(wi.FirstPersonEntity.ID);
}
if (wi.ThirdPersonEntity.Valid()) {
m_World->DeleteEntity(wi.ThirdPersonEntity.ID);
}
// Make weapon inactive
m_ActiveWeapons.erase(player);
}
}; };
#endif #endif
+2 -2
View File
@@ -9,8 +9,8 @@
#include "Core/EShoot.h" #include "Core/EShoot.h"
#include "Core/EPlayerSpawned.h" #include "Core/EPlayerSpawned.h"
#include "Input/EInputCommand.h" #include "Input/EInputCommand.h"
#include "Core/EntityXMLFile.h" #include "Core/EntityFile.h"
#include "Core/EntityXMLFileParser.h" #include "Core/EntityFileParser.h"
#include "Core/Octree.h" #include "Core/Octree.h"
#include "Collision/EntityAABB.h" #include "Collision/EntityAABB.h"
#include "Systems/SpawnerSystem.h" #include "Systems/SpawnerSystem.h"
+2 -50
View File
@@ -1,13 +1,10 @@
[Gameplay]
AutoReload=true
[Debug] [Debug]
LogLevel=1 LogLevel=1
LoadMap= LoadMap=
; if true -> Pool allocation is not used when calling Allocate/Free, just use regular dynamic allocation. ; if true -> Pool allocation is not used when calling Allocate/Free, just use regular dynamic allocation.
; if false -> Use pool allocation. ; if false -> Use pool allocation.
DisableMemoryPool=false DisableMemoryPool=false
RespawnTime = -1.0 RespawnTime = 8.0
EditorEnabled=false EditorEnabled=false
OutOfBodyExperience=false OutOfBodyExperience=false
@@ -39,49 +36,4 @@ ResourceLoading=true
[Sound] [Sound]
BGMVolume=1.0 BGMVolume=1.0
SFXVolume=1.0 SFXVolume=1.0
Announcer=female Announcer=female
[SSAO]
Quality=0
[SSAO1]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=8
NumTurns=3
NumIterations=5
TextureQuality=2
[SSAO2]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=16
NumTurns=13
NumIterations=9
TextureQuality=1
[SSAO3]
Radius=1.0
Bias=0.02
Contrast=1.5
Intensity=1.0
NumSamples=24
NumTurns=17
NumIterations=9
TextureQuality=0
[GLOW]
Quality=3
[GLOW1]
NumIterations=5
[GLOW2]
NumIterations=9
[GLOW3]
NumIterations=13
+1 -5
View File
@@ -27,8 +27,4 @@ M=SwitchToClient
P=SwitchToPlayer P=SwitchToPlayer
K=TakeDamage,1500 K=TakeDamage,1500
F2=PerformanceTimingResetAllTimers F2=PerformanceTimingResetAllTimers
F3=PerformanceTimingCreateExcelData F3=PerformanceTimingCreateExcelData
Comma=SwapToClassPick
Period=SwapToTeamPick
Enter=PickClass,1
F5=DisconnectFromServer
+2 -26
View File
@@ -33,41 +33,17 @@
<xs:include schemaLocation="Components/HiddenForLocalPlayer.xsd"/> <xs:include schemaLocation="Components/HiddenForLocalPlayer.xsd"/>
<xs:include schemaLocation="Components/HealthPickup.xsd"/> <xs:include schemaLocation="Components/HealthPickup.xsd"/>
<xs:include schemaLocation="Components/AmmoPickup.xsd"/> <xs:include schemaLocation="Components/AmmoPickup.xsd"/>
<xs:include schemaLocation="Components/AnimationOffset.xsd"/>
<xs:include schemaLocation="Components/DashAbility.xsd"/> <xs:include schemaLocation="Components/DashAbility.xsd"/>
<xs:include schemaLocation="Components/ShieldAbility.xsd"/>
<xs:include schemaLocation="Components/SprintAbility.xsd"/>
<xs:include schemaLocation="Components/AssaultWeapon.xsd"/> <xs:include schemaLocation="Components/AssaultWeapon.xsd"/>
<xs:include schemaLocation="Components/BoostAssault.xsd"/>
<xs:include schemaLocation="Components/BoostDefender.xsd"/>
<xs:include schemaLocation="Components/BoostSniper.xsd"/>
<xs:include schemaLocation="Components/Shield.xsd"/> <xs:include schemaLocation="Components/Shield.xsd"/>
<xs:include schemaLocation="Components/Sprite.xsd"/> <xs:include schemaLocation="Components/Sprite.xsd"/>
<xs:include schemaLocation="Components/Shielded.xsd"/> <xs:include schemaLocation="Components/Shielded.xsd"/>
<xs:include schemaLocation="Components/CapturePointHUD.xsd"/> <xs:include schemaLocation="Components/CapturePointHUD.xsd"/>
<xs:include schemaLocation="Components/TextFieldReader.xsd"/> <xs:include schemaLocation="Components/AmmunitionHUD.xsd"/>
<xs:include schemaLocation="Components/Menu.xsd"/> <xs:include schemaLocation="Components/Menu.xsd"/>
<xs:include schemaLocation="Components/KillFeed.xsd"/> <xs:include schemaLocation="Components/KillFeed.xsd"/>
<xs:include schemaLocation="Components/BlendOverride.xsd"/>
<xs:include schemaLocation="Components/Blend.xsd"/>
<xs:include schemaLocation="Components/BlendAdditive.xsd"/>
<xs:include schemaLocation="Components/Page.xsd"/> <xs:include schemaLocation="Components/Page.xsd"/>
<xs:include schemaLocation="Components/SpriteIndicator.xsd"/> <xs:include schemaLocation="Components/SpriteIndicator.xsd"/>
<xs:include schemaLocation="Components/Button.xsd"/> <xs:include schemaLocation="Components/Button.xsd"/>
<xs:include schemaLocation="Components/AbilityCooldownHUD.xsd"/>
<xs:include schemaLocation="Components/DoubleJump.xsd"/>
<xs:include schemaLocation="Components/WeaponAttachment.xsd"/>
<xs:include schemaLocation="Components/DefenderWeapon.xsd"/>
<xs:include schemaLocation="Components/SidearmWeapon.xsd"/>
<xs:include schemaLocation="Components/CapturePointGameMode.xsd"/>
<xs:include schemaLocation="Components/CapturePointArrowHUD.xsd"/>
<xs:include schemaLocation="Components/FloatingEffect.xsd"/>
<xs:include schemaLocation="Components/BoostIconsHUD.xsd"/>
<xs:include schemaLocation="Components/InputCmdButton.xsd"/>
<xs:include schemaLocation="Components/ScoreScreen.xsd"/>
<xs:include schemaLocation="Components/ScoreIdentity.xsd"/>
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
<xs:include schemaLocation="Components/ServerList.xsd"/>
<xs:include schemaLocation="Components/ConfigBtnResolution.xsd"/>
<xs:include schemaLocation="Components/ConfigBtnFloat.xsd"/>
</xs:schema> </xs:schema>
@@ -1,3 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<AbilityCooldownHUD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="AbilityCooldownHUD.xsd">
</AbilityCooldownHUD>

Some files were not shown because too many files have changed in this diff Show More