Compare commits
220 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3261e21d96 | |||
| 373bb33cf0 | |||
| aaa11d2109 | |||
| 1ce9128da8 | |||
| 132de88d28 | |||
| df485ccf7b | |||
| 85a4d98c81 | |||
| ef020a3770 | |||
| 160b7183b2 | |||
| 5edf5a41f1 | |||
| ff6ec82a6c | |||
| bd62b5873d | |||
| 666ef6589e | |||
| b83d773627 | |||
| d59ab5aba2 | |||
| f623232a2b | |||
| 6a18cb88af | |||
| b499f4b020 | |||
| 482689fd48 | |||
| 32f73201c5 | |||
| 3aeeb3cad5 | |||
| 4d5cbb6057 | |||
| bef95235d0 | |||
| 9a23d8887a | |||
| db0e67b9bd | |||
| e4513376bb | |||
| 445248af55 | |||
| 64a7239b17 | |||
| 31e7340daf | |||
| 3ac3311c0c | |||
| 90867b094a | |||
| 55ee2bb3bf | |||
| 406b730ef3 | |||
| b37b20b7d8 | |||
| 750442d224 | |||
| 389e057611 | |||
| 74d9bae896 | |||
| 74c95089ea | |||
| ca2aab449e | |||
| 7498cebf5e | |||
| 2b8debbfff | |||
| 08c476e9e3 | |||
| 10c3b475bf | |||
| 08fcdb382b | |||
| b1ea5429ce | |||
| fcc9d64e7a | |||
| caf55fb8d1 | |||
| 7a95880e10 | |||
| 6cd073c3c8 | |||
| 1e3fc1ae2d | |||
| 6f739e22f3 | |||
| 8cf83454d7 | |||
| 41f0daaf3f | |||
| deb6ff1b16 | |||
| 4d60f387ed | |||
| f740d46683 | |||
| 75dcdcec41 | |||
| 254caf9e5d | |||
| 1c6750f5b0 | |||
| 3548cfa248 | |||
| 973ccd34c9 | |||
| 43b8fd29f6 | |||
| a6548a72b3 | |||
| 7deb32431e | |||
| fc06a4babc | |||
| c6e9aad0c7 | |||
| afe43c5f44 | |||
| 2381f01d12 | |||
| b9147344e1 | |||
| 70bbc5ed0a | |||
| 0183e1bdb7 | |||
| 983f90504d | |||
| bdebc9de62 | |||
| f1345419b6 | |||
| 5e70d6eef6 | |||
| 4aa9100c69 | |||
| 7b34e001ba | |||
| c2e05de89f | |||
| ea9c4d19d0 | |||
| f3bfe388af | |||
| 70cab9ef30 | |||
| f1a54a89b3 | |||
| b098bd2bd3 | |||
| 60037c2849 | |||
| cd67253173 | |||
| a596b8746b | |||
| 35876f6425 | |||
| f6ce98249e | |||
| 00588b07c5 | |||
| 3376f4a16e | |||
| 25d2aa3464 | |||
| 29aefc5af2 | |||
| 39ae83efd4 | |||
| 86824f1b1f | |||
| 8189e3c00c | |||
| 4d01cdf895 | |||
| 7e7ca7edcf | |||
| e9a576341e | |||
| f52cddb445 | |||
| 78a1037983 | |||
| 85523343b2 | |||
| 410e349329 | |||
| ce27b224df | |||
| b45de542da | |||
| f0763bc2a3 | |||
| dfa96f74e1 | |||
| 5d6d0f82b9 | |||
| a124ab2400 | |||
| d2263b0c90 | |||
| a8ffb24040 | |||
| 893ef38237 | |||
| f197993beb | |||
| ad9bb5fba4 | |||
| 982837052a | |||
| 8854794cbc | |||
| e0c4394f20 | |||
| 260203fa4d | |||
| d030e8f699 | |||
| 61984d2c4a | |||
| cfe023cc1d | |||
| 4cafb2fc4c | |||
| 46e17b7e0d | |||
| a6445c65aa | |||
| 162523d3ca | |||
| dbe56280a6 | |||
| 3fb975a8d9 | |||
| 267a60ef30 | |||
| 68af853a03 | |||
| 3142c701e3 | |||
| b62e42567c | |||
| 9e3dfff7b6 | |||
| 79eaa7364c | |||
| 51979d7f0c | |||
| 3fc44e944c | |||
| 1760f9dfb1 | |||
| d4242bbead | |||
| 631dd57eeb | |||
| 9cb5f4bd2f | |||
| a6425160fd | |||
| 88eb3ca2db | |||
| 3e90ed564c | |||
| 4b29d48f27 | |||
| c4594524da | |||
| 2a93e2ae7f | |||
| 14b1d541dc | |||
| 765509b510 | |||
| 8952c1a7e4 | |||
| fc305f8bf4 | |||
| 62c3f72355 | |||
| 92553f1e93 | |||
| 70cbb02cb2 | |||
| 0c7f2c5198 | |||
| d7780d8248 | |||
| 601ce85c05 | |||
| 4c1a49a8a4 | |||
| 01a164847c | |||
| 794635b6a1 | |||
| 0a3b6f4da1 | |||
| 3bc7dceca5 | |||
| e0410d4345 | |||
| 6f1fd19ac7 | |||
| 6680f6863f | |||
| 4092f6b4d4 | |||
| 504f301e4d | |||
| 6ba6deb863 | |||
| cc604f8e9a | |||
| e97f4a3563 | |||
| d995713d3b | |||
| e39e4064f2 | |||
| 0d50ede6f5 | |||
| 4786986abd | |||
| e34856468a | |||
| e2357b8625 | |||
| 6ec2258758 | |||
| 9f447afbdb | |||
| 7faed50507 | |||
| 6fbb962b5e | |||
| db62d767ac | |||
| e7da11fda4 | |||
| 8f257b9a58 | |||
| c8fe6853c0 | |||
| 76a8b43ca3 | |||
| 0bf756dc08 | |||
| 696f44a673 | |||
| 5e9a3774ab | |||
| db18a45368 | |||
| a060640da3 | |||
| b8a41b7c13 | |||
| 9533920684 | |||
| f47f913bf5 | |||
| ed5ac2e923 | |||
| 7a8604bf2b | |||
| 3a1056a2c3 | |||
| 59be714fdc | |||
| 147b116f20 | |||
| f0b425614d | |||
| 4b672b11e7 | |||
| e865971fdd | |||
| 878c71b56a | |||
| ec4d5fbfa8 | |||
| 184af95507 | |||
| e6527196ed | |||
| c14f3789f7 | |||
| a20ca49d53 | |||
| 774bb8ce56 | |||
| 0cc58f088a | |||
| 00805d30d0 | |||
| 2f6261dfbf | |||
| 2cd0e94a60 | |||
| 8f92de3683 | |||
| 31c1c0ac8d | |||
| 7ae42a5bf7 | |||
| 123c198e19 | |||
| 9bd3da409d | |||
| a8a38716bd | |||
| 8f007f6daf | |||
| 4c2ce3882e | |||
| 7b6902eafe | |||
| 46854a63dd | |||
| dc66891d60 |
+1
-1
Submodule assets updated: a3c92ac876...e8174f630f
@@ -8,14 +8,14 @@
|
|||||||
class CollidableOctreeSystem : public ImpureSystem, public PureSystem
|
class CollidableOctreeSystem : public ImpureSystem, public PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CollidableOctreeSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
CollidableOctreeSystem(World* world, EventBroker* eventBroker, Octree<AABB>* octree)
|
||||||
: System(eventBroker)
|
: System(world, eventBroker)
|
||||||
, PureSystem("Collidable")
|
, PureSystem("Collidable")
|
||||||
, m_Octree(octree)
|
, m_Octree(octree)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void Update(World* world, double dt) override;
|
virtual void Update(double dt) override;
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Octree<AABB>* m_Octree;
|
Octree<AABB>* m_Octree;
|
||||||
|
|||||||
@@ -13,8 +13,8 @@
|
|||||||
class CollisionSystem : public PureSystem
|
class CollisionSystem : public PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CollisionSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
CollisionSystem(World* world, EventBroker* eventBroker, Octree<AABB>* octree)
|
||||||
: System(eventBroker)
|
: System(world, eventBroker)
|
||||||
, PureSystem("Collidable")
|
, PureSystem("Collidable")
|
||||||
, m_Octree(octree)
|
, m_Octree(octree)
|
||||||
, zPress(false)
|
, zPress(false)
|
||||||
@@ -23,7 +23,7 @@ public:
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp);
|
EVENT_SUBSCRIBE_MEMBER(m_EKeyUp, &CollisionSystem::OnKeyUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Octree<AABB>* m_Octree;
|
Octree<AABB>* m_Octree;
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ class AABB;
|
|||||||
class TriggerSystem : public PureSystem
|
class TriggerSystem : public PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TriggerSystem(EventBroker* eventBroker, Octree<AABB>* octree)
|
TriggerSystem(World* world, EventBroker* eventBroker, Octree<AABB>* octree)
|
||||||
: System(eventBroker)
|
: System(world, eventBroker)
|
||||||
, PureSystem("Trigger")
|
, PureSystem("Trigger")
|
||||||
, m_Octree(octree)
|
, m_Octree(octree)
|
||||||
{
|
{
|
||||||
@@ -24,7 +24,7 @@ public:
|
|||||||
EVENT_SUBSCRIBE_MEMBER(m_ELeave, &TriggerSystem::OnLeave);
|
EVENT_SUBSCRIBE_MEMBER(m_ELeave, &TriggerSystem::OnLeave);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Octree<AABB>* m_Octree;
|
Octree<AABB>* m_Octree;
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include "Core/Util/Logging.h"
|
#include "Core/Util/Logging.h"
|
||||||
#include "Core/Util/IfDebug.h"
|
#include "Core/Util/IfDebug.h"
|
||||||
@@ -5,12 +5,14 @@
|
|||||||
|
|
||||||
struct ComponentInfo
|
struct ComponentInfo
|
||||||
{
|
{
|
||||||
|
typedef int EnumType;
|
||||||
|
|
||||||
struct Meta_t
|
struct Meta_t
|
||||||
{
|
{
|
||||||
std::string Annotation;
|
std::string Annotation;
|
||||||
unsigned int Allocation = 0;
|
unsigned int Allocation = 0;
|
||||||
std::map<std::string, std::string> FieldAnnotations;
|
std::map<std::string, std::string> FieldAnnotations;
|
||||||
std::map<std::string, std::map<std::string, int>> FieldEnumDefinitions;
|
std::map<std::string, std::map<std::string, EnumType>> FieldEnumDefinitions;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Field_t
|
struct Field_t
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ public:
|
|||||||
|
|
||||||
iterator begin() const;
|
iterator begin() const;
|
||||||
iterator end() const;
|
iterator end() const;
|
||||||
|
size_t size() 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<<)
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ struct ComponentWrapper
|
|||||||
const ::EntityID EntityID;
|
const ::EntityID EntityID;
|
||||||
char* Data;
|
char* Data;
|
||||||
|
|
||||||
int Enum(const char* fieldName, const char* enumKey)
|
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey)
|
||||||
{
|
{
|
||||||
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
|
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
|
||||||
}
|
}
|
||||||
@@ -58,7 +58,7 @@ struct ComponentWrapper
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// Return the integer value of an enum type key for this field
|
// Return the integer value of an enum type key for this field
|
||||||
int Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
|
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
operator T&() { return m_Component->Field<T>(m_PropertyName); }
|
operator T&() { return m_Component->Field<T>(m_PropertyName); }
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
void AddProperty(std::string fieldName, T defaultValue)
|
void AddProperty(std::string fieldName, T defaultValue)
|
||||||
{
|
{
|
||||||
m_DefaultValues.push_back(defaultValue);
|
m_DefaultValues.push_back(defaultValue);
|
||||||
m_ComponentInfo.Fields[fieldName].Name = typeid(T).name();
|
m_ComponentInfo.Fields[fieldName].Type = typeid(T).name();
|
||||||
m_ComponentInfo.Fields[fieldName].Offset = m_ComponentInfo.Stride;
|
m_ComponentInfo.Fields[fieldName].Offset = m_ComponentInfo.Stride;
|
||||||
m_ComponentInfo.Fields[fieldName].Stride = sizeof(T);
|
m_ComponentInfo.Fields[fieldName].Stride = sizeof(T);
|
||||||
m_ComponentInfo.Stride += sizeof(T);
|
m_ComponentInfo.Stride += sizeof(T);
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef ECaptured_h__
|
||||||
|
#define ECaptured_h__
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "../Core/Entity.h"
|
||||||
|
#include "Engine/GLM.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
//triggers when a capturePoint has been taken over
|
||||||
|
struct Captured : Event
|
||||||
|
{
|
||||||
|
int TeamNumberThatCapturedCapturePoint;
|
||||||
|
EntityID CapturePointID;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -11,6 +11,9 @@ struct KeyDown : Event
|
|||||||
{
|
{
|
||||||
/** GLFW key code */
|
/** GLFW key code */
|
||||||
int KeyCode;
|
int KeyCode;
|
||||||
|
bool ModCtrl;
|
||||||
|
bool ModAlt;
|
||||||
|
bool ModShift;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ struct KeyUp : Event
|
|||||||
{
|
{
|
||||||
/** GLFW key code */
|
/** GLFW key code */
|
||||||
int KeyCode;
|
int KeyCode;
|
||||||
|
bool ModCtrl;
|
||||||
|
bool ModAlt;
|
||||||
|
bool ModShift;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef EPause_h__
|
||||||
|
#define EPause_h__
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "World.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Pause : Event
|
||||||
|
{
|
||||||
|
::World* World;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Resume : Event
|
||||||
|
{
|
||||||
|
::World* World;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -11,8 +11,6 @@ struct PlayerDamage : Event
|
|||||||
{
|
{
|
||||||
double DamageAmount;
|
double DamageAmount;
|
||||||
EntityID PlayerDamagedID;
|
EntityID PlayerDamagedID;
|
||||||
//optional TypeOfDamage
|
|
||||||
std::string TypeOfDamage;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef EPlayerSpawned_h__
|
||||||
|
#define EPlayerSpawned_h__
|
||||||
|
|
||||||
|
#include "Core/Event.h"
|
||||||
|
#include "Core/EntityWrapper.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct PlayerSpawned : Event
|
||||||
|
{
|
||||||
|
int PlayerID;
|
||||||
|
EntityWrapper Player;
|
||||||
|
EntityWrapper Spawner;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef EShoot_h__
|
||||||
|
#define EShoot_h__
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "../Core/Entity.h"
|
||||||
|
#include "Engine/GLM.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Shoot : Event
|
||||||
|
{
|
||||||
|
//ID for who made the shot
|
||||||
|
EntityID shooter;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef EWin_h__
|
||||||
|
#define EWin_h__
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "../Core/Entity.h"
|
||||||
|
#include "Engine/GLM.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
//triggers when a team has captured all capturePoints
|
||||||
|
struct Win : Event
|
||||||
|
{
|
||||||
|
//can be 0 = none, 1,2
|
||||||
|
int TeamThatWon;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
#define EntityWrapper_h__
|
#define EntityWrapper_h__
|
||||||
|
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
|
#include <boost/functional/hash.hpp>
|
||||||
#include "ComponentWrapper.h"
|
#include "ComponentWrapper.h"
|
||||||
|
|
||||||
class World;
|
class World;
|
||||||
@@ -23,10 +24,30 @@ struct EntityWrapper
|
|||||||
static const EntityWrapper Invalid;
|
static const EntityWrapper Invalid;
|
||||||
|
|
||||||
bool HasComponent(const std::string& componentName);
|
bool HasComponent(const std::string& componentName);
|
||||||
|
EntityWrapper Parent();
|
||||||
|
EntityWrapper FirstChildByName(const std::string& name);
|
||||||
|
bool IsChildOf(EntityWrapper potentialParent);
|
||||||
|
bool Valid();
|
||||||
|
|
||||||
ComponentWrapper operator[](const std::string& componentName);
|
ComponentWrapper operator[](const char* componentName);
|
||||||
bool operator==(const EntityWrapper& e);
|
bool operator==(const EntityWrapper& e) const;
|
||||||
explicit operator EntityID();
|
bool operator!=(const EntityWrapper& e) const;
|
||||||
|
explicit operator EntityID() const;
|
||||||
|
operator bool();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace std
|
||||||
|
{
|
||||||
|
template<> struct hash<EntityWrapper>
|
||||||
|
{
|
||||||
|
std::size_t operator()(const EntityWrapper& e) const
|
||||||
|
{
|
||||||
|
std::size_t seed = 0;
|
||||||
|
boost::hash_combine(seed, e.World);
|
||||||
|
boost::hash_combine(seed, e.ID);
|
||||||
|
return seed;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ struct Child
|
|||||||
std::vector<ContainedObject>& m_StaticObjectsRef;
|
std::vector<ContainedObject>& m_StaticObjectsRef;
|
||||||
std::vector<ContainedObject>& m_DynamicObjectsRef;
|
std::vector<ContainedObject>& m_DynamicObjectsRef;
|
||||||
|
|
||||||
inline bool hasChildren() const;
|
bool hasChildren() const;
|
||||||
int childIndexContainingPoint(const glm::vec3& point) const;
|
int childIndexContainingPoint(const glm::vec3& point) const;
|
||||||
std::vector<int> childIndicesContainingBox(const AABB& box) const;
|
std::vector<int> childIndicesContainingBox(const AABB& box) const;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,14 +11,14 @@ class System
|
|||||||
friend class SystemPipeline;
|
friend class SystemPipeline;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
System()
|
System(World* world, EventBroker) { }
|
||||||
: m_EventBroker(nullptr)
|
System(World* world, EventBroker* eventBroker)
|
||||||
{ }
|
: m_World(world)
|
||||||
System(EventBroker* eventBroker)
|
, m_EventBroker(eventBroker)
|
||||||
: m_EventBroker(eventBroker)
|
|
||||||
{ }
|
{ }
|
||||||
virtual ~System() = default;
|
virtual ~System() = default;
|
||||||
|
|
||||||
|
World* m_World;
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ protected:
|
|||||||
|
|
||||||
const std::string m_ComponentType;
|
const std::string m_ComponentType;
|
||||||
|
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) = 0;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cComponent, double dt) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ImpureSystem : public virtual System
|
class ImpureSystem : public virtual System
|
||||||
@@ -45,7 +45,7 @@ protected:
|
|||||||
ImpureSystem() = default;
|
ImpureSystem() = default;
|
||||||
virtual ~ImpureSystem() = default;
|
virtual ~ImpureSystem() = default;
|
||||||
|
|
||||||
virtual void Update(World* world, double dt) = 0;
|
virtual void Update(double dt) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -5,13 +5,19 @@
|
|||||||
#include "EventBroker.h"
|
#include "EventBroker.h"
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
#include "EPause.h"
|
||||||
|
|
||||||
class SystemPipeline
|
class SystemPipeline
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SystemPipeline(EventBroker* eventBroker)
|
SystemPipeline(World* world, EventBroker* eventBroker)
|
||||||
: m_EventBroker(eventBroker)
|
: m_World(world)
|
||||||
{ }
|
, m_EventBroker(eventBroker)
|
||||||
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EPause, &SystemPipeline::OnPause);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EResume, &SystemPipeline::OnResume);
|
||||||
|
}
|
||||||
|
|
||||||
~SystemPipeline()
|
~SystemPipeline()
|
||||||
{
|
{
|
||||||
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
||||||
@@ -29,7 +35,7 @@ public:
|
|||||||
m_OrderedSystemGroups.resize(updateOrderLevel + 1);
|
m_OrderedSystemGroups.resize(updateOrderLevel + 1);
|
||||||
}
|
}
|
||||||
UnorderedSystems& group = m_OrderedSystemGroups[updateOrderLevel];
|
UnorderedSystems& group = m_OrderedSystemGroups[updateOrderLevel];
|
||||||
System* system = new T(m_EventBroker, args...);
|
System* system = new T(m_World, m_EventBroker, args...);
|
||||||
group.Systems[typeid(T).name()] = system;
|
group.Systems[typeid(T).name()] = system;
|
||||||
|
|
||||||
PureSystem* pureSystem = dynamic_cast<PureSystem*>(system);
|
PureSystem* pureSystem = dynamic_cast<PureSystem*>(system);
|
||||||
@@ -47,8 +53,12 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update(World* world, double dt)
|
void Update(double dt)
|
||||||
{
|
{
|
||||||
|
if (m_Paused) {
|
||||||
|
dt = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
for (UnorderedSystems& group : m_OrderedSystemGroups) {
|
||||||
// Process events
|
// Process events
|
||||||
for (auto& pair : group.Systems) {
|
for (auto& pair : group.Systems) {
|
||||||
@@ -57,18 +67,18 @@ public:
|
|||||||
|
|
||||||
// Update
|
// Update
|
||||||
for (auto& system : group.ImpureSystems) {
|
for (auto& system : group.ImpureSystems) {
|
||||||
system->Update(world, dt);
|
system->Update(dt);
|
||||||
}
|
}
|
||||||
for (auto& pair : group.PureSystems) {
|
for (auto& pair : group.PureSystems) {
|
||||||
const std::string& componentName = pair.first;
|
const std::string& componentName = pair.first;
|
||||||
auto& systems = pair.second;
|
auto& systems = pair.second;
|
||||||
const ComponentPool* pool = world->GetComponents(componentName);
|
const ComponentPool* pool = m_World->GetComponents(componentName);
|
||||||
if (pool == nullptr) {
|
if (pool == nullptr) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (auto& component : *pool) {
|
for (auto& component : *pool) {
|
||||||
for (auto& system : systems) {
|
for (auto& system : systems) {
|
||||||
system->UpdateComponent(world, EntityWrapper(world, component.EntityID), component, dt);
|
system->UpdateComponent(EntityWrapper(m_World, component.EntityID), component, dt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,7 +86,10 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
World* m_World;
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
bool m_Paused = false;
|
||||||
|
|
||||||
struct UnorderedSystems
|
struct UnorderedSystems
|
||||||
{
|
{
|
||||||
std::map<std::string, System*> Systems;
|
std::map<std::string, System*> Systems;
|
||||||
@@ -84,6 +97,21 @@ private:
|
|||||||
std::vector<ImpureSystem*> ImpureSystems;
|
std::vector<ImpureSystem*> ImpureSystems;
|
||||||
};
|
};
|
||||||
std::vector<UnorderedSystems> m_OrderedSystemGroups;
|
std::vector<UnorderedSystems> m_OrderedSystemGroups;
|
||||||
|
|
||||||
|
EventRelay<SystemPipeline, Events::Pause> m_EPause;
|
||||||
|
bool OnPause(const Events::Pause& e) {
|
||||||
|
if (e.World == m_World) {
|
||||||
|
m_Paused = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EventRelay<SystemPipeline, Events::Resume> m_EResume;
|
||||||
|
bool OnResume(const Events::Resume& e) {
|
||||||
|
if (e.World == m_World) {
|
||||||
|
m_Paused = false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -3,13 +3,18 @@
|
|||||||
|
|
||||||
#include "../GLM.h"
|
#include "../GLM.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
|
#include "EntityWrapper.h"
|
||||||
|
|
||||||
namespace Transform
|
namespace Transform
|
||||||
{
|
{
|
||||||
|
|
||||||
|
glm::vec3 AbsolutePosition(EntityWrapper entity);
|
||||||
glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
||||||
|
glm::quat AbsoluteOrientation(EntityWrapper entity);
|
||||||
glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
||||||
|
glm::vec3 AbsoluteScale(EntityWrapper entity);
|
||||||
glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
||||||
|
glm::mat4 ModelMatrix(EntityWrapper entity);
|
||||||
glm::mat4 ModelMatrix(EntityID entity, World* world);
|
glm::mat4 ModelMatrix(EntityID entity, World* world);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#ifndef UniformScaleSystem_h__
|
||||||
|
#define UniformScaleSystem_h__
|
||||||
|
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "System.h"
|
||||||
|
#include "../Rendering/ESetCamera.h"
|
||||||
|
|
||||||
|
class UniformScaleSystem : public PureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UniformScaleSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cUniformScale, double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
EntityWrapper m_Camera = EntityWrapper::Invalid;
|
||||||
|
|
||||||
|
EventRelay<UniformScaleSystem, Events::SetCamera> m_ESetCamera;
|
||||||
|
bool OnSetCamera(const Events::SetCamera& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
#ifndef EditorCameraInputController_h__
|
||||||
|
#define EditorCameraInputController_h__
|
||||||
|
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#include "../Input/FirstPersonInputController.h"
|
||||||
|
#include "../Core/EMousePress.h"
|
||||||
|
#include "../Core/EMouseRelease.h"
|
||||||
|
#include "../Core/EMouseScroll.h"
|
||||||
|
#include "../Core/ConfigFile.h"
|
||||||
|
|
||||||
|
template <typename EventContext>
|
||||||
|
class EditorCameraInputController : public FirstPersonInputController<EventContext>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorCameraInputController(EventBroker* eventBroker, unsigned int playerID)
|
||||||
|
: FirstPersonInputController(eventBroker, playerID)
|
||||||
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EMousePress, &EditorCameraInputController::OnMousePress);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EMouseRelease, &EditorCameraInputController::OnMouseRelease);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EMouseScroll, &EditorCameraInputController::OnMouseScroll);
|
||||||
|
|
||||||
|
m_Config = ResourceManager::Load<ConfigFile>("Config.ini");
|
||||||
|
m_SpeedMultiplier = m_Config->Get<float>("Editor.CameraSpeed", 3.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const glm::vec3 Movement() const override { return m_Movement * m_SpeedMultiplier; }
|
||||||
|
|
||||||
|
void Enable() { m_Enabled = true; }
|
||||||
|
void Disable() { m_Enabled = false; }
|
||||||
|
|
||||||
|
virtual bool OnCommand(const Events::InputCommand& e) override
|
||||||
|
{
|
||||||
|
if (glm::abs(e.Value) > 0 && !m_MouseLocked) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
if (glm::abs(e.Value) > 0 && (io.WantCaptureKeyboard || io.WantCaptureMouse)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Jump") {
|
||||||
|
if (e.Value > 0) {
|
||||||
|
m_Movement.y = glm::max(e.Value, 1.f);
|
||||||
|
} else {
|
||||||
|
m_Movement.y = 0.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Crouch") {
|
||||||
|
if (e.Value > 0) {
|
||||||
|
m_Movement.y = glm::min(-e.Value, -1.f);
|
||||||
|
} else {
|
||||||
|
m_Movement.y = 0.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Sprint") {
|
||||||
|
if (e.Value > 0) {
|
||||||
|
m_SpeedMultiplier *= 2.f;
|
||||||
|
} else {
|
||||||
|
m_SpeedMultiplier /= 2.f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FirstPersonInputController::OnCommand(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ConfigFile* m_Config;
|
||||||
|
bool m_Enabled = false;
|
||||||
|
float m_SpeedMultiplier = 1.f;
|
||||||
|
|
||||||
|
EventRelay<EventContext, Events::MousePress> m_EMousePress;
|
||||||
|
bool OnMousePress(const Events::MousePress& e)
|
||||||
|
{
|
||||||
|
if (!m_Enabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Button == GLFW_MOUSE_BUTTON_2) {
|
||||||
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
|
if (!io.WantCaptureMouse) {
|
||||||
|
LockMouse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EventRelay<EventContext, Events::MouseRelease> m_EMouseRelease;
|
||||||
|
bool OnMouseRelease(const Events::MouseRelease& e)
|
||||||
|
{
|
||||||
|
if (!m_Enabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Button == GLFW_MOUSE_BUTTON_2) {
|
||||||
|
UnlockMouse();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
EventRelay<EventContext, Events::MouseScroll> m_EMouseScroll;
|
||||||
|
bool OnMouseScroll(const Events::MouseScroll& e)
|
||||||
|
{
|
||||||
|
if (!m_Enabled) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_SpeedMultiplier += e.DeltaY * (0.1f * m_SpeedMultiplier);
|
||||||
|
m_Config->Set("Editor.CameraSpeed", m_SpeedMultiplier);
|
||||||
|
m_Config->SaveToDisk();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,153 @@
|
|||||||
|
#ifndef EditorGUI_h__
|
||||||
|
#define EditorGUI_h__
|
||||||
|
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#define IMGUI_DEFINE_MATH_OPERATORS
|
||||||
|
#include <imgui/imgui_internal.h>
|
||||||
|
#include <nativefiledialog/nfd.h>
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/any.hpp>
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include <glm/gtx/common.hpp>
|
||||||
|
|
||||||
|
#include "EditorWidgetSystem.h"
|
||||||
|
#include "../Core/EventBroker.h"
|
||||||
|
#include "../Core/World.h"
|
||||||
|
#include "../Core/EntityWrapper.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "../Core/EPause.h"
|
||||||
|
#include "../Core/EKeyDown.h"
|
||||||
|
#include "../Rendering/Texture.h"
|
||||||
|
|
||||||
|
class EditorGUI
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorGUI(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
|
enum class WidgetMode
|
||||||
|
{
|
||||||
|
Translate,
|
||||||
|
Rotate,
|
||||||
|
Scale
|
||||||
|
};
|
||||||
|
|
||||||
|
void Draw();
|
||||||
|
|
||||||
|
void SelectEntity(EntityWrapper entity);
|
||||||
|
void SetDirty(EntityWrapper entity);
|
||||||
|
|
||||||
|
// Called when an entity is selected in the entity tree
|
||||||
|
typedef std::function<void(EntityWrapper)> OnEntitySelectedCallback_t;
|
||||||
|
void SetEntitySelectedCallback(OnEntitySelectedCallback_t f) { m_OnEntitySelected = f; }
|
||||||
|
// Called when the user means to import an entity file.
|
||||||
|
// @param EntityWrapper The entity to parent the imported entity to. The entity will be imported into the world of this entity.
|
||||||
|
// @param boost::filesystem::path The path to the entity to import
|
||||||
|
// @return EntityWrapper The newly created entity
|
||||||
|
typedef std::function<EntityWrapper(EntityWrapper, boost::filesystem::path)> OnEntityImport_t;
|
||||||
|
void SetEntityImportCallback(OnEntityImport_t f) { m_OnEntityImport = f; }
|
||||||
|
// Called when the user means to save an entity to file.
|
||||||
|
// Permitted to throw exceptions on save failure.
|
||||||
|
typedef std::function<void(EntityWrapper, boost::filesystem::path)> OnEntitySave_t;
|
||||||
|
void SetEntitySaveCallback(OnEntitySave_t f) { m_OnEntitySave = f; }
|
||||||
|
// Called when the user means to create a new entity.
|
||||||
|
// @param EntityWrapper The parent of the entity to be created
|
||||||
|
// @return EntityWrapper The newly created entity
|
||||||
|
typedef std::function<EntityWrapper(EntityWrapper)> OnEntityCreate_t;
|
||||||
|
void SetEntityCreateCallback(OnEntityCreate_t f) { m_OnEntityCreate = f; }
|
||||||
|
// Called when the user means to delete an entity.
|
||||||
|
typedef std::function<void(EntityWrapper)> OnEntityDelete_t;
|
||||||
|
void SetEntityDeleteCallback(OnEntityDelete_t f) { m_OnEntityDelete = f; }
|
||||||
|
// Called when the user means to change the parent of an entity.
|
||||||
|
typedef std::function<void(EntityWrapper, EntityWrapper)> OnEntityChangeParent_t;
|
||||||
|
void SetEntityChangeParentCallback(OnEntityChangeParent_t f) { m_OnEntityChangeParent = f; }
|
||||||
|
// Called when the user means to rename an entity.
|
||||||
|
typedef std::function<void(EntityWrapper, const std::string&)> OnEntityChangeName_t;
|
||||||
|
void SetEntityChangeNameCallback(OnEntityChangeName_t f) { m_OnEntityChangeName = f; }
|
||||||
|
// Called when the user means to attach a new component to an entity.
|
||||||
|
typedef std::function<void(EntityWrapper, const std::string&)> OnComponentAttach_t;
|
||||||
|
void SetComponentAttachCallback(OnComponentAttach_t f) { m_OnComponentAttach = f; }
|
||||||
|
// Called when the user means to delete a component off an entity.
|
||||||
|
typedef std::function<void(EntityWrapper, const std::string&)> OnComponentDelete_t;
|
||||||
|
void SetComponentDeleteCallback(OnComponentDelete_t f) { m_OnComponentDelete = f; }
|
||||||
|
// Called when the user selects a widget mode.
|
||||||
|
typedef std::function<void(WidgetMode)> OnWidgetMode_t;
|
||||||
|
void SetWidgetModeCallback(OnWidgetMode_t f) { m_OnWidgetMode = f; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
World* m_World;
|
||||||
|
EventBroker* m_EventBroker;
|
||||||
|
|
||||||
|
struct EntityFileInfo
|
||||||
|
{
|
||||||
|
boost::filesystem::path Path;
|
||||||
|
bool Dirty = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Config variables
|
||||||
|
const boost::filesystem::path m_DefaultEntityPath = boost::filesystem::path("Schema") / boost::filesystem::path("Entities");
|
||||||
|
|
||||||
|
// State
|
||||||
|
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
|
||||||
|
std::unordered_map<EntityWrapper, EntityFileInfo> m_EntityFiles;
|
||||||
|
EntityWrapper m_CurrentlyDragging = EntityWrapper::Invalid;
|
||||||
|
std::string m_LastErrorMessage;
|
||||||
|
WidgetMode m_CurrentWidgetMode = WidgetMode::Translate;
|
||||||
|
std::set<std::string> m_ModalsToOpen;
|
||||||
|
std::map<std::string, boost::any> m_ModalData;
|
||||||
|
|
||||||
|
// Callbacks
|
||||||
|
OnEntitySelectedCallback_t m_OnEntitySelected = nullptr;
|
||||||
|
OnEntityImport_t m_OnEntityImport = nullptr;
|
||||||
|
OnEntitySave_t m_OnEntitySave = nullptr;
|
||||||
|
OnEntityCreate_t m_OnEntityCreate = nullptr;
|
||||||
|
OnEntityDelete_t m_OnEntityDelete = nullptr;
|
||||||
|
OnEntityChangeParent_t m_OnEntityChangeParent = nullptr;
|
||||||
|
OnEntityChangeName_t m_OnEntityChangeName = nullptr;
|
||||||
|
OnComponentAttach_t m_OnComponentAttach = nullptr;
|
||||||
|
OnComponentDelete_t m_OnComponentDelete = nullptr;
|
||||||
|
OnWidgetMode_t m_OnWidgetMode = nullptr;
|
||||||
|
|
||||||
|
// Events
|
||||||
|
EventRelay<EditorGUI, Events::KeyDown> m_EKeyDown;
|
||||||
|
bool OnKeyDown(const Events::KeyDown& e);
|
||||||
|
|
||||||
|
// Utility functions
|
||||||
|
boost::filesystem::path fileOpenDialog();
|
||||||
|
boost::filesystem::path fileSaveDialog();
|
||||||
|
const std::string formatEntityName(EntityWrapper entity);
|
||||||
|
GLuint tryLoadTexture(std::string filePath);
|
||||||
|
void openModal(const std::string& modal);
|
||||||
|
|
||||||
|
// Entity file handling methods
|
||||||
|
void entityImport(World* world);
|
||||||
|
void entitySave(EntityWrapper entity, bool saveAs = false);
|
||||||
|
void entityCreate(World* world, EntityWrapper parent);
|
||||||
|
void entityDelete(EntityWrapper entity);
|
||||||
|
void entityChangeParent(EntityWrapper entity, EntityWrapper parent);
|
||||||
|
|
||||||
|
// UI drawing methods
|
||||||
|
void drawMenu();
|
||||||
|
void drawTools();
|
||||||
|
void drawEntities(World* world);
|
||||||
|
void drawEntitiesRecursive(World* world, EntityID parent);
|
||||||
|
bool drawEntityNode(EntityWrapper entity);
|
||||||
|
void drawComponents(EntityWrapper entity);
|
||||||
|
bool drawComponentNode(EntityWrapper entity, const ComponentInfo& componentType);
|
||||||
|
bool drawComponentField(ComponentWrapper& c, const ComponentInfo::Field_t& field);
|
||||||
|
bool drawComponentField_Vector(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_Color(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_int(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_enum(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_float(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_double(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_bool(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
bool drawComponentField_string(ComponentWrapper &c, const ComponentInfo::Field_t &field);
|
||||||
|
void drawModals();
|
||||||
|
|
||||||
|
// Custom UI elements
|
||||||
|
bool createDeleteButton(const std::string& componentType);
|
||||||
|
void createWidgetToolButton(WidgetMode mode);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef EditorRenderSystem_h__
|
||||||
|
#define EditorRenderSystem_h__
|
||||||
|
|
||||||
|
#include "../Core/System.h"
|
||||||
|
#include "../Rendering/IRenderer.h"
|
||||||
|
#include "../Rendering/ModelJob.h"
|
||||||
|
#include "../Rendering/Camera.h"
|
||||||
|
#include "../Rendering/ESetCamera.h"
|
||||||
|
|
||||||
|
class EditorRenderSystem : public ImpureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorRenderSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame);
|
||||||
|
|
||||||
|
virtual void Update(double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
IRenderer* m_Renderer;
|
||||||
|
RenderFrame* m_RenderFrame;
|
||||||
|
Camera* m_EditorCamera;
|
||||||
|
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
|
||||||
|
|
||||||
|
EventRelay<EditorRenderSystem, Events::SetCamera> m_ESetCamera;
|
||||||
|
bool OnSetCamera(Events::SetCamera& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#include <numeric>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../OpenGL.h"
|
||||||
|
|
||||||
|
class EditorStats
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorStats();
|
||||||
|
void Draw(double dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// FPS graph
|
||||||
|
const unsigned int m_SampleSize = 100;
|
||||||
|
unsigned int m_FrameCount = 0;
|
||||||
|
std::vector<double> m_FrameTimes;
|
||||||
|
double m_TimeAccumulator = 0.0;
|
||||||
|
double m_AveragedSamplesPerSecond = 10.0;
|
||||||
|
const unsigned int m_AveragedSampleSize = 100;
|
||||||
|
unsigned int m_CurrentAveragedSampleIndex = 0;
|
||||||
|
std::vector<double> m_AveragedSamples;
|
||||||
|
void drawFPSGraph(double dt);
|
||||||
|
|
||||||
|
void drawRAMUsage(double dt);
|
||||||
|
|
||||||
|
void drawVRAMStats(double dt);
|
||||||
|
};
|
||||||
@@ -1,94 +1,70 @@
|
|||||||
#include <imgui/imgui.h>
|
|
||||||
#include <glm/gtx/common.hpp>
|
|
||||||
#include <boost/filesystem/path.hpp>
|
|
||||||
#include <nativefiledialog/nfd.h>
|
|
||||||
#include "../Core/System.h"
|
#include "../Core/System.h"
|
||||||
#include "../Core/EMousePress.h"
|
|
||||||
#include "../Core/EMouseRelease.h"
|
|
||||||
#include "../Core/EMouseMove.h"
|
|
||||||
#include "../Core/ConfigFile.h"
|
|
||||||
#include "../Input/EInputCommand.h"
|
|
||||||
#include "../Rendering/IRenderer.h"
|
#include "../Rendering/IRenderer.h"
|
||||||
#include "../Core/Transform.h"
|
#include "../Rendering/Camera.h"
|
||||||
#include "../Core/EFileDropped.h"
|
#include "../Rendering/ESetCamera.h"
|
||||||
|
#include "../Core/World.h"
|
||||||
|
#include "../Core/SystemPipeline.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
#include "../Core/EntityFilePreprocessor.h"
|
#include "../Core/EntityFilePreprocessor.h"
|
||||||
#include "../Core/EntityFileParser.h"
|
#include "../Core/EntityFileParser.h"
|
||||||
#include "../Core/EntityFileWriter.h"
|
#include "../Core/EntityFileWriter.h"
|
||||||
|
#include "../Core/EMousePress.h"
|
||||||
|
#include "../Input/EInputCommand.h"
|
||||||
|
#include "EditorGUI.h"
|
||||||
|
#include "EditorStats.h"
|
||||||
|
#include "EditorCameraInputController.h"
|
||||||
|
|
||||||
class EditorSystem : public ImpureSystem
|
class EditorSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EditorSystem(EventBroker* eventBroker, IRenderer* renderer);
|
EditorSystem(World* world, EventBroker* eventBroker, IRenderer* renderer, RenderFrame* renderFrame);
|
||||||
|
~EditorSystem();
|
||||||
|
|
||||||
virtual void Update(World* world, double dt) override;
|
void Update(double dt);
|
||||||
|
|
||||||
|
void Enable();
|
||||||
|
void Disable();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
IRenderer* m_Renderer;
|
IRenderer* m_Renderer;
|
||||||
World* m_World = nullptr;
|
RenderFrame* m_RenderFrame;
|
||||||
Camera* m_Camera = nullptr;
|
World* m_EditorWorld;
|
||||||
|
SystemPipeline* m_EditorWorldSystemPipeline;
|
||||||
|
//Camera* m_EditorCamera;
|
||||||
|
EntityWrapper m_EditorCamera = EntityWrapper::Invalid;
|
||||||
|
EntityWrapper m_ActualCamera = EntityWrapper::Invalid;
|
||||||
|
EditorCameraInputController<EditorSystem>* m_EditorCameraInputController;
|
||||||
|
EditorGUI* m_EditorGUI;
|
||||||
|
EditorStats* m_EditorStats;
|
||||||
|
|
||||||
bool m_Enabled;
|
// State
|
||||||
bool m_Visible;
|
double m_LastTime = 0.f;
|
||||||
boost::filesystem::path m_DefaultEntityDir;
|
bool m_Enabled = true;
|
||||||
boost::filesystem::path m_CurrentFile;
|
EditorGUI::WidgetMode m_WidgetMode = EditorGUI::WidgetMode::Translate;
|
||||||
std::vector<glm::vec2> m_PickingQueue;
|
EntityWrapper m_Widget = EntityWrapper::Invalid;
|
||||||
|
EntityWrapper m_CurrentSelection = EntityWrapper::Invalid;
|
||||||
|
|
||||||
enum class WidgetMode
|
// Utility functions
|
||||||
{
|
EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
|
||||||
None,
|
void setWidgetMode(EditorGUI::WidgetMode mode);
|
||||||
Translate,
|
|
||||||
Rotate,
|
|
||||||
Scale
|
|
||||||
} m_WidgetMode = WidgetMode::None;
|
|
||||||
|
|
||||||
enum class WidgetSpace
|
// GUI callbacks
|
||||||
{
|
void OnEntitySelected(EntityWrapper entity);
|
||||||
Local,
|
void OnEntitySave(EntityWrapper entity, boost::filesystem::path filePath);
|
||||||
Global
|
EntityWrapper OnEntityCreate(EntityWrapper parent);
|
||||||
} m_WidgetSpace = WidgetSpace::Global;
|
void OnEntityDelete(EntityWrapper entity);
|
||||||
|
void OnEntityChangeParent(EntityWrapper entity, EntityWrapper parent);
|
||||||
|
void OnEntityChangeName(EntityWrapper entity, const std::string& name);
|
||||||
|
void OnComponentAttach(EntityWrapper entity, const std::string& componentType);
|
||||||
|
void OnComponentDelete(EntityWrapper entity, const std::string& componentType);
|
||||||
|
|
||||||
EntityID m_Widget = EntityID_Invalid;
|
// Events
|
||||||
EntityID m_WidgetX = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetPlaneX = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetY = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetPlaneY = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetZ = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetPlaneZ = EntityID_Invalid;
|
|
||||||
EntityID m_WidgetOrigin = EntityID_Invalid;
|
|
||||||
glm::vec3 m_WidgetCurrentAxis;
|
|
||||||
float m_WidgetPickingDepth = 0.f;
|
|
||||||
glm::vec3 m_WidgetPickingPosition = glm::vec3(0);
|
|
||||||
|
|
||||||
EntityID m_Selection = EntityID_Invalid;
|
|
||||||
EntityID m_LastSelection = EntityID_Invalid;
|
|
||||||
EntityID m_UIDraggingEntity = EntityID_Invalid;
|
|
||||||
glm::vec3 m_Position;
|
|
||||||
std::string m_LastDroppedFile;
|
|
||||||
|
|
||||||
static boost::filesystem::path openDialog(boost::filesystem::path defaultPath);
|
|
||||||
static boost::filesystem::path saveDialog(boost::filesystem::path defaultPath);
|
|
||||||
|
|
||||||
EventRelay<EditorSystem, Events::InputCommand> m_EInputCommand;
|
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
|
||||||
EventRelay<EditorSystem, Events::MouseRelease> m_EMouseRelease;
|
|
||||||
bool OnMouseRelease(const Events::MouseRelease& e);
|
|
||||||
EventRelay<EditorSystem, Events::MousePress> m_EMousePress;
|
EventRelay<EditorSystem, Events::MousePress> m_EMousePress;
|
||||||
bool OnMousePress(const Events::MousePress& e);
|
bool OnMousePress(const Events::MousePress& e);
|
||||||
EventRelay<EditorSystem, Events::MouseMove> m_EMouseMove;
|
EventRelay<EditorSystem, Events::WidgetDelta> m_EWidgetDelta;
|
||||||
bool OnMouseMove(const Events::MouseMove& e);
|
bool OnWidgetDelta(const Events::WidgetDelta& e);
|
||||||
EventRelay<EditorSystem, Events::FileDropped> m_EFileDropped;
|
EventRelay<EditorSystem, Events::InputCommand> m_EInputCommand;
|
||||||
bool OnFileDropped(const Events::FileDropped& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
EventRelay<EditorSystem, Events::SetCamera> m_ESetCamera;
|
||||||
void Picking();
|
bool OnSetCamera(const Events::SetCamera& e);
|
||||||
void createWidget();
|
|
||||||
void updateWidget();
|
|
||||||
void setWidgetMode(WidgetMode newMode);
|
|
||||||
void setWidgetSpace(WidgetSpace space);
|
|
||||||
void drawUI(World* world, double dt);
|
|
||||||
bool createDeleteButton(std::string componentType);
|
|
||||||
bool createEntityNode(World* world, EntityID entity);
|
|
||||||
void changeParent(EntityID entity, EntityID newParent);
|
|
||||||
void fileImport(World* world);
|
|
||||||
void fileSave(World* world);
|
|
||||||
void fileSaveAs(World* world);
|
|
||||||
};
|
};
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
#ifndef EditorWidgetSystem_h__
|
||||||
|
#define EditorWidgetSystem_h__
|
||||||
|
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/System.h"
|
||||||
|
#include "../Rendering/IRenderer.h"
|
||||||
|
#include "../Rendering/Util/ScreenCoords.h"
|
||||||
|
#include "../Core/EMouseMove.h"
|
||||||
|
#include "../Core/EMousePress.h"
|
||||||
|
#include "../Core/EMouseRelease.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct WidgetDelta : Event
|
||||||
|
{
|
||||||
|
glm::vec3 Translation;
|
||||||
|
glm::vec3 Rotation;
|
||||||
|
glm::vec3 Scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class EditorWidgetSystem : public ImpureSystem, PureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
EditorWidgetSystem(World* world, EventBroker* eventBroker, IRenderer* renderer);
|
||||||
|
|
||||||
|
virtual void Update(double dt) override;
|
||||||
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cEditorWidget, double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
// State
|
||||||
|
EntityWrapper m_PickEntity = EntityWrapper::Invalid;
|
||||||
|
PickData m_PickData;
|
||||||
|
glm::vec2 m_MouseDelta;
|
||||||
|
|
||||||
|
EventRelay<EditorWidgetSystem, Events::MouseMove> m_EMouseMove;
|
||||||
|
bool OnMouseMove(const Events::MouseMove& e);
|
||||||
|
EventRelay<EditorWidgetSystem, Events::MousePress> m_EMousePress;
|
||||||
|
bool OnMousePress(const Events::MousePress& e);
|
||||||
|
EventRelay<EditorWidgetSystem, Events::MouseRelease> m_EMouseRelease;
|
||||||
|
bool OnMouseRelease(const Events::MouseRelease& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -7,4 +7,5 @@
|
|||||||
#include <glm/gtx/rotate_vector.hpp>
|
#include <glm/gtx/rotate_vector.hpp>
|
||||||
#include <glm/gtc/quaternion.hpp>
|
#include <glm/gtc/quaternion.hpp>
|
||||||
#include <glm/gtx/quaternion.hpp>
|
#include <glm/gtx/quaternion.hpp>
|
||||||
#include <glm/gtc/type_ptr.hpp>
|
#include <glm/gtc/type_ptr.hpp>
|
||||||
|
#include <glm/gtx/projection.hpp>
|
||||||
@@ -9,7 +9,7 @@ namespace Events
|
|||||||
struct InputCommand : Event
|
struct InputCommand : Event
|
||||||
{
|
{
|
||||||
/** Numerical ID of the player. */
|
/** Numerical ID of the player. */
|
||||||
unsigned int PlayerID;
|
int PlayerID;
|
||||||
/** The command that was sent. */
|
/** The command that was sent. */
|
||||||
std::string Command;
|
std::string Command;
|
||||||
/** The value of the command. */
|
/** The value of the command. */
|
||||||
|
|||||||
@@ -9,62 +9,119 @@ template <typename EventContext>
|
|||||||
class FirstPersonInputController : public InputController<EventContext>
|
class FirstPersonInputController : public InputController<EventContext>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FirstPersonInputController(EventBroker* eventBroker, unsigned int playerID)
|
FirstPersonInputController(EventBroker* eventBroker, int playerID);
|
||||||
: InputController(eventBroker)
|
|
||||||
, m_PlayerID(playerID)
|
|
||||||
{
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
|
|
||||||
}
|
|
||||||
|
|
||||||
const glm::quat Orientation() const { return m_Orientation; }
|
virtual const glm::vec3 Movement() const { return m_Movement; }
|
||||||
|
virtual const glm::vec3 Rotation() const { return m_Rotation; }
|
||||||
|
virtual bool Jumping() const { return m_Jumping; }
|
||||||
|
virtual bool Crouching() const { return m_Crouching; }
|
||||||
|
|
||||||
void LockMouse()
|
void LockMouse();
|
||||||
{
|
void UnlockMouse();
|
||||||
Events::LockMouse e;
|
virtual bool OnCommand(const Events::InputCommand& e) override;
|
||||||
m_EventBroker->Publish(e);
|
virtual void Reset();
|
||||||
m_MouseLocked = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UnlockMouse()
|
protected:
|
||||||
{
|
const int m_PlayerID;
|
||||||
Events::UnlockMouse e;
|
bool m_MouseLocked = false;
|
||||||
m_EventBroker->Publish(e);
|
glm::vec3 m_Rotation;
|
||||||
m_MouseLocked = false;
|
glm::vec3 m_Movement;
|
||||||
}
|
bool m_Jumping = false;
|
||||||
|
bool m_Crouching = false;
|
||||||
|
|
||||||
|
EventRelay<EventContext, Events::LockMouse> m_ELockMouse;
|
||||||
|
bool OnLockMouse(const Events::LockMouse& e);
|
||||||
|
EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse;
|
||||||
|
bool OnUnlockMouse(const Events::UnlockMouse& e);
|
||||||
|
};
|
||||||
|
|
||||||
virtual bool OnCommand(const Events::InputCommand& e) override
|
template <typename EventContext>
|
||||||
{
|
FirstPersonInputController<EventContext>::FirstPersonInputController(EventBroker* eventBroker, int playerID)
|
||||||
if (m_PlayerID != e.PlayerID) {
|
: InputController(eventBroker)
|
||||||
return false;
|
, m_PlayerID(playerID)
|
||||||
}
|
{
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_ELockMouse, &FirstPersonInputController::OnLockMouse);
|
||||||
|
EVENT_SUBSCRIBE_MEMBER(m_EUnlockMouse, &FirstPersonInputController::OnUnlockMouse);
|
||||||
|
}
|
||||||
|
|
||||||
if (m_MouseLocked) {
|
template <typename EventContext>
|
||||||
if (e.Command == "Pitch") {
|
void FirstPersonInputController<EventContext>::Reset()
|
||||||
float val = glm::radians(e.Value);
|
{
|
||||||
m_Orientation = m_Orientation * glm::angleAxis<float>(-val, glm::vec3(1, 0, 0));
|
m_Rotation = glm::vec3(0.f, 0.f, 0.f);
|
||||||
return true;
|
m_Jumping = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.Command == "Yaw") {
|
template <typename EventContext>
|
||||||
float val = glm::radians(e.Value);
|
void FirstPersonInputController<EventContext>::LockMouse()
|
||||||
m_Orientation = glm::angleAxis<float>(-val, glm::vec3(0, 1, 0)) * m_Orientation;
|
{
|
||||||
return true;
|
Events::LockMouse e;
|
||||||
}
|
m_EventBroker->Publish(e);
|
||||||
}
|
m_MouseLocked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename EventContext>
|
||||||
|
void FirstPersonInputController<EventContext>::UnlockMouse()
|
||||||
|
{
|
||||||
|
Events::UnlockMouse e;
|
||||||
|
m_EventBroker->Publish(e);
|
||||||
|
m_MouseLocked = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename EventContext>
|
||||||
|
bool FirstPersonInputController<EventContext>::OnCommand(const Events::InputCommand& e)
|
||||||
|
{
|
||||||
|
if (m_PlayerID != e.PlayerID) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
if (e.Command == "Pitch") {
|
||||||
const unsigned int m_PlayerID;
|
float val = glm::radians(e.Value);
|
||||||
glm::quat m_Orientation;
|
m_Rotation.x += -val;
|
||||||
bool m_MouseLocked = false;
|
//m_Rotation.x = glm::clamp(m_Rotation.x, -glm::half_pi<float>(), glm::half_pi<float>());
|
||||||
|
}
|
||||||
EventRelay<EventContext, Events::LockMouse> m_ELockMouse;
|
|
||||||
bool OnLockMouse(const Events::LockMouse& e) { m_MouseLocked = true; return true; }
|
if (e.Command == "Yaw") {
|
||||||
EventRelay<EventContext, Events::UnlockMouse> m_EUnlockMouse;
|
float val = glm::radians(e.Value);
|
||||||
bool OnUnlockMouse(const Events::UnlockMouse& e) { m_MouseLocked = false; return true; }
|
m_Rotation.y += -val;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Forward" || e.Command == "Right") {
|
||||||
|
if (e.Command == "Forward") {
|
||||||
|
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||||
|
m_Movement.z = -val;
|
||||||
|
}
|
||||||
|
if (e.Command == "Right") {
|
||||||
|
float val = glm::clamp(e.Value, -1.f, 1.f);
|
||||||
|
m_Movement.x = val;
|
||||||
|
}
|
||||||
|
if (glm::length2(m_Movement) > 0) {
|
||||||
|
m_Movement = glm::normalize(m_Movement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Jump") {
|
||||||
|
m_Jumping = e.Value > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.Command == "Crouch") {
|
||||||
|
m_Crouching = e.Value > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename EventContext>
|
||||||
|
bool FirstPersonInputController<EventContext>::OnUnlockMouse(const Events::UnlockMouse& e)
|
||||||
|
{
|
||||||
|
m_MouseLocked = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename EventContext>
|
||||||
|
bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMouse& e)
|
||||||
|
{
|
||||||
|
m_MouseLocked = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -3,9 +3,12 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
|
#include <limits>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
#include <glm/common.hpp>
|
#include <glm/common.hpp>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
|
#include <boost/shared_array.hpp>
|
||||||
|
|
||||||
#include "Network/Network.h"
|
#include "Network/Network.h"
|
||||||
#include "Network/MessageType.h"
|
#include "Network/MessageType.h"
|
||||||
@@ -15,6 +18,9 @@
|
|||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
#include "Core/ConfigFile.h"
|
#include "Core/ConfigFile.h"
|
||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
|
#include "Core/EPlayerDamage.h"
|
||||||
|
#include "Network/EInterpolate.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
class Client : public Network
|
class Client : public Network
|
||||||
{
|
{
|
||||||
@@ -32,52 +38,67 @@ private:
|
|||||||
// Sending message to server logic
|
// Sending message to server logic
|
||||||
int bytesRead = -1;
|
int bytesRead = -1;
|
||||||
char readBuf[INPUTSIZE] = { 0 };
|
char readBuf[INPUTSIZE] = { 0 };
|
||||||
int snapshotInterval = 33;
|
|
||||||
std::clock_t previousSnapshotMessage = std::clock();
|
|
||||||
|
|
||||||
// Packet loss logic
|
// Packet loss logic
|
||||||
unsigned int m_PacketID = 0;
|
PacketID m_PacketID = 0;
|
||||||
unsigned int m_PreviousPacketID = 0;
|
PacketID m_PreviousPacketID = 0;
|
||||||
unsigned int m_SendPacketID = 0;
|
PacketID m_SendPacketID = 0;
|
||||||
|
|
||||||
// Game logic
|
// Game logic
|
||||||
World* m_World;
|
World* m_World;
|
||||||
std::string m_PlayerName;
|
std::string m_PlayerName;
|
||||||
int m_PlayerID = -1;
|
PlayerID m_PlayerID = -1;
|
||||||
|
EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max();
|
||||||
|
bool m_IsConnected = false;
|
||||||
|
// Server Client Lookup map
|
||||||
|
// Assumes that root node for client and server is EntityID 0.
|
||||||
|
|
||||||
|
// Don't Add items to these two maps with insert, use insertIntoServerClientMaps(EntityID, EntityID)!!!!
|
||||||
|
std::unordered_map<EntityID, EntityID> m_ServerIDToClientID;
|
||||||
|
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
|
||||||
|
|
||||||
// Network logic
|
// Network logic
|
||||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
PlayerDefinition m_PlayerDefinitions[8];
|
||||||
SnapshotDefinitions m_NextSnapshot;
|
SnapshotDefinitions m_NextSnapshot;
|
||||||
double m_DurationOfPingTime;
|
double m_DurationOfPingTime;
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
// Use to check if we should send disconnect message
|
std::clock_t m_TimeSinceSentInputs;
|
||||||
// if game is turned of by closing window.
|
unsigned int m_SendInputIntervalMs;
|
||||||
bool m_WasStarted = false;
|
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
void readFromServer();
|
void readFromServer();
|
||||||
void sendSnapshotToServer();
|
int receive(char* data);
|
||||||
int receive(char* data, size_t length);
|
|
||||||
void send(Packet& packet);
|
void send(Packet& packet);
|
||||||
void connect();
|
void connect();
|
||||||
void disconnect();
|
void disconnect();
|
||||||
void ping();
|
|
||||||
void moveMessageHead(char*& data, size_t& length, size_t stepSize);
|
|
||||||
void parseMessageType(Packet& packet);
|
void parseMessageType(Packet& packet);
|
||||||
void parseEventMessage(Packet& packet);
|
|
||||||
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType);
|
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType);
|
||||||
void parseConnect(Packet& packet);
|
void parseConnect(Packet& packet);
|
||||||
|
void parsePlayerConnected(Packet& packet);
|
||||||
void parsePing();
|
void parsePing();
|
||||||
void parseServerPing();
|
void parseKick();
|
||||||
|
void parsePlayersSpawned(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();
|
||||||
bool isConnected();
|
bool hasServerTimedOut();
|
||||||
EntityID createPlayer();
|
EntityID createPlayer();
|
||||||
|
void sendInputCommands();
|
||||||
|
void becomePlayer();
|
||||||
|
// Mapping Logic
|
||||||
|
// Returns if local EntityID exist in map
|
||||||
|
bool clientServerMapsHasEntity(EntityID clientEntityID);
|
||||||
|
// Returns if server EntityID exist in map
|
||||||
|
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
||||||
|
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
EventRelay<Client, Events::InputCommand> m_EInputCommand;
|
EventRelay<Client, Events::InputCommand> m_EInputCommand;
|
||||||
bool OnInputCommand(const Events::InputCommand &e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
EventRelay<Client, Events::PlayerDamage> m_EPlayeDamage;
|
||||||
|
bool OnPlayerDamage(const Events::PlayerDamage& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef Events_Interpolate_h__
|
||||||
|
#define Events_Interpolate_h__
|
||||||
|
|
||||||
|
#include <boost/shared_array.hpp>
|
||||||
|
|
||||||
|
#include "Core/EventBroker.h"
|
||||||
|
#include "Core/Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Interpolate : Event
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
boost::shared_array<char> DataArray;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef Events_PlayerDisconnected
|
||||||
|
#define Events_PlayerDisconnected
|
||||||
|
|
||||||
|
#include "Core/EventBroker.h"
|
||||||
|
#include "Core/Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct PlayerDisconnected : public Event
|
||||||
|
{
|
||||||
|
unsigned int PlayerID;
|
||||||
|
EntityID Entity;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -5,13 +5,17 @@
|
|||||||
// Used to determine what type of message was sent.
|
// Used to determine what type of message was sent.
|
||||||
enum class MessageType
|
enum class MessageType
|
||||||
{
|
{
|
||||||
Connect,
|
Connect,
|
||||||
Disconnect,
|
Disconnect,
|
||||||
ClientPing,
|
Ping,
|
||||||
ServerPing,
|
Message,
|
||||||
Message,
|
Snapshot,
|
||||||
Snapshot,
|
OnInputCommand,
|
||||||
Event,
|
OnPlayerDamage,
|
||||||
|
PlayerConnected,
|
||||||
|
BecomePlayer,
|
||||||
|
Kick,
|
||||||
|
OnPlayerSpawned
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,12 +1,21 @@
|
|||||||
#ifndef Network_h__
|
#ifndef Network_h__
|
||||||
#define Network_h__
|
#define Network_h__
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
#include "Network/Packet.h"
|
#include "Network/Packet.h"
|
||||||
|
#include "Network/NetworkData.h"
|
||||||
|
#include "Core/ResourceManager.h"
|
||||||
|
#include "Core/ConfigFile.h"
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#define MAXCONNECTIONS 8
|
|
||||||
#define INPUTSIZE 4097
|
#define INPUTSIZE 4097
|
||||||
|
typedef unsigned int PlayerID;
|
||||||
|
typedef unsigned int PacketID;
|
||||||
|
typedef unsigned int UserID;
|
||||||
|
|
||||||
class Network
|
class Network
|
||||||
{
|
{
|
||||||
@@ -14,6 +23,17 @@ public:
|
|||||||
virtual ~Network() { };
|
virtual ~Network() { };
|
||||||
virtual void Start(World* m_world, EventBroker *eventBroker) = 0;
|
virtual void Start(World* m_world, EventBroker *eventBroker) = 0;
|
||||||
virtual void Update() = 0;
|
virtual void Update() = 0;
|
||||||
|
protected:
|
||||||
|
// For Debug
|
||||||
|
bool isReadingData = false;
|
||||||
|
NetworkData m_NetworkData;
|
||||||
|
unsigned int m_SaveDataIntervalMs = 1000;
|
||||||
|
std::clock_t m_SaveDataTimer;
|
||||||
|
unsigned int m_MaxConnections;
|
||||||
|
unsigned int m_TimeoutMs;
|
||||||
|
void saveToFile();
|
||||||
|
void updateNetworkData();
|
||||||
|
void initialize();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef NetworkData_h__
|
||||||
|
#define NetworkData_h__
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
struct NetworkData {
|
||||||
|
unsigned int TotalTime = 0;
|
||||||
|
unsigned int TotalDataReceived = 0;
|
||||||
|
unsigned int TotalDataSent = 0;
|
||||||
|
unsigned int AmountOfMessagesReceived = 0;
|
||||||
|
unsigned int AmountOfMessagesSent = 0;
|
||||||
|
// Interval based
|
||||||
|
unsigned int DataReceivedThisInterval = 0;
|
||||||
|
unsigned int DataSentThisInterval = 0;
|
||||||
|
// pair: first=reveived, second=send
|
||||||
|
std::vector<std::pair<unsigned int, unsigned int>> BandwidthBytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -14,6 +14,7 @@ public:
|
|||||||
Packet(MessageType type, unsigned int& packetID);
|
Packet(MessageType type, unsigned int& packetID);
|
||||||
// Used to create packet from already existing data buffer.
|
// Used to create packet from already existing data buffer.
|
||||||
Packet(char* data, const int sizeOfPacket);
|
Packet(char* data, const int sizeOfPacket);
|
||||||
|
Packet(MessageType type);
|
||||||
~Packet();
|
~Packet();
|
||||||
void Init(MessageType type, unsigned int& packetID);
|
void Init(MessageType type, unsigned int& packetID);
|
||||||
|
|
||||||
@@ -49,17 +50,19 @@ public:
|
|||||||
// Pops the first element as if it was a string.
|
// Pops the first element as if it was a string.
|
||||||
std::string ReadString();
|
std::string ReadString();
|
||||||
char* ReadData(int SizeOfData);
|
char* ReadData(int SizeOfData);
|
||||||
|
void ChangePacketID(unsigned int& packetID);
|
||||||
int Size() { return m_Offset; };
|
int Size() { return m_Offset; };
|
||||||
char* Data() { return m_Data; };
|
char* Data() { return m_Data; };
|
||||||
unsigned int DataReadSize() { return m_ReturnDataOffset; }
|
unsigned int DataReadSize() { return m_ReturnDataOffset; }
|
||||||
unsigned int MaxSize() { return m_MaxPacketSize; }
|
unsigned int MaxSize() { return m_MaxPacketSize; }
|
||||||
|
unsigned int HeaderSize() { return m_HeaderSize; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char* m_Data;
|
char* m_Data;
|
||||||
unsigned int m_ReturnDataOffset = 0;
|
unsigned int m_ReturnDataOffset = 0;
|
||||||
int m_Offset = 0;
|
int m_Offset = 0;
|
||||||
unsigned int m_MaxPacketSize = 512;
|
unsigned int m_MaxPacketSize = 512;
|
||||||
|
unsigned int m_HeaderSize = 0;
|
||||||
void resizeData();
|
void resizeData();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ struct PlayerDefinition {
|
|||||||
int EntityID = -1;
|
int EntityID = -1;
|
||||||
std::string Name = "";
|
std::string Name = "";
|
||||||
boost::asio::ip::udp::endpoint Endpoint;
|
boost::asio::ip::udp::endpoint Endpoint;
|
||||||
|
unsigned int PacketID;
|
||||||
|
std::clock_t StopTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -11,7 +11,11 @@
|
|||||||
#include "Network/PlayerDefinition.h"
|
#include "Network/PlayerDefinition.h"
|
||||||
#include "Core/World.h"
|
#include "Core/World.h"
|
||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
#include "Network/Network.h"
|
#include "../Network/Network.h"
|
||||||
|
#include "Input/EInputCommand.h"
|
||||||
|
#include "Core/EPlayerDamage.h"
|
||||||
|
#include "Network/EPlayerDisconnected.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
class Server : public Network
|
class Server : public Network
|
||||||
{
|
{
|
||||||
@@ -25,9 +29,10 @@ private:
|
|||||||
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
|
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
|
||||||
boost::asio::io_service m_IOService;
|
boost::asio::io_service m_IOService;
|
||||||
boost::asio::ip::udp::socket m_Socket;
|
boost::asio::ip::udp::socket m_Socket;
|
||||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
|
||||||
|
|
||||||
// Sending messages to client logic
|
// Sending messages to client logic
|
||||||
|
PlayerDefinition m_PlayerDefinitions[8]; //
|
||||||
|
std::vector<PlayerDefinition> m_ConnectedUsers;
|
||||||
char readBuffer[INPUTSIZE] = { 0 };
|
char readBuffer[INPUTSIZE] = { 0 };
|
||||||
int bytesRead = 0;
|
int bytesRead = 0;
|
||||||
// time for previouse message
|
// time for previouse message
|
||||||
@@ -35,46 +40,48 @@ private:
|
|||||||
std::clock_t previousSnapshotMessage = std::clock();
|
std::clock_t previousSnapshotMessage = std::clock();
|
||||||
std::clock_t timOutTimer = std::clock();
|
std::clock_t timOutTimer = std::clock();
|
||||||
// How often we send messages (milliseconds)
|
// How often we send messages (milliseconds)
|
||||||
int intervalMs = 1000;
|
int pingIntervalMs;
|
||||||
int snapshotInterval = 50;
|
int snapshotInterval;
|
||||||
int checkTimeOutInterval = 100;
|
int checkTimeOutInterval = 100;
|
||||||
|
|
||||||
//Timers
|
//Timers
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
std::clock_t m_StopTimes[8];
|
|
||||||
|
|
||||||
// Game logic
|
// Game logic
|
||||||
World* m_World;
|
World* m_World;
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
// vec.size() = ammount of players to create, stores playerID's
|
|
||||||
std::vector<unsigned int> m_PlayersToCreate;
|
|
||||||
|
|
||||||
// Packet loss logic
|
// Packet loss logic
|
||||||
unsigned int m_PacketID;
|
PacketID m_PacketID = 0;
|
||||||
unsigned int m_PreviousPacketID;
|
PacketID m_PreviousPacketID = 0;
|
||||||
unsigned int m_SendPacketID;
|
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
int receive(char* data, size_t length);
|
int receive(char* data);
|
||||||
void readFromClients();
|
void readFromClients();
|
||||||
void send(Packet& packet, int playerID);
|
void send(Packet& packet, UserID user);
|
||||||
|
void send(PlayerID player, Packet& packet);
|
||||||
void send(Packet& packet);
|
void send(Packet& packet);
|
||||||
void moveMessageHead(char*& data, size_t& length, size_t stepSize);
|
|
||||||
void broadcast(std::string message);
|
|
||||||
void broadcast(Packet& packet);
|
void broadcast(Packet& packet);
|
||||||
void sendSnapshot();
|
void sendSnapshot();
|
||||||
void sendPing();
|
void sendPing();
|
||||||
void checkForTimeOuts();
|
void checkForTimeOuts();
|
||||||
void disconnect(int i);
|
void disconnect(UserID user);
|
||||||
void parseMessageType(Packet& packet);
|
void parseMessageType(Packet& packet);
|
||||||
void parseEvent(Packet& packet);
|
void parseOnInputCommand(Packet& packet);
|
||||||
|
void parseOnPlayerDamage(Packet& packet);
|
||||||
void parseConnect(Packet& packet);
|
void parseConnect(Packet& packet);
|
||||||
void parseDisconnect();
|
void parseDisconnect();
|
||||||
void parseClientPing();
|
void parseClientPing();
|
||||||
void parseServerPing();
|
void parsePing();
|
||||||
void parseSnapshot(Packet& packet);
|
|
||||||
void identifyPacketLoss();
|
void identifyPacketLoss();
|
||||||
EntityID createPlayer();
|
void createPlayer();
|
||||||
|
void kick(PlayerID player);
|
||||||
|
PlayerID GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
|
||||||
|
// Debug event
|
||||||
|
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
||||||
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#define Camera_h__
|
#define Camera_h__
|
||||||
|
|
||||||
#include "../GLM.h"
|
#include "../GLM.h"
|
||||||
|
#include "../Core/Util/Rectangle.h"
|
||||||
|
|
||||||
class Camera
|
class Camera
|
||||||
{
|
{
|
||||||
@@ -32,7 +33,6 @@ public:
|
|||||||
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
glm::mat4 ViewMatrix() const { return m_ViewMatrix; }
|
||||||
void SetViewMatrix(glm::mat4 val);
|
void SetViewMatrix(glm::mat4 val);
|
||||||
|
|
||||||
|
|
||||||
float AspectRatio() const { return m_AspectRatio; }
|
float AspectRatio() const { return m_AspectRatio; }
|
||||||
void SetAspectRatio(float val);
|
void SetAspectRatio(float val);
|
||||||
|
|
||||||
@@ -48,6 +48,8 @@ public:
|
|||||||
void UpdateViewMatrix();
|
void UpdateViewMatrix();
|
||||||
void UpdateProjectionMatrix();
|
void UpdateProjectionMatrix();
|
||||||
|
|
||||||
|
glm::vec2 WorldToScreen(glm::vec3 worldCoord, Rectangle resolution);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
glm::vec3 m_Position;
|
glm::vec3 m_Position;
|
||||||
|
|||||||
@@ -1,66 +0,0 @@
|
|||||||
#include <imgui/imgui.h>
|
|
||||||
#include "../Input/FirstPersonInputController.h"
|
|
||||||
|
|
||||||
template <typename EventContext>
|
|
||||||
class DebugCameraInputController : public FirstPersonInputController<EventContext>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DebugCameraInputController(EventBroker* eventBroker, unsigned int playerID)
|
|
||||||
: FirstPersonInputController(eventBroker, playerID)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void SetPosition(const glm::vec3 position) { m_Position = position; }
|
|
||||||
void SetOrientation(const glm::quat orientation) { m_Orientation = orientation; }
|
|
||||||
|
|
||||||
const glm::vec3 Position() const { return m_Position; }
|
|
||||||
void SetBaseSpeed(float speed) { m_BaseSpeed = speed; }
|
|
||||||
|
|
||||||
virtual bool OnCommand(const Events::InputCommand& e) override
|
|
||||||
{
|
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
|
||||||
|
|
||||||
if (e.Command == "PrimaryFire") {
|
|
||||||
if (e.Value > 0) {
|
|
||||||
if (!io.WantCaptureMouse) {
|
|
||||||
LockMouse();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
UnlockMouse();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!io.WantCaptureKeyboard) {
|
|
||||||
if (e.Command == "Right") {
|
|
||||||
float value = std::max(-1.f, std::min(e.Value, 1.f));
|
|
||||||
m_Velocity.x = value;
|
|
||||||
}
|
|
||||||
if (e.Command == "Forward") {
|
|
||||||
float value = std::max(-1.f, std::min(e.Value, 1.f));
|
|
||||||
m_Velocity.z = -value;
|
|
||||||
}
|
|
||||||
if (e.Command == "Sprint") {
|
|
||||||
if (e.Value > 0.f) {
|
|
||||||
m_Speed = m_BaseSpeed * 2.f * (e.Value);
|
|
||||||
} else {
|
|
||||||
m_Speed = m_BaseSpeed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FirstPersonInputController::OnCommand(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Update(double dt)
|
|
||||||
{
|
|
||||||
if (glm::length2(m_Velocity) > 0) {
|
|
||||||
m_Position += m_Orientation * (glm::normalize(m_Velocity) * m_Speed * (float)dt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
glm::vec3 m_Position = glm::vec3(0, 0, 0);
|
|
||||||
glm::vec3 m_Velocity = glm::vec3(0, 0, 0);
|
|
||||||
float m_BaseSpeed = 2.0f;
|
|
||||||
float m_Speed = m_BaseSpeed;
|
|
||||||
};
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#ifndef DirectionalLightJob_h__
|
||||||
|
#define DirectionalLightJob_h__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ComponentWrapper.h"
|
||||||
|
#include "RenderJob.h"
|
||||||
|
#include "../Core/Transform.h"
|
||||||
|
#include "../Core/World.h"
|
||||||
|
|
||||||
|
struct DirectionalLightJob : RenderJob
|
||||||
|
{
|
||||||
|
DirectionalLightJob(ComponentWrapper transformComponent, ComponentWrapper directionalLightComponent, World* m_World)
|
||||||
|
: RenderJob()
|
||||||
|
{
|
||||||
|
|
||||||
|
Direction = glm::vec4(0,0,-1,0) * glm::inverse(Transform::AbsoluteOrientation(m_World, transformComponent.EntityID));
|
||||||
|
//Direction = glm::vec4((glm::vec3)directionalLightComponent["Direction"], 0.f);
|
||||||
|
Color = (glm::vec4)directionalLightComponent["Color"];
|
||||||
|
Intensity = (double)directionalLightComponent["Intensity"];
|
||||||
|
};
|
||||||
|
|
||||||
|
glm::vec4 Direction;
|
||||||
|
glm::vec4 Color;
|
||||||
|
float Intensity;
|
||||||
|
|
||||||
|
void CalculateHash() override
|
||||||
|
{
|
||||||
|
Hash = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#ifndef DrawBloomPass_h__
|
||||||
|
#define DrawBloomPass_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 DrawBloomPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawBloomPass(IRenderer* renderer /* ,Texture or finalpass*/ );
|
||||||
|
~DrawBloomPass() { }
|
||||||
|
void InitializeTextures();
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
void InitializeBuffers();
|
||||||
|
void ClearBuffer();
|
||||||
|
|
||||||
|
void FillGaussianBuffer(FrameBuffer* fb);
|
||||||
|
|
||||||
|
void Draw(GLuint texture);
|
||||||
|
|
||||||
|
//Getters
|
||||||
|
//Return the blurred result of the texture that was sent into draw
|
||||||
|
GLuint GaussianTexture() const { return m_GaussianTexture_vert; }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
||||||
|
|
||||||
|
Texture* m_WhiteTexture;
|
||||||
|
Model* m_ScreenQuad;
|
||||||
|
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
//const LightCullingPass* m_LightCullingPass
|
||||||
|
GLuint m_iterations = 9;
|
||||||
|
|
||||||
|
GLuint m_GaussianTexture_horiz;
|
||||||
|
GLuint m_GaussianTexture_vert;
|
||||||
|
|
||||||
|
FrameBuffer m_GaussianFrameBuffer_horiz;
|
||||||
|
FrameBuffer m_GaussianFrameBuffer_vert;
|
||||||
|
|
||||||
|
ShaderProgram* m_GaussianProgram_horiz;
|
||||||
|
ShaderProgram* m_GaussianProgram_vert;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef DrawBloomPassState_h__
|
||||||
|
#define DrawBloomPassState_h__
|
||||||
|
|
||||||
|
#include "Rendering/RenderState.h"
|
||||||
|
|
||||||
|
class DrawBloomPassState : public RenderState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawBloomPassState();
|
||||||
|
~DrawBloomPassState();
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef DrawColorCorrectionPass_h__
|
||||||
|
#define DrawColorCorrectionPass_h__
|
||||||
|
|
||||||
|
#include "IRenderer.h"
|
||||||
|
#include "DrawScreenQuadPassState.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
//#include "Util/UnorderedMapVec2.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
|
||||||
|
class DrawColorCorrectionPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawColorCorrectionPass(IRenderer* renderer);
|
||||||
|
~DrawColorCorrectionPass() { }
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
|
void Draw(GLuint sceneTexture, GLuint bloomTexture);
|
||||||
|
private:
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
ShaderProgram* m_ColorCorrectionProgram;
|
||||||
|
|
||||||
|
Model* m_ScreenQuad;
|
||||||
|
GLfloat m_Exposure;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -17,22 +17,32 @@ public:
|
|||||||
void InitializeTextures();
|
void InitializeTextures();
|
||||||
void InitializeFrameBuffers();
|
void InitializeFrameBuffers();
|
||||||
void InitializeShaderPrograms();
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
void Draw(RenderScene& scene);
|
void Draw(RenderScene& scene);
|
||||||
|
void ClearBuffer();
|
||||||
|
|
||||||
//Getters
|
//Return the texture that is used in later stages to apply the bloom effect
|
||||||
|
GLuint BloomTexture() const { return m_BloomTexture; }
|
||||||
|
//Return the texture with diffuse and lighting of the scene.
|
||||||
|
GLuint SceneTexture() const { return m_SceneTexture; }
|
||||||
|
FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; }
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
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;
|
||||||
|
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
|
Texture* m_BlackTexture;
|
||||||
|
|
||||||
|
FrameBuffer m_FinalPassFrameBuffer;
|
||||||
|
GLuint m_BloomTexture;
|
||||||
|
GLuint m_SceneTexture;
|
||||||
|
GLuint m_DepthBuffer;
|
||||||
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
const LightCullingPass* m_LightCullingPass;
|
const LightCullingPass* m_LightCullingPass;
|
||||||
|
|
||||||
ShaderProgram* m_ForwardPlusProgram;
|
ShaderProgram* m_ForwardPlusProgram;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
class DrawFinalPassState : public RenderState
|
class DrawFinalPassState : public RenderState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DrawFinalPassState();
|
DrawFinalPassState(GLuint frameBuffer);
|
||||||
~DrawFinalPassState();
|
~DrawFinalPassState();
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|||||||
@@ -1,42 +0,0 @@
|
|||||||
#ifndef DrawScenePass_h__
|
|
||||||
#define DrawScenePass_h__
|
|
||||||
|
|
||||||
#include "IRenderer.h"
|
|
||||||
#include "DrawScenePassState.h"
|
|
||||||
#include "FrameBuffer.h"
|
|
||||||
#include "ShaderProgram.h"
|
|
||||||
#include "Util/UnorderedMapVec2.h"
|
|
||||||
#include "Texture.h"
|
|
||||||
|
|
||||||
class DrawScenePass
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DrawScenePass(IRenderer* renderer);
|
|
||||||
~DrawScenePass() { }
|
|
||||||
void InitializeTextures();
|
|
||||||
void InitializeFrameBuffers();
|
|
||||||
void InitializeShaderPrograms();
|
|
||||||
|
|
||||||
void Draw(RenderScene& scene);
|
|
||||||
|
|
||||||
//Getters
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type) const;
|
|
||||||
|
|
||||||
static bool DepthSort(const std::shared_ptr<RenderJob> &i, const std::shared_ptr<RenderJob> &j)
|
|
||||||
{
|
|
||||||
return (i->Depth < j->Depth);
|
|
||||||
};
|
|
||||||
|
|
||||||
Texture* m_WhiteTexture;
|
|
||||||
|
|
||||||
const IRenderer* m_Renderer;
|
|
||||||
|
|
||||||
ShaderProgram* m_BasicForwardProgram;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#ifndef DrawScenePassState_h__
|
|
||||||
#define DrawScenePassState_h__
|
|
||||||
|
|
||||||
#include "Rendering/RenderState.h"
|
|
||||||
|
|
||||||
class DrawScenePassState : public RenderState
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DrawScenePassState();
|
|
||||||
~DrawScenePassState();
|
|
||||||
private:
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
#ifndef DrawScreenQuadPass_h__
|
||||||
|
#define DrawScreenQuadPass_h__
|
||||||
|
|
||||||
|
#include "IRenderer.h"
|
||||||
|
#include "DrawScreenQuadPassState.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
//#include "Util/UnorderedMapVec2.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
|
||||||
|
class DrawScreenQuadPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawScreenQuadPass(IRenderer* renderer);
|
||||||
|
~DrawScreenQuadPass() { }
|
||||||
|
void InitializeFrameBuffers();
|
||||||
|
void InitializeShaderPrograms();
|
||||||
|
|
||||||
|
void Draw(GLuint texture);
|
||||||
|
private:
|
||||||
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
ShaderProgram* m_DrawQuadProgram;
|
||||||
|
|
||||||
|
Model* m_ScreenQuad;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef DrawScreenQuadPassState_h__
|
||||||
|
#define DrawScreenQuadPassState_h__
|
||||||
|
|
||||||
|
#include "Rendering/RenderState.h"
|
||||||
|
|
||||||
|
class DrawScreenQuadPassState : public RenderState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DrawScreenQuadPassState();
|
||||||
|
~DrawScreenQuadPassState();
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -2,20 +2,14 @@
|
|||||||
#define Events_SetCamera_h__
|
#define Events_SetCamera_h__
|
||||||
|
|
||||||
#include "../Core/EventBroker.h"
|
#include "../Core/EventBroker.h"
|
||||||
#include "../Core/Entity.h"
|
#include "../Core/EntityWrapper.h"
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace Events
|
namespace Events
|
||||||
{
|
{
|
||||||
|
|
||||||
struct SetCamera : Event
|
struct SetCamera : Event
|
||||||
{
|
{
|
||||||
public:
|
EntityWrapper CameraEntity;
|
||||||
SetCamera() { };
|
|
||||||
std::string Name;
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef Font_h__
|
||||||
|
#define Font_h__
|
||||||
|
|
||||||
|
#include <ft2build.h>
|
||||||
|
#include FT_FREETYPE_H
|
||||||
|
#include FT_GLYPH_H
|
||||||
|
#include <boost/tokenizer.hpp>
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
#include "../OpenGL.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
|
||||||
|
class Font : public Resource
|
||||||
|
{
|
||||||
|
friend class ResourceManager;
|
||||||
|
private:
|
||||||
|
Font(std::string path);
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct Character {
|
||||||
|
GLuint TextureID; // ID handle of the glyph texture
|
||||||
|
glm::ivec2 Size; // Size of glyph
|
||||||
|
glm::ivec2 Bearing; // Offset from baseline to left/top of glyph
|
||||||
|
GLuint Advance; // Offset to advance to next glyph
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int FontSize = 16;
|
||||||
|
|
||||||
|
~Font();
|
||||||
|
|
||||||
|
std::map<GLchar, Character> m_Characters;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
@@ -31,15 +31,6 @@ public:
|
|||||||
void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
void SetFullscreen(bool fullscreen) { m_Fullscreen = fullscreen; }
|
||||||
bool VSYNC() const { return m_VSYNC; }
|
bool VSYNC() const { return m_VSYNC; }
|
||||||
void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
void SetVSYNC(bool vsync) { m_VSYNC = vsync; }
|
||||||
::Camera* Camera() const { return m_Camera; }
|
|
||||||
void SetCamera(::Camera* camera)
|
|
||||||
{
|
|
||||||
if (camera == nullptr) {
|
|
||||||
m_Camera = m_DefaultCamera;
|
|
||||||
} else {
|
|
||||||
m_Camera = camera;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
virtual void Initialize() = 0;
|
virtual void Initialize() = 0;
|
||||||
virtual void Update(double dt) = 0;
|
virtual void Update(double dt) = 0;
|
||||||
virtual void Draw(RenderFrame& rq) = 0;
|
virtual void Draw(RenderFrame& rq) = 0;
|
||||||
@@ -54,8 +45,6 @@ protected:
|
|||||||
int m_GLVersion[2];
|
int m_GLVersion[2];
|
||||||
std::string m_GLVendor;
|
std::string m_GLVendor;
|
||||||
GLFWwindow* m_Window = nullptr;
|
GLFWwindow* m_Window = nullptr;
|
||||||
::Camera* m_DefaultCamera;
|
|
||||||
::Camera* m_Camera = nullptr;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // Renderer_h__
|
#endif // Renderer_h__
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ private:
|
|||||||
int m_NumberOfTiles = 0;
|
int m_NumberOfTiles = 0;
|
||||||
|
|
||||||
struct Plane {
|
struct Plane {
|
||||||
glm::vec3 Normal;
|
glm::vec3 Normal = glm::vec3(0.f);
|
||||||
float d;
|
float d = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Frustum {
|
struct Frustum {
|
||||||
@@ -56,20 +56,21 @@ private:
|
|||||||
Frustum* m_Frustums;
|
Frustum* m_Frustums;
|
||||||
|
|
||||||
//This should be a component
|
//This should be a component
|
||||||
struct PointLight {
|
struct LightSource {
|
||||||
glm::vec4 Position = glm::vec4(0.f);
|
glm::vec4 Position = glm::vec4(0.f);
|
||||||
|
glm::vec4 Direction = glm::vec4(10.f);
|
||||||
glm::vec4 Color = glm::vec4(1.f);
|
glm::vec4 Color = glm::vec4(1.f);
|
||||||
float Radius = 5.f;
|
float Radius = 5.f;
|
||||||
float Intensity = 0.8f;
|
float Intensity = 0.8f;
|
||||||
float Falloff = 0.3f;
|
float Falloff = 0.3f;
|
||||||
float Padding = 1337;
|
enum Type_t { Zero, Point, Directional, Spot } Type;
|
||||||
};
|
};
|
||||||
std::vector<PointLight> m_PointLights;
|
std::vector<LightSource> m_LightSources;
|
||||||
|
|
||||||
struct LightGrid {
|
struct LightGrid {
|
||||||
float Start;
|
float Start = 0;
|
||||||
float Amount;
|
float Amount = 0;
|
||||||
glm::vec2 Padding;
|
glm::vec2 Padding = glm::vec2(1.f, 2.f);
|
||||||
};
|
};
|
||||||
|
|
||||||
LightGrid* m_LightGrid;
|
LightGrid* m_LightGrid;
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "../Core/ResourceManager.h"
|
#include "../Core/ResourceManager.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "../Core/World.h"
|
#include "../Core/World.h"
|
||||||
|
#include "../Core/Transform.h"
|
||||||
|
|
||||||
struct ModelJob : RenderJob
|
struct ModelJob : RenderJob
|
||||||
{
|
{
|
||||||
@@ -28,6 +29,9 @@ struct ModelJob : RenderJob
|
|||||||
Matrix = matrix;
|
Matrix = matrix;
|
||||||
Color = modelComponent["Color"];
|
Color = modelComponent["Color"];
|
||||||
Entity = modelComponent.EntityID;
|
Entity = modelComponent.EntityID;
|
||||||
|
glm::vec3 abspos = Transform::AbsolutePosition(world, modelComponent.EntityID);
|
||||||
|
glm::vec3 worldpos = glm::vec3(camera->ViewMatrix() * glm::vec4(abspos, 1));
|
||||||
|
Depth = worldpos.z;
|
||||||
World = world;
|
World = world;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ struct RenderJob
|
|||||||
friend class RenderQueue;
|
friend class RenderQueue;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
float Depth;
|
float Depth;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -11,54 +11,26 @@
|
|||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "RenderJob.h"
|
#include "RenderJob.h"
|
||||||
#include "ModelJob.h"
|
#include "ModelJob.h"
|
||||||
|
#include "TextJob.h"
|
||||||
#include "PointLightJob.h"
|
#include "PointLightJob.h"
|
||||||
|
#include "DirectionalLightJob.h"
|
||||||
|
|
||||||
/*
|
|
||||||
struct SpriteJob : RenderJob
|
|
||||||
{
|
|
||||||
unsigned int ShaderID = 0;
|
|
||||||
unsigned int TextureID = 0;
|
|
||||||
|
|
||||||
glm::mat4 ModelMatrix;
|
|
||||||
const Texture* DiffuseTexture = nullptr;
|
|
||||||
const Texture* NormalTexture = nullptr;
|
|
||||||
const Texture* SpecularTexture = nullptr;
|
|
||||||
glm::vec4 Color;
|
|
||||||
|
|
||||||
void CalculateHash() override
|
|
||||||
{
|
|
||||||
Hash = TextureID;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PointLightJob : RenderJob
|
|
||||||
{
|
|
||||||
glm::vec4 Position;
|
|
||||||
glm::vec4 Color;
|
|
||||||
float Radius;
|
|
||||||
float Intensity;
|
|
||||||
float Falloff;
|
|
||||||
float padding = 123;
|
|
||||||
|
|
||||||
void CalculateHash() override
|
|
||||||
{
|
|
||||||
Hash = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct RenderScene
|
struct RenderScene
|
||||||
{
|
{
|
||||||
::Camera* Camera;
|
::Camera* Camera = nullptr;
|
||||||
std::list<std::shared_ptr<RenderJob>> ForwardJobs;
|
std::list<std::shared_ptr<RenderJob>> ForwardJobs;
|
||||||
std::list<std::shared_ptr<RenderJob>> PointLightJobs;
|
std::list<std::shared_ptr<RenderJob>> PointLightJobs;
|
||||||
|
std::list<std::shared_ptr<RenderJob>> TextJobs;
|
||||||
|
std::list<std::shared_ptr<RenderJob>> DirectionalLightJobs;
|
||||||
Rectangle Viewport;
|
Rectangle Viewport;
|
||||||
|
bool ClearDepth = false;
|
||||||
|
|
||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
ForwardJobs.clear();
|
ForwardJobs.clear();
|
||||||
PointLightJobs.clear();
|
PointLightJobs.clear();
|
||||||
|
TextJobs.clear();
|
||||||
|
DirectionalLightJobs.clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -94,5 +66,4 @@ public:
|
|||||||
private:
|
private:
|
||||||
int m_Size = 0;
|
int m_Size = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -16,10 +16,10 @@ public:
|
|||||||
bool Disable(GLenum cap);
|
bool Disable(GLenum cap);
|
||||||
bool CullFace(GLenum mode);
|
bool CullFace(GLenum mode);
|
||||||
bool ClearColor(glm::vec4 color);
|
bool ClearColor(glm::vec4 color);
|
||||||
bool Clear(GLbitfield mask);
|
|
||||||
bool BindFramebuffer(GLint framebuffer);
|
bool BindFramebuffer(GLint framebuffer);
|
||||||
bool BlendEquation(GLenum mode);
|
bool BlendEquation(GLenum mode);
|
||||||
bool BlendFunc(GLenum sfactor, GLenum dfactor);
|
bool BlendFunc(GLenum sfactor, GLenum dfactor);
|
||||||
|
bool DepthMask(GLboolean flag);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::function<void(void)>> m_ResetFunctions;
|
std::vector<std::function<void(void)>> m_ResetFunctions;
|
||||||
|
|||||||
@@ -15,41 +15,36 @@
|
|||||||
#include "Renderer.h"
|
#include "Renderer.h"
|
||||||
#include "PointLightJob.h"
|
#include "PointLightJob.h"
|
||||||
#include "../Core/Transform.h"
|
#include "../Core/Transform.h"
|
||||||
#include "DebugCameraInputController.h"
|
#include "../Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
class RenderSystem : public ImpureSystem
|
class RenderSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderSystem(EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
|
RenderSystem(World* world, EventBroker* eventBrokerer, const IRenderer* renderer, RenderFrame* renderFrame);
|
||||||
~RenderSystem();
|
~RenderSystem();
|
||||||
|
|
||||||
virtual void Update(World* world, double dt) override;
|
virtual void Update(double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
World* m_World = nullptr;
|
|
||||||
const IRenderer* m_Renderer;
|
const IRenderer* m_Renderer;
|
||||||
|
|
||||||
RenderFrame* m_RenderFrame;
|
RenderFrame* m_RenderFrame;
|
||||||
bool m_SwitchCamera = false;
|
|
||||||
Camera* m_Camera;
|
Camera* m_Camera;
|
||||||
DebugCameraInputController<RenderSystem>* m_DebugCameraInputController;
|
EntityWrapper m_CurrentCamera = EntityWrapper::Invalid;
|
||||||
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
std::list<ComponentWrapper> m_CameraComponents;
|
|
||||||
|
|
||||||
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
|
EventRelay<RenderSystem, Events::SetCamera> m_ESetCamera;
|
||||||
bool OnSetCamera(const Events::SetCamera &event);
|
bool OnSetCamera(Events::SetCamera &event);
|
||||||
EntityID m_CurrentCamera = EntityID_Invalid;
|
void fillText(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||||
|
void fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||||
void switchCamera(EntityID entity);
|
void fillDirectionalLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||||
|
|
||||||
void updateCamera(World* world, double dt);
|
|
||||||
void updateProjectionMatrix(ComponentWrapper& cameraComponent);
|
|
||||||
|
|
||||||
void fillModels(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
|
||||||
void fillLight(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
|
||||||
|
|
||||||
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
|
EventRelay<RenderSystem, Events::InputCommand> m_EInputCommand;
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
|
||||||
|
void fillModels(std::list<std::shared_ptr<RenderJob>>& jobs);
|
||||||
|
void fillLight(std::list<std::shared_ptr<RenderJob>>& jobs);
|
||||||
|
|
||||||
|
EventRelay<RenderSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -11,20 +11,23 @@
|
|||||||
#include "FrameBuffer.h"
|
#include "FrameBuffer.h"
|
||||||
#include "../Core/World.h"
|
#include "../Core/World.h"
|
||||||
#include "PickingPass.h"
|
#include "PickingPass.h"
|
||||||
#include "DrawScenePass.h"
|
|
||||||
#include "LightCullingPass.h"
|
#include "LightCullingPass.h"
|
||||||
#include "DrawFinalPass.h"
|
#include "DrawFinalPass.h"
|
||||||
|
#include "DrawScreenQuadPass.h"
|
||||||
|
#include "DrawBloomPass.h"
|
||||||
|
#include "DrawColorCorrectionPass.h"
|
||||||
#include "../Core/EventBroker.h"
|
#include "../Core/EventBroker.h"
|
||||||
#include "ImGuiRenderPass.h"
|
#include "ImGuiRenderPass.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "../Core/Transform.h"
|
#include "../Core/Transform.h"
|
||||||
|
#include "imgui/imgui.h"
|
||||||
|
#include "TextPass.h"
|
||||||
|
|
||||||
class Renderer : public IRenderer
|
class Renderer : public IRenderer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Renderer(EventBroker* eventBroker, World* world)
|
Renderer(EventBroker* eventBroker)
|
||||||
: m_EventBroker(eventBroker)
|
: m_EventBroker(eventBroker)
|
||||||
, m_World(world)
|
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void Initialize() override;
|
virtual void Initialize() override;
|
||||||
@@ -36,7 +39,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
//----------------------Variables----------------------//
|
//----------------------Variables----------------------//
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
World* m_World;
|
TextPass* m_TextPass;
|
||||||
|
|
||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
@@ -45,11 +48,15 @@ private:
|
|||||||
Model* m_UnitQuad;
|
Model* m_UnitQuad;
|
||||||
Model* m_UnitSphere;
|
Model* m_UnitSphere;
|
||||||
|
|
||||||
DrawScenePass* m_DrawScenePass;
|
int m_DebugTextureToDraw = 0;
|
||||||
|
|
||||||
PickingPass* m_PickingPass;
|
PickingPass* m_PickingPass;
|
||||||
LightCullingPass* m_LightCullingPass;
|
LightCullingPass* m_LightCullingPass;
|
||||||
ImGuiRenderPass* m_ImGuiRenderPass;
|
ImGuiRenderPass* m_ImGuiRenderPass;
|
||||||
DrawFinalPass* m_DrawFinalPass;
|
DrawFinalPass* m_DrawFinalPass;
|
||||||
|
DrawScreenQuadPass* m_DrawScreenQuadPass;
|
||||||
|
DrawBloomPass* m_DrawBloomPass;
|
||||||
|
DrawColorCorrectionPass* m_DrawColorCorrectionPass;
|
||||||
|
|
||||||
//----------------------Functions----------------------//
|
//----------------------Functions----------------------//
|
||||||
void InitializeWindow();
|
void InitializeWindow();
|
||||||
@@ -59,14 +66,13 @@ private:
|
|||||||
//TODO: Renderer: Get InputUpdate out of renderer
|
//TODO: Renderer: Get InputUpdate out of renderer
|
||||||
void InputUpdate(double dt);
|
void InputUpdate(double dt);
|
||||||
//void PickingPass(RenderQueueCollection& rq);
|
//void PickingPass(RenderQueueCollection& rq);
|
||||||
void DrawScreenQuad(GLuint textureToDraw);
|
//void DrawScreenQuad(GLuint textureToDraw);
|
||||||
|
|
||||||
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 FillDepth(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_DrawScreenQuadProgram;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef TextJob_h__
|
||||||
|
#define TextJob_h__
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ComponentWrapper.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
#include "RenderJob.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "Font.h"
|
||||||
|
|
||||||
|
struct TextJob : RenderJob
|
||||||
|
{
|
||||||
|
TextJob(glm::mat4 matrix, Font* font, ComponentWrapper textComponent)
|
||||||
|
: RenderJob()
|
||||||
|
{
|
||||||
|
Matrix = matrix;
|
||||||
|
Color = (glm::vec4)textComponent["Color"];
|
||||||
|
Content = (std::string)textComponent["Content"];
|
||||||
|
Resource = font;
|
||||||
|
|
||||||
|
if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) {
|
||||||
|
Alignment = AlignmentEnum::Left;
|
||||||
|
} else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Right")) {
|
||||||
|
Alignment = AlignmentEnum::Right;
|
||||||
|
} else if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Center")) {
|
||||||
|
Alignment = AlignmentEnum::Center;
|
||||||
|
} else {
|
||||||
|
LOG_ERROR("Text alignment invalid");
|
||||||
|
Alignment = AlignmentEnum::Left;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class AlignmentEnum
|
||||||
|
{
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
Center
|
||||||
|
};
|
||||||
|
|
||||||
|
glm::mat4 Matrix;
|
||||||
|
glm::vec4 Color;
|
||||||
|
std::string Content;
|
||||||
|
Font* Resource;
|
||||||
|
AlignmentEnum Alignment;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void CalculateHash() override
|
||||||
|
{
|
||||||
|
Hash = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
#ifndef TextRenderer_h__
|
||||||
|
#define TextRenderer_h__
|
||||||
|
|
||||||
|
#include <ft2build.h>
|
||||||
|
#include FT_FREETYPE_H
|
||||||
|
|
||||||
|
#include "../OpenGL.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "ShaderProgram.h"
|
||||||
|
#include "Font.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "RenderQueue.h"
|
||||||
|
#include "TextPassState.h"
|
||||||
|
#include "FrameBuffer.h"
|
||||||
|
|
||||||
|
class TextPass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextPass();
|
||||||
|
void Initialize();
|
||||||
|
void Update();
|
||||||
|
void Draw(RenderScene& scene, FrameBuffer& frameBuffer);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix);
|
||||||
|
|
||||||
|
Font* font;
|
||||||
|
GLuint VAO, VBO;
|
||||||
|
ShaderProgram* m_TextProgram;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
#ifndef TextPassState_h__
|
||||||
|
#define TextPassState_h__
|
||||||
|
|
||||||
|
#include "Rendering/RenderState.h"
|
||||||
|
|
||||||
|
class TextPassState : public RenderState
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
TextPassState(GLuint frameBuffer);
|
||||||
|
~TextPassState();
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -18,6 +18,7 @@ public:
|
|||||||
void Bind(GLenum textureUnit = GL_TEXTURE0);
|
void Bind(GLenum textureUnit = GL_TEXTURE0);
|
||||||
|
|
||||||
GLuint m_Texture = 0;
|
GLuint m_Texture = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef CommonFuntions_h__
|
||||||
|
#define CommonFuntions_h__
|
||||||
|
|
||||||
|
#include "../../Common.h"
|
||||||
|
#include "../../OpenGL.h"
|
||||||
|
#include "../../GLM.h"
|
||||||
|
|
||||||
|
class CommonFuntions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CommonFuntions() = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
+2
-1
@@ -19,7 +19,8 @@
|
|||||||
#include "Rendering/RenderSystem.h"
|
#include "Rendering/RenderSystem.h"
|
||||||
#include "Core/EntityFileParser.h"
|
#include "Core/EntityFileParser.h"
|
||||||
#include "Core/Octree.h"
|
#include "Core/Octree.h"
|
||||||
|
#include "Rendering/Font.h"
|
||||||
|
#include "Systems/InterpolationSystem.h"
|
||||||
// Network
|
// Network
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
#include "Network/Network.h"
|
#include "Network/Network.h"
|
||||||
|
|||||||
@@ -0,0 +1,55 @@
|
|||||||
|
#ifndef CapturePointSystem_h__
|
||||||
|
#define CapturePointSystem_h__
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <glm/common.hpp>
|
||||||
|
|
||||||
|
#include "Common.h"
|
||||||
|
#include "Core/System.h"
|
||||||
|
#include "Engine/Collision/ETrigger.h"
|
||||||
|
#include "Core/ECaptured.h"
|
||||||
|
#include "Core/EWin.h"
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class CapturePointSystem : public PureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?)
|
||||||
|
CapturePointSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
|
//updatecomponent
|
||||||
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
//methods which will take care of specific events
|
||||||
|
EventRelay<CapturePointSystem, Events::TriggerTouch> m_ETriggerTouch;
|
||||||
|
bool CapturePointSystem::OnTriggerTouch(const Events::TriggerTouch& e);
|
||||||
|
EventRelay<CapturePointSystem, Events::TriggerLeave> m_ETriggerLeave;
|
||||||
|
bool CapturePointSystem::OnTriggerLeave(const Events::TriggerLeave& e);
|
||||||
|
EventRelay<CapturePointSystem, Events::Captured> m_ECaptured;
|
||||||
|
bool CapturePointSystem::OnCaptured(const Events::Captured& e);
|
||||||
|
|
||||||
|
bool m_WinnerWasFound = false;
|
||||||
|
//need to track these variables for the captureSystem to work as per design!
|
||||||
|
const int m_NotACapturePoint = 999;
|
||||||
|
int m_RedTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
||||||
|
int m_BlueTeamNextPossibleCapturePoint = m_NotACapturePoint;
|
||||||
|
int m_RedTeamHomeCapturePoint = m_NotACapturePoint;
|
||||||
|
int m_BlueTeamHomeCapturePoint = m_NotACapturePoint;
|
||||||
|
|
||||||
|
int m_NumberOfCapturePoints = 0;
|
||||||
|
std::map<int, EntityID> m_CapturePointNumberToEntityIDMap;
|
||||||
|
|
||||||
|
//std::vector<ComponentWrapper>
|
||||||
|
|
||||||
|
const double m_CaptureTimeToTakeOver = 15.0;
|
||||||
|
bool m_ResetTimers = false;
|
||||||
|
|
||||||
|
//vectors which will keep track of enter/leave changes
|
||||||
|
std::vector<std::tuple<EntityID, EntityID>> m_ETriggerTouchVector;
|
||||||
|
std::vector<std::tuple<EntityID, EntityID>> m_ETriggerLeaveVector;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -16,10 +16,10 @@
|
|||||||
class HealthSystem : public PureSystem
|
class HealthSystem : public PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HealthSystem(EventBroker* eventBroker);
|
HealthSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
//updatecomponent
|
//updatecomponent
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//methods which will take care of specific events
|
//methods which will take care of specific events
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#ifndef Systems_InterpolationSystem_h__
|
||||||
|
#define Systems_InterpolationSystem_h__
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include <boost/shared_array.hpp>
|
||||||
|
#include <glm/common.hpp>
|
||||||
|
#include <glm/gtc/quaternion.hpp>
|
||||||
|
|
||||||
|
#include "Common.h"
|
||||||
|
#include "Core/System.h"
|
||||||
|
#include "Core/EventBroker.h"
|
||||||
|
#include "Core/ResourceManager.h"
|
||||||
|
#include "Core/ConfigFile.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
|
#include "Network/EInterpolate.h"
|
||||||
|
|
||||||
|
class InterpolationSystem : public PureSystem
|
||||||
|
{
|
||||||
|
struct Transform
|
||||||
|
{
|
||||||
|
glm::vec3 Position;
|
||||||
|
glm::vec3 Scale;
|
||||||
|
glm::quat Orientation;
|
||||||
|
double interpolationTime;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
InterpolationSystem(World* world, EventBroker* eventBroker);
|
||||||
|
~InterpolationSystem() { }
|
||||||
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) override;
|
||||||
|
private:
|
||||||
|
std::unordered_map<EntityID, Transform> m_NextTransform;
|
||||||
|
std::unordered_map<EntityID, Transform> m_LastReceivedTransform;
|
||||||
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
|
|
||||||
|
//glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
|
||||||
|
template <typename T>
|
||||||
|
T vectorInterpolation(T prev, T next, double currentTime)
|
||||||
|
{
|
||||||
|
T difference = next - prev;
|
||||||
|
T vector = (difference / m_SnapshotInterval) * static_cast<float>(currentTime);
|
||||||
|
return vector;
|
||||||
|
}
|
||||||
|
float m_SnapshotInterval;
|
||||||
|
|
||||||
|
EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate;
|
||||||
|
bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e);
|
||||||
|
EventRelay<InterpolationSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,14 +1,23 @@
|
|||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "GLM.h"
|
#include "GLM.h"
|
||||||
#include "Core/System.h"
|
#include "Core/System.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
#include "Input/FirstPersonInputController.h"
|
||||||
|
#include <imgui/imgui.h>
|
||||||
|
|
||||||
class PlayerMovementSystem : public PureSystem
|
class PlayerMovementSystem : public ImpureSystem, PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlayerMovementSystem(EventBroker* eventBroker)
|
PlayerMovementSystem(World* world, EventBroker* eventBroker);
|
||||||
: System(eventBroker)
|
~PlayerMovementSystem();
|
||||||
, PureSystem("Player")
|
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt);
|
virtual void Update(double dt) override;
|
||||||
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// State
|
||||||
|
std::unordered_map<EntityWrapper, FirstPersonInputController<PlayerMovementSystem>*> m_PlayerInputControllers;
|
||||||
|
|
||||||
|
EventRelay<PlayerMovementSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
@@ -2,17 +2,30 @@
|
|||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
#include "Systems/SpawnerSystem.h"
|
#include "Systems/SpawnerSystem.h"
|
||||||
#include "Events/ESpawnerSpawn.h"
|
#include "Events/ESpawnerSpawn.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
#include "Rendering/ESetCamera.h"
|
||||||
|
#include "Core/ConfigFile.h"
|
||||||
|
|
||||||
class PlayerSpawnSystem : public ImpureSystem
|
class PlayerSpawnSystem : public ImpureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlayerSpawnSystem(EventBroker* eventBroker);
|
PlayerSpawnSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
virtual void Update(World* world, double dt) override;
|
virtual void Update(double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
struct SpawnRequest
|
||||||
|
{
|
||||||
|
int PlayerID;
|
||||||
|
ComponentInfo::EnumType Team;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool m_NetworkEnabled = false;
|
||||||
|
std::vector<SpawnRequest> m_SpawnRequests;
|
||||||
|
std::map<int, EntityWrapper> m_PlayerEntities;
|
||||||
|
|
||||||
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
|
EventRelay<PlayerSpawnSystem, Events::InputCommand> m_OnInputCommand;
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
EventRelay<PlayerSpawnSystem, Events::PlayerSpawned> m_OnPlayerSpawnerd;
|
||||||
std::vector<int> m_SpawnRequests;
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
@@ -4,14 +4,14 @@
|
|||||||
class RaptorCopterSystem : public PureSystem
|
class RaptorCopterSystem : public PureSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RaptorCopterSystem(EventBroker* eventBroker)
|
RaptorCopterSystem(World* world, EventBroker* eventBroker)
|
||||||
: System(eventBroker)
|
: System(world, eventBroker)
|
||||||
, PureSystem("RaptorCopter")
|
, PureSystem("RaptorCopter")
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& component, double dt) override
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
|
||||||
{
|
{
|
||||||
ComponentWrapper& transform = world->GetComponent(component.EntityID, "Transform");
|
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
|
||||||
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"];
|
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"];
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
class SpawnerSystem : public System
|
class SpawnerSystem : public System
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
SpawnerSystem(EventBroker* eventBroker);
|
SpawnerSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid);
|
static EntityWrapper Spawn(EntityWrapper spawner, EntityWrapper parent = EntityWrapper::Invalid);
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#ifndef WeaponSystem_h__
|
||||||
|
#define WeaponSystem_h__
|
||||||
|
|
||||||
|
//#include <GLFW/glfw3.h>
|
||||||
|
//#include <glm/common.hpp>
|
||||||
|
#include "Rendering/IRenderer.h"
|
||||||
|
|
||||||
|
#include "Common.h"
|
||||||
|
#include "Core/System.h"
|
||||||
|
#include "Core/EPlayerDamage.h"
|
||||||
|
#include "Core/EShoot.h"
|
||||||
|
#include "Input/EInputCommand.h"
|
||||||
|
|
||||||
|
#include <tuple>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
class WeaponSystem : public ImpureSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WeaponSystem(World* world, EventBroker* eventBroker, IRenderer* renderer);
|
||||||
|
|
||||||
|
virtual void Update(double dt) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
//methods which will take care of specific events
|
||||||
|
EventRelay<WeaponSystem, Events::Shoot> m_EShoot;
|
||||||
|
bool WeaponSystem::OnShoot(const Events::Shoot& e);
|
||||||
|
|
||||||
|
EventRelay<WeaponSystem, Events::InputCommand> m_EInputCommand;
|
||||||
|
bool WeaponSystem::OnInputCommand(const Events::InputCommand& e);
|
||||||
|
|
||||||
|
IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
std::vector<std::tuple<EntityID, glm::vec2>> m_EShootVector;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
[Debug]
|
[Debug]
|
||||||
LogLevel=1
|
LogLevel=1
|
||||||
LoadMap=
|
LoadMap=
|
||||||
EditorEnabled=false
|
|
||||||
; 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
|
||||||
|
|
||||||
|
[Editor]
|
||||||
|
CameraSpeed=3
|
||||||
|
|
||||||
[Video]
|
[Video]
|
||||||
Fullscreen=false
|
Fullscreen=false
|
||||||
VSYNC=false
|
VSYNC=false
|
||||||
@@ -19,6 +21,11 @@ IsServer=false
|
|||||||
Name=Bob
|
Name=Bob
|
||||||
Address=127.0.0.1
|
Address=127.0.0.1
|
||||||
Port=13
|
Port=13
|
||||||
|
MaxConnections=8
|
||||||
|
SnapshotInterval=0.05
|
||||||
|
SendInputIntervalMs=33
|
||||||
|
PingIntervalMs= 1000
|
||||||
|
TimeoutMs=15000
|
||||||
|
|
||||||
[Multithreading]
|
[Multithreading]
|
||||||
ResourceLoading=true
|
ResourceLoading=true
|
||||||
|
|||||||
@@ -6,11 +6,14 @@
|
|||||||
<xs:include schemaLocation="Components/Model.xsd"/>
|
<xs:include schemaLocation="Components/Model.xsd"/>
|
||||||
<xs:include schemaLocation="Components/RaptorCopter.xsd"/>
|
<xs:include schemaLocation="Components/RaptorCopter.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Player.xsd"/>
|
<xs:include schemaLocation="Components/Player.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/Text.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Camera.xsd"/>
|
<xs:include schemaLocation="Components/Camera.xsd"/>
|
||||||
<xs:include schemaLocation="Components/AABB.xsd"/>
|
<xs:include schemaLocation="Components/AABB.xsd"/>
|
||||||
<xs:include schemaLocation="Components/PointLight.xsd"/>
|
<xs:include schemaLocation="Components/PointLight.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/DirectionalLight.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Trigger.xsd"/>
|
<xs:include schemaLocation="Components/Trigger.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Health.xsd"/>
|
<xs:include schemaLocation="Components/Health.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/CapturePoint.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Listener.xsd"/>
|
<xs:include schemaLocation="Components/Listener.xsd"/>
|
||||||
<xs:include schemaLocation="Components/SoundEmitter.xsd"/>
|
<xs:include schemaLocation="Components/SoundEmitter.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Collidable.xsd"/>
|
<xs:include schemaLocation="Components/Collidable.xsd"/>
|
||||||
@@ -18,4 +21,6 @@
|
|||||||
<xs:include schemaLocation="Components/SpawnPoint.xsd"/>
|
<xs:include schemaLocation="Components/SpawnPoint.xsd"/>
|
||||||
<xs:include schemaLocation="Components/PlayerSpawn.xsd"/>
|
<xs:include schemaLocation="Components/PlayerSpawn.xsd"/>
|
||||||
<xs:include schemaLocation="Components/Team.xsd"/>
|
<xs:include schemaLocation="Components/Team.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/UniformScale.xsd"/>
|
||||||
|
<xs:include schemaLocation="Components/EditorWidget.xsd"/>
|
||||||
</xs:schema>
|
</xs:schema>
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
<Camera xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Camera.xsd">
|
<Camera xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Camera.xsd">
|
||||||
<Name>cam</Name>
|
|
||||||
<FOV>45</FOV>
|
<FOV>45</FOV>
|
||||||
<NearClip>0.01</NearClip>
|
<NearClip>0.01</NearClip>
|
||||||
<FarClip>5000</FarClip>
|
<FarClip>5000</FarClip>
|
||||||
|
|||||||
@@ -9,7 +9,6 @@
|
|||||||
</xs:annotation>
|
</xs:annotation>
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:all>
|
<xs:all>
|
||||||
<xs:element name="Name" type="t:string" minOccurs="0"/>
|
|
||||||
<xs:element name="FOV" type="t:double" minOccurs="0">
|
<xs:element name="FOV" type="t:double" minOccurs="0">
|
||||||
<xs:annotation><xs:documentation>Vertical Field of View in degrees</xs:documentation></xs:annotation>
|
<xs:annotation><xs:documentation>Vertical Field of View in degrees</xs:documentation></xs:annotation>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<CapturePoint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CapturePoint.xsd">
|
||||||
|
<CapturePointNumber>0</CapturePointNumber>
|
||||||
|
<CaptureTimer>0</CaptureTimer>
|
||||||
|
<HomePointForTeam><Spectator/></HomePointForTeam>
|
||||||
|
</CapturePoint>
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:complexType name="TeamEnum" mixed="true">
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="t:enum">
|
||||||
|
<xs:choice>
|
||||||
|
<xs:element name="Spectator" type="xs:integer" fixed="1" minOccurs="0"/>
|
||||||
|
<xs:element name="Red" type="xs:integer" fixed="2" minOccurs="0"/>
|
||||||
|
<xs:element name="Blue" type="xs:integer" fixed="3" minOccurs="0"/>
|
||||||
|
</xs:choice>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:element name="CapturePoint">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>A Capture Point. Add a Team Component to specify who currently owns it</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="CaptureTimer" type="t:double" minOccurs="0">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>CaptureTimer handled by Capture Point System</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="CapturePointNumber" type="t:int" minOccurs="0">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>CapturePointNumber specify an int number for this</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="HomePointForTeam" type="TeamEnum" minOccurs="0">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>Specify if this is a HomePoint for either team</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<DirectionalLight xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="DirectionalLight.xsd">
|
||||||
|
<Color R="1" G="1" B="1" A="1"/>
|
||||||
|
<Intensity>0.8</Intensity>
|
||||||
|
<Visible>true</Visible>
|
||||||
|
</DirectionalLight>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
<xs:element name="DirectionalLight">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>A directional light that shines bright like the future.</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Color" type="t:Color" minOccurs="0"/>
|
||||||
|
<xs:element name="Intensity" type="t:double" minOccurs="0"/>
|
||||||
|
<xs:element name="Visible" type="t:bool" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<EditorWidget xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="EditorWidget.xsd">
|
||||||
|
<Type><Translate/></Type>
|
||||||
|
<Axis X="0" Y="0" Z="0"/>
|
||||||
|
</EditorWidget>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:complexType name="WidgetEnum" mixed="true">
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="t:enum">
|
||||||
|
<xs:choice>
|
||||||
|
<xs:element name="Translate" type="xs:integer" fixed="0" minOccurs="0"/>
|
||||||
|
<xs:element name="Rotate" type="xs:integer" fixed="1" minOccurs="0"/>
|
||||||
|
<xs:element name="Scale" type="xs:integer" fixed="2" minOccurs="0"/>
|
||||||
|
</xs:choice>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:element name="EditorWidget">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Type" type="WidgetEnum" minOccurs="0"/>
|
||||||
|
<xs:element name="Axis" type="t:Vector" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -9,7 +9,9 @@
|
|||||||
</xs:annotation>
|
</xs:annotation>
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:all>
|
<xs:all>
|
||||||
<xs:element name="Velocity" type="t:Vector" minOccurs="0"/>
|
<xs:element name="Velocity" type="t:Vector" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>m/s^2</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
<xs:element name="Gravity" type="t:bool" minOccurs="0"/>
|
<xs:element name="Gravity" type="t:bool" minOccurs="0"/>
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
<Player xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Player.xsd">
|
<Player xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Player.xsd">
|
||||||
<Velocity X="0" Y="0" Z="0"/>
|
<MovementSpeed>3</MovementSpeed>
|
||||||
<Forward>false</Forward>
|
<CrouchSpeed>1.5</CrouchSpeed>
|
||||||
<Left>false</Left>
|
|
||||||
<Back>false</Back>
|
|
||||||
<Right>false</Right>
|
|
||||||
</Player>
|
</Player>
|
||||||
@@ -4,13 +4,13 @@
|
|||||||
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
<xs:element name="Player">
|
<xs:element name="Player">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>The player charachter</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
<xs:complexType>
|
<xs:complexType>
|
||||||
<xs:all>
|
<xs:all>
|
||||||
<xs:element name="Velocity" type="t:Vector" minOccurs="0"/>
|
<xs:element name="MovementSpeed" type="t:float" minOccurs="0"/>
|
||||||
<xs:element name="Forward" type="t:bool" minOccurs="0"/>
|
<xs:element name="CrouchSpeed" type="t:float" minOccurs="0"/>
|
||||||
<xs:element name="Left" type="t:bool" minOccurs="0"/>
|
|
||||||
<xs:element name="Back" type="t:bool" minOccurs="0"/>
|
|
||||||
<xs:element name="Right" type="t:bool" minOccurs="0"/>
|
|
||||||
</xs:all>
|
</xs:all>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
</xs:element>
|
</xs:element>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<xs:element name="Color" type="t:Color" minOccurs="0"/>
|
<xs:element name="Color" type="t:Color" minOccurs="0"/>
|
||||||
<xs:element name="Radius" type="t:double" minOccurs="0"/>
|
<xs:element name="Radius" type="t:double" minOccurs="0"/>
|
||||||
<xs:element name="Intensity" type="t:double" minOccurs="0"/>
|
<xs:element name="Intensity" type="t:double" minOccurs="0"/>
|
||||||
<xs:element name="Falloff">
|
<xs:element name="Falloff" minOccurs="0">
|
||||||
<xs:simpleType>
|
<xs:simpleType>
|
||||||
<xs:restriction base="t:double">
|
<xs:restriction base="t:double">
|
||||||
<xs:minInclusive value="0"/>
|
<xs:minInclusive value="0"/>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
</xs:extension>
|
</xs:extension>
|
||||||
</xs:complexContent>
|
</xs:complexContent>
|
||||||
</xs:complexType>
|
</xs:complexType>
|
||||||
|
|
||||||
<xs:element name="Team">
|
<xs:element name="Team">
|
||||||
<xs:annotation>
|
<xs:annotation>
|
||||||
<xs:documentation>Represents entity team affiliation</xs:documentation>
|
<xs:documentation>Represents entity team affiliation</xs:documentation>
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Text xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Text.xsd">
|
||||||
|
<Content>Text</Content>
|
||||||
|
<Resource></Resource>
|
||||||
|
<Color R="1" G="1" B="1" A="1"/>
|
||||||
|
<Visible>true</Visible>
|
||||||
|
<Alignment><Center/></Alignment>
|
||||||
|
</Text>
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:complexType name="AlignmentEnum" mixed="true">
|
||||||
|
<xs:complexContent>
|
||||||
|
<xs:extension base="t:enum">
|
||||||
|
<xs:choice>
|
||||||
|
<xs:element name="Right" type="xs:integer" fixed="0" minOccurs="0"/>
|
||||||
|
<xs:element name="Left" type="xs:integer" fixed="1" minOccurs="0"/>
|
||||||
|
<xs:element name="Center" type="xs:integer" fixed="2" minOccurs="0"/>
|
||||||
|
</xs:choice>
|
||||||
|
</xs:extension>
|
||||||
|
</xs:complexContent>
|
||||||
|
</xs:complexType>
|
||||||
|
|
||||||
|
<xs:element name="Text">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>A visible font loaded from disk</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Content" type="t:string" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>the content of the string printed</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="Resource" type="t:string" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>The asset file, font resolution, example: Fonts/font.ttf,16</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="Color" type="t:Color" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>Color</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="Visible" type="t:bool" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>Wether the text is visible or not</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
<xs:element name="Alignment" type="AlignmentEnum" minOccurs="0">
|
||||||
|
<xs:annotation><xs:documentation>Text alignment</xs:documentation></xs:annotation>
|
||||||
|
</xs:element>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
Executable
+4
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<UniformScale xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UniformScale.xsd">
|
||||||
|
<Scale X="1" Y="1" Z="1"/>
|
||||||
|
</UniformScale>
|
||||||
Executable
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:t="types">
|
||||||
|
<xs:import schemaLocation="../Types.xsd" namespace="types"/>
|
||||||
|
|
||||||
|
<xs:element name="UniformScale">
|
||||||
|
<xs:annotation>
|
||||||
|
<xs:documentation>Keeps an entity at an uniform scale relative to the camera</xs:documentation>
|
||||||
|
</xs:annotation>
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:all>
|
||||||
|
<xs:element name="Scale" type="t:Vector" minOccurs="0"/>
|
||||||
|
</xs:all>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
</xs:schema>
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/DummyScene.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health>
|
||||||
|
<Health>60</Health>
|
||||||
|
</c:Health>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.151326105" Y="13.5594187" Z="12.5957394"/>
|
||||||
|
<Orientation X="-0.872664392" Y="0.157068729" Z="4.90324332e-08"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.48757935" Y="2.62824345" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.91470337" Y="2.32191443" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.31178355" Y="2.16289616" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>2</HomePointForTeam>
|
||||||
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-4.27947044" Y="1.99913001" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.67672658" Y="2.23822045" Z="-0.0577065349"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="2.40398169" Y="2.02053547" Z="-0.0348547697"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/DummyScene.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health>
|
||||||
|
<Health>60</Health>
|
||||||
|
</c:Health>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-2.38960934" Y="11.7122087" Z="11.4659815"/>
|
||||||
|
<Orientation X="-0.645771146" Y="-1.17512627e-05" Z="1.76718231e-07"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
|
<CaptureTimer>6.9158446328696002</CaptureTimer>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.48757935" Y="2.62824345" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CaptureTimer>-13.234195338196177</CaptureTimer>
|
||||||
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.38422918" Y="2.32191443" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.79222715" Y="2.16289616" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>2</HomePointForTeam>
|
||||||
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-4.27947044" Y="1.99913001" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="4.99647331" Y="2.23822045" Z="1.80651212"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="2.7091608" Y="2.02053547" Z="-0.0348547697"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/DummyScene.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health>
|
||||||
|
<Health>60</Health>
|
||||||
|
</c:Health>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.151326105" Y="13.5594187" Z="12.5957394"/>
|
||||||
|
<Orientation X="-0.872664511" Y="0.157068729" Z="3.01738083e-08"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.48757935" Y="2.62824345" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.91470337" Y="2.32191443" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.31178355" Y="2.16289616" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>2</HomePointForTeam>
|
||||||
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-4.27947044" Y="1.99913001" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-5.74354839" Y="2.23822045" Z="-0.0577065349"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="6.96941662" Y="2.02053547" Z="-0.0348547697"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,212 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/DummyScene.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health>
|
||||||
|
<Health>60</Health>
|
||||||
|
</c:Health>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.151326105" Y="13.5594187" Z="12.5957394"/>
|
||||||
|
<Orientation X="-0.942477643" Y="0.157067701" Z="-1.50870125e-08"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.39647007" Y="2.36802292" Z="0.0546064377"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="4.21088505" Y="2.32191443" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="2.30499458" Y="2.04659939" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.196968079" Y="1.99913001" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>2</HomePointForTeam>
|
||||||
|
<CapturePointNumber>4</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.82539892" Y="1.96172595" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.15194035" Y="2.23822045" Z="-0.0577065349"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.266237378" Y="2.23822045" Z="0.344228983"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="6.96941662" Y="2.02053547" Z="1.9484092"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="3.63076782" Y="2.5672617" Z="-0.0348547697"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -0,0 +1,205 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||||
|
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||||
|
|
||||||
|
<Components>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/DummyScene.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health>
|
||||||
|
<Health>60</Health>
|
||||||
|
</c:Health>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.151326105" Y="13.5594187" Z="12.5957394"/>
|
||||||
|
<Orientation X="-0.62831825" Y="0.0872534811" Z="-7.47903606e-09"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.39647007" Y="2.36802292" Z="0.0546064377"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="3.68890452" Y="2.32191443" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.98802853" Y="2.16289616" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.196968079" Y="1.99913001" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:CapturePoint>
|
||||||
|
<HomePointForTeam>2</HomePointForTeam>
|
||||||
|
<CapturePointNumber>4</CapturePointNumber>
|
||||||
|
</c:CapturePoint>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
||||||
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.82539892" Y="1.96172595" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
<c:Trigger/>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-7.44269609" Y="2.23822045" Z="-0.0577065349"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>2</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-5.74354839" Y="2.23822045" Z="1.40012479"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="6.96941662" Y="2.02053547" Z="1.9484092"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Health/>
|
||||||
|
<c:AABB/>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
||||||
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
|
</c:Model>
|
||||||
|
<c:Player/>
|
||||||
|
<c:Team>
|
||||||
|
<Team>3</Team>
|
||||||
|
</c:Team>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="7.70311165" Y="2.02053547" Z="-0.0348547697"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user