Compare commits
193 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ac0c6ff952 | |||
| 06f64f8fbf | |||
| 0c56a05144 | |||
| 382eff169f | |||
| d4797b0808 | |||
| 25890c8d6c | |||
| 0fb1dbcae1 | |||
| 9f3d887ac4 | |||
| b4081b3e45 | |||
| 8d61632c26 | |||
| 2eaad2aa00 | |||
| 235b26ad61 | |||
| f80fb5eda8 | |||
| aa115befa9 | |||
| aa20b48188 | |||
| 96a735c542 | |||
| 3261e21d96 | |||
| 666f1fd878 | |||
| 373bb33cf0 | |||
| 4c5d17b203 | |||
| 8286d052b3 | |||
| aaa11d2109 | |||
| 67477ff3ae | |||
| b5b1140f5c | |||
| 7567f47a68 | |||
| 97d70f8e32 | |||
| 3baa988ad4 | |||
| 1ce9128da8 | |||
| a28748b35d | |||
| 132de88d28 | |||
| df485ccf7b | |||
| 85a4d98c81 | |||
| ef020a3770 | |||
| 160b7183b2 | |||
| f1835fd89c | |||
| ecdb5ed07d | |||
| 5edf5a41f1 | |||
| 6d2c656a04 | |||
| 2bf0434bcb | |||
| 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 | |||
| b9147344e1 | |||
| 70bbc5ed0a | |||
| 0183e1bdb7 | |||
| 983f90504d | |||
| bdebc9de62 | |||
| f1345419b6 | |||
| 5e70d6eef6 | |||
| 4aa9100c69 | |||
| 7b34e001ba | |||
| c2e05de89f | |||
| ea9c4d19d0 | |||
| f3bfe388af | |||
| c984f76b2f | |||
| b098bd2bd3 | |||
| 86824f1b1f | |||
| 78a1037983 | |||
| 84b7cf165c | |||
| 386e76f642 | |||
| a47317bb32 | |||
| e643581971 | |||
| 3826142e94 | |||
| ce27b224df | |||
| f0763bc2a3 | |||
| 8854794cbc | |||
| 260203fa4d | |||
| d030e8f699 | |||
| 61984d2c4a | |||
| cfe023cc1d | |||
| a6445c65aa | |||
| 162523d3ca | |||
| dbe56280a6 | |||
| 3fb975a8d9 | |||
| 267a60ef30 | |||
| 68af853a03 | |||
| b62e42567c | |||
| 9e3dfff7b6 | |||
| 79eaa7364c | |||
| 51979d7f0c | |||
| 3fc44e944c | |||
| 1760f9dfb1 | |||
| 2a3009212a | |||
| d4242bbead | |||
| 631dd57eeb | |||
| 9cb5f4bd2f | |||
| c4594524da | |||
| 2a93e2ae7f | |||
| 92553f1e93 | |||
| 3bc7dceca5 | |||
| 504f301e4d | |||
| e39e4064f2 | |||
| 0d50ede6f5 | |||
| 4786986abd | |||
| e34856468a | |||
| e2357b8625 | |||
| 6ec2258758 | |||
| 9f447afbdb | |||
| 16c39df439 | |||
| 8437b9c734 | |||
| 6317a6092d | |||
| 7faed50507 | |||
| 6fbb962b5e | |||
| 4e70439653 | |||
| e6527196ed | |||
| c14f3789f7 | |||
| 24486c314d | |||
| 7b62dc19bf | |||
| a20ca49d53 | |||
| 774bb8ce56 | |||
| 0cc58f088a | |||
| 00805d30d0 | |||
| 2f6261dfbf | |||
| 2cd0e94a60 | |||
| 8f92de3683 | |||
| 31c1c0ac8d | |||
| 0e90382fd1 | |||
| 1667358e0c | |||
| eb5fca898f | |||
| c9db46564f | |||
| 509a989d3b | |||
| bc4cc5db54 | |||
| 73708ec706 | |||
| 67017fcaf4 | |||
| 498afb3a5e | |||
| 4e535c1102 | |||
| 1689370356 | |||
| 123c198e19 | |||
| 60b3ce89b2 | |||
| 9bd3da409d | |||
| a8a38716bd | |||
| 8f007f6daf | |||
| 4c2ce3882e | |||
| 7b6902eafe | |||
| 46854a63dd | |||
| dc66891d60 | |||
| a22d086e60 | |||
| 74c1beed20 | |||
| c8cb0ee939 |
@@ -4,3 +4,11 @@ bin/
|
|||||||
lib/
|
lib/
|
||||||
# Because apparently nobody has any self control
|
# Because apparently nobody has any self control
|
||||||
*.orig
|
*.orig
|
||||||
|
|
||||||
|
*.suo
|
||||||
|
*.sdf
|
||||||
|
tools/MayaExporter/MayaExporter/x64/Debug/
|
||||||
|
tools/MayaExporter/x64/Debug/
|
||||||
|
|
||||||
|
tools/MayaExporter/MayaExporter/Debug/
|
||||||
|
tools/MayaExporter/MayaExporter/GeneratedFiles/
|
||||||
|
|||||||
+1
-1
Submodule assets updated: 6ffb46e155...068fbb2d20
@@ -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;
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
|
|
||||||
#include "../Core/Ray.h"
|
#include "../Core/Ray.h"
|
||||||
#include "../Core/AABB.h"
|
#include "../Core/AABB.h"
|
||||||
#include "../Rendering/RawModel.h"
|
#include "Rendering/RawModelCustom.h"
|
||||||
|
//#include "Rendering/RawModelAssimp.h"
|
||||||
#include "../Core/Transform.h"
|
#include "../Core/Transform.h"
|
||||||
#include "../Core/Entity.h"
|
#include "../Core/Entity.h"
|
||||||
#include "../Core/EntityWrapper.h"
|
#include "../Core/EntityWrapper.h"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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); }
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef EComponentDeleted_h__
|
||||||
|
#define EComponentDeleted_h__
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "Event.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct ComponentDeleted : Event
|
||||||
|
{
|
||||||
|
EntityID Entity;
|
||||||
|
std::string ComponentType;
|
||||||
|
// True if the component was deleted as a result of the entity it was attached to being deleted
|
||||||
|
bool Cascaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#ifndef EEntityDeleted_h__
|
||||||
|
#define EEntityDeleted_h__
|
||||||
|
|
||||||
|
#include "Event.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct EntityDeleted : Event
|
||||||
|
{
|
||||||
|
EntityID DeletedEntity;
|
||||||
|
// True if the entity deletion was triggered because the entity's parent was deleted before it
|
||||||
|
bool Cascaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#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
|
||||||
@@ -2,17 +2,15 @@
|
|||||||
#define EPlayerDamage_h__
|
#define EPlayerDamage_h__
|
||||||
|
|
||||||
#include "EventBroker.h"
|
#include "EventBroker.h"
|
||||||
#include "../Core/Entity.h"
|
#include "../Core/EntityWrapper.h"
|
||||||
|
|
||||||
namespace Events
|
namespace Events
|
||||||
{
|
{
|
||||||
|
|
||||||
struct PlayerDamage : Event
|
struct PlayerDamage : Event
|
||||||
{
|
{
|
||||||
double DamageAmount;
|
EntityWrapper Player;
|
||||||
EntityID PlayerDamagedID;
|
double Damage;
|
||||||
//optional TypeOfDamage
|
|
||||||
std::string TypeOfDamage;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#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;
|
||||||
|
std::string PlayerName;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef EShoot_h__
|
||||||
|
#define EShoot_h__
|
||||||
|
|
||||||
|
#include "EventBroker.h"
|
||||||
|
#include "../Core/EntityWrapper.h"
|
||||||
|
|
||||||
|
namespace Events
|
||||||
|
{
|
||||||
|
|
||||||
|
struct Shoot : Event
|
||||||
|
{
|
||||||
|
EntityWrapper Player;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#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;
|
||||||
@@ -22,11 +23,32 @@ struct EntityWrapper
|
|||||||
|
|
||||||
static const EntityWrapper Invalid;
|
static const EntityWrapper Invalid;
|
||||||
|
|
||||||
bool HasComponent(const std::string& componentName);
|
bool HasComponent(const std::string& componentType);
|
||||||
|
EntityWrapper Parent();
|
||||||
|
EntityWrapper FirstChildByName(const std::string& name);
|
||||||
|
EntityWrapper FirstParentWithComponent(const std::string& componentType);
|
||||||
|
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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ public:
|
|||||||
};
|
};
|
||||||
struct FailedLoadingException : public std::exception
|
struct FailedLoadingException : public std::exception
|
||||||
{
|
{
|
||||||
virtual const char* what() const throw()
|
FailedLoadingException(char const* const _Message)
|
||||||
{
|
: std::exception(_Message)
|
||||||
return "Resource is failed to load.";
|
{ }
|
||||||
}
|
FailedLoadingException() :std::exception("Resource failed to load.") { };
|
||||||
};
|
};
|
||||||
|
|
||||||
// Pretend that this is a pure virtual function that you have to implement
|
// Pretend that this is a pure virtual function that you have to implement
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -5,11 +5,15 @@
|
|||||||
#include "Entity.h"
|
#include "Entity.h"
|
||||||
#include "ObjectPool.h"
|
#include "ObjectPool.h"
|
||||||
#include "ComponentPool.h"
|
#include "ComponentPool.h"
|
||||||
|
#include "EventBroker.h"
|
||||||
|
|
||||||
class World
|
class World
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
World() = default;
|
World() = default;
|
||||||
|
World(EventBroker* eventBroker)
|
||||||
|
: m_EventBroker(eventBroker)
|
||||||
|
{ }
|
||||||
~World();
|
~World();
|
||||||
|
|
||||||
// Create empty entity
|
// Create empty entity
|
||||||
@@ -46,6 +50,7 @@ public:
|
|||||||
std::string GetName(EntityID entity) const;
|
std::string GetName(EntityID entity) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
EventBroker* m_EventBroker = nullptr;
|
||||||
EntityID m_CurrentEntityID = 0;
|
EntityID m_CurrentEntityID = 0;
|
||||||
|
|
||||||
std::unordered_map<EntityID, EntityID> m_EntityParents;
|
std::unordered_map<EntityID, EntityID> m_EntityParents;
|
||||||
@@ -55,6 +60,7 @@ private:
|
|||||||
std::unordered_map<EntityID, std::string> m_EntityNames;
|
std::unordered_map<EntityID, std::string> m_EntityNames;
|
||||||
|
|
||||||
EntityID generateEntityID();
|
EntityID generateEntityID();
|
||||||
|
void deleteEntityRecursive(EntityID entity, bool cascaded = false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#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
|
||||||
@@ -20,6 +20,7 @@
|
|||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
#include "Core/EPlayerDamage.h"
|
#include "Core/EPlayerDamage.h"
|
||||||
#include "Network/EInterpolate.h"
|
#include "Network/EInterpolate.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
class Client : public Network
|
class Client : public Network
|
||||||
{
|
{
|
||||||
@@ -39,16 +40,18 @@ private:
|
|||||||
char readBuf[INPUTSIZE] = { 0 };
|
char readBuf[INPUTSIZE] = { 0 };
|
||||||
|
|
||||||
// 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;
|
||||||
|
AckBitPattern ackBitField = 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();
|
EntityID m_ServerEntityID = std::numeric_limits<EntityID>::max();
|
||||||
bool m_IsConnected = false;
|
bool m_IsConnected = false;
|
||||||
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
// Server Client Lookup map
|
// Server Client Lookup map
|
||||||
// Assumes that root node for client and server is EntityID 0.
|
// Assumes that root node for client and server is EntityID 0.
|
||||||
|
|
||||||
@@ -57,31 +60,36 @@ private:
|
|||||||
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
|
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;
|
||||||
|
std::clock_t m_TimeSinceSentInputs;
|
||||||
|
unsigned int m_SendInputIntervalMs;
|
||||||
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
void readFromServer();
|
void readFromServer();
|
||||||
int receive(char* data, size_t length);
|
int receive(char* data);
|
||||||
void send(Packet& packet);
|
void send(Packet& packet);
|
||||||
void connect();
|
void connect();
|
||||||
void disconnect();
|
void disconnect();
|
||||||
void ping();
|
|
||||||
void parseMessageType(Packet& packet);
|
void parseMessageType(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 parsePlayerConnected(Packet& packet);
|
||||||
void parsePing();
|
void parsePing();
|
||||||
void parseServerPing();
|
void parseKick();
|
||||||
|
void parsePlayersSpawned(Packet& packet);
|
||||||
|
void parseEntityDeletion(Packet& packet);
|
||||||
|
void parseComponentDeletion(Packet& packet);
|
||||||
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
||||||
void parseSnapshot(Packet& packet);
|
void parseSnapshot(Packet& packet);
|
||||||
void identifyPacketLoss();
|
void identifyPacketLoss();
|
||||||
bool hasServerTimedOut();
|
bool hasServerTimedOut();
|
||||||
EntityID createPlayer();
|
EntityID createPlayer();
|
||||||
void sendInputCommands();
|
void sendInputCommands();
|
||||||
|
void sendLocalPlayerTransform();
|
||||||
void becomePlayer();
|
void becomePlayer();
|
||||||
// Mapping Logic
|
// Mapping Logic
|
||||||
// Returns if local EntityID exist in map
|
// Returns if local EntityID exist in map
|
||||||
@@ -89,13 +97,16 @@ private:
|
|||||||
// Returns if server EntityID exist in map
|
// Returns if server EntityID exist in map
|
||||||
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
bool serverClientMapsHasEntity(EntityID serverEntityID);
|
||||||
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
void insertIntoServerClientMaps(EntityID serverEntityID, EntityID clientEntityID);
|
||||||
|
void deleteFromServerClientMaps(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;
|
EventRelay<Client, Events::PlayerDamage> m_EPlayerDamage;
|
||||||
bool OnPlayerDamage(const Events::PlayerDamage& e);
|
bool OnPlayerDamage(const Events::PlayerDamage& e);
|
||||||
|
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#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,16 +5,20 @@
|
|||||||
// 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,
|
OnInputCommand,
|
||||||
OnPlayerDamage,
|
OnPlayerDamage,
|
||||||
PlayerConnected,
|
PlayerConnected,
|
||||||
BecomePlayer
|
BecomePlayer,
|
||||||
|
Kick,
|
||||||
|
OnPlayerSpawned,
|
||||||
|
EntityDeleted,
|
||||||
|
ComponentDeleted,
|
||||||
|
PlayerTransform
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,13 +1,22 @@
|
|||||||
#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>
|
||||||
|
#include <bitset>
|
||||||
|
|
||||||
#define MAXCONNECTIONS 8
|
|
||||||
#define INPUTSIZE 4097
|
#define INPUTSIZE 4097
|
||||||
#define TIMEOUTMS 15000
|
typedef unsigned int PlayerID;
|
||||||
|
typedef unsigned int PacketID;
|
||||||
|
typedef unsigned int AckBitPattern;
|
||||||
|
|
||||||
class Network
|
class Network
|
||||||
{
|
{
|
||||||
@@ -15,6 +24,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
|
||||||
@@ -11,12 +11,12 @@ class Packet
|
|||||||
public:
|
public:
|
||||||
// arg1: Type of message (Connect, Disconnect...)
|
// arg1: Type of message (Connect, Disconnect...)
|
||||||
// arg2: PacketID for identifying packet loss.
|
// arg2: PacketID for identifying packet loss.
|
||||||
Packet(MessageType type, unsigned int& packetID);
|
Packet(MessageType type, unsigned int& packetID, unsigned int lastReceivedPacket, unsigned int ackBitField);
|
||||||
// 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(MessageType type);
|
||||||
~Packet();
|
~Packet();
|
||||||
void Init(MessageType type, unsigned int& packetID);
|
void Init(MessageType type, unsigned int& packetID, unsigned int lastReceivedPacket, unsigned int ackBitField);
|
||||||
|
|
||||||
// Add primitive types like int, float, char...
|
// Add primitive types like int, float, char...
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@@ -50,17 +50,21 @@ 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);
|
// No purpose any more
|
||||||
|
//void ChangePacketID(unsigned int& packetID);
|
||||||
|
void ChangeHeaderInfo(unsigned int& packetID, unsigned int lastReceivedPacket, unsigned int ackBitField);
|
||||||
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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,19 @@
|
|||||||
#ifndef PlayerDefinition_h__
|
#ifndef PlayerDefinition_h__
|
||||||
#define PlayerDefinition_h__
|
#define PlayerDefinition_h__
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "../Core/Entity.h"
|
||||||
|
|
||||||
struct PlayerDefinition {
|
struct PlayerDefinition {
|
||||||
int EntityID = -1;
|
::EntityID EntityID = EntityID_Invalid;
|
||||||
std::string Name = "";
|
std::string Name = "";
|
||||||
boost::asio::ip::udp::endpoint Endpoint;
|
boost::asio::ip::udp::endpoint Endpoint;
|
||||||
|
// The ID of the last sent packet. (Local sequence number)
|
||||||
unsigned int PacketID;
|
unsigned int PacketID;
|
||||||
|
// The ID of the last received packet. (Remote sequence number)
|
||||||
|
// This is sent as the ackNumber.
|
||||||
|
unsigned int LastPacketReceivedID;
|
||||||
|
// The bit pattern of the last 32 received packets.
|
||||||
|
unsigned int AckBitField;
|
||||||
std::clock_t StopTime;
|
std::clock_t StopTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@
|
|||||||
#include "../Network/Network.h"
|
#include "../Network/Network.h"
|
||||||
#include "Input/EInputCommand.h"
|
#include "Input/EInputCommand.h"
|
||||||
#include "Core/EPlayerDamage.h"
|
#include "Core/EPlayerDamage.h"
|
||||||
|
#include "Network/EPlayerDisconnected.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
#include "Core/EEntityDeleted.h"
|
||||||
|
#include "Core/EComponentDeleted.h"
|
||||||
|
|
||||||
class Server : public Network
|
class Server : public Network
|
||||||
{
|
{
|
||||||
@@ -29,18 +33,18 @@ private:
|
|||||||
boost::asio::ip::udp::socket m_Socket;
|
boost::asio::ip::udp::socket m_Socket;
|
||||||
|
|
||||||
// Sending messages to client logic
|
// Sending messages to client logic
|
||||||
PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS];
|
std::map<PlayerID, PlayerDefinition> m_ConnectedPlayers;
|
||||||
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
|
||||||
std::clock_t previousePingMessage = std::clock();
|
std::clock_t previousPingMessage = std::clock();
|
||||||
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;
|
||||||
|
int m_NextPlayerID = 0;
|
||||||
|
|
||||||
//Timers
|
//Timers
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
@@ -50,32 +54,41 @@ private:
|
|||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
|
||||||
// Packet loss logic
|
// Packet loss logic
|
||||||
unsigned int m_PacketID = 0;
|
PacketID m_PacketID = 0;
|
||||||
unsigned int m_PreviousPacketID = 0;
|
PacketID m_PreviousPacketID = 0;
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
int receive(char* data, size_t length);
|
void addChildrenToPacket(Packet& packet, EntityID entityID);
|
||||||
void readFromClients();
|
|
||||||
void send(Packet& packet, int playerID);
|
|
||||||
void send(Packet& packet);
|
|
||||||
void broadcast(Packet& packet);
|
void broadcast(Packet& packet);
|
||||||
|
void checkForTimeOuts();
|
||||||
|
void disconnect(PlayerID playerID);
|
||||||
|
void identifyPacketLoss();
|
||||||
|
void kick(PlayerID player);
|
||||||
|
int receive(char* data);
|
||||||
|
void readFromClients();
|
||||||
|
void send(PlayerID playerID, Packet& packet);
|
||||||
|
void send(Packet& packet);
|
||||||
void sendSnapshot();
|
void sendSnapshot();
|
||||||
void sendPing();
|
void sendPing();
|
||||||
void checkForTimeOuts();
|
void parseClientPing(PlayerID playerID);
|
||||||
void disconnect(int i);
|
void parseConnect(Packet& packet, PlayerID playerID);
|
||||||
|
void parseDisconnect();
|
||||||
void parseMessageType(Packet& packet);
|
void parseMessageType(Packet& packet);
|
||||||
void parseOnInputCommand(Packet& packet);
|
void parseOnInputCommand(Packet& packet);
|
||||||
void parseOnPlayerDamage(Packet& packet);
|
void parseOnPlayerDamage(Packet& packet);
|
||||||
void parseConnect(Packet& packet);
|
void parsePing();
|
||||||
void parseDisconnect();
|
|
||||||
void parseClientPing();
|
PlayerID GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
|
||||||
void parseServerPing();
|
|
||||||
void identifyPacketLoss();
|
|
||||||
void createPlayer();
|
|
||||||
int GetPlayerIDFromEndpoint(boost::asio::ip::udp::endpoint endpoint);
|
|
||||||
// Debug event
|
// Debug event
|
||||||
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
||||||
bool OnInputCommand(const Events::InputCommand& e);
|
bool OnInputCommand(const Events::InputCommand& e);
|
||||||
|
EventRelay<Server, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
|
EventRelay<Server, Events::EntityDeleted> m_EEntityDeleted;
|
||||||
|
bool OnEntityDeleted(const Events::EntityDeleted& e);
|
||||||
|
EventRelay<Server, Events::ComponentDeleted> m_EComponentDeleted;
|
||||||
|
bool OnComponentDeleted(const Events::ComponentDeleted& e);
|
||||||
|
void parsePlayerTransform(Packet& packet);
|
||||||
};
|
};
|
||||||
|
|
||||||
#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,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__
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#ifndef Model_h__
|
#ifndef Model_h__
|
||||||
#define Model_h__
|
#define Model_h__
|
||||||
|
|
||||||
#include "RawModel.h"
|
#include "Rendering/RawModelCustom.h"
|
||||||
|
//#include "Rendering/RawModelAssimp.h"
|
||||||
#include "../OpenGL.h"
|
#include "../OpenGL.h"
|
||||||
|
|
||||||
class Model : public ThreadUnsafeResource
|
class Model : public ThreadUnsafeResource
|
||||||
@@ -19,12 +20,11 @@ public:
|
|||||||
|
|
||||||
GLuint VAO;
|
GLuint VAO;
|
||||||
GLuint ElementBuffer;
|
GLuint ElementBuffer;
|
||||||
|
RawModel* m_RawModel;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RawModel* m_RawModel;
|
|
||||||
GLuint VertexBuffer;
|
GLuint VertexBuffer;
|
||||||
GLuint DiffuseVertexColorBuffer;
|
|
||||||
GLuint SpecularVertexColorBuffer;
|
|
||||||
GLuint NormalBuffer;
|
GLuint NormalBuffer;
|
||||||
GLuint TangentNormalsBuffer;
|
GLuint TangentNormalsBuffer;
|
||||||
GLuint BiTangentNormalsBuffer;
|
GLuint BiTangentNormalsBuffer;
|
||||||
|
|||||||
@@ -24,6 +24,10 @@ struct ModelJob : RenderJob
|
|||||||
DiffuseTexture = matGroup.Texture.get();
|
DiffuseTexture = matGroup.Texture.get();
|
||||||
NormalTexture = matGroup.NormalMap.get();
|
NormalTexture = matGroup.NormalMap.get();
|
||||||
SpecularTexture = matGroup.SpecularMap.get();
|
SpecularTexture = matGroup.SpecularMap.get();
|
||||||
|
IncandescenceTexture = matGroup.IncandescenceMap.get();
|
||||||
|
DiffuseColor = matGroup.DiffuseColor;
|
||||||
|
SpecularColor = matGroup.SpecularColor;
|
||||||
|
IncandescenceColor = matGroup.IncandescenceColor;
|
||||||
StartIndex = matGroup.StartIndex;
|
StartIndex = matGroup.StartIndex;
|
||||||
EndIndex = matGroup.EndIndex;
|
EndIndex = matGroup.EndIndex;
|
||||||
Matrix = matrix;
|
Matrix = matrix;
|
||||||
@@ -43,9 +47,13 @@ struct ModelJob : RenderJob
|
|||||||
const Texture* DiffuseTexture;
|
const Texture* DiffuseTexture;
|
||||||
const Texture* NormalTexture;
|
const Texture* NormalTexture;
|
||||||
const Texture* SpecularTexture;
|
const Texture* SpecularTexture;
|
||||||
|
const Texture* IncandescenceTexture;
|
||||||
float Shininess = 0.f;
|
float Shininess = 0.f;
|
||||||
glm::vec4 Color;
|
glm::vec4 Color;
|
||||||
const ::Model* Model = nullptr;
|
const ::Model* Model = nullptr;
|
||||||
|
glm::vec4 DiffuseColor;
|
||||||
|
glm::vec4 SpecularColor;
|
||||||
|
glm::vec4 IncandescenceColor;
|
||||||
unsigned int StartIndex = 0;
|
unsigned int StartIndex = 0;
|
||||||
unsigned int EndIndex = 0;
|
unsigned int EndIndex = 0;
|
||||||
World* World;
|
World* World;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
#ifndef RawModel_h__
|
#ifndef RawModelAssimp_h__
|
||||||
#define RawModel_h__
|
#define RawModelAssimp_h__
|
||||||
|
|
||||||
|
#ifdef USING_ASSIMP_AS_IMPORTER
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@@ -18,29 +20,27 @@
|
|||||||
#include "Texture.h"
|
#include "Texture.h"
|
||||||
#include "Skeleton.h"
|
#include "Skeleton.h"
|
||||||
|
|
||||||
class RawModel : public Resource
|
#define RawModel RawModelAssimp
|
||||||
|
|
||||||
|
class RawModelAssimp : public Resource
|
||||||
{
|
{
|
||||||
friend class ResourceManager;
|
friend class ResourceManager;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
RawModel(std::string fileName);
|
RawModelAssimp(std::string fileName);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~RawModel();
|
~RawModelAssimp();
|
||||||
|
|
||||||
struct Vertex
|
struct Vertex
|
||||||
{
|
{
|
||||||
glm::vec3 Position;
|
glm::vec3 Position;
|
||||||
glm::vec3 Normal;
|
glm::vec3 Normal;
|
||||||
glm::vec3 Tangent;
|
glm::vec3 Tangent;
|
||||||
glm::vec3 BiTangent;
|
glm::vec3 BiNormal;
|
||||||
glm::vec2 TextureCoords;
|
glm::vec2 TextureCoords;
|
||||||
glm::vec4 DiffuseVertexColor;
|
glm::vec4 BoneIndices;
|
||||||
glm::vec4 SpecularVertexColor;
|
glm::vec4 BoneWeights;
|
||||||
glm::vec4 BoneIndices1;
|
|
||||||
glm::vec4 BoneIndices2;
|
|
||||||
glm::vec4 BoneWeights1;
|
|
||||||
glm::vec4 BoneWeights2;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MaterialGroup
|
struct MaterialGroup
|
||||||
@@ -68,8 +68,6 @@ private:
|
|||||||
std::vector<glm::ivec2> BoneIndices;
|
std::vector<glm::ivec2> BoneIndices;
|
||||||
std::vector<glm::vec2> BoneWeights;
|
std::vector<glm::vec2> BoneWeights;
|
||||||
std::vector<glm::vec3> Normals;
|
std::vector<glm::vec3> Normals;
|
||||||
std::vector<glm::vec4> DiffuseVertexColor;
|
|
||||||
std::vector<glm::vec4> SpecularVertexColor;
|
|
||||||
std::vector<glm::vec3> TangentNormals;
|
std::vector<glm::vec3> TangentNormals;
|
||||||
std::vector<glm::vec3> BiTangentNormals;
|
std::vector<glm::vec3> BiTangentNormals;
|
||||||
std::vector<glm::vec2> TextureCoords;
|
std::vector<glm::vec2> TextureCoords;
|
||||||
@@ -78,3 +76,4 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
#ifndef RawModelCustom_h__
|
||||||
|
#define RawModelCustom_h__
|
||||||
|
|
||||||
|
#ifndef USING_ASSIMP_AS_IMPORTER
|
||||||
|
|
||||||
|
#define RawModel RawModelCustom
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
#include "../Common.h"
|
||||||
|
#include "../GLM.h"
|
||||||
|
#include "../Core/ResourceManager.h"
|
||||||
|
#include "Texture.h"
|
||||||
|
#include "Skeleton.h"
|
||||||
|
|
||||||
|
#include "boost\endian\buffers.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class RawModelCustom : public Resource
|
||||||
|
{
|
||||||
|
friend class ResourceManager;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
RawModelCustom(std::string fileName);
|
||||||
|
|
||||||
|
public:
|
||||||
|
~RawModelCustom();
|
||||||
|
|
||||||
|
struct Vertex
|
||||||
|
{
|
||||||
|
glm::vec3 Position;
|
||||||
|
glm::vec3 Normal;
|
||||||
|
glm::vec3 Tangent;
|
||||||
|
glm::vec3 BiNormal;
|
||||||
|
glm::vec2 TextureCoords;
|
||||||
|
glm::vec4 BoneIndices;
|
||||||
|
glm::vec4 BoneWeights;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MaterialGroup
|
||||||
|
{
|
||||||
|
float SpecularExponent;
|
||||||
|
float ReflectionFactor;
|
||||||
|
glm::vec4 DiffuseColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||||
|
glm::vec4 SpecularColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||||
|
glm::vec4 IncandescenceColor{ 1.0f, 1.0f, 1.0f, 1.0f };
|
||||||
|
unsigned int StartIndex;
|
||||||
|
unsigned int EndIndex;
|
||||||
|
//float Transparency;
|
||||||
|
std::string TexturePath;
|
||||||
|
std::shared_ptr<::Texture> Texture;
|
||||||
|
std::string NormalMapPath;
|
||||||
|
std::shared_ptr<::Texture> NormalMap;
|
||||||
|
std::string SpecularMapPath;
|
||||||
|
std::shared_ptr<::Texture> SpecularMap;
|
||||||
|
std::string IncandescenceMapPath;
|
||||||
|
std::shared_ptr<::Texture> IncandescenceMap;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<MaterialGroup> MaterialGroups;
|
||||||
|
|
||||||
|
std::vector<Vertex> m_Vertices;
|
||||||
|
std::vector<unsigned int> m_Indices;
|
||||||
|
Skeleton* m_Skeleton = nullptr;
|
||||||
|
glm::mat4 m_Matrix;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
void ReadMeshFile(std::string filePath);
|
||||||
|
void ReadMeshFileHeader(unsigned int& offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadMesh(unsigned int& offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadVertices(unsigned int& offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadIndices(unsigned int& offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
|
||||||
|
void ReadMaterialFile(std::string filePath);
|
||||||
|
void ReadMaterials(unsigned int &offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadMaterialSingle(unsigned int &offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
|
||||||
|
void ReadAnimationFile(std::string filePath);
|
||||||
|
void ReadAnimationBindPoses(unsigned int &offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadAnimationJoint(unsigned int &offset, char* fileData, unsigned int& fileByteSize);
|
||||||
|
void ReadAnimationClips(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int numberOfClips);
|
||||||
|
void ReadAnimationClipSingle(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int clipIndex);
|
||||||
|
void ReadAnimationKeyFrame(unsigned int &offset, char* fileData, unsigned int& fileByteSize, unsigned int numberOfJoints, Skeleton::Animation& animation);
|
||||||
|
|
||||||
|
//void CreateSkeleton(std::vector<std::tuple<std::string, glm::mat4>> &boneInfo, std::map<std::string, int> &boneNameMapping, aiNode* node, int parentID);
|
||||||
|
};
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include "RawModelAssimp.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -14,7 +14,6 @@ struct RenderJob
|
|||||||
friend class RenderQueue;
|
friend class RenderQueue;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
float Depth;
|
float Depth;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
@@ -11,56 +11,25 @@
|
|||||||
#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"
|
#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;
|
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();
|
DirectionalLightJobs.clear();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -97,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,42 +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 switchCamera(EntityID entity);
|
|
||||||
|
|
||||||
void updateCamera(World* world, double dt);
|
|
||||||
void updateProjectionMatrix(ComponentWrapper& cameraComponent);
|
|
||||||
|
|
||||||
void fillModels(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
|
||||||
void fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
void fillPointLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
||||||
void fillDirectionalLights(std::list<std::shared_ptr<RenderJob>>& jobs, World* world);
|
void fillDirectionalLights(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,13 +11,17 @@
|
|||||||
#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
|
||||||
{
|
{
|
||||||
@@ -35,6 +39,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
//----------------------Variables----------------------//
|
//----------------------Variables----------------------//
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
|
TextPass* m_TextPass;
|
||||||
|
|
||||||
Texture* m_ErrorTexture;
|
Texture* m_ErrorTexture;
|
||||||
Texture* m_WhiteTexture;
|
Texture* m_WhiteTexture;
|
||||||
@@ -43,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();
|
||||||
@@ -57,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 SortRenderJobsByDepth(RenderScene &scene);
|
void SortRenderJobsByDepth(RenderScene &scene);
|
||||||
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type);
|
||||||
//--------------------ShaderPrograms-------------------//
|
//--------------------ShaderPrograms-------------------//
|
||||||
ShaderProgram* m_BasicForwardProgram;
|
ShaderProgram* m_BasicForwardProgram;
|
||||||
ShaderProgram* m_DrawScreenQuadProgram;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "../GLM.h"
|
#include "../GLM.h"
|
||||||
|
#include <glm/gtx/matrix_decompose.hpp>
|
||||||
|
|
||||||
//struct Bone
|
//struct Bone
|
||||||
//{
|
//{
|
||||||
@@ -38,9 +39,9 @@ public:
|
|||||||
, OffsetMatrix(offsetMatrix)
|
, OffsetMatrix(offsetMatrix)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
int ID;
|
|
||||||
std::string Name;
|
std::string Name;
|
||||||
glm::mat4 OffsetMatrix;
|
glm::mat4 OffsetMatrix;
|
||||||
|
int ID;
|
||||||
|
|
||||||
Bone* Parent;
|
Bone* Parent;
|
||||||
std::vector<Bone*> Children;
|
std::vector<Bone*> Children;
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -19,6 +19,7 @@
|
|||||||
#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"
|
#include "Systems/InterpolationSystem.h"
|
||||||
// Network
|
// Network
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ class CapturePointSystem : public PureSystem
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?)
|
//WARNING: on new map, destroy all info in the vectors, as well as reset all variables (just make new?)
|
||||||
CapturePointSystem(EventBroker* eventBroker);
|
CapturePointSystem(World* world, EventBroker* eventBroker);
|
||||||
|
|
||||||
//updatecomponent
|
//updatecomponent
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& capturePoint, double dt) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//methods which will take care of specific events
|
//methods which will take care of specific events
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -10,11 +10,12 @@
|
|||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "Core/System.h"
|
#include "Core/System.h"
|
||||||
#include "Core/EventBroker.h"
|
#include "Core/EventBroker.h"
|
||||||
|
#include "Core/ResourceManager.h"
|
||||||
|
#include "Core/ConfigFile.h"
|
||||||
|
#include "Core/EPlayerSpawned.h"
|
||||||
|
|
||||||
#include "Network/EInterpolate.h"
|
#include "Network/EInterpolate.h"
|
||||||
|
|
||||||
#define SNAPSHOTINTERVAL 0.05f
|
|
||||||
|
|
||||||
class InterpolationSystem : public PureSystem
|
class InterpolationSystem : public PureSystem
|
||||||
{
|
{
|
||||||
struct Transform
|
struct Transform
|
||||||
@@ -25,29 +26,28 @@ class InterpolationSystem : public PureSystem
|
|||||||
double interpolationTime;
|
double interpolationTime;
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
InterpolationSystem(EventBroker* eventBroker)
|
InterpolationSystem(World* world, EventBroker* eventBroker);
|
||||||
: System(eventBroker)
|
|
||||||
, PureSystem("Transform")
|
|
||||||
{
|
|
||||||
EVENT_SUBSCRIBE_MEMBER(m_EInterpolate, &InterpolationSystem::OnInterpolate);
|
|
||||||
}
|
|
||||||
~InterpolationSystem() { }
|
~InterpolationSystem() { }
|
||||||
virtual void UpdateComponent(World* world, EntityWrapper& entity, ComponentWrapper& transform, double dt) override;
|
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& transform, double dt) override;
|
||||||
private:
|
private:
|
||||||
std::unordered_map<EntityID, Transform> m_NextTransform;
|
std::unordered_map<EntityID, Transform> m_NextTransform;
|
||||||
std::unordered_map<EntityID, Transform> m_LastReceivedTransform;
|
std::unordered_map<EntityID, Transform> m_LastReceivedTransform;
|
||||||
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
|
|
||||||
//glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
|
//glm::vec3 vectorInterpolation(glm::vec3 prev, glm::vec3 next, double currentTime);
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T vectorInterpolation(T prev, T next, double currentTime)
|
T vectorInterpolation(T prev, T next, double currentTime)
|
||||||
{
|
{
|
||||||
T difference = next - prev;
|
T difference = next - prev;
|
||||||
T vector = (difference / SNAPSHOTINTERVAL) * static_cast<float>(currentTime);
|
T vector = (difference / m_SnapshotInterval) * static_cast<float>(currentTime);
|
||||||
return vector;
|
return vector;
|
||||||
}
|
}
|
||||||
|
float m_SnapshotInterval;
|
||||||
|
|
||||||
EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate;
|
EventRelay<InterpolationSystem, Events::Interpolate> m_EInterpolate;
|
||||||
bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e);
|
bool InterpolationSystem::OnInterpolate(const Events::Interpolate& e);
|
||||||
|
EventRelay<InterpolationSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#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,41 @@
|
|||||||
|
#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 "Core/EPlayerSpawned.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:
|
||||||
|
IRenderer* m_Renderer;
|
||||||
|
|
||||||
|
// State
|
||||||
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
|
|
||||||
|
// Events
|
||||||
|
EventRelay<WeaponSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
|
bool WeaponSystem::OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
|
||||||
|
#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
|
||||||
|
|||||||
@@ -21,4 +21,5 @@ F1=ToggleEditor
|
|||||||
X=EditorToggleTransformSpace
|
X=EditorToggleTransformSpace
|
||||||
C=ConnectToServer
|
C=ConnectToServer
|
||||||
N=SwitchToServer
|
N=SwitchToServer
|
||||||
M=SwitchToClient
|
M=SwitchToClient
|
||||||
|
P=SwitchToPlayer
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
<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"/>
|
||||||
@@ -20,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,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>
|
||||||
@@ -9,11 +9,8 @@
|
|||||||
</xs:annotation>
|
</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"/>
|
||||||
|
|||||||
@@ -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,273 @@
|
|||||||
|
<?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:Camera/>
|
||||||
|
<c:Listener/>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="4.52910185" Y="5.50171423" Z="7.69566345"/>
|
||||||
|
<Orientation X="-0.453785568" Y="0.436270237" Z="-1.03594937e-06"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>models/dummyscene.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="-0" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>models/animtest.</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-0.0966923237" Y="1.2939688" Z="0.399702221"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>models/animTest.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1.31816244" Z="1.1888907"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>models/animTest.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0.708824873" Y="1.30000007" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:Model>
|
||||||
|
<Resource>models/animTest.mesh</Resource>
|
||||||
|
</c:Model>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.36948848" Y="1.20000005" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:DirectionalLight>
|
||||||
|
<Intensity>0.13000047206878662</Intensity>
|
||||||
|
</c:DirectionalLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="2.77622533" Z="0"/>
|
||||||
|
<Orientation X="0" Y="1.30900002" Z="1.73600006"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:RaptorCopter>
|
||||||
|
<Speed>0.30000001192092896</Speed>
|
||||||
|
<Axis X="0" Y="5" Z="0"/>
|
||||||
|
</c:RaptorCopter>
|
||||||
|
<c:Transform>
|
||||||
|
<Orientation X="117.03714" Y="3023.50244" Z="3.03297734"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1" Z="1.29999995"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0" G="1" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
<Intensity>0.80000001192092896</Intensity>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="1" Z="-1.29999995"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="1" G="0" R="0.478431374"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-1.30000007" Y="1" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="1.29999995" Y="1" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:RaptorCopter>
|
||||||
|
<Speed>0.50999981164932251</Speed>
|
||||||
|
<Axis X="0" Y="1" Z="0"/>
|
||||||
|
</c:RaptorCopter>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="-0.100000001" Z="0"/>
|
||||||
|
<Orientation X="0" Y="191.457993" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0.301960796" G="0.0901960805" R="0.247058824"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
<Intensity>5</Intensity>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="3" Z="5"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0.960784316" G="1" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="3" Z="-7.66608238"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0.00784313772" G="1" R="1"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-3.47176075" Y="3" Z="-8.09415054"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0" G="0" R="1"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-9.50536728" Y="2" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="1" G="0" R="1"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="3" Z="4.40877533"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0.431372553" G="0.0745098069" R="1"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="5.83008432" Y="3" Z="0"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0" G="0.623529434" R="0.929411769"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="3.72500014" Y="3" Z="-4.26100016"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="0" Y="3" Z="-7.50000048"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
<Entity>
|
||||||
|
<Components>
|
||||||
|
<c:PointLight>
|
||||||
|
<Color A="1" B="0.192156866" G="1" R="0"/>
|
||||||
|
<Radius>5</Radius>
|
||||||
|
</c:PointLight>
|
||||||
|
<c:Transform>
|
||||||
|
<Position X="-5.90153885" Y="3" Z="-5.40681458"/>
|
||||||
|
</c:Transform>
|
||||||
|
</Components>
|
||||||
|
<Children/>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
</Entity>
|
||||||
|
</Children>
|
||||||
|
|
||||||
|
</Entity>
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/DummyScene.obj</Resource>
|
<Resource>../assets/Models/DummyScene.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<HomePointForTeam>3</HomePointForTeam>
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.200000003" R="0"/>
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<CapturePointNumber>1</CapturePointNumber>
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="1" R="1"/>
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
<CapturePointNumber>2</CapturePointNumber>
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="1" R="0"/>
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
<CapturePointNumber>3</CapturePointNumber>
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/DummyScene.obj</Resource>
|
<Resource>../assets/Models/DummyScene.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<CaptureTimer>6.9158446328696002</CaptureTimer>
|
<CaptureTimer>6.9158446328696002</CaptureTimer>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="1" R="1"/>
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -63,7 +63,7 @@
|
|||||||
<CapturePointNumber>1</CapturePointNumber>
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="1" R="0"/>
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
<CapturePointNumber>2</CapturePointNumber>
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
<CapturePointNumber>3</CapturePointNumber>
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/DummyScene.obj</Resource>
|
<Resource>../assets/Models/DummyScene.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<HomePointForTeam>3</HomePointForTeam>
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.200000003" R="0"/>
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<CapturePointNumber>1</CapturePointNumber>
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="1" R="0"/>
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team/>
|
<c:Team/>
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
<CapturePointNumber>2</CapturePointNumber>
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="1" R="1"/>
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team/>
|
<c:Team/>
|
||||||
@@ -98,7 +98,7 @@
|
|||||||
<CapturePointNumber>3</CapturePointNumber>
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<Entity>
|
<Entity>
|
||||||
<Components>
|
<Components>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/DummyScene.obj</Resource>
|
<Resource>../assets/Models/DummyScene.mesh</Resource>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Transform/>
|
<c:Transform/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<HomePointForTeam>3</HomePointForTeam>
|
<HomePointForTeam>3</HomePointForTeam>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.200000003" R="0"/>
|
<Color A="1" B="1" G="0.200000003" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<CapturePointNumber>1</CapturePointNumber>
|
<CapturePointNumber>1</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="1" R="1"/>
|
<Color A="1" B="0" G="1" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
<CapturePointNumber>2</CapturePointNumber>
|
<CapturePointNumber>2</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="1" G="1" R="0"/>
|
<Color A="1" B="1" G="1" R="0"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
<CapturePointNumber>3</CapturePointNumber>
|
<CapturePointNumber>3</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
<CapturePointNumber>4</CapturePointNumber>
|
<CapturePointNumber>4</CapturePointNumber>
|
||||||
</c:CapturePoint>
|
</c:CapturePoint>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitSphere.obj</Resource>
|
<Resource>../assets/Models/Core/UnitSphere.mesh</Resource>
|
||||||
<Color A="1" B="0" G="0.200000003" R="1"/>
|
<Color A="1" B="0" G="0.200000003" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Team>
|
<c:Team>
|
||||||
@@ -140,7 +140,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -158,7 +158,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
<Color A="1" B="0.482352942" G="0.490196079" R="1"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
@@ -194,7 +194,7 @@
|
|||||||
<c:Health/>
|
<c:Health/>
|
||||||
<c:AABB/>
|
<c:AABB/>
|
||||||
<c:Model>
|
<c:Model>
|
||||||
<Resource>../assets/Models/Core/UnitCube.obj</Resource>
|
<Resource>../assets/Models/Core/UnitCube.mesh</Resource>
|
||||||
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
<Color A="1" B="1" G="0.196078435" R="0.196078435"/>
|
||||||
</c:Model>
|
</c:Model>
|
||||||
<c:Player/>
|
<c:Player/>
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user