Compare commits
149 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0516794db6 | |||
| 4bd2e7995a | |||
| 799fd31844 | |||
| 45bfc374de | |||
| 95f9065037 | |||
| 993e56ec59 | |||
| a1fda82d3a | |||
| f6113b9d9c | |||
| 7ea90bede7 | |||
| 2bfbd72189 | |||
| 1e7f6941ba | |||
| 8c90c39680 | |||
| 91bad517d3 | |||
| ba93ebbe88 | |||
| a3b3351e55 | |||
| ce0d3b9fbe | |||
| 674604d0df | |||
| 8e9ddc7b9d | |||
| 36b84f7cc3 | |||
| beee2db5fb | |||
| 1bc4b89a53 | |||
| cc10e5500b | |||
| 068e151741 | |||
| e7a3793486 | |||
| 9bac141a6b | |||
| eb5fcd6d19 | |||
| 9942747d41 | |||
| 24bb05ec67 | |||
| df7b4faf24 | |||
| 01db8e0615 | |||
| 5baac926aa | |||
| ee5c13d463 | |||
| 671079764e | |||
| 9b98bbbea8 | |||
| 80649ce51d | |||
| a4b0b108d4 | |||
| 28d576bfc0 | |||
| 66d0f9fa47 | |||
| dc09ba9158 | |||
| 157a54e845 | |||
| 7759af2c5a | |||
| ac096bbf77 | |||
| 81634578d9 | |||
| 2f61171d16 | |||
| aa16a15693 | |||
| 26337ff243 | |||
| 7bdb0d410f | |||
| 172fb8dfc2 | |||
| 0ca627eb8b | |||
| 530c0fd9b0 | |||
| 4df936ca70 | |||
| f036817c0c | |||
| e45d0e8232 | |||
| 8ebf818c19 | |||
| 62d1cb9a69 | |||
| edb305b307 | |||
| 0aedeb61b4 | |||
| 44398eac58 | |||
| 06bddd9d54 | |||
| 4937bee46a | |||
| bb0531a459 | |||
| 8bd38bc465 | |||
| 8ceaae995d | |||
| 5f959ded89 | |||
| 0fbc482f9c | |||
| 2eb863757b | |||
| 91aedcbb14 | |||
| cac0522ae7 | |||
| 26dde21e3d | |||
| 23e6a15c7f | |||
| e96ad44e44 | |||
| a3ab844cc4 | |||
| 03493df213 | |||
| 7febb7681c | |||
| e000408593 | |||
| 33627f917c | |||
| 0869afd529 | |||
| 56a13d03fc | |||
| dad18a200f | |||
| dab58e09a0 | |||
| cd6967b310 | |||
| 937bf823f3 | |||
| e35b09cc68 | |||
| b172526e62 | |||
| ab70aed840 | |||
| d6e3a47182 | |||
| 038a706e28 | |||
| f9808a61f7 | |||
| a8a4b5d2a2 | |||
| b094b9feca | |||
| 67dfbfff01 | |||
| bdcb33d992 | |||
| 6c072aae45 | |||
| 68634126e5 | |||
| a0d60160dd | |||
| 15c54d2be6 | |||
| e444a86ec5 | |||
| 8a8c375d3a | |||
| 981dc3467e | |||
| 42af029a26 | |||
| 37355b1afc | |||
| 2e5dfc609a | |||
| 8936b3d6c3 | |||
| ad49af2f8c | |||
| 5a7034dfcd | |||
| 9721cb6a7d | |||
| c36c7d1ea6 | |||
| 3209e36176 | |||
| 8a3564ad49 | |||
| 9581e9ac84 | |||
| ba6d2b758d | |||
| 12dd1d21de | |||
| e0de91cce3 | |||
| b7d93058b1 | |||
| ab2b28264f | |||
| 7ced9e6767 | |||
| 5d53fc74cb | |||
| ecc8d998cf | |||
| e3c0fb2178 | |||
| 090bd806ce | |||
| 3828616b60 | |||
| 9cbc582be2 | |||
| ec3ed1f46f | |||
| 68a88ed756 | |||
| ee99821164 | |||
| 9cc8124847 | |||
| 078d6eb712 | |||
| a369c26a28 | |||
| 53ea5bd37d | |||
| 243276707a | |||
| 16124b7aa7 | |||
| a7c57da2c9 | |||
| 1227a795d7 | |||
| 1cc92f4800 | |||
| 3613d66d32 | |||
| 20c6caa408 | |||
| b7fac7103d | |||
| 0cf92e99ff | |||
| 3ba73b8206 | |||
| d3ffb9768b | |||
| fcf5117952 | |||
| 2c56b03b2b | |||
| 4fd578c764 | |||
| 67dffafe5a | |||
| 7dbb9e452b | |||
| cf3d1b5b00 | |||
| 9783f9c650 | |||
| f72dea3852 | |||
| fb80d088e4 |
+1
-1
Submodule assets updated: 007b54bd67...bc6e7df04c
@@ -12,7 +12,7 @@
|
||||
#include "../Core/AABB.h"
|
||||
#include "Rendering/RawModelCustom.h"
|
||||
//#include "Rendering/RawModelAssimp.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "../Core/Entity.h"
|
||||
#include "../Core/EntityWrapper.h"
|
||||
#include "EntityAABB.h"
|
||||
@@ -48,13 +48,13 @@ bool RayVsTriangle(const Ray& ray,
|
||||
bool trueOnNegativeDistance = false);
|
||||
//Return true if the ray hits any of the triangles in the model. Stops checking when a hit is detected.
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix);
|
||||
//Return true if the ray hits any of the triangles in the model.
|
||||
//Also returns the position of the intersection point. Will loop through all the whole model indices.
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& outHitPosition);
|
||||
@@ -62,7 +62,7 @@ bool RayVsModel(const Ray& ray,
|
||||
//Also returns the distance from the ray origin to the closest
|
||||
//intersection point, and the barycentric u,v-coordinates. Will loop through all the whole model indices.
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
float& outDistance,
|
||||
@@ -70,7 +70,7 @@ bool RayVsModel(const Ray& ray,
|
||||
float& outVCoord);
|
||||
|
||||
bool AABBvsTriangles(const AABB& box,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& boxVelocity,
|
||||
@@ -80,7 +80,19 @@ bool AABBvsTriangles(const AABB& box,
|
||||
|
||||
//Detects collision, but does not resolve.
|
||||
bool AABBvsTriangles(const AABB& box,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix);
|
||||
|
||||
enum Output
|
||||
{
|
||||
OutContained,
|
||||
OutSeparated,
|
||||
OutIntersecting
|
||||
};
|
||||
//Detects intersection and containment.
|
||||
Output AABBvsTrianglesWContainment(const AABB& box,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix);
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define ComponentInfo_h__
|
||||
|
||||
#include "../Common.h"
|
||||
#include "Entity.h"
|
||||
#include <boost/shared_array.hpp>
|
||||
|
||||
struct ComponentInfo
|
||||
@@ -21,6 +22,7 @@ struct ComponentInfo
|
||||
{
|
||||
std::string Name;
|
||||
std::string Type;
|
||||
unsigned char Index;
|
||||
unsigned int Offset;
|
||||
unsigned int Stride;
|
||||
};
|
||||
@@ -32,6 +34,16 @@ struct ComponentInfo
|
||||
unsigned int Stride = 0;
|
||||
boost::shared_array<char> Defaults = nullptr;
|
||||
std::shared_ptr<Meta_t> Meta = nullptr;
|
||||
|
||||
std::size_t GetHeaderSize() const
|
||||
{
|
||||
std::size_t size = 0;
|
||||
|
||||
// A component block starts with an entity ID
|
||||
size += sizeof(EntityID);
|
||||
|
||||
return size;
|
||||
}
|
||||
};
|
||||
|
||||
template<>
|
||||
|
||||
@@ -5,16 +5,15 @@
|
||||
#include "MemoryPool.h"
|
||||
#include "ComponentInfo.h"
|
||||
#include "ComponentWrapper.h"
|
||||
#include "DirtySet.h"
|
||||
|
||||
|
||||
class ComponentPool;
|
||||
class ComponentPoolForwardIterator
|
||||
: public std::iterator<std::forward_iterator_tag, ComponentWrapper>
|
||||
{
|
||||
public:
|
||||
ComponentPoolForwardIterator(const ComponentInfo& componentInfo, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end)
|
||||
: m_ComponentInfo(componentInfo)
|
||||
, m_MemoryPoolIterator(begin)
|
||||
, m_MemoryPoolEnd(end)
|
||||
{ }
|
||||
ComponentPoolForwardIterator(ComponentPool* pool, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end);
|
||||
|
||||
ComponentPoolForwardIterator(const ComponentPoolForwardIterator& other) = default;
|
||||
ComponentPoolForwardIterator(ComponentPoolForwardIterator&& other) = default;
|
||||
@@ -27,6 +26,7 @@ public:
|
||||
ComponentWrapper operator*() const;
|
||||
|
||||
private:
|
||||
ComponentPool* m_ComponentPool;
|
||||
const ComponentInfo& m_ComponentInfo;
|
||||
MemoryPool<char>::iterator m_MemoryPoolIterator;
|
||||
const MemoryPool<char>::iterator m_MemoryPoolEnd;
|
||||
@@ -34,6 +34,7 @@ private:
|
||||
|
||||
class ComponentPool
|
||||
{
|
||||
friend class ComponentPoolForwardIterator;
|
||||
public:
|
||||
typedef ComponentPoolForwardIterator iterator;
|
||||
typedef ptrdiff_t difference_type;
|
||||
@@ -42,9 +43,10 @@ public:
|
||||
typedef ComponentWrapper* pointer;
|
||||
typedef ComponentWrapper& reference;
|
||||
|
||||
ComponentPool(const ::ComponentInfo& ci)
|
||||
ComponentPool(const ::ComponentInfo& ci, World* world)
|
||||
: m_ComponentInfo(ci)
|
||||
, m_Pool(ci.Meta->Allocation, sizeof(EntityID) + ci.Stride)
|
||||
, m_Pool(ci.Meta->Allocation, ci.GetHeaderSize() + ci.Stride)
|
||||
, m_World(world)
|
||||
{ }
|
||||
~ComponentPool();
|
||||
ComponentPool(const ComponentPool& other);
|
||||
@@ -61,8 +63,8 @@ public:
|
||||
// Delete a component and free its memory
|
||||
void Delete(ComponentWrapper& wrapper);
|
||||
|
||||
iterator begin() const;
|
||||
iterator end() const;
|
||||
iterator begin();
|
||||
iterator end();
|
||||
size_t size() const;
|
||||
|
||||
//Dumps information about what the pool memory looks like right now
|
||||
@@ -80,6 +82,8 @@ private:
|
||||
::ComponentInfo m_ComponentInfo;
|
||||
MemoryPool<char> m_Pool;
|
||||
std::unordered_map<EntityID, char*> m_EntityToComponent;
|
||||
DirtySet m_DirtySet;
|
||||
World* m_World;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -4,46 +4,32 @@
|
||||
#include <boost/shared_array.hpp>
|
||||
#include <boost/any.hpp>
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "Entity.h"
|
||||
#include "ComponentInfo.h"
|
||||
#include "DirtySet.h"
|
||||
#include "Util/Any.h"
|
||||
|
||||
template <typename T, typename Enable = void>
|
||||
struct ComponentField { };
|
||||
|
||||
template <typename T>
|
||||
struct ComponentField<T, typename std::enable_if<std::is_trivially_copyable<T>::value>::type>
|
||||
{
|
||||
static T& Get(const ComponentInfo::Field_t& info, char* data) { return *reinterpret_cast<T*>(data); }
|
||||
static void Set(const ComponentInfo::Field_t& info, char* data, const T& value) { Get(data) = value; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ComponentField<std::string, void>
|
||||
{
|
||||
static std::string& Get(const ComponentInfo::Field_t& info, char* data) { return **reinterpret_cast<std::string**>(data); }
|
||||
static void Set(const ComponentInfo::Field_t& info, char* data, const std::string& value) { Get(info, data) = value; }
|
||||
};
|
||||
class World;
|
||||
|
||||
struct ComponentWrapper
|
||||
{
|
||||
ComponentWrapper(const ComponentInfo& componentInfo, char* data)
|
||||
: Info(componentInfo)
|
||||
, EntityID(*reinterpret_cast<::EntityID*>(data))
|
||||
, Data(data + sizeof(::EntityID))
|
||||
{ }
|
||||
ComponentWrapper(const ComponentInfo& componentInfo, char* data, ::DirtyBitField* dirtyBitField, World* world);
|
||||
|
||||
World* m_World;
|
||||
const ComponentInfo& Info;
|
||||
const ::EntityID EntityID;
|
||||
char* Data;
|
||||
::DirtyBitField* DirtyBitField = nullptr;
|
||||
|
||||
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey)
|
||||
{
|
||||
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
|
||||
}
|
||||
ComponentInfo::EnumType Enum(const char* fieldName, const char* enumKey);
|
||||
|
||||
bool Dirty(DirtySetType type, const std::string& fieldName);
|
||||
void SetDirty(DirtySetType type, const std::string& fieldName, bool dirty = true);
|
||||
void SetAllDirty(const std::string& fieldName, bool dirty = true);
|
||||
|
||||
template <typename T>
|
||||
T& Field(std::string name)
|
||||
T& Field(const std::string& name)
|
||||
{
|
||||
const ComponentInfo::Field_t& field = Info.Fields.at(name);
|
||||
if (sizeof(T) > field.Stride) {
|
||||
@@ -55,13 +41,15 @@ struct ComponentWrapper
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void SetField(std::string name, const T value) { Field<T>(name) = value; }
|
||||
//template <typename T>
|
||||
//void SetField(std::string name, T& value) { Field<T>(name) = value; }
|
||||
void SetField(const std::string& name, const T& value)
|
||||
{
|
||||
Field<T>(name) = value;
|
||||
SetAllDirty(name);
|
||||
}
|
||||
|
||||
// Specialization for string literals
|
||||
template <std::size_t N>
|
||||
void SetField(std::string name, const char(&value)[N]) { Field<std::string>(name) = std::string(value); }
|
||||
void SetField(const std::string& name, const char(&value)[N]) { SetField(name, std::string(value)); }
|
||||
|
||||
void Copy(ComponentWrapper& destination)
|
||||
{
|
||||
@@ -95,40 +83,163 @@ struct ComponentWrapper
|
||||
struct SubscriptProxy
|
||||
{
|
||||
friend struct ComponentWrapper;
|
||||
private:
|
||||
SubscriptProxy(ComponentWrapper* component, std::string propertyName)
|
||||
|
||||
public:
|
||||
SubscriptProxy(ComponentWrapper* component, std::string fieldName)
|
||||
: m_Component(component)
|
||||
, m_PropertyName(propertyName)
|
||||
, m_FieldName(fieldName)
|
||||
{ }
|
||||
|
||||
ComponentWrapper* m_Component;
|
||||
std::string m_PropertyName;
|
||||
std::string m_FieldName;
|
||||
|
||||
public:
|
||||
// Return the integer value of an enum type key for this field
|
||||
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_PropertyName.c_str(), enumKey); }
|
||||
ComponentInfo::EnumType Enum(const char* enumKey) { return m_Component->Enum(m_FieldName.c_str(), enumKey); }
|
||||
bool Dirty(DirtySetType type) { return m_Component->Dirty(type, m_FieldName); }
|
||||
void SetDirty(DirtySetType type, bool dirty = true) { m_Component->SetDirty(type, m_FieldName, dirty); }
|
||||
void SetAllDirty(bool dirty = true) { m_Component->SetAllDirty(m_FieldName, dirty); }
|
||||
|
||||
template <typename T>
|
||||
operator T&() { return m_Component->Field<T>(m_PropertyName); }
|
||||
operator const double&() { return m_Component->Field<double>(m_FieldName); }
|
||||
operator const float&() { return m_Component->Field<float>(m_FieldName); }
|
||||
operator const int&() { return m_Component->Field<int>(m_FieldName); }
|
||||
operator const glm::vec3&() { return m_Component->Field<glm::vec3>(m_FieldName); }
|
||||
operator const glm::vec4&() { return m_Component->Field<glm::vec4>(m_FieldName); }
|
||||
operator const glm::quat&() { return m_Component->Field<glm::quat>(m_FieldName); }
|
||||
operator const bool&() { return m_Component->Field<bool>(m_FieldName); }
|
||||
operator const std::string&() { return m_Component->Field<std::string>(m_FieldName); }
|
||||
|
||||
// Don't allow non-const references
|
||||
// If this wasn't deleted, the above overloads would still get called for some reason...
|
||||
template <
|
||||
typename T,
|
||||
typename = typename std::enable_if<!std::is_base_of<::FIELDLOL, T>::value>::type
|
||||
>
|
||||
//operator T&() = delete;
|
||||
operator T&() { static_assert(constexpr(false), "https://github.com/teamfisk/TacticalZ/pull/212"); }
|
||||
|
||||
// Value assignment
|
||||
template <typename T>
|
||||
void operator=(const T val) { m_Component->SetField<T>(m_PropertyName, val); }
|
||||
// TODO: Pass by reference and rvalue (universal reference?)
|
||||
//template <typename T>
|
||||
//void operator=(T& val) { m_Component->SetField<T>(m_PropertyName, val); }
|
||||
void operator=(const T& val) { m_Component->SetField<T>(m_FieldName, val); }
|
||||
|
||||
// Specialization for string literals
|
||||
template <std::size_t N>
|
||||
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_PropertyName, val); }
|
||||
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_FieldName, val); }
|
||||
};
|
||||
SubscriptProxy operator[](std::string propertyName) { return SubscriptProxy(this, propertyName); }
|
||||
SubscriptProxy operator[](const std::string& propertyName) { return SubscriptProxy(this, propertyName); }
|
||||
};
|
||||
|
||||
struct FIELDLOL { }; // lol
|
||||
|
||||
template <typename T>
|
||||
struct FieldBase : FIELDLOL
|
||||
{
|
||||
FieldBase(ComponentWrapper::SubscriptProxy& Proxy)
|
||||
: Proxy(Proxy)
|
||||
, Data(Proxy.m_Component->Field<T>(Proxy.m_FieldName))
|
||||
{ }
|
||||
|
||||
void SetAllDirty() { Proxy.SetAllDirty(); }
|
||||
|
||||
FieldBase& operator=(const FieldBase& rhs) { Data = rhs.Data; SetAllDirty(); return *this; }
|
||||
FieldBase& operator=(const T& rhs) { Data = rhs; SetAllDirty(); return *this; }
|
||||
|
||||
template <typename T2> FieldBase& operator+=(const T2& rhs) { Data += rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator-=(const T2& rhs) { Data -= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator*=(const T2& rhs) { Data *= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator/=(const T2& rhs) { Data /= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator%=(const T2& rhs) { Data %= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator&=(const T2& rhs) { Data &= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator|=(const T2& rhs) { Data |= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator^=(const T2& rhs) { Data ^= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator<<=(const T2& rhs) { Data <<= rhs; SetAllDirty(); return *this; }
|
||||
template <typename T2> FieldBase& operator>>=(const T2& rhs) { Data >>= rhs; SetAllDirty(); return *this; }
|
||||
|
||||
T operator+() const { return +Data; }
|
||||
T operator-() const { return -Data; }
|
||||
T operator~() const { return ~Data; }
|
||||
|
||||
FieldBase& operator++() { Data++; SetAllDirty(); return *this; }
|
||||
T operator++(int) { T tmp = Data; operator++(); return tmp; }
|
||||
FieldBase& operator--() { Data--; SetAllDirty(); return *this; }
|
||||
T operator--(int) { T tmp = Data; operator--(); return tmp; }
|
||||
|
||||
operator const T&() const { return Data; }
|
||||
const T& operator*() const { return operator const T&(); }
|
||||
|
||||
protected:
|
||||
ComponentWrapper::SubscriptProxy Proxy;
|
||||
T& Data;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct Field : FieldBase<T>
|
||||
{
|
||||
using FieldBase<T>::FieldBase;
|
||||
using FieldBase<T>::operator=;
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Field<glm::vec3> : FieldBase<glm::vec3>
|
||||
{
|
||||
using FieldBase<glm::vec3>::FieldBase;
|
||||
using FieldBase<glm::vec3>::operator=;
|
||||
|
||||
glm::vec3::value_type x() const { return Data.x; }
|
||||
void x(glm::vec3::value_type val) { Data.x = val; SetAllDirty(); }
|
||||
glm::vec3::value_type y() const { return Data.y; }
|
||||
void y(glm::vec3::value_type val) { Data.y = val; SetAllDirty(); }
|
||||
glm::vec3::value_type z() const { return Data.z; }
|
||||
void z(glm::vec3::value_type val) { Data.z = val; SetAllDirty(); }
|
||||
|
||||
template <typename T> friend glm::vec3 operator+(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) + glm::vec3(rhs); }
|
||||
template <typename T> friend glm::vec3 operator-(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) - glm::vec3(rhs); }
|
||||
template <typename T> friend glm::vec3 operator*(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) * glm::vec3(rhs); }
|
||||
template <typename T> friend glm::vec3 operator/(const Field<glm::vec3>& lhs, const T& rhs) { return static_cast<glm::vec3>(lhs) / glm::vec3(rhs); }
|
||||
template <typename T> friend glm::vec3 operator+(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) + static_cast<glm::vec3>(rhs); }
|
||||
template <typename T> friend glm::vec3 operator-(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) - static_cast<glm::vec3>(rhs); }
|
||||
template <typename T> friend glm::vec3 operator*(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) * static_cast<glm::vec3>(rhs); }
|
||||
template <typename T> friend glm::vec3 operator/(const T& lhs, const Field<glm::vec3>& rhs) { return glm::vec3(lhs) / static_cast<glm::vec3>(rhs); }
|
||||
|
||||
friend glm::vec3& operator+=(glm::vec3& lhs, const Field<glm::vec3>& rhs) { lhs += *rhs; return lhs; }
|
||||
};
|
||||
|
||||
template <>
|
||||
struct Field<glm::vec4> : FieldBase<glm::vec4>
|
||||
{
|
||||
//Field(glm::vec4& Data)
|
||||
// : FieldBase(Data)
|
||||
//{ }
|
||||
using FieldBase<glm::vec4>::FieldBase;
|
||||
using FieldBase<glm::vec4>::operator=;
|
||||
|
||||
glm::vec4::value_type x() const { return Data.x; }
|
||||
void x(glm::vec4::value_type val) { Data.x = val; SetAllDirty(); }
|
||||
glm::vec4::value_type y() const { return Data.y; }
|
||||
void y(glm::vec4::value_type val) { Data.y = val; SetAllDirty(); }
|
||||
glm::vec4::value_type z() const { return Data.z; }
|
||||
void z(glm::vec4::value_type val) { Data.z = val; SetAllDirty(); }
|
||||
glm::vec4::value_type w() const { return Data.w; }
|
||||
void w(glm::vec4::value_type val) { Data.w = val; SetAllDirty(); }
|
||||
|
||||
template <typename T> friend glm::vec4 operator+(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) + glm::vec4(rhs); }
|
||||
template <typename T> friend glm::vec4 operator-(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) - glm::vec4(rhs); }
|
||||
template <typename T> friend glm::vec4 operator*(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) * glm::vec4(rhs); }
|
||||
template <typename T> friend glm::vec4 operator/(const Field<glm::vec4>& lhs, const T& rhs) { return static_cast<glm::vec4>(lhs) / glm::vec4(rhs); }
|
||||
template <typename T> friend glm::vec4 operator+(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) + static_cast<glm::vec4>(rhs); }
|
||||
template <typename T> friend glm::vec4 operator-(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) - static_cast<glm::vec4>(rhs); }
|
||||
template <typename T> friend glm::vec4 operator*(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) * static_cast<glm::vec4>(rhs); }
|
||||
template <typename T> friend glm::vec4 operator/(const T& lhs, const Field<glm::vec4>& rhs) { return glm::vec4(lhs) / static_cast<glm::vec4>(rhs); }
|
||||
|
||||
friend glm::vec4& operator+=(glm::vec4& lhs, const Field<glm::vec4>& rhs) { lhs += *rhs; return lhs; }
|
||||
};
|
||||
|
||||
|
||||
// A component wrapper that "owns" its data through a shared pointer
|
||||
struct SharedComponentWrapper : ComponentWrapper
|
||||
{
|
||||
SharedComponentWrapper(const ComponentInfo& componentInfo, boost::shared_array<char> data)
|
||||
: ComponentWrapper(componentInfo, data.get())
|
||||
: ComponentWrapper(componentInfo, data.get(), nullptr, nullptr)
|
||||
, m_DataReference(data)
|
||||
{ }
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef DirtySet_h__
|
||||
#define DirtySet_h__
|
||||
|
||||
#include <set>
|
||||
#include "ComponentInfo.h"
|
||||
|
||||
enum class DirtySetType
|
||||
{
|
||||
Transform,
|
||||
Network
|
||||
};
|
||||
|
||||
typedef std::unordered_map<DirtySetType, std::set<decltype(ComponentInfo::Field_t::Index)>> DirtyBitField;
|
||||
typedef std::unordered_map<EntityID, DirtyBitField> DirtySet;
|
||||
|
||||
#endif
|
||||
@@ -2,14 +2,14 @@
|
||||
#define EEntityDeleted_h__
|
||||
|
||||
#include "Event.h"
|
||||
#include "Entity.h"
|
||||
#include "EntityWrapper.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct EntityDeleted : Event
|
||||
{
|
||||
EntityID DeletedEntity;
|
||||
EntityWrapper DeletedEntity;
|
||||
// True if the entity deletion was triggered because the entity's parent was deleted before it
|
||||
bool Cascaded;
|
||||
};
|
||||
|
||||
@@ -45,8 +45,9 @@ struct EntityWrapper
|
||||
|
||||
private:
|
||||
EntityWrapper firstChildByNameRecursive(const std::string& name, EntityID parent);
|
||||
EntityWrapper cloneRecursive(EntityWrapper entity, EntityWrapper parent);
|
||||
void childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent);
|
||||
static void fillRelationships(std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper entity);
|
||||
static void recreateRelationships(const std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper templateEntity, EntityWrapper parent = EntityWrapper::Invalid);
|
||||
};
|
||||
|
||||
namespace std
|
||||
|
||||
@@ -19,6 +19,7 @@ class Resource
|
||||
|
||||
protected:
|
||||
Resource() { }
|
||||
virtual ~Resource() = default;
|
||||
|
||||
public:
|
||||
//Should be thrown in a Resource's constructor if it cannot complete because another resource is still loading.
|
||||
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
for (auto& pair : group.PureSystems) {
|
||||
const std::string& componentName = pair.first;
|
||||
auto& systems = pair.second;
|
||||
const ComponentPool* pool = m_World->GetComponents(componentName);
|
||||
ComponentPool* pool = m_World->GetComponents(componentName);
|
||||
if (pool == nullptr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
#ifndef Transform_h__
|
||||
#define Transform_h__
|
||||
|
||||
#include "../GLM.h"
|
||||
#include "World.h"
|
||||
#include "EntityWrapper.h"
|
||||
|
||||
namespace Transform
|
||||
{
|
||||
|
||||
glm::mat4 AbsoluteTransformation(EntityWrapper entity);
|
||||
glm::vec3 AbsolutePosition(EntityWrapper entity);
|
||||
glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
||||
glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
|
||||
glm::quat AbsoluteOrientation(EntityWrapper entity);
|
||||
glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
||||
glm::vec3 AbsoluteScale(EntityWrapper entity);
|
||||
glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
||||
glm::mat4 ModelMatrix(EntityWrapper entity);
|
||||
glm::mat4 ModelMatrix(EntityID entity, World* world);
|
||||
glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,39 @@
|
||||
#ifndef Transform_h__
|
||||
#define Transform_h__
|
||||
|
||||
#include "../GLM.h"
|
||||
#include "System.h"
|
||||
#include "EEntityDeleted.h"
|
||||
|
||||
class TransformSystem : public System
|
||||
{
|
||||
public:
|
||||
TransformSystem(SystemParams params);
|
||||
|
||||
//glm::mat4 AbsoluteTransformation(EntityWrapper entity);
|
||||
static glm::vec3 AbsolutePosition(EntityWrapper entity);
|
||||
static glm::vec3 AbsolutePosition(World* world, EntityID entity);
|
||||
static glm::vec3 AbsoluteOrientationEuler(EntityWrapper entity);
|
||||
static glm::quat AbsoluteOrientation(EntityWrapper entity);
|
||||
static glm::quat AbsoluteOrientation(World* world, EntityID entity);
|
||||
static glm::vec3 AbsoluteScale(EntityWrapper entity);
|
||||
static glm::vec3 AbsoluteScale(World* world, EntityID entity);
|
||||
static glm::mat4 ModelMatrix(EntityWrapper entity);
|
||||
static glm::mat4 ModelMatrix(EntityID entity, World* world);
|
||||
static glm::vec3 TransformPoint(const glm::vec3& point, const glm::mat4& matrix);
|
||||
|
||||
static int RecalculatedPositions;
|
||||
static int RecalculatedOrientations;
|
||||
static int RecalculatedScales;
|
||||
|
||||
private:
|
||||
static std::unordered_map<EntityWrapper, glm::vec3> PositionCache;
|
||||
static std::unordered_map<EntityWrapper, glm::quat> OrientationCache;
|
||||
static std::unordered_map<EntityWrapper, glm::vec3> ScaleCache;
|
||||
static std::unordered_map<EntityWrapper, glm::mat4> MatrixCache;
|
||||
|
||||
EventRelay<TransformSystem, Events::EntityDeleted> m_EEntityDeleted;
|
||||
bool OnEntityDeleted(const Events::EntityDeleted& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -35,7 +35,7 @@ public:
|
||||
// Delete a component off an entity
|
||||
void DeleteComponent(EntityID entity, const std::string& componentType);
|
||||
// Get all components of the specified type
|
||||
const ComponentPool* GetComponents(const std::string& componentType);
|
||||
ComponentPool* GetComponents(const std::string& componentType);
|
||||
// Get entity parent
|
||||
EntityID GetParent(EntityID entity);
|
||||
// Change the parent of an entity
|
||||
|
||||
@@ -47,6 +47,7 @@ private:
|
||||
// Utility functions
|
||||
EntityWrapper importEntity(EntityWrapper parent, boost::filesystem::path filePath);
|
||||
void setWidgetMode(EditorGUI::WidgetMode mode);
|
||||
bool isAnyParentMissingTransform(EntityID entityID);
|
||||
|
||||
// GUI callbacks
|
||||
void OnEntitySelected(EntityWrapper entity);
|
||||
|
||||
@@ -19,6 +19,7 @@ public:
|
||||
virtual const glm::vec3 Rotation() const { return m_Rotation; }
|
||||
virtual bool Jumping() const { return m_Jumping; }
|
||||
virtual bool Crouching() const { return m_Crouching; }
|
||||
virtual bool CrouchingLastFrame() const { return m_CrouchingLastFrame; }
|
||||
virtual bool DoubleJumping() const { return m_DoubleJumping; }
|
||||
virtual void SetDoubleJumping(bool isDoubleJumping) {
|
||||
m_DoubleJumping = isDoubleJumping;
|
||||
@@ -29,7 +30,7 @@ public:
|
||||
virtual bool OnCommand(const Events::InputCommand& e) override;
|
||||
virtual void Reset();
|
||||
|
||||
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID);
|
||||
void AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID);
|
||||
virtual bool AssaultDashDoubleTapped() const { return m_AssaultDashDoubleTapped; }
|
||||
virtual bool PlayerIsDashing() const { return m_PlayerIsDashing; }
|
||||
bool SpecialAbilityKeyDown() const { return m_SpecialAbilityKeyDown; }
|
||||
@@ -44,6 +45,7 @@ protected:
|
||||
bool m_Jumping = false;
|
||||
bool m_DoubleJumping = false;
|
||||
bool m_Crouching = false;
|
||||
bool m_CrouchingLastFrame = false;
|
||||
//assault dash membervariables - needed to calculate the doubletap- and dashlogic
|
||||
double m_AssaultDashDoubleTapDeltaTime = 0.0;
|
||||
//i will let m_AssaultDashDoubleTapSensitivityTimer stay hardcoded, its not really a gamevariable (more an inputvariable),
|
||||
@@ -82,6 +84,7 @@ void FirstPersonInputController<EventContext>::Reset()
|
||||
{
|
||||
m_Rotation = glm::vec3(0.f, 0.f, 0.f);
|
||||
m_Jumping = false;
|
||||
m_CrouchingLastFrame = m_Crouching;
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
@@ -355,7 +358,7 @@ bool FirstPersonInputController<EventContext>::OnLockMouse(const Events::LockMou
|
||||
}
|
||||
|
||||
template <typename EventContext>
|
||||
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, double& assaultDashCoolDownTimer, EntityID playerID) {
|
||||
void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool isJumping, double assaultDashCoolDownMaxTimer, Field<double> assaultDashCoolDownTimer, EntityID playerID) {
|
||||
m_AssaultDashDoubleTapDeltaTime += dt;
|
||||
assaultDashCoolDownTimer -= dt;
|
||||
//cooldown = assaultDashCoolDownMaxTimer sec, pretend the dash lasts 0.25 sec (for friction to do its work)
|
||||
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
void Connect(std::string address, int port);
|
||||
void Update() override;
|
||||
private:
|
||||
//UDPClient m_Unreliable;
|
||||
UDPClient m_Unreliable;
|
||||
TCPClient m_Reliable;
|
||||
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
|
||||
void parseSpawnEvents();
|
||||
@@ -81,7 +81,7 @@ private:
|
||||
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||
|
||||
// Private member functions
|
||||
size_t receive(char* data);
|
||||
size_t receive(char* data);
|
||||
void disconnect();
|
||||
void parseMessageType(Packet& packet);
|
||||
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
|
||||
@@ -139,7 +139,7 @@ private:
|
||||
std::vector<ServerInfo> m_Serverlist;
|
||||
bool m_SearchingForServers = false;
|
||||
std::clock_t m_StartSearchTime;
|
||||
double m_SearchingTime = 2000; // Config I guess
|
||||
double m_SearchingTime = 200; // Config I guess
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -39,6 +39,7 @@ protected:
|
||||
void logReceivedData(int bytesReceived);
|
||||
void saveToFile();
|
||||
void updateNetworkData();
|
||||
void popNetworkSegmentOfHeader(Packet& packet);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -16,7 +16,9 @@ public:
|
||||
Packet(char* data, const size_t sizeOfPacket);
|
||||
Packet(MessageType type);
|
||||
~Packet();
|
||||
void Init(MessageType type, unsigned int& packetID);
|
||||
void Init(MessageType type, unsigned int& packetID,
|
||||
int groupIndex, int groupSize,
|
||||
int packetGroup);
|
||||
|
||||
// Add primitive types like int, float, char...
|
||||
template<typename T>
|
||||
@@ -25,7 +27,8 @@ public:
|
||||
// Check if we are trying to add more than the package can fit.
|
||||
if (m_MaxPacketSize < m_Offset + sizeof(T)) {
|
||||
if (m_MaxPacketSize >= 32000) {
|
||||
LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
|
||||
// This will spam couse 8 players are over 100 000 bytes
|
||||
//LOG_WARNING("Package::WritePrimitive(): New size is huge %i bytes\n", m_MaxPacketSize*2);
|
||||
}
|
||||
resizeData();
|
||||
}
|
||||
@@ -57,13 +60,19 @@ public:
|
||||
void UpdateSize();
|
||||
char* ReadData(int SizeOfData);
|
||||
void ChangePacketID(unsigned int& packetID);
|
||||
void ChangeGroupIndex(int groupIndex);
|
||||
void ChangeGroupSize(int groupSize);
|
||||
void ChangeGroup(int group);
|
||||
size_t Size() { return m_Offset; };
|
||||
char* Data() { return m_Data; };
|
||||
MessageType GetMessageType();
|
||||
size_t Group();
|
||||
size_t DataReadSize() { return m_ReturnDataOffset; }
|
||||
size_t MaxSize() { return m_MaxPacketSize; }
|
||||
size_t HeaderSize() { return m_HeaderSize; }
|
||||
|
||||
size_t GroupIndex();
|
||||
size_t GroupSize();
|
||||
size_t PacketID();
|
||||
private:
|
||||
char* m_Data;
|
||||
size_t m_ReturnDataOffset = 0;
|
||||
@@ -72,6 +81,13 @@ private:
|
||||
size_t m_HeaderSize = 0;
|
||||
void resizeData();
|
||||
void resizeData(int size);
|
||||
|
||||
size_t packetSizeOffset = 0;
|
||||
size_t groupOffset = 0;
|
||||
size_t groupIndexOffset = 0;
|
||||
size_t groupSizeOffset = 0;
|
||||
size_t messageTypeOffset = 0;
|
||||
size_t packetIDOffset = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -14,6 +14,7 @@ struct PlayerDefinition {
|
||||
unsigned short TCPPort;
|
||||
// use for tcp connections
|
||||
boost::shared_ptr<boost::asio::ip::tcp::socket> TCPSocket;
|
||||
int PacketGroup = 1;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -36,7 +36,7 @@ public:
|
||||
private:
|
||||
// Network channels
|
||||
TCPServer m_Reliable;
|
||||
//UDPServer m_Unreliable;
|
||||
UDPServer m_Unreliable;
|
||||
UDPServer m_ServerlistRequest;
|
||||
// dont forget to set these in the childrens receive logic
|
||||
boost::asio::ip::address m_Address;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#ifndef UDPClient_h__
|
||||
#define UDPClient_h__
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
|
||||
#include <boost/asio.hpp>
|
||||
#include "Network/NetworkClient.h"
|
||||
@@ -13,16 +15,27 @@ public:
|
||||
bool Connect(std::string playerName, std::string address, int port);
|
||||
void Disconnect();
|
||||
void Receive(Packet& packet);
|
||||
void Send(Packet & packet);
|
||||
void ReceivePackets();
|
||||
void Send(Packet& packet);
|
||||
void Broadcast(Packet& packet, int port);
|
||||
bool IsSocketAvailable();
|
||||
// Returns false if no packets are available
|
||||
bool GetNextPacket(Packet& packet);
|
||||
private:
|
||||
typedef std::map<unsigned int, std::vector<std::pair<int, boost::shared_ptr<char>>>> PacketMap;
|
||||
// Assio UDP logic
|
||||
boost::asio::io_service m_IOService;
|
||||
boost::asio::ip::udp::endpoint m_ReceiverEndpoint;
|
||||
boost::shared_ptr<boost::asio::ip::udp::socket> m_Socket;
|
||||
int m_LastReceivedSnapshotGroup = 0;
|
||||
int readBuffer();
|
||||
void readPartOfPacket();
|
||||
PacketID m_SendPacketID = 0;
|
||||
//map:(packetGroup, vector:(pair:(groupIndex, packetData)))
|
||||
PacketMap m_PacketSegmentMap;
|
||||
bool hasReceivedPacket(int packetGroup, int groupIndex);
|
||||
// 2^19
|
||||
const int m_SizeOfSocketBuffer = 524288;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "NetworkServer.h"
|
||||
#include <boost/asio/ip/udp.hpp>
|
||||
#define MAXPACKETSIZE 64000
|
||||
|
||||
class UDPServer : public NetworkServer
|
||||
{
|
||||
@@ -13,6 +14,7 @@ public:
|
||||
void AcceptNewConnections(int& nextPlayerID, std::map<PlayerID, PlayerDefinition>& connectedPlayers);
|
||||
void Receive(Packet & packet, PlayerDefinition & playerDefinition);
|
||||
void Send(Packet & packet, PlayerDefinition & playerDefinition);
|
||||
void SendToConnectedPlayers(Packet & packet, std::map<PlayerID, PlayerDefinition>& playersTosendTo);
|
||||
void Send(Packet & packet);
|
||||
void Send(Packet & packet, boost::asio::ip::udp::endpoint endpoint);
|
||||
void Broadcast(Packet & packet, int port);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "IRenderer.h"
|
||||
#include "ShaderProgram.h"
|
||||
#include "PNG.h"
|
||||
|
||||
class CubeMapPass
|
||||
{
|
||||
@@ -21,7 +22,7 @@ private:
|
||||
IRenderer* m_Renderer;
|
||||
std::string m_PreviusCubeMapTexture;
|
||||
|
||||
std::vector<Texture*> m_CubeMapTextures;
|
||||
std::vector<std::string> m_CubeMapTextures;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ComponentWrapper.h"
|
||||
#include "RenderJob.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "../Core/World.h"
|
||||
|
||||
struct DirectionalLightJob : RenderJob
|
||||
@@ -16,7 +16,7 @@ struct DirectionalLightJob : RenderJob
|
||||
: RenderJob()
|
||||
{
|
||||
|
||||
Direction = glm::vec4(0,0,-1,0) * glm::inverse(Transform::AbsoluteOrientation(m_World, transformComponent.EntityID));
|
||||
Direction = glm::vec4(0,0,-1,0) * glm::inverse(TransformSystem::AbsoluteOrientation(m_World, transformComponent.EntityID));
|
||||
//Direction = glm::vec4((glm::vec3)directionalLightComponent["Direction"], 0.f);
|
||||
Color = (glm::vec4)directionalLightComponent["Color"];
|
||||
Intensity = (double)directionalLightComponent["Intensity"];
|
||||
|
||||
@@ -18,15 +18,17 @@ struct ExplosionEffectJob : ModelJob
|
||||
ExplosionEffectJob(ComponentWrapper explosionEffectComponent, ::Model* model, Camera* camera, glm::mat4 matrix, ::RawModel::MaterialProperties matGroup, ComponentWrapper modelComponent, ::World* world, glm::vec4 fillColor, float fillPercentage, bool isShielded, bool shadow)
|
||||
: ModelJob(model, camera, matrix, matGroup, modelComponent, world, fillColor, fillPercentage, isShielded, shadow)
|
||||
{
|
||||
ExplosionOrigin = (glm::vec3)explosionEffectComponent["ExplosionOrigin"];
|
||||
TimeSinceDeath = (double)explosionEffectComponent["TimeSinceDeath"];
|
||||
ExplosionDuration = (double)explosionEffectComponent["ExplosionDuration"];
|
||||
EndColor = (glm::vec4)explosionEffectComponent["EndColor"];
|
||||
Randomness = (bool)explosionEffectComponent["Randomness"];
|
||||
RandomnessScalar = (double)explosionEffectComponent["RandomnessScalar"];
|
||||
Velocity = (glm::vec2)explosionEffectComponent["Velocity"];
|
||||
ColorByDistance = (bool)explosionEffectComponent["ColorByDistance"];
|
||||
ExponentialAccelaration = (bool)explosionEffectComponent["ExponentialAccelaration"];
|
||||
ExplosionOrigin = (Field<glm::vec3>)explosionEffectComponent["ExplosionOrigin"];
|
||||
TimeSinceDeath = (Field<double>)explosionEffectComponent["TimeSinceDeath"];
|
||||
ExplosionDuration = (Field<double>)explosionEffectComponent["ExplosionDuration"];
|
||||
EndColor = (Field<glm::vec4>)explosionEffectComponent["EndColor"];
|
||||
Randomness = (Field<bool>)explosionEffectComponent["Randomness"];
|
||||
RandomnessScalar = (Field<double>)explosionEffectComponent["RandomnessScalar"];
|
||||
Velocity = (Field<glm::vec2>)explosionEffectComponent["Velocity"];
|
||||
ColorByDistance = (Field<bool>)explosionEffectComponent["ColorByDistance"];
|
||||
ExponentialAccelaration = (Field<bool>)explosionEffectComponent["ExponentialAccelaration"];
|
||||
Reverse = (Field<bool>)explosionEffectComponent["Reverse"];Reverse = (bool)explosionEffectComponent["Reverse"];
|
||||
ColorDistanceScalar = (Field<double>)explosionEffectComponent["ColorDistanceScalar"];ColorDistanceScalar = (double)explosionEffectComponent["ColorDistanceScalar"];
|
||||
};
|
||||
|
||||
glm::vec3 ExplosionOrigin;
|
||||
@@ -38,12 +40,14 @@ struct ExplosionEffectJob : ModelJob
|
||||
glm::vec4 EndColor;
|
||||
bool Randomness = false;
|
||||
|
||||
float RandomnessScalar = 1.f;
|
||||
double RandomnessScalar = 1.f;
|
||||
glm::vec2 Velocity;
|
||||
bool ColorByDistance = false;
|
||||
//bool ReverseAnimation = false;
|
||||
//bool Wireframe = false;
|
||||
bool ExponentialAccelaration = false;
|
||||
bool Reverse = false;
|
||||
double ColorDistanceScalar = 1.f;
|
||||
|
||||
std::array<float, 50> RandomNumbers = {
|
||||
0.3257552917701f,
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
|
||||
struct Image
|
||||
{
|
||||
virtual ~Image() = default;
|
||||
|
||||
enum class ImageFormat
|
||||
{
|
||||
Unknown,
|
||||
|
||||
@@ -16,15 +16,18 @@ private:
|
||||
|
||||
public:
|
||||
~Model();
|
||||
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_RawModel->m_Materials; }
|
||||
const glm::mat4& Matrix() const { return m_RawModel->m_Matrix; }
|
||||
const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
|
||||
unsigned int NumberOfVertices() const { return m_RawModel->NumVertices(); }
|
||||
const std::vector<RawModel::MaterialProperties>& MaterialGroups() const { return m_Materials; }
|
||||
//const RawModel::Vertex* Vertices() const { return m_RawModel->Vertices(); }
|
||||
unsigned int NumberOfVertices() const { return m_Vertices.size(); }
|
||||
const AABB& Box() const { return m_Box; }
|
||||
bool IsSkinned() const { return m_RawModel->IsSkinned(); }
|
||||
bool IsSkinned() const { return m_IsSkinned; }
|
||||
GLuint VAO;
|
||||
GLuint ElementBuffer;
|
||||
RawModel* m_RawModel;
|
||||
//RawModel* m_RawModel;
|
||||
|
||||
Skeleton* m_Skeleton = nullptr;
|
||||
std::vector<glm::vec3> m_Vertices;
|
||||
std::vector<unsigned int> m_Indices;
|
||||
|
||||
private:
|
||||
AABB m_Box;
|
||||
@@ -34,6 +37,9 @@ private:
|
||||
GLuint TangentNormalsBuffer;
|
||||
GLuint BiTangentNormalsBuffer;
|
||||
GLuint TextureCoordBuffer;
|
||||
|
||||
std::vector<RawModel::MaterialProperties> m_Materials;
|
||||
bool m_IsSkinned;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/World.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "Skeleton.h"
|
||||
#include "ShaderProgram.h"
|
||||
#include "BlendTree.h"
|
||||
@@ -26,24 +26,13 @@ struct ModelJob : RenderJob
|
||||
ModelID = model->ResourceID;
|
||||
Type = matProp.type;
|
||||
::RawModel::MaterialBasic* matGroup = matProp.material;
|
||||
ShaderID = matProp.ShaderID;
|
||||
switch(matProp.type){
|
||||
case ::RawModel::MaterialType::Basic:
|
||||
if (Model->IsSkinned()) {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
|
||||
}
|
||||
else {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
|
||||
}
|
||||
TextureID = 0;
|
||||
break;
|
||||
case ::RawModel::MaterialType::SingleTextures:
|
||||
{
|
||||
if (Model->IsSkinned()) {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSkinnedProgram")->ResourceID;
|
||||
}
|
||||
else {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusProgram")->ResourceID;
|
||||
}
|
||||
::RawModel::MaterialSingleTextures* singleTextures = static_cast<::RawModel::MaterialSingleTextures*>(matProp.material);
|
||||
TextureID = (singleTextures->ColorMap.Texture) ? singleTextures->ColorMap.Texture->ResourceID : 0;
|
||||
if (modelComponent["DiffuseTexture"]) {
|
||||
@@ -65,12 +54,6 @@ struct ModelJob : RenderJob
|
||||
break;
|
||||
case ::RawModel::MaterialType::SplatMapping:
|
||||
{
|
||||
if (Model->IsSkinned()) {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapSkinnedProgram")->ResourceID;
|
||||
}
|
||||
else {
|
||||
ShaderID = ResourceManager::Load<ShaderProgram>("#ForwardPlusSplatMapProgram")->ResourceID;
|
||||
}
|
||||
::RawModel::MaterialSplatMapping* SplatTextures = static_cast<::RawModel::MaterialSplatMapping*>(matProp.material);
|
||||
|
||||
SplatMap = &SplatTextures->SplatMap;
|
||||
@@ -122,7 +105,7 @@ struct ModelJob : RenderJob
|
||||
IsShielded = isShielded;
|
||||
|
||||
if (model->IsSkinned()) {
|
||||
Skeleton = Model->m_RawModel->m_Skeleton;
|
||||
Skeleton = Model->m_Skeleton;
|
||||
|
||||
if (Skeleton != nullptr) {
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ComponentWrapper.h"
|
||||
#include "RenderJob.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "../Core/World.h"
|
||||
|
||||
struct PointLightJob : RenderJob
|
||||
@@ -16,7 +16,7 @@ struct PointLightJob : RenderJob
|
||||
: RenderJob()
|
||||
{
|
||||
Position = glm::vec4((glm::vec3)transformComponent["Position"], 1.0f);
|
||||
Position = glm::vec4(Transform::AbsolutePosition(m_World, transformComponent.EntityID), 1.f);
|
||||
Position = glm::vec4(TransformSystem::AbsolutePosition(m_World, transformComponent.EntityID), 1.f);
|
||||
Color = (glm::vec4)pointLightComponent["Color"];
|
||||
Radius = (double)pointLightComponent["Radius"];
|
||||
Intensity = (double)pointLightComponent["Intensity"];
|
||||
|
||||
@@ -13,20 +13,18 @@
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include <boost/endian/buffers.hpp>
|
||||
#include "../Common.h"
|
||||
#include "../GLM.h"
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Texture.h"
|
||||
#include "Skeleton.h"
|
||||
|
||||
#include "boost\endian\buffers.hpp"
|
||||
|
||||
|
||||
#include "ShaderProgram.h"
|
||||
|
||||
class RawModelCustom : public Resource
|
||||
{
|
||||
friend class ResourceManager;
|
||||
|
||||
friend class Model;
|
||||
protected:
|
||||
RawModelCustom(std::string fileName);
|
||||
|
||||
@@ -87,6 +85,7 @@ public:
|
||||
struct MaterialProperties {
|
||||
MaterialType type;
|
||||
MaterialBasic* material;
|
||||
unsigned int ShaderID = 0;
|
||||
};
|
||||
|
||||
const Vertex* Vertices() const {
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#include "ModelJob.h"
|
||||
#include "Renderer.h"
|
||||
#include "PointLightJob.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "../Core/EPlayerSpawned.h"
|
||||
#include "../Core/Octree.h"
|
||||
#include "../Collision/EntityAABB.h"
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#include "../Core/EventBroker.h"
|
||||
#include "ImGuiRenderPass.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "imgui/imgui.h"
|
||||
#include "TextPass.h"
|
||||
#include "Util/CommonFunctions.h"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include "../Core/ResourceManager.h"
|
||||
#include "Camera.h"
|
||||
#include "../Core/World.h"
|
||||
#include "../Core/Transform.h"
|
||||
#include "../Core/TransformSystem.h"
|
||||
#include "Skeleton.h"
|
||||
|
||||
struct SpriteJob : RenderJob
|
||||
@@ -37,7 +37,7 @@ struct SpriteJob : RenderJob
|
||||
BlurBackground = (bool)cSprite["BlurBackground"];
|
||||
|
||||
Entity = cSprite.EntityID;
|
||||
Position = Transform::AbsolutePosition(world, cSprite.EntityID);
|
||||
Position = TransformSystem::AbsolutePosition(world, cSprite.EntityID);
|
||||
Depth = 0;
|
||||
if (depthSorted) {
|
||||
glm::vec3 viewpos = glm::vec3(camera->ViewMatrix() * glm::vec4(Position, 1));
|
||||
@@ -50,7 +50,7 @@ struct SpriteJob : RenderJob
|
||||
FillColor = fillColor;
|
||||
FillPercentage = fillPercentage;
|
||||
|
||||
glm::vec3 scale = Transform::AbsoluteScale(world, cSprite.EntityID);
|
||||
glm::vec3 scale = TransformSystem::AbsoluteScale(world, cSprite.EntityID);
|
||||
|
||||
if((bool)cSprite["KeepRatio"] == true) {
|
||||
if(scale.y >= scale.x) {
|
||||
|
||||
@@ -17,8 +17,8 @@ struct TextJob : RenderJob
|
||||
: RenderJob()
|
||||
{
|
||||
Matrix = matrix;
|
||||
Color = (glm::vec4)textComponent["Color"];
|
||||
Content = (std::string)textComponent["Content"];
|
||||
Color = (const glm::vec4&)textComponent["Color"];
|
||||
Content = (const std::string&)textComponent["Content"];
|
||||
Resource = font;
|
||||
|
||||
if ((int)textComponent["Alignment"] == textComponent["Alignment"].Enum("Left")) {
|
||||
|
||||
@@ -23,6 +23,7 @@ public:
|
||||
|
||||
private:
|
||||
void renderText(std::string text, Font* font, TextJob::AlignmentEnum alignment, glm::vec4 color, glm::mat4 modelMatrix, glm::mat4 projectionMatrix, glm::mat4 viewMatrix);
|
||||
std::string parseColors(std::string text, std::map<int, glm::vec4>& colorChanges, glm::vec4 originalColor);
|
||||
|
||||
Font* font;
|
||||
GLuint VAO, VBO;
|
||||
|
||||
@@ -14,8 +14,6 @@ protected:
|
||||
TextureSprite(std::string path);
|
||||
|
||||
public:
|
||||
~TextureSprite();
|
||||
|
||||
void Bind(GLenum textureUnit = GL_TEXTURE0);
|
||||
|
||||
GLuint m_Texture = 0;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef Events_ChangeBGM_h__
|
||||
#define Events_ChangeBGM_h__
|
||||
|
||||
#include <string>
|
||||
#include "../Engine/Core/EventBroker.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct ChangeBGM : Event
|
||||
{
|
||||
std::string FilePath = "";
|
||||
};
|
||||
|
||||
}
|
||||
#endif // Events_ChangeBGM_h__
|
||||
@@ -0,0 +1,17 @@
|
||||
#ifndef Events_PlayAnnouncerVoice_h__
|
||||
#define Events_PlayAnnouncerVoice_h__
|
||||
|
||||
#include <string>
|
||||
#include "../Engine/Core/EventBroker.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct PlayAnonuncerVoice : public Event
|
||||
{
|
||||
std::string FilePath = "";
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -12,7 +12,8 @@ namespace Events
|
||||
// Sound behavior is thereby specified in the SoundEmitter component.
|
||||
struct PlaySoundOnEntity : public Event
|
||||
{
|
||||
EntityID EmitterID = 0;
|
||||
EntityWrapper Emitter = EntityWrapper::Invalid;
|
||||
float Gain = 1.f;
|
||||
std::string FilePath = "";
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#ifndef Events_SetAnnouncerGain_h__
|
||||
#define Events_SetAnnouncerGain_h__
|
||||
|
||||
#include "../Engine/Core/EventBroker.h"
|
||||
|
||||
namespace Events
|
||||
{
|
||||
|
||||
struct SetAnnouncerGain : public Event
|
||||
{
|
||||
float Gain = 1;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //
|
||||
@@ -9,32 +9,35 @@
|
||||
#include "OpenAL/al.h"
|
||||
#include "OpenAL/alc.h"
|
||||
|
||||
#include "imgui/imgui.h"
|
||||
|
||||
#include "Core/World.h"
|
||||
#include "Core/EventBroker.h"
|
||||
#include "../Engine/Core/World.h"
|
||||
#include "../Engine/Core/EventBroker.h"
|
||||
#include "../Engine/Core/ResourceManager.h"
|
||||
#include "../Engine/Core/ConfigFile.h"
|
||||
#include "Core/Transform.h" // Absolute transform
|
||||
#include "Sound/Sound.h"
|
||||
#include "../Engine/Core/TransformSystem.h"
|
||||
#include "../Engine/Sound/Sound.h"
|
||||
#include "../Engine/Sound/EPlayQueueOnEntity.h"
|
||||
#include "Sound/EPlaySoundOnEntity.h"
|
||||
#include "Sound/EPlaySoundOnPosition.h"
|
||||
#include "Sound/EPlayBackgroundMusic.h"
|
||||
#include "Sound/EPauseSound.h"
|
||||
#include "Sound/EContinueSound.h"
|
||||
#include "Sound/EStopSound.h"
|
||||
#include "Sound/ESetBGMGain.h"
|
||||
#include "Sound/ESetSFXGain.h"
|
||||
#include "Core/EPause.h"
|
||||
#include "Core/EComponentAttached.h"
|
||||
#include "../Engine/Sound/EPlaySoundOnEntity.h"
|
||||
#include "../Engine/Sound/EPlaySoundOnPosition.h"
|
||||
#include "../Engine/Sound/EPlayBackgroundMusic.h"
|
||||
#include "../Engine/Sound/EPlayAnnouncerVoice.h"
|
||||
#include "../Engine/Sound/EPauseSound.h"
|
||||
#include "../Engine/Sound/EContinueSound.h"
|
||||
#include "../Engine/Sound/EStopSound.h"
|
||||
#include "../Engine/Sound/ESetBGMGain.h"
|
||||
#include "../Engine/Sound/ESetSFXGain.h"
|
||||
#include "../Engine/Sound/ESetAnnouncerGain.h"
|
||||
#include "../Engine/Sound/EChangeBGM.h"
|
||||
#include "../Engine/Core/EPause.h"
|
||||
#include "../Engine/Core/EComponentAttached.h"
|
||||
#include "../Core/EPlayerSpawned.h"
|
||||
|
||||
|
||||
typedef std::pair<ALuint, std::vector<ALuint>> QueuedBuffers;
|
||||
|
||||
enum class SoundType {
|
||||
SFX,
|
||||
BGM
|
||||
BGM,
|
||||
Announcer
|
||||
};
|
||||
|
||||
struct Source
|
||||
@@ -43,6 +46,7 @@ struct Source
|
||||
Sound* SoundResource = nullptr;
|
||||
ALuint ALsource;
|
||||
SoundType Type;
|
||||
float Duration;
|
||||
};
|
||||
|
||||
class SoundManager
|
||||
@@ -74,14 +78,20 @@ private:
|
||||
ALenum getSourceState(ALuint source);
|
||||
void setGain(Source* source, float gain);
|
||||
void setSoundProperties(Source* source, ComponentWrapper* soundComponent);
|
||||
float getDurationSeconds(Source* source);
|
||||
float getTimeOffsetSeconds(Source* source);
|
||||
|
||||
// Specific logic
|
||||
void playSound(Source* source);
|
||||
// Need to be the same format (sample rate etc)
|
||||
// Needs to be the same format (sample rate etc)
|
||||
void playQueue(QueuedBuffers qb);
|
||||
void stopSound(Source* source);
|
||||
Source* createSource(std::string filePath);
|
||||
std::unordered_map<EntityID, Source*> m_Sources;
|
||||
void matchBGMLoop();
|
||||
Source* m_CurrentBGM = nullptr;
|
||||
Source* m_CurrentBGMCombo = nullptr;
|
||||
bool m_DrumLoopHasBeenStarted = false;
|
||||
|
||||
// Logic
|
||||
World* m_World = nullptr;
|
||||
@@ -93,6 +103,7 @@ private:
|
||||
|
||||
float m_BGMVolumeChannel = 1.0f;
|
||||
float m_SFXVolumeChannel = 1.0f;
|
||||
float m_AnnouncerVolumeChannel = 1.0f;
|
||||
EntityWrapper m_LocalPlayer = EntityWrapper();
|
||||
|
||||
// Events
|
||||
@@ -102,6 +113,8 @@ private:
|
||||
bool OnPlaySoundOnPosition(const Events::PlaySoundOnPosition &e);
|
||||
EventRelay<SoundManager, Events::PlayBackgroundMusic> m_EPlayBackgroundMusic;
|
||||
bool OnPlayBackgroundMusic(const Events::PlayBackgroundMusic &e);
|
||||
EventRelay<SoundManager, Events::PlayAnonuncerVoice> m_EPlayAnnouncerVoice;
|
||||
bool OnPlayAnnouncerVoice(const Events::PlayAnonuncerVoice& e);
|
||||
EventRelay<SoundManager, Events::PauseSound> m_EPauseSound;
|
||||
bool OnPauseSound(const Events::PauseSound &e);
|
||||
EventRelay<SoundManager, Events::StopSound> m_EStopSound;
|
||||
@@ -112,6 +125,8 @@ private:
|
||||
bool OnSetBGMGain(const Events::SetBGMGain &e);
|
||||
EventRelay<SoundManager, Events::SetSFXGain> m_ESetSFXGain;
|
||||
bool OnSetSFXGain(const Events::SetSFXGain &e);
|
||||
EventRelay<SoundManager, Events::SetAnnouncerGain> m_ESetAnnouncerGain;
|
||||
bool OnSetAnnouncerGain(const Events::SetAnnouncerGain& e);
|
||||
EventRelay<SoundManager, Events::ComponentAttached> m_EComponentAttached;
|
||||
bool OnComponentAttached(const Events::ComponentAttached &e);
|
||||
EventRelay<SoundManager, Events::Pause> m_EPause;
|
||||
@@ -122,6 +137,8 @@ private:
|
||||
bool OnPlayerSpawned(const Events::PlayerSpawned &e);
|
||||
EventRelay<SoundManager, Events::PlayQueueOnEntity> m_EPlayQueueOnEntity;
|
||||
bool OnPlayQueueOnEntity(const Events::PlayQueueOnEntity &e);
|
||||
EventRelay<SoundManager, Events::ChangeBGM> m_EChangeBGM;
|
||||
bool OnChangeBGM(const Events::ChangeBGM &e);
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define AmmoPickupSystem_h__
|
||||
|
||||
#include "Core/System.h"
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Core/EntityFile.h"
|
||||
#include "Core/EPickupSpawned.h"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
#include "Core/ECaptured.h"
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define DamageIndicatorSystem_h__
|
||||
|
||||
#include "Core/System.h"
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Core/EntityFile.h"
|
||||
#include "Core/EPlayerDamage.h"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
#include "Engine/GLM.h"
|
||||
|
||||
class ExplosionEffectSystem : public PureSystem
|
||||
{
|
||||
|
||||
@@ -12,8 +12,8 @@ public:
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
|
||||
{
|
||||
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
|
||||
(double&)component["Time"] += dt;
|
||||
(glm::vec3&)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
|
||||
(Field<double>)component["Time"] += dt;
|
||||
(Field<glm::vec3>)transform["Position"] = (float)(double)component["Amplitude"] * glm::sin((glm::two_pi<float>() / (float)(double)component["Period"]) * (float)(double)component["Time"]) * (glm::vec3)component["Axis"];
|
||||
|
||||
}
|
||||
};
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "Core/Event.h"
|
||||
#include "Systems/SpawnerSystem.h"
|
||||
|
||||
|
||||
#include "GUI/EButtonClicked.h"
|
||||
#include "GUI/EButtonPressed.h"
|
||||
#include "GUI/EButtonReleased.h"
|
||||
@@ -24,6 +23,8 @@ public:
|
||||
|
||||
private:
|
||||
IRenderer* m_Renderer;
|
||||
void OpenSubMenu(const Events::InputCommand& e);
|
||||
void OpenDropDown(const Events::InputCommand& e);
|
||||
|
||||
EventRelay<MainMenuSystem, Events::ButtonClicked> m_EClicked;
|
||||
bool OnButtonClick(const Events::ButtonClicked& e);
|
||||
@@ -36,6 +37,7 @@ private:
|
||||
|
||||
std::string m_CurrentCommand = "";
|
||||
EntityWrapper m_OpenSubMenu = EntityWrapper::Invalid;
|
||||
EntityWrapper m_DropDown = EntityWrapper::Invalid;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define PickupSpawnSystem_h__
|
||||
|
||||
#include "Core/System.h"
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
#include "Core/ResourceManager.h"
|
||||
#include "Core/EntityFile.h"
|
||||
#include "Core/EPickupSpawned.h"
|
||||
|
||||
@@ -33,7 +33,7 @@ private:
|
||||
// Used to track afterimages for sprint effect.
|
||||
float m_SprintEffectTimer;
|
||||
// The logic for making the sound play when player is moving
|
||||
void playerStep(double dt);
|
||||
void playerStep(double dt, EntityWrapper player);
|
||||
// Spawn a hexagon at origin of an Entity
|
||||
void spawnHexagon(EntityWrapper target);
|
||||
|
||||
|
||||
@@ -1,6 +1,25 @@
|
||||
#include "Common.h"
|
||||
#include "Core/System.h"
|
||||
|
||||
|
||||
|
||||
//struct FSubscriptProxy
|
||||
// {
|
||||
// friend struct ComponentWrapper;
|
||||
// FSubscriptProxy(ComponentWrapper* component, std::string fieldName)
|
||||
// : m_Component(component)
|
||||
// , m_FieldName(fieldName)
|
||||
// { }
|
||||
|
||||
// ComponentWrapper* m_Component;
|
||||
// std::string m_FieldName;
|
||||
|
||||
// public:
|
||||
// template <typename T>
|
||||
// operator Field<T>() { return Field<T>(m_Component->Field<T>(m_FieldName)); }
|
||||
|
||||
// };
|
||||
|
||||
class RaptorCopterSystem : public PureSystem
|
||||
{
|
||||
public:
|
||||
@@ -9,9 +28,11 @@ public:
|
||||
, PureSystem("RaptorCopter")
|
||||
{ }
|
||||
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& component, double dt) override
|
||||
virtual void UpdateComponent(EntityWrapper& entity, ComponentWrapper& cRaptorCopter, double dt) override
|
||||
{
|
||||
ComponentWrapper& transform = m_World->GetComponent(component.EntityID, "Transform");
|
||||
(glm::vec3&)transform["Orientation"] += (float)(double)component["Speed"] * (float)dt * (glm::vec3)component["Axis"];
|
||||
ComponentWrapper& cTransform = entity["Transform"];
|
||||
//FSubscriptProxy subOri(&cTransform, "Orientation");
|
||||
//Field<glm::vec3> orientation = subOri;
|
||||
(Field<glm::vec3>)cTransform["Orientation"] += (float)(const double&)cRaptorCopter["Speed"] * (float)dt * (glm::vec3)cRaptorCopter["Axis"];
|
||||
}
|
||||
};
|
||||
@@ -2,6 +2,7 @@
|
||||
#define Systems_SoundSystem_h__
|
||||
|
||||
#include <random>
|
||||
#include <chrono>
|
||||
|
||||
#include "../Engine/Core/System.h"
|
||||
#include "../Engine/Core/ResourceManager.h"
|
||||
@@ -20,9 +21,10 @@
|
||||
#include "../Engine/Collision/ETrigger.h"
|
||||
#include "../Engine/Sound/EPlaySoundOnEntity.h"
|
||||
#include "../Engine/Sound/EPlayBackgroundMusic.h"
|
||||
#include "../Engine/Sound/EPlayAnnouncerVoice.h"
|
||||
#include "../Game/Events/EDoubleJump.h"
|
||||
#include "../Game/Events/EDashAbility.h"
|
||||
|
||||
#include "../Engine/Sound/EChangeBGM.h"
|
||||
|
||||
class SoundSystem : public PureSystem, ImpureSystem
|
||||
{
|
||||
@@ -33,14 +35,10 @@ public:
|
||||
private:
|
||||
std::string m_Announcer = "";
|
||||
// Logic for playing a sound when a player jumps
|
||||
void playerJumps();
|
||||
|
||||
// Temporary solution for play test.
|
||||
bool m_DrumsIsPlaying = false;
|
||||
double m_DrumTimer = 0.0;
|
||||
bool drumTimer(double dt);
|
||||
void playerJumps(EntityWrapper player);
|
||||
|
||||
std::default_random_engine generator;
|
||||
std::default_random_engine m_RandomGenerator;
|
||||
std::uniform_int_distribution<int> m_RandIntDistribution;
|
||||
|
||||
EventRelay<SoundSystem, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||
bool OnPlayerSpawned(const Events::PlayerSpawned &e);
|
||||
@@ -48,10 +46,6 @@ private:
|
||||
bool OnInputCommand(const Events::InputCommand &e);
|
||||
EventRelay<SoundSystem, Events::DoubleJump> m_EDoubleJump;
|
||||
bool OnDoubleJump(const Events::DoubleJump &e);
|
||||
EventRelay<SoundSystem, Events::DashAbility> m_EDashAbility;
|
||||
bool OnDashAbility(const Events::DashAbility &e);
|
||||
EventRelay<SoundSystem, Events::TriggerTouch> m_ETriggerTouch;
|
||||
bool OnTriggerTouch(const Events::TriggerTouch &e);
|
||||
EventRelay<SoundSystem, Events::Captured> m_ECaptured;
|
||||
bool OnCaptured(const Events::Captured &e);
|
||||
EventRelay<SoundSystem, Events::PlayerDamage> m_EPlayerDamage;
|
||||
|
||||
@@ -6,8 +6,9 @@
|
||||
#include "GLM.h"
|
||||
#include "Core/System.h"
|
||||
#include "Events/ESpawnerSpawn.h"
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
#include "Core/EntityFile.h"
|
||||
#include "Rendering/Model.h"
|
||||
|
||||
class SpawnerSystem : public System
|
||||
{
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include "Core/System.h"
|
||||
#include "Input/EInputCommand.h"
|
||||
#include "Network/EPlayerDisconnected.h"
|
||||
|
||||
class SpectatorCameraSystem : public ImpureSystem
|
||||
{
|
||||
@@ -17,6 +18,8 @@ private:
|
||||
|
||||
EventRelay<SpectatorCameraSystem, Events::InputCommand> m_EInputCommand;
|
||||
bool OnInputCommand(const Events::InputCommand& e);
|
||||
EventRelay<SpectatorCameraSystem, Events::PlayerDisconnected> m_EDisconnect;
|
||||
bool OnDisconnect(const Events::PlayerDisconnected& e);
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Collision/Collision.h"
|
||||
#include "Core/EPlayerDamage.h"
|
||||
#include "Sound/EPlaySoundOnEntity.h"
|
||||
#include "Sound/EPlaySoundOnEntity.h"
|
||||
|
||||
class DefenderWeaponBehaviour : public WeaponBehaviour<DefenderWeaponBehaviour>
|
||||
{
|
||||
|
||||
@@ -270,7 +270,8 @@ private:
|
||||
EntityWrapper thirdPersonAttachment;
|
||||
for (auto& attachment : weaponAttachments) {
|
||||
ComponentWrapper cWeaponAttachment = attachment["WeaponAttachment"];
|
||||
if ((std::string&)cWeaponAttachment["Weapon"] == m_ComponentType) {
|
||||
Field<std::string> weaponType = cWeaponAttachment["Weapon"];
|
||||
if (*weaponType == m_ComponentType) {
|
||||
ComponentWrapper::SubscriptProxy person = cWeaponAttachment["Person"];
|
||||
if ((ComponentInfo::EnumType)person == person.Enum("FirstPerson")) {
|
||||
firstPersonAttachment = attachment;
|
||||
|
||||
@@ -39,6 +39,7 @@ ResourceLoading=true
|
||||
[Sound]
|
||||
BGMVolume=1.0
|
||||
SFXVolume=1.0
|
||||
AnnouncerVolume=1.0
|
||||
Announcer=female
|
||||
|
||||
[SSAO]
|
||||
|
||||
@@ -29,4 +29,6 @@ K=TakeDamage,1500
|
||||
F2=PerformanceTimingResetAllTimers
|
||||
F3=PerformanceTimingCreateExcelData
|
||||
Comma=SwapToClassPick
|
||||
Period=SwapToTeamPick
|
||||
Period=SwapToTeamPick
|
||||
Enter=PickClass,1
|
||||
F5=DisconnectFromServer
|
||||
@@ -68,4 +68,6 @@
|
||||
<xs:include schemaLocation="Components/NetworkComponent.xsd"/>
|
||||
<xs:include schemaLocation="Components/ServerIdentity.xsd"/>
|
||||
<xs:include schemaLocation="Components/ServerList.xsd"/>
|
||||
<xs:include schemaLocation="Components/ConfigBtnResolution.xsd"/>
|
||||
<xs:include schemaLocation="Components/ConfigBtnFloat.xsd"/>
|
||||
</xs:schema>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ConfigBtnFloat xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ConfigBtnFloat.xsd">
|
||||
<Header></Header>
|
||||
<Field></Field>
|
||||
<PressValue></PressValue>
|
||||
</ConfigBtnFloat>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?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="ConfigBtnFloat">
|
||||
<xs:annotation><xs:documentation>Used with a Button component, this button will change a variable in the config file.</xs:documentation></xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="Header" type="t:string" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>The header of the section in config.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="Field" type="t:string" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>The name of the field to be changed in the config.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="PressValue" type="t:float" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>The value to give the field.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ConfigBtnResolution xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ConfigBtnResolution.xsd">
|
||||
<Header></Header>
|
||||
<Field></Field>
|
||||
<PressValue></PressValue>
|
||||
</ConfigBtnResolution>
|
||||
@@ -0,0 +1,17 @@
|
||||
<?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="ConfigBtnResolution">
|
||||
<xs:annotation><xs:documentation>Used with a Button component, this button will change a variable in the config file.</xs:documentation></xs:annotation>
|
||||
<xs:complexType>
|
||||
<xs:all>
|
||||
<xs:element name="Width" type="t:int" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Value of the resolution width.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="Height" type="t:int" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Value of the resolution height.</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
</xs:schema>
|
||||
@@ -1,19 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<ExplosionEffect xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ExplosionEffect.xsd">
|
||||
<ExplosionOrigin X="0" Y="0" Z="0"/>
|
||||
<TimeSinceDeath>0</TimeSinceDeath>
|
||||
<ExplosionDuration>2</ExplosionDuration>
|
||||
<TimeSinceDeath>0.0</TimeSinceDeath>
|
||||
<ExplosionDuration>2.0</ExplosionDuration>
|
||||
<Speed>1</Speed>
|
||||
<Delay>0</Delay>
|
||||
<!--<Gravity>1</Gravity>-->
|
||||
<!--<GravityForce>1</GravityForce>-->
|
||||
<!--<ObjectRadius>2</ObjectRadius>-->
|
||||
<EndColor R="0" G="0" B="0" A="0"/>
|
||||
<Randomness>0</Randomness>
|
||||
<RandomnessScalar>1</RandomnessScalar>
|
||||
<Randomness>false</Randomness>
|
||||
<RandomnessScalar>1.0</RandomnessScalar>
|
||||
<Velocity X="2" Y="2"/>
|
||||
<ColorByDistance>0</ColorByDistance>
|
||||
<!--<ReverseAnimation>0</ReverseAnimation>-->
|
||||
<ColorByDistance>false</ColorByDistance>
|
||||
<!--<Wireframe>0</Wireframe>-->
|
||||
<ExponentialAccelaration>0</ExponentialAccelaration>
|
||||
<ExponentialAccelaration>false</ExponentialAccelaration>
|
||||
<Pulsate>false</Pulsate>
|
||||
<Reverse>false</Reverse>
|
||||
<ColorDistanceScalar>1.0</ColorDistanceScalar>
|
||||
</ExplosionEffect>
|
||||
@@ -44,15 +44,21 @@
|
||||
<xs:element name="ColorByDistance" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Change the color by its moved distance instead of by its time</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<!--<xs:element name="ReverseAnimation" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Implosions are cooler</xs:documentation></xs:annotation>
|
||||
</xs:element>-->
|
||||
<!--<xs:element name="Wireframe" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Enable/disable wireframe</xs:documentation></xs:annotation>
|
||||
</xs:element>-->
|
||||
<xs:element name="ExponentialAccelaration" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Linear/Exponential accelaration</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="Pulsate" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Pulsate the effect</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="Reverse" type="t:bool" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Reverse the effect</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
<xs:element name="ColorDistanceScalar" type="t:double" minOccurs="0">
|
||||
<xs:annotation><xs:documentation>Scale the distance of the color change</xs:documentation></xs:annotation>
|
||||
</xs:element>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<Gain>1.0</Gain>
|
||||
<Pitch>1.0</Pitch>
|
||||
<Loop>false</Loop>
|
||||
<MaxDistance>20.0</MaxDistance>
|
||||
<RollOffFactor>1.0</RollOffFactor>
|
||||
<MaxDistance>220.0</MaxDistance>
|
||||
<RollOffFactor>10</RollOffFactor>
|
||||
<ReferenceDistance>1.0</ReferenceDistance>
|
||||
</SoundEmitter>
|
||||
@@ -9,6 +9,6 @@
|
||||
<KeepRatioX>false</KeepRatioX>
|
||||
<KeepRatioY>false</KeepRatioY>
|
||||
<KeepRatio>false</KeepRatio>
|
||||
<Linear>false</Linear>
|
||||
<Linear>true</Linear>
|
||||
<BlurBackground>false</BlurBackground>
|
||||
</Sprite>
|
||||
|
||||
@@ -2,21 +2,26 @@
|
||||
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:NetworkComponent/>
|
||||
<c:AmmoPickup/>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/PickUps/AmmoPickUp.mesh</Resource>
|
||||
</c:Model>
|
||||
<c:Trigger/>
|
||||
<c:RaptorCopter>
|
||||
<Speed>8</Speed>
|
||||
<Axis X="0" Y="0.100000001" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/PickUps/AmmoPickUp.mesh</Resource>
|
||||
</c:Model>
|
||||
<c:NetworkComponent/>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.0823529437" R="1"/>
|
||||
<Radius>1.5</Radius>
|
||||
<Intensity>3</Intensity>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Position X="0" Y="2.36784196" Z="-0.0281207096"/>
|
||||
<Orientation X="0" Y="18843.5469" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
<Orientation X="0" Y="18717.9453" Z="0"/>
|
||||
</c:Transform>
|
||||
<c:Trigger/>
|
||||
</Components>
|
||||
|
||||
<Children/>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+9531
-6482
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,169 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Anchor1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.30000001192092896</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>30</Period>
|
||||
<Time>342.91836260588383</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="1.47803104" Z="0"/>
|
||||
<Orientation X="0" Y="220.263962" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
|
||||
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor2">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>20</Period>
|
||||
<Time>448.85134971162591</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="1.05921149" Z="0"/>
|
||||
<Orientation X="0" Y="360.699402" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
|
||||
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor0">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.10000000149011612</Speed>
|
||||
<Axis X="0" Y="-1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>10</Period>
|
||||
<Time>495.36799589902654</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>0.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0.11458683" Z="-0"/>
|
||||
<Orientation X="0" Y="-68.9721527" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
|
||||
<Color A="1" B="1" G="0.392156869" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="LightOrigin1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>1</Speed>
|
||||
<Axis X="0.400000006" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="16.781414" Y="41.9535484" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,174 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="14.8518229" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Anchor1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.30000001192092896</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>30</Period>
|
||||
<Time>1125.9779108477385</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0.711852849" Z="-0"/>
|
||||
<Orientation X="0" Y="455.182343" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
|
||||
<Color A="1" B="2" G="0.784313738" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor2">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>20</Period>
|
||||
<Time>1231.9108979534806</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-1.69476664" Z="-0"/>
|
||||
<Orientation X="0" Y="752.229553" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
|
||||
<Color A="1" B="2" G="0.784313738" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor0">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.10000000149011612</Speed>
|
||||
<Axis X="0" Y="-1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>10</Period>
|
||||
<Time>1278.4275441408811</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>0.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0.417467505" Z="-0"/>
|
||||
<Orientation X="0" Y="-147.27742" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
|
||||
<Color A="1" B="2" G="0.784313738" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="LightOrigin1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>1</Speed>
|
||||
<Axis X="0.400000006" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="330.00589" Y="825.014587" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="0.588235319" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,173 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="14.8518229" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Anchor1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.30000001192092896</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>30</Period>
|
||||
<Time>1816.9423460293749</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-1.38488328" Z="-0"/>
|
||||
<Orientation X="0" Y="662.475891" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
|
||||
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor2">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>20</Period>
|
||||
<Time>1922.875333135117</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.35616231" Z="0"/>
|
||||
<Orientation X="0" Y="1097.71094" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
|
||||
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor0">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.10000000149011612</Speed>
|
||||
<Axis X="0" Y="-1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>10</Period>
|
||||
<Time>1969.3919793225175</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>0.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0.186382934" Z="-0"/>
|
||||
<Orientation X="0" Y="-216.374603" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
|
||||
<Color A="1" B="0" G="0.235294119" R="1.09803927"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0" Z="-0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="LightOrigin1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>1</Speed>
|
||||
<Axis X="0.400000006" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="606.394653" Y="1515.97461" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,167 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="14.8518229" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Anchor1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.30000001192092896</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>30</Period>
|
||||
<Time>1622.3711487379048</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="1.66753078" Z="0"/>
|
||||
<Orientation X="0" Y="604.103943" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer1.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor2">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>20</Period>
|
||||
<Time>1728.3041358436469</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="1.5237397" Z="0"/>
|
||||
<Orientation X="0" Y="1000.42615" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer2.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor0">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.10000000149011612</Speed>
|
||||
<Axis X="0" Y="-1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>10</Period>
|
||||
<Time>1774.8207820310474</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>0.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.0561612286" Z="0"/>
|
||||
<Orientation X="0" Y="-196.917053" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CenterCrystal.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-0" Z="-0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="LightOrigin1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>1</Speed>
|
||||
<Axis X="0.400000006" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="528.564453" Y="1321.40454" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Origin" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="7.3052454" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Anchor0">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.20000000298023224</Speed>
|
||||
<Axis X="0" Y="-1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>10</Period>
|
||||
<Time>1323.7395571102679</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>0.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.355862439" Z="0"/>
|
||||
<Orientation X="0" Y="-363.932587" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CenterCrystalBlue.mesh</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="LightOrigin1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>1</Speed>
|
||||
<Axis X="0.400000006" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="348.130463" Y="870.325134" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="1" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.1234858" Y="0.720658064" Z="3.40589333"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="1" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0.4723185" Y="0" Z="-4.12240839"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="1" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="-2.91954184" Y="1.54033804" Z="-0.0577439293"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="1" G="1" R="0"/>
|
||||
<Radius>4.5</Radius>
|
||||
<Falloff>0.5</Falloff>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="1.48998797" Y="-3.06706786" Z="-1.78805089"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor1">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>30</Period>
|
||||
<Time>1171.2899238171258</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3.5</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.93411696" Z="0"/>
|
||||
<Orientation X="0" Y="1483.0957" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer1Blue.mesh</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Anchor2">
|
||||
<Components>
|
||||
<c:RaptorCopter>
|
||||
<Speed>0.5</Speed>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:FloatingEffect>
|
||||
<Period>20</Period>
|
||||
<Time>1277.2229109228683</Time>
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
<Amplitude>3</Amplitude>
|
||||
</c:FloatingEffect>
|
||||
<c:Transform>
|
||||
<Position X="-0" Y="-2.29767179" Z="-0"/>
|
||||
<Orientation X="0" Y="2074.16089" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/CapturePoint/CrystalsLayer2Blue.mesh</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -2,21 +2,26 @@
|
||||
<Entity xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:NetworkComponent/>
|
||||
<c:HealthPickup/>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/PickUps/HealthPickUp.mesh</Resource>
|
||||
</c:Model>
|
||||
<c:Trigger/>
|
||||
<c:RaptorCopter>
|
||||
<Speed>8</Speed>
|
||||
<Axis X="0" Y="0.100000001" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Model>
|
||||
<Resource>Models/Props/PickUps/HealthPickUp.mesh</Resource>
|
||||
</c:Model>
|
||||
<c:NetworkComponent/>
|
||||
<c:PointLight>
|
||||
<Color A="1" B="0" G="1" R="1"/>
|
||||
<Radius>1.5</Radius>
|
||||
<Intensity>3</Intensity>
|
||||
</c:PointLight>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Position X="0" Y="2.36800003" Z="0"/>
|
||||
<Orientation X="0" Y="19005.3867" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
<Orientation X="0" Y="18767.0273" Z="0"/>
|
||||
</c:Transform>
|
||||
<c:Trigger/>
|
||||
</Components>
|
||||
|
||||
<Children/>
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="MuzzleFlashBlue" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Lifetime>
|
||||
<Lifetime>0.039999999105930328</Lifetime>
|
||||
</c:Lifetime>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="PlaneRight">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneRight.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/Cone1Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/Cone1Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/Cone2Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/Cone2Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneUp">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneUp.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneDown">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneDown.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneLeft">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Blue/PlaneLeft.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="MuzzleFlashFire" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Lifetime>
|
||||
<Lifetime>0.039999999105930328</Lifetime>
|
||||
</c:Lifetime>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="PlaneRight">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneRight.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/Cone1Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/Cone1Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/Cone2Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/Cone2Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneUp">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneUp.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneDown">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneDown.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneLeft">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Fire/PlaneLeft.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="MuzzleFlashGay" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Lifetime>
|
||||
<Lifetime>0.039999999105930328</Lifetime>
|
||||
</c:Lifetime>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="PlaneRight">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneRight.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone1Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone1Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone2Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/Cone2Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneUp">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneUp.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneDown">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneDown.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneLeft">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Rainbow/PlaneLeft.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,102 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="MuzzleFlashRed" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Lifetime>
|
||||
<Lifetime>0.039999999105930328</Lifetime>
|
||||
</c:Lifetime>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="PlaneRight">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/PlaneRight.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/Cone1Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone1Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/Cone1Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Outside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/Cone2Outside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Cone2Inside">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/Cone2Inside.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneUp">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/PlaneUp.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneDown">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/PlaneDown.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="PlaneLeft">
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource>Models/Effects/MuzzleFlash/Red/PlaneLeft.mesh</Resource>
|
||||
<Shadow>false</Shadow>
|
||||
<Transparent>true</Transparent>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
+8977
-6217
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Background_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Background">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.196078435" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Scale X="0.300000012" Y="0.5" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Title_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="UnderLine">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<Visible>false</Visible>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.00500000035" Y="0.198000014" Z="0.0199999996"/>
|
||||
<Scale X="0.270000011" Y="0.00100000005" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>Options</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.131999999" Y="0.202000007" Z="0.0199999996"/>
|
||||
<Scale X="0.0320000015" Y="0.0310000014" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Buttons_anchor">
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.168000013" Z="0.0199999996"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Resolution">
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Scale X="0.100000001" Y="0.100000001" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Sprite">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:InputCmdButton>
|
||||
<Command>Resolution</Command>
|
||||
<PressValue>1</PressValue>
|
||||
</c:InputCmdButton>
|
||||
<c:Transform>
|
||||
<Scale X="2.5999999" Y="0.300000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="TextAndCorner_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>Resolution</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Right/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.180000007" Y="-0.116000004" Z="0.00500000035"/>
|
||||
<Scale X="0.219000012" Y="0.150000006" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="ResolutionSpawner">
|
||||
<Components>
|
||||
<c:Spawner>
|
||||
<EntityFile>Schema/Entities/Resolution_Options.xml</EntityFile>
|
||||
</c:Spawner>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,128 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Resolution_Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Res1080">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1920</Width>
|
||||
<Height>1080</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-0.088000007" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1920x1080</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.361000031" Y="-0.562000036" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Res768">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1366</Width>
|
||||
<Height>768</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1366x768</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.380000025" Y="-0.561999977" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Res720">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1280</Width>
|
||||
<Height>720</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.088000007" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1280x720</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.387000024" Y="-0.561999977" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -0,0 +1,149 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="Resolution_Options" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0" Z="0.0180000011"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
|
||||
<Children>
|
||||
<Entity name="Background">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<Color A="1" B="0.117647059" G="0.117647059" R="0.117647059"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-0.00700000022" Y="-0.0310000014" Z="-0.0270000007"/>
|
||||
<Scale X="0.292000026" Y="0.064000003" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Res1080">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1920</Width>
|
||||
<Height>1080</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-0.088000007" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1920x1080</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.361000031" Y="-0.562000036" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Res768">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1366</Width>
|
||||
<Height>768</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1366x768</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.380000025" Y="-0.561999977" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Res720">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:ConfigBtnResolution>
|
||||
<Width>1280</Width>
|
||||
<Height>720</Height>
|
||||
</c:ConfigBtnResolution>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.392156869" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.088000007" Y="-0.0350000001" Z="0"/>
|
||||
<Scale X="0.0820000023" Y="0.0299999993" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>1280x720</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.387000024" Y="-0.561999977" Z="0.0199999996"/>
|
||||
<Scale X="0.180000007" Y="0.469000012" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
@@ -17,7 +17,6 @@
|
||||
<c:Text>
|
||||
<Content>123.123.123.123</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
@@ -28,7 +27,7 @@
|
||||
<Field>IP</Field>
|
||||
</c:TextFieldReader>
|
||||
<c:Transform>
|
||||
<Position X="-0.200000003" Y="-0.100000001" Z="0"/>
|
||||
<Position X="-0.200000003" Y="-0.100000001" Z="0.00700000022"/>
|
||||
<Scale X="0.649999976" Y="0.649999976" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -39,7 +38,6 @@
|
||||
<c:Text>
|
||||
<Content>65999</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
@@ -50,7 +48,7 @@
|
||||
<Field>Port</Field>
|
||||
</c:TextFieldReader>
|
||||
<c:Transform>
|
||||
<Position X="4.70000029" Y="-0.100000001" Z="0"/>
|
||||
<Position X="4.70000029" Y="-0.100000001" Z="0.00700000022"/>
|
||||
<Scale X="0.649999976" Y="0.649999976" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -61,7 +59,6 @@
|
||||
<c:Text>
|
||||
<Content>UnkownServer</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
@@ -72,7 +69,7 @@
|
||||
<Field>ServerName</Field>
|
||||
</c:TextFieldReader>
|
||||
<c:Transform>
|
||||
<Position X="-8.60000038" Y="-0.100000001" Z="0"/>
|
||||
<Position X="-8.60000038" Y="-0.100000001" Z="0.00700000022"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
@@ -82,7 +79,6 @@
|
||||
<c:Text>
|
||||
<Content>0</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Color A="1" B="0" G="0" R="0"/>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
@@ -93,7 +89,7 @@
|
||||
<Field>PlayersConnected</Field>
|
||||
</c:TextFieldReader>
|
||||
<c:Transform>
|
||||
<Position X="7.80000019" Y="0" Z="0"/>
|
||||
<Position X="7.80000019" Y="0" Z="0.00700000022"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
@@ -102,14 +98,15 @@
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Color A="0.588235319" B="1" G="1" R="1"/>
|
||||
<Color A="0.392156869" B="0.392156869" G="0.392156869" R="0.392156869"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.100000001" Y="0.496000022" Z="0"/>
|
||||
<Position X="0.100000001" Y="0.496000022" Z="0.00700000022"/>
|
||||
<Scale X="18.1000004" Y="2" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -117,6 +114,75 @@
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Corners">
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0" Z="0.00700000022"/>
|
||||
<Scale X="0.200000003" Y="0.200000003" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="TopLeft">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-43.9590034" Y="6.70000029" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="1.57079637"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomLeft">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-43.9589996" Y="-1.75600004" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="3.14499998"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="44.8320007" Y="-1.75600004" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="4.71218538"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="44.8320007" Y="6.69999981" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<Entity name="ServerList" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
<Entity name="Play" xmlns:c="components" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../Types/Entity.xsd">
|
||||
|
||||
<Components>
|
||||
<c:ServerList>
|
||||
@@ -12,7 +12,7 @@
|
||||
<Entity name="Identities_Origin">
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0.181182757" Z="0"/>
|
||||
<Position X="0" Y="0.172000006" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
@@ -30,27 +30,14 @@
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Background">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<Color A="0.196078435" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Scale X="0.300000012" Y="0.5" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="RefreshButton">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<Color A="0.588235319" B="1" G="1" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:InputCmdButton>
|
||||
@@ -66,8 +53,9 @@
|
||||
<Entity name="RefreshIcon">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/Icons/rotate.png</DiffuseTexture>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Icons/rotate.png</DiffuseTexture>
|
||||
<Color A="1" B="1" G="0" R="1"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
@@ -79,6 +67,135 @@
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Title_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>Servers</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Alignment>
|
||||
<Left/>
|
||||
</Alignment>
|
||||
</c:Text>
|
||||
<c:Transform>
|
||||
<Position X="-0.131999999" Y="0.202000007" Z="0.0199999996"/>
|
||||
<Scale X="0.0320000015" Y="0.0310000014" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="UnderLine">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<Visible>false</Visible>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.00500000035" Y="0.198000014" Z="0.0199999996"/>
|
||||
<Scale X="0.270000011" Y="0.00100000005" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Background_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="Background">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<Color A="0.196078435" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Scale X="0.300000012" Y="0.5" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="Corners">
|
||||
<Components>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="0" Z="0.0100000007"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="TopLeft">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-29.0360012" Y="49.0510025" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="1.57079637"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomLeft">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="-29.0050011" Y="-48.927002" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="3.14499998"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="29.0750008" Y="-48.9350014" Z="0"/>
|
||||
<Orientation X="0" Y="0" Z="4.71218538"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="29.0750008" Y="49.0650024" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
</Entity>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:CapturePointGameMode>
|
||||
<RespawnTime>7.0999304984909202</RespawnTime>
|
||||
<RespawnTime>0.53338721940212963</RespawnTime>
|
||||
</c:CapturePointGameMode>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
@@ -2828,7 +2828,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="25992.9746" Z="0"/>
|
||||
<Orientation X="0" Y="26060.2324" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -2870,7 +2870,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90523.6719" Z="0"/>
|
||||
<Orientation X="0" Y="90593.4219" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -2912,7 +2912,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90461.8125" Z="0"/>
|
||||
<Orientation X="0" Y="90531.5625" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -2954,7 +2954,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36800003" Z="0"/>
|
||||
<Orientation X="0" Y="71578.0156" Z="0"/>
|
||||
<Orientation X="0" Y="71647.7656" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -2996,7 +2996,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36800003" Z="0"/>
|
||||
<Orientation X="0" Y="25923.3281" Z="0"/>
|
||||
<Orientation X="0" Y="25990.5859" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -3038,7 +3038,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="81128.9531" Z="0"/>
|
||||
<Orientation X="0" Y="81198.7031" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -3080,7 +3080,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="78866.125" Z="0"/>
|
||||
<Orientation X="0" Y="78935.875" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -3122,7 +3122,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90523.6719" Z="0"/>
|
||||
<Orientation X="0" Y="90593.4219" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -3164,7 +3164,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="78866.125" Z="0"/>
|
||||
<Orientation X="0" Y="78935.875" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -5261,7 +5261,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36800003" Z="0"/>
|
||||
<Orientation X="0" Y="71424.8125" Z="0"/>
|
||||
<Orientation X="0" Y="71494.5625" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -5303,7 +5303,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="47480.0781" Z="0"/>
|
||||
<Orientation X="0" Y="47550.7578" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -6869,7 +6869,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36800003" Z="0"/>
|
||||
<Orientation X="0" Y="71548.5938" Z="0"/>
|
||||
<Orientation X="0" Y="71618.3438" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -6911,7 +6911,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90490.5469" Z="0"/>
|
||||
<Orientation X="0" Y="90560.2969" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -6953,7 +6953,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="78833" Z="0"/>
|
||||
<Orientation X="0" Y="78902.75" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -6995,7 +6995,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="81095.8281" Z="0"/>
|
||||
<Orientation X="0" Y="81165.5781" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -7037,7 +7037,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90428.6875" Z="0"/>
|
||||
<Orientation X="0" Y="90498.4375" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -7079,7 +7079,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="25960.2227" Z="0"/>
|
||||
<Orientation X="0" Y="26027.4805" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -7121,7 +7121,7 @@
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="2.36784196" Z="0"/>
|
||||
<Orientation X="0" Y="90490.5469" Z="0"/>
|
||||
<Orientation X="0" Y="90560.2969" Z="0"/>
|
||||
<Scale X="0.600000024" Y="0.600000024" Z="0.600000024"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
@@ -8796,7 +8796,7 @@
|
||||
<Axis X="0" Y="1" Z="0"/>
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Orientation X="0" Y="97.568718" Z="0"/>
|
||||
<Orientation X="0" Y="165.48909" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
@@ -8808,7 +8808,7 @@
|
||||
</c:RaptorCopter>
|
||||
<c:Transform>
|
||||
<Position X="0" Y="26" Z="40"/>
|
||||
<Orientation X="0" Y="-112.035805" Z="0"/>
|
||||
<Orientation X="0" Y="-247.882935" Z="0"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
@@ -8858,10 +8858,11 @@
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Color A="0.392156869" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:InputCmdButton>
|
||||
@@ -8874,6 +8875,44 @@
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="ButtonCorner_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
<Orientation X="0" Y="0" Z="4.71199989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
@@ -8890,40 +8929,6 @@
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="ButtonCorner_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<GlowMap></GlowMap>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<GlowMap></GlowMap>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
<Orientation X="0" Y="0" Z="4.71199989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="ButtonPos_3">
|
||||
@@ -8937,10 +8942,11 @@
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Color A="0.392156869" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
@@ -8973,8 +8979,10 @@
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
@@ -8986,8 +8994,10 @@
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
@@ -9008,16 +9018,59 @@
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="ButtonCorner_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
<Orientation X="0" Y="0" Z="4.71199989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Button_2">
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Color A="0.392156869" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:InputCmdButton>
|
||||
<Command>Options</Command>
|
||||
<PressValue>1</PressValue>
|
||||
</c:InputCmdButton>
|
||||
<c:Transform>
|
||||
<Scale X="0.200000003" Y="0.0500000007" Z="1"/>
|
||||
</c:Transform>
|
||||
@@ -9027,7 +9080,7 @@
|
||||
<Entity name="Text">
|
||||
<Components>
|
||||
<c:Text>
|
||||
<Content>Option</Content>
|
||||
<Content>Options</Content>
|
||||
<Resource>Fonts/DroidSans.ttf,64</Resource>
|
||||
<Alignment>
|
||||
<Right/>
|
||||
@@ -9040,40 +9093,6 @@
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="ButtonCorner_Origin">
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<GlowMap></GlowMap>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<GlowMap></GlowMap>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
<Orientation X="0" Y="0" Z="4.71199989"/>
|
||||
<Scale X="0.00499999989" Y="0.00499999989" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="ButtonPos_4">
|
||||
@@ -9087,10 +9106,11 @@
|
||||
<Components>
|
||||
<c:Button/>
|
||||
<c:Sprite>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/Core/White.png</DiffuseTexture>
|
||||
<BlurBackground>true</BlurBackground>
|
||||
<GlowMap></GlowMap>
|
||||
<DepthSort>false</DepthSort>
|
||||
<Color A="0.392156869" B="0" G="0" R="0"/>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
@@ -9123,8 +9143,10 @@
|
||||
<Entity name="TopRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="0.0220000017" Z="0.00499999989"/>
|
||||
@@ -9136,8 +9158,10 @@
|
||||
<Entity name="BottomRight">
|
||||
<Components>
|
||||
<c:Sprite>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Model>Models/Core/UnitQuad.mesh</Model>
|
||||
<GlowMap></GlowMap>
|
||||
<DiffuseTexture>Textures/HUD/ButtonCorner_16.png</DiffuseTexture>
|
||||
<Linear>false</Linear>
|
||||
</c:Sprite>
|
||||
<c:Transform>
|
||||
<Position X="0.0970000029" Y="-0.0219999999" Z="0.00499999989"/>
|
||||
@@ -9169,6 +9193,15 @@
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity name="OptionsSpawner">
|
||||
<Components>
|
||||
<c:Spawner>
|
||||
<EntityFile>Schema/Entities/OptionMenu.xml</EntityFile>
|
||||
</c:Spawner>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="0.980392158" G="1" R="1"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-0.100000001" Y="0" Z="0"/>
|
||||
@@ -28,6 +29,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-14.500001" Y="1.50000012" Z="16.9222012"/>
|
||||
@@ -52,6 +54,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="1" G="0" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="-14.500001" Y="1.50000012" Z="-17.6888409"/>
|
||||
@@ -67,6 +70,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="0" G="0" R="1"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="12.1000004" Y="1.50000012" Z="16.9222012"/>
|
||||
@@ -82,6 +86,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="1" G="0" R="0"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Position X="12.1228638" Y="1.50000012" Z="-17.9642811"/>
|
||||
@@ -198,6 +203,7 @@
|
||||
<c:Model>
|
||||
<Resource>models/core/unitcube.mesh</Resource>
|
||||
<Color A="1" B="39.2156868" G="0" R="3.13725495"/>
|
||||
<Shadow>false</Shadow>
|
||||
</c:Model>
|
||||
<c:Transform>
|
||||
<Scale X="-70" Y="-70" Z="-70"/>
|
||||
@@ -210,7 +216,7 @@
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="-">
|
||||
<Entity name="CapP">
|
||||
<Components>
|
||||
<c:AABB/>
|
||||
<c:CapturePoint>
|
||||
@@ -254,6 +260,13 @@
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight/>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Blue">
|
||||
@@ -265,7 +278,25 @@
|
||||
<Scale X="3.4000001" Y="4.70000029" Z="0.700000048"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource></Resource>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight/>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Spectator">
|
||||
<Components>
|
||||
@@ -276,7 +307,43 @@
|
||||
<Scale X="1" Y="5.70000029" Z="1"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight/>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource></Resource>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:PointLight/>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource></Resource>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
@@ -287,11 +354,11 @@
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity name="-">
|
||||
<Entity name="CapP">
|
||||
<Components>
|
||||
<c:AABB/>
|
||||
<c:CapturePoint>
|
||||
<CaptureTimer>-15</CaptureTimer>
|
||||
<CaptureTimer>12</CaptureTimer>
|
||||
<HomePointForTeam>
|
||||
<Blue/>
|
||||
</HomePointForTeam>
|
||||
@@ -317,7 +384,38 @@
|
||||
<Scale X="4.4000001" Y="2" Z="3.70000029"/>
|
||||
</c:Transform>
|
||||
</Components>
|
||||
<Children/>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Model>
|
||||
<Resource></Resource>
|
||||
</c:Model>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children>
|
||||
<Entity>
|
||||
<Components>
|
||||
<c:Transform/>
|
||||
</Components>
|
||||
<Children/>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
</Children>
|
||||
</Entity>
|
||||
<Entity name="Blue">
|
||||
<Components>
|
||||
|
||||
@@ -71,6 +71,8 @@
|
||||
<xs:element ref="c:NetworkComponent" minOccurs="0"/>
|
||||
<xs:element ref="c:ServerIdentity" minOccurs="0"/>
|
||||
<xs:element ref="c:ServerList" minOccurs="0"/>
|
||||
<xs:element ref="c:ConfigBtnResolution" minOccurs="0"/>
|
||||
<xs:element ref="c:ConfigBtnFloat" minOccurs="0"/>
|
||||
</xs:all>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
@@ -15,6 +15,11 @@ uniform float RandomnessScalar;
|
||||
uniform vec2 Velocity;
|
||||
uniform bool ColorByDistance;
|
||||
uniform bool ExponentialAccelaration;
|
||||
uniform bool Reverse;
|
||||
uniform float ColorDistanceScalar;
|
||||
//uniform bool Gravity;
|
||||
//uniform bool Rotation;
|
||||
//uniform bool MaxRadius;
|
||||
|
||||
in VertexData{
|
||||
vec3 Position;
|
||||
@@ -41,169 +46,136 @@ out VertexData{
|
||||
layout(triangles) in;
|
||||
layout(triangle_strip, max_vertices = 3) out;
|
||||
|
||||
float EqualTo(float x, float y) {
|
||||
return 1.0 - abs(sign(x - y));
|
||||
}
|
||||
|
||||
float NotEqualTo(float x, float y) {
|
||||
return abs(sign(x - y));
|
||||
}
|
||||
|
||||
float GreaterThan(float x, float y) {
|
||||
return max(sign(x - y), 0.0);
|
||||
}
|
||||
|
||||
float LessThan(float x, float y) {
|
||||
return max(sign(y - x), 0.0);
|
||||
}
|
||||
|
||||
float GreaterEqualTo(float x, float y) {
|
||||
return 1.0 - LessThan(x, y);
|
||||
}
|
||||
|
||||
float LessEqualTo(float x, float y) {
|
||||
return 1.0 - GreaterThan(x, y);
|
||||
}
|
||||
|
||||
// returns a "random" number based on input parameter
|
||||
float GetRandomNumber(int polygon_index)
|
||||
{
|
||||
int randomIndex = int(mod(polygon_index, 50));
|
||||
|
||||
return RandomNumbers[randomIndex];
|
||||
return RandomNumbers[int(mod(polygon_index, 50))];
|
||||
}
|
||||
|
||||
float randomNumber = 0.0;
|
||||
float randomDistance = 0.0;
|
||||
|
||||
void main()
|
||||
vec3 CalcCenterOfTriangle(vec3 vertex0, vec3 vertex1, vec3 vertex2)
|
||||
{
|
||||
// calculate middle of vectors
|
||||
vec3 v1 = Input[1].Position - Input[0].Position;
|
||||
vec3 v2 = Input[2].Position - Input[0].Position;
|
||||
vec3 v3 = Input[2].Position - (v1 / 2);
|
||||
vec3 v4 = Input[1].Position - (v2 / 2);
|
||||
vec3 dir1 = normalize(vertex1 - vertex0);
|
||||
vec3 dir2 = normalize(vertex2 - vertex0);
|
||||
|
||||
// calculate intersection
|
||||
|
||||
// normalize direction
|
||||
vec3 dir1 = normalize(v1);
|
||||
vec3 dir2 = normalize(v2);
|
||||
|
||||
vec3 vecA = Input[2].Position - Input[1].Position; //o2 - o1
|
||||
vec3 vecA = vertex2 - vertex1; //o2 - o1
|
||||
vec3 vecB = cross(dir1, dir2);
|
||||
|
||||
mat3 matrisA = mat3(vecA, dir2, vecB);
|
||||
|
||||
float lengthA = length(vecB);
|
||||
lengthA = lengthA * lengthA;
|
||||
|
||||
|
||||
float s = determinant(matrisA) / lengthA;
|
||||
|
||||
// center position of triangle
|
||||
vec3 centerOfTriangle = Input[1].Position + (s * dir1);
|
||||
|
||||
return vertex1 + (s * dir1);
|
||||
}
|
||||
|
||||
void PassThingsThrough(int index)
|
||||
{
|
||||
// pass through vertex data
|
||||
Output.Normal = Input[index].Normal;
|
||||
Output.Position = Input[index].Position;
|
||||
Output.TextureCoordinate = Input[index].TextureCoordinate;
|
||||
Output.Tangent = Input[index].Tangent;
|
||||
Output.BiTangent = Input[index].BiTangent;
|
||||
Output.ExplosionColor = EndColor;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec3 centerOfTriangle = CalcCenterOfTriangle(Input[0].Position, Input[1].Position, Input[2].Position);
|
||||
|
||||
// center position of triangle to origin vector
|
||||
vec3 origin2TriangleCenterVector = centerOfTriangle - ExplosionOrigin;
|
||||
vec3 normalizedOrigin2TriangleCenterVector = normalize(origin2TriangleCenterVector);
|
||||
|
||||
// distance between origin and the center of the current triangle
|
||||
float origin2TriangleCenterDistance = length(origin2TriangleCenterVector);
|
||||
|
||||
// time percentage until end of explosion (0.0-1.0)
|
||||
float timePercetage = TimeSinceDeath / ExplosionDuration;
|
||||
|
||||
// get a random number if randomness is enabled, otherwise the random number will be zero and won't affect the other algorithms
|
||||
if (Randomness == true)
|
||||
{
|
||||
randomDistance = GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar;
|
||||
}
|
||||
// get a random number if randomness is enabled, otherwise the random distance will be zero and won't affect the other algorithms
|
||||
float randomDistance = float(Randomness) * GetRandomNumber(gl_PrimitiveIDIn) * RandomnessScalar;
|
||||
|
||||
vec2 randomVelocity = Velocity * (randomDistance + 1.0);
|
||||
|
||||
// accelaration to use on current frame. is a interpolation between start and end value
|
||||
float currentVelocity = mix(randomVelocity.x, randomVelocity.y, timePercetage);
|
||||
|
||||
if (ExponentialAccelaration == true)
|
||||
{
|
||||
currentVelocity = pow(currentVelocity, 2) / 2.0;
|
||||
}
|
||||
// if the accelaration should be exponential
|
||||
currentVelocity = currentVelocity * max(currentVelocity * float(ExponentialAccelaration), 1.0);
|
||||
|
||||
// distance between origin and the center of the current triangle
|
||||
float origin2TriangleCenterDistance = length(origin2TriangleCenterVector);
|
||||
// the distance the blast has moved since the beginning, i.e. its radius
|
||||
float blastWave = TimeSinceDeath * currentVelocity;
|
||||
|
||||
// the distance from origin to the triangle center with eventual randomness added
|
||||
float fullDistanceWithRandomness = origin2TriangleCenterDistance + randomDistance;
|
||||
|
||||
// vector from the triangle center to the explosion's shockwave
|
||||
vec3 triangleCenter2ExplosionRadius = (normalizedOrigin2TriangleCenterVector * (TimeSinceDeath * currentVelocity)) - (normalizedOrigin2TriangleCenterVector * fullDistanceWithRandomness);
|
||||
float origin2TriangleCenterDistanceWithRandomness = origin2TriangleCenterDistance + randomDistance;
|
||||
|
||||
// if the triangle is inside the blast radius...
|
||||
if (fullDistanceWithRandomness <= (TimeSinceDeath * currentVelocity))
|
||||
vec3 triangleCenter2ExplosionRadius = (normalizedOrigin2TriangleCenterVector * blastWave) - (normalizedOrigin2TriangleCenterVector * origin2TriangleCenterDistanceWithRandomness);
|
||||
|
||||
// if the triangle is inside the blast's radius...
|
||||
float isInsideBlastRadius = LessEqualTo(origin2TriangleCenterDistanceWithRandomness, blastWave);
|
||||
|
||||
// calculate the max distance (s) the triangle will move
|
||||
float accelaration = (randomVelocity.y - randomVelocity.x) / ExplosionDuration;
|
||||
float maxDistance = (randomVelocity.x * ExplosionDuration) + (0.5 * accelaration * ExplosionDuration * ExplosionDuration);
|
||||
|
||||
// if explosion color should be affected by distance instead of time...
|
||||
if (ColorByDistance == true)
|
||||
{
|
||||
float maxRadius = max(TimeSinceDeath * currentVelocity, (ExplosionDuration * currentVelocity));
|
||||
|
||||
float a = (randomVelocity.y - randomVelocity.x) / ExplosionDuration;
|
||||
//float t = sqrt((2 * origin2TriangleCenterDistance) / a);
|
||||
|
||||
// if explosion color should be affected by distance instead of time...
|
||||
if (ColorByDistance == true)
|
||||
{
|
||||
// calculate the max distance (s) the triangle will move
|
||||
float s = (randomVelocity.x * ExplosionDuration) + (0.5 * a * pow(ExplosionDuration, 2));
|
||||
float te = (length(triangleCenter2ExplosionRadius) / s);
|
||||
|
||||
Output.ExplosionColor = EndColor;
|
||||
Output.ExplosionPercentageElapsed = te;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Output.ExplosionColor = EndColor;
|
||||
Output.ExplosionPercentageElapsed = timePercetage;
|
||||
|
||||
}
|
||||
|
||||
// for every vertex on the triangle...
|
||||
for (int i = 0; i < gl_in.length(); i++)
|
||||
{
|
||||
// move the triangle to the blast radius
|
||||
vec3 ExplodedPosition = Input[i].Position + triangleCenter2ExplosionRadius;
|
||||
|
||||
// pass through vertex data
|
||||
Output.Normal = Input[i].Normal;
|
||||
Output.Position = Input[i].Position;
|
||||
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
||||
Output.Tangent = Input[i].Tangent;
|
||||
Output.BiTangent = Input[i].BiTangent;
|
||||
for (int j = 0; j < MAX_SPLITS; j++)
|
||||
{
|
||||
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
|
||||
}
|
||||
|
||||
// convert to model space for the gravity to always be in -y
|
||||
vec4 ExplodedPositionInModelSpace = M * vec4(ExplodedPosition, 1.0);
|
||||
|
||||
// if there is gravity, apply it
|
||||
//if (Gravity == true)
|
||||
//{
|
||||
// // ---DO THIS----> //ExplodedPositionInModelSpace.y = ExplodedPositionInModelSpace.y - TimeSinceHit;
|
||||
//
|
||||
// ExplodedPositionInModelSpace.y = ExplodedPositionInModelSpace.y - pow(TimeSinceDeath, 2);
|
||||
//}
|
||||
|
||||
// convert to screen space
|
||||
gl_Position = P*V * ExplodedPositionInModelSpace;
|
||||
EmitVertex();
|
||||
}
|
||||
Output.ExplosionPercentageElapsed = (length(triangleCenter2ExplosionRadius) / maxDistance) * isInsideBlastRadius * ColorDistanceScalar;
|
||||
}
|
||||
else
|
||||
{
|
||||
// if explosion color should be affected by distance instead of time...
|
||||
if (ColorByDistance == true)
|
||||
{
|
||||
Output.ExplosionColor = EndColor;
|
||||
Output.ExplosionPercentageElapsed = 0.0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Output.ExplosionColor = EndColor;
|
||||
Output.ExplosionPercentageElapsed = timePercetage;
|
||||
Output.ExplosionPercentageElapsed = timePercetage;
|
||||
}
|
||||
|
||||
vec3 ExplodedPosition;
|
||||
for (int i = 0; i < gl_in.length(); i++)
|
||||
{
|
||||
// move the triangle to the blast radius
|
||||
ExplodedPosition = Input[i].Position + (triangleCenter2ExplosionRadius * isInsideBlastRadius);
|
||||
|
||||
}
|
||||
|
||||
// for every vertex on the triangle...
|
||||
for(int i = 0; i < gl_in.length(); i++)
|
||||
{
|
||||
// pass through vertex data
|
||||
Output.Normal = Input[i].Normal;
|
||||
Output.Position = Input[i].Position;
|
||||
Output.TextureCoordinate = Input[i].TextureCoordinate;
|
||||
Output.Tangent = Input[i].Tangent;
|
||||
Output.BiTangent = Input[i].BiTangent;
|
||||
// pass through vertex data
|
||||
PassThingsThrough(i);
|
||||
for (int j = 0; j < MAX_SPLITS; j++)
|
||||
{
|
||||
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
|
||||
}
|
||||
|
||||
// no change in position, pass through vertex
|
||||
gl_Position = gl_in[i].gl_Position;
|
||||
EmitVertex();
|
||||
}
|
||||
for (int j = 0; j < MAX_SPLITS; j++)
|
||||
{
|
||||
Output.PositionLightSpace[j] = Input[i].PositionLightSpace[j];
|
||||
}
|
||||
|
||||
// convert to window space
|
||||
gl_Position = P * V * M * vec4(ExplodedPosition, 1.0);
|
||||
EmitVertex();
|
||||
}
|
||||
|
||||
//EndPrimitive();
|
||||
}
|
||||
}
|
||||
@@ -29,9 +29,10 @@ void main()
|
||||
vec4 color_result = Color * diffuseTexel;
|
||||
|
||||
float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0;
|
||||
float fillResult = floor(pos*FillPercentage);
|
||||
|
||||
color_result = FillColor*diffuseTexel.a*fillResult + color_result*(1-fillResult);
|
||||
if(pos <= FillPercentage) {
|
||||
color_result = FillColor*diffuseTexel.a;
|
||||
}
|
||||
|
||||
sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1));
|
||||
|
||||
|
||||
@@ -146,14 +146,14 @@ bool RayVsTriangle(const Ray& ray,
|
||||
}
|
||||
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix)
|
||||
{
|
||||
for (int i = 0; i < modelIndices.size();) {
|
||||
glm::vec3 v0 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v1 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v2 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
if (RayVsTriangle(ray, v0, v1, v2)) {
|
||||
return true;
|
||||
}
|
||||
@@ -194,7 +194,7 @@ bool RayVsTriangle(const Ray& ray,
|
||||
}
|
||||
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
float& outDistance,
|
||||
@@ -204,9 +204,9 @@ bool RayVsModel(const Ray& ray,
|
||||
outDistance = INFINITY;
|
||||
bool hit = false;
|
||||
for (int i = 0; i < modelIndices.size();) {
|
||||
glm::vec3 v0 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v1 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v2 = Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix);
|
||||
glm::vec3 v0 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
glm::vec3 v1 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
glm::vec3 v2 = TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix);
|
||||
float dist = outDistance;
|
||||
float u;
|
||||
float v;
|
||||
@@ -221,7 +221,7 @@ bool RayVsModel(const Ray& ray,
|
||||
}
|
||||
|
||||
bool RayVsModel(const Ray& ray,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& outHitPosition)
|
||||
@@ -360,7 +360,14 @@ constexpr bool FaceIsGround(float faceNormalY)
|
||||
//An array containing 3 int pairs { 0, 2 }, { 0, 1 }, { 1, 2 }
|
||||
constexpr std::array<std::pair<int, int>, 3> dimensionPairs({ std::pair<int, int>(0, 2), std::pair<int, int>(0, 1), std::pair<int, int>(1, 2) });
|
||||
|
||||
bool AABBvsTriangle(const AABB& box,
|
||||
enum class BoxTriRes
|
||||
{
|
||||
Front,
|
||||
Behind,
|
||||
Intersect
|
||||
};
|
||||
|
||||
BoxTriRes AABBvsTriangle(const AABB& box,
|
||||
const std::array<glm::vec3, 3>& triPos,
|
||||
const glm::vec3& originalBoxVelocity,
|
||||
float verticalStepHeight,
|
||||
@@ -374,7 +381,7 @@ bool AABBvsTriangle(const AABB& box,
|
||||
//Less checks, and we should be able to walk out from models if we are trapped inside.
|
||||
glm::vec3 triNormal = glm::cross(triPos[1] - triPos[0], triPos[2] - triPos[0]);
|
||||
if (!vectorHasLength(triNormal) || (glm::dot(triNormal, originalBoxVelocity) > 0)) {
|
||||
return false;
|
||||
return BoxTriRes::Behind;
|
||||
}
|
||||
triNormal = glm::normalize(triNormal);
|
||||
|
||||
@@ -409,6 +416,9 @@ bool AABBvsTriangle(const AABB& box,
|
||||
const glm::vec3& min = box.MinCorner();
|
||||
const glm::vec3& max = box.MaxCorner();
|
||||
|
||||
// If there is no intersection, whether the box center is in front of or behind the triangle.
|
||||
BoxTriRes noIntersection = glm::dot(triNormal, origin - triPos[0]) > 0 ? BoxTriRes::Front : BoxTriRes::Behind;
|
||||
|
||||
//For each projection in xy-, xz-, and yx-planes.
|
||||
for (std::pair<int, int> dim : dimensionPairs) {
|
||||
//2D Triangle.
|
||||
@@ -426,7 +436,7 @@ bool AABBvsTriangle(const AABB& box,
|
||||
bool pushedFromTriangleLine;
|
||||
//if projections don't overlap, return false.
|
||||
if (!rectangleVsTriangle(boxMin, boxMax, t2D, resolutionVector, resolutionDist, pushedFromTriangleLine)) {
|
||||
return false;
|
||||
return noIntersection;
|
||||
} else if (resolveCollision) {
|
||||
//Overwrite the smallest resolution if this is smaller.
|
||||
if (resolutionDist < resolveShortest.DistanceSq) {
|
||||
@@ -462,14 +472,15 @@ bool AABBvsTriangle(const AABB& box,
|
||||
float t = glm::dot(triNormal, triPos[0] - origin) / glm::dot(triNormal, diagonal);
|
||||
//If intersection point between plane and diagonal is within the box.
|
||||
if (glm::abs(t) > 1) {
|
||||
return false;
|
||||
return noIntersection;
|
||||
}
|
||||
|
||||
if (!resolveCollision) {
|
||||
return true;
|
||||
return BoxTriRes::Intersect;
|
||||
}
|
||||
|
||||
glm::vec3 cornerResolution = (1+t) * diagonal;
|
||||
cornerResolution = glm::dot(cornerResolution, triNormal) * triNormal;
|
||||
//Overwrite the smallest resolution if cornerResolution is smaller.
|
||||
float lenSq = glm::length2(cornerResolution);
|
||||
if (lenSq < resolveShortest.DistanceSq) {
|
||||
@@ -498,7 +509,7 @@ bool AABBvsTriangle(const AABB& box,
|
||||
case ResolveDimZ:
|
||||
//If we get here, the resolution is along one coordinate axis.
|
||||
//set velocity to 0 in y if it is along y-axis.
|
||||
return true;
|
||||
return BoxTriRes::Intersect;
|
||||
case Line:
|
||||
projNorm = glm::normalize(outResolution);
|
||||
break;
|
||||
@@ -533,11 +544,11 @@ bool AABBvsTriangle(const AABB& box,
|
||||
boxVelocity = boxVelocity - glm::dot(boxVelocity, projNorm) * projNorm;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
return BoxTriRes::Intersect;
|
||||
}
|
||||
|
||||
bool AABBvsTriangles(const AABB& box,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
Output AABBvsTriangles(const AABB& box,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& boxVelocity,
|
||||
@@ -546,38 +557,45 @@ bool AABBvsTriangles(const AABB& box,
|
||||
glm::vec3& outResolutionVector,
|
||||
bool resolveCollision)
|
||||
{
|
||||
bool hit = false;
|
||||
|
||||
bool intersect = false;
|
||||
Output out = Output::OutContained;
|
||||
bool everHitTheGround = false;
|
||||
AABB newBox = box;
|
||||
outResolutionVector = glm::vec3(0.f);
|
||||
glm::vec3 originalBoxVelocity(boxVelocity);
|
||||
for (int i = 0; i < modelIndices.size(); ) {
|
||||
std::array<glm::vec3, 3> triVertices = {
|
||||
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
|
||||
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix),
|
||||
Transform::TransformPoint(modelVertices[modelIndices[i++]].Position, modelMatrix)
|
||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
|
||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix),
|
||||
TransformSystem::TransformPoint(modelVertices[modelIndices[i++]], modelMatrix)
|
||||
};
|
||||
glm::vec3 outVec;
|
||||
bool collideWithGround = isOnGround;
|
||||
if (AABBvsTriangle(newBox, triVertices, originalBoxVelocity, verticalStepHeight, collideWithGround, boxVelocity, outVec, resolveCollision)) {
|
||||
hit = true;
|
||||
switch (AABBvsTriangle(newBox, triVertices, originalBoxVelocity, verticalStepHeight, collideWithGround, boxVelocity, outVec, resolveCollision)) {
|
||||
case Collision::BoxTriRes::Front:
|
||||
out = Output::OutSeparated;
|
||||
break;
|
||||
case Collision::BoxTriRes::Intersect:
|
||||
intersect = true;
|
||||
outResolutionVector += outVec;
|
||||
newBox = AABB::FromOriginSize(newBox.Origin() + outVec, newBox.Size());
|
||||
if (collideWithGround) {
|
||||
everHitTheGround = isOnGround = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!everHitTheGround) {
|
||||
isOnGround = false;
|
||||
}
|
||||
return hit;
|
||||
return intersect ? Output::OutIntersecting : out;
|
||||
}
|
||||
|
||||
bool AABBvsTriangles(const AABB& box,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix,
|
||||
glm::vec3& boxVelocity,
|
||||
@@ -593,11 +611,29 @@ bool AABBvsTriangles(const AABB& box,
|
||||
verticalStepHeight,
|
||||
isOnGround,
|
||||
outResolutionVector,
|
||||
true);
|
||||
true) == Output::OutIntersecting;
|
||||
}
|
||||
|
||||
bool AABBvsTriangles(const AABB& box,
|
||||
const RawModel::Vertex* modelVertices,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix)
|
||||
{
|
||||
glm::vec3 vel, outres;
|
||||
bool g;
|
||||
return AABBvsTriangles(box,
|
||||
modelVertices,
|
||||
modelIndices,
|
||||
modelMatrix,
|
||||
vel,
|
||||
0.f,
|
||||
g,
|
||||
outres,
|
||||
false) == Output::OutIntersecting;
|
||||
}
|
||||
|
||||
Output AABBvsTrianglesWContainment(const AABB& box,
|
||||
const std::vector<glm::vec3>& modelVertices,
|
||||
const std::vector<unsigned int>& modelIndices,
|
||||
const glm::mat4& modelMatrix)
|
||||
{
|
||||
@@ -619,9 +655,9 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
|
||||
AABB modelSpaceBox;
|
||||
if (entity.HasComponent("AABB") && !takeModelBox) {
|
||||
ComponentWrapper& cAABB = entity["AABB"];
|
||||
modelSpaceBox = EntityAABB::FromOriginSize((glm::vec3)cAABB["Origin"], (glm::vec3)cAABB["Size"]);
|
||||
modelSpaceBox = EntityAABB::FromOriginSize((const glm::vec3&)cAABB["Origin"], (const glm::vec3&)cAABB["Size"]);
|
||||
} else if (entity.HasComponent("Model")) {
|
||||
std::string res = entity["Model"]["Resource"];
|
||||
const std::string& res = entity["Model"]["Resource"];
|
||||
if (res.empty()) {
|
||||
return boost::none;
|
||||
}
|
||||
@@ -638,7 +674,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
|
||||
return boost::none;
|
||||
}
|
||||
|
||||
glm::mat4 modelMat = Transform::AbsoluteTransformation(entity);
|
||||
glm::mat4 modelMat = TransformSystem::ModelMatrix(entity);
|
||||
glm::vec3 mini(INFINITY);
|
||||
glm::vec3 maxi(-INFINITY);
|
||||
glm::vec3 maxCorner = modelSpaceBox.MaxCorner();
|
||||
@@ -649,7 +685,7 @@ boost::optional<EntityAABB> EntityAbsoluteAABB(EntityWrapper& entity, bool takeM
|
||||
corner.x = bits.test(0) ? maxCorner.x : minCorner.x;
|
||||
corner.y = bits.test(1) ? maxCorner.y : minCorner.y;
|
||||
corner.z = bits.test(2) ? maxCorner.z : minCorner.z;
|
||||
corner = Transform::TransformPoint(corner, modelMat);
|
||||
corner = TransformSystem::TransformPoint(corner, modelMat);
|
||||
mini = glm::min(mini, corner);
|
||||
maxi = glm::max(maxi, corner);
|
||||
}
|
||||
@@ -667,7 +703,7 @@ boost::optional<EntityAABB> AbsoluteAABBExplosionEffect(EntityWrapper& entity)
|
||||
if (!modelBox) {
|
||||
return boost::none;
|
||||
}
|
||||
bool isRandom = (bool)entity["ExplosionEffect"]["Randomness"];
|
||||
Field<bool> isRandom = entity["ExplosionEffect"]["Randomness"];
|
||||
float random = isRandom ? (float)(double)entity["ExplosionEffect"]["RandomnessScalar"] : 0;
|
||||
glm::vec3 origin = (glm::vec3)entity["ExplosionEffect"]["ExplosionOrigin"];
|
||||
glm::vec3 randomVel = (glm::vec3)entity["ExplosionEffect"]["Velocity"];
|
||||
@@ -705,7 +741,7 @@ boost::optional<EntityAABB> EntityFirstHitByRay(const Ray& ray, std::vector<Enti
|
||||
continue;
|
||||
}
|
||||
float u, v;
|
||||
if (RayVsModel(ray, model->Vertices(), model->m_RawModel->m_Indices, Transform::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
|
||||
if (RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(entityBox.Entity), outDistance, u, v)) {
|
||||
outIntersectPos = ray.Origin() + outDistance * ray.Direction();
|
||||
return entityBox;
|
||||
}
|
||||
|
||||
@@ -37,15 +37,19 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
||||
bool hit;
|
||||
float dist;
|
||||
if (boxB.Entity.HasComponent("Model")) {
|
||||
RawModel* model;
|
||||
if (!((bool)boxB.Entity["Model"]["Visible"])) {
|
||||
// Don't collide against invisible models.
|
||||
continue;
|
||||
}
|
||||
Model* model;
|
||||
std::string res = (std::string)boxB.Entity["Model"]["Resource"];
|
||||
try {
|
||||
model = ResourceManager::Load<RawModel, true>(res);
|
||||
model = ResourceManager::Load<Model, true>(res);
|
||||
} catch (const std::exception&) {
|
||||
continue;
|
||||
}
|
||||
float u, v;
|
||||
hit = Collision::RayVsModel(ray, model->Vertices(), model->m_Indices, Transform::ModelMatrix(boxB.Entity), dist, u, v);
|
||||
hit = Collision::RayVsModel(ray, model->m_Vertices, model->m_Indices, TransformSystem::ModelMatrix(boxB.Entity), dist, u, v);
|
||||
} else {
|
||||
hit = Collision::RayVsAABB(ray, boxB, dist);
|
||||
}
|
||||
@@ -54,12 +58,12 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
||||
//TODO: Perhaps this should be done slightly more properly.
|
||||
glm::vec3 newOriginPos = ray.Origin() + (dist - 0.707107f*diameter) * ray.Direction();
|
||||
glm::vec3 resolve = newOriginPos - boxA.Origin();
|
||||
(glm::vec3&)cTransform["Position"] += resolve;
|
||||
(Field<glm::vec3>)cTransform["Position"] += resolve;
|
||||
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||
if (resolve.y > 0) {
|
||||
everHitTheGround = true;
|
||||
(bool)cPhysics["IsOnGround"] = true;
|
||||
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
|
||||
cPhysics["IsOnGround"] = true;
|
||||
((Field<glm::vec3>)cPhysics["Velocity"]).y(0.f);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -77,23 +81,26 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
||||
}
|
||||
|
||||
if (boxB.Entity.HasComponent("Model") && Collision::AABBVsAABB(boxA, boxB)) {
|
||||
//Here we know boxB is a entity with Collideable, AABB, and Model.
|
||||
RawModel* model;
|
||||
// Here we know boxB is a entity with Collideable, AABB, and Model.
|
||||
if (!((const bool&)boxB.Entity["Model"]["Visible"])) {
|
||||
// Don't collide against invisible models.
|
||||
continue;
|
||||
}
|
||||
Model* model;
|
||||
try {
|
||||
model = ResourceManager::Load<RawModel, true>(boxB.Entity["Model"]["Resource"]);
|
||||
model = ResourceManager::Load<Model, true>(boxB.Entity["Model"]["Resource"]);
|
||||
} catch (const std::exception&) {
|
||||
continue;
|
||||
}
|
||||
|
||||
glm::mat4 modelMatrix = Transform::ModelMatrix(boxB.Entity);
|
||||
glm::mat4 modelMatrix = TransformSystem::ModelMatrix(boxB.Entity);
|
||||
|
||||
glm::vec3 inOutVelocity = (glm::vec3)cPhysics["Velocity"];
|
||||
bool notMovingxz = glm::all(glm::lessThan(glm::abs(glm::vec2(inOutVelocity.x, inOutVelocity.z)), glm::vec2(0.01f))) && prevPosIt != m_PrevPositions.end();
|
||||
bool isOnGround = (bool)cPhysics["IsOnGround"];
|
||||
float verticalStepHeight = (float)(double)cPhysics["VerticalStepHeight"];
|
||||
if (Collision::AABBvsTriangles(boxA, model->Vertices(), model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
||||
if (Collision::AABBvsTriangles(boxA, model->m_Vertices, model->m_Indices, modelMatrix, inOutVelocity, verticalStepHeight, isOnGround, resolutionVector)) {
|
||||
//Move the position to previous position if it is not moving in the xz-plane, else resolve with the resolution vector.
|
||||
(glm::vec3&)cTransform["Position"] += notMovingxz ? prevPosIt->second - boxA.Origin() : resolutionVector;
|
||||
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
|
||||
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||
cPhysics["Velocity"] = inOutVelocity;
|
||||
if (isOnGround) {
|
||||
@@ -103,12 +110,12 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
|
||||
}
|
||||
} else if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
|
||||
//Enter here if boxB has no Model.
|
||||
(glm::vec3&)cTransform["Position"] += resolutionVector;
|
||||
(Field<glm::vec3>)cTransform["Position"] += resolutionVector;
|
||||
boxA = *Collision::EntityAbsoluteAABB(entity);
|
||||
if (resolutionVector.y > 0) {
|
||||
everHitTheGround = true;
|
||||
(bool)cPhysics["IsOnGround"] = true;
|
||||
((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
|
||||
((Field<glm::vec3>)cPhysics["Velocity"]).y(0.f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,16 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
||||
return;
|
||||
}
|
||||
|
||||
Model* triggerModel = nullptr;
|
||||
glm::mat4 triggerModelMat;
|
||||
if (triggerEntity.HasComponent("Model")) {
|
||||
try {
|
||||
triggerModel = ResourceManager::Load<Model, true>(triggerEntity["Model"]["Resource"]);
|
||||
triggerModelMat = TransformSystem::ModelMatrix(triggerEntity);
|
||||
} catch (const std::exception&) {
|
||||
}
|
||||
}
|
||||
|
||||
m_OctreeOut.clear();
|
||||
m_Octree->ObjectsInSameRegion(*triggerBox, m_OctreeOut);
|
||||
|
||||
@@ -22,7 +32,17 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
||||
if (colliderFitsInTrigger) {
|
||||
completelyInsideBox = AABB::FromOriginSize((*triggerBox).Origin(), (*triggerBox).Size() - 2.0f * colliderBox.Size());
|
||||
}
|
||||
if (colliderFitsInTrigger && Collision::AABBVsAABB(completelyInsideBox, colliderBox)) {
|
||||
|
||||
// We know the entity is inside the trigger box, but perhaps not the model yet.
|
||||
Collision::Output out = triggerModel == nullptr
|
||||
? Collision::Output::OutContained
|
||||
: Collision::AABBvsTrianglesWContainment(
|
||||
colliderBox,
|
||||
triggerModel->m_Vertices,
|
||||
triggerModel->m_Indices,
|
||||
triggerModelMat);
|
||||
|
||||
if (colliderFitsInTrigger && Collision::AABBVsAABB(completelyInsideBox, colliderBox) && out == Collision::Output::OutContained) {
|
||||
// Entity is completely inside the trigger.
|
||||
// If it was only touching before, it is erased.
|
||||
m_EntitiesTouchingTrigger[triggerEntity].erase(colliderEntity);
|
||||
@@ -32,7 +52,8 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
||||
completeSet.insert(colliderEntity);
|
||||
publish<Events::TriggerEnter>(colliderEntity, triggerEntity);
|
||||
}
|
||||
} else {
|
||||
continue;
|
||||
} else if (out != Collision::Output::OutSeparated) {
|
||||
// Entity is only touching the trigger.
|
||||
auto& touchSet = m_EntitiesTouchingTrigger[triggerEntity];
|
||||
auto& completeSet = m_EntitiesCompletelyInTrigger[triggerEntity];
|
||||
@@ -47,17 +68,17 @@ void TriggerSystem::UpdateComponent(EntityWrapper& triggerEntity, ComponentWrapp
|
||||
touchSet.insert(colliderEntity);
|
||||
}
|
||||
// Else, it was touching the trigger last frame too and nothing is done.
|
||||
}
|
||||
} else {
|
||||
// Entity is not touching the trigger,
|
||||
// Throw event if it was previously.
|
||||
if (throwLeaveIfWasInTrigger(m_EntitiesTouchingTrigger[triggerEntity], colliderEntity, triggerEntity)) {
|
||||
continue;
|
||||
}
|
||||
// This only occurs if the entity was completely inside the trigger one frame,
|
||||
// then completely outside the trigger, e.g. when dying and respawning.
|
||||
throwLeaveIfWasInTrigger(m_EntitiesCompletelyInTrigger[triggerEntity], colliderEntity, triggerEntity);
|
||||
}
|
||||
// Only get here if entity is not touching the trigger,
|
||||
// throw event if it was touching previously.
|
||||
if (throwLeaveIfWasInTrigger(m_EntitiesTouchingTrigger[triggerEntity], colliderEntity, triggerEntity)) {
|
||||
continue;
|
||||
}
|
||||
// This only occurs if the entity was completely inside the trigger one frame,
|
||||
// then completely outside the trigger, e.g. when dying and respawning.
|
||||
throwLeaveIfWasInTrigger(m_EntitiesCompletelyInTrigger[triggerEntity], colliderEntity, triggerEntity);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,17 @@
|
||||
#include "Core/ComponentPool.h"
|
||||
|
||||
ComponentPoolForwardIterator::ComponentPoolForwardIterator(ComponentPool* pool, const MemoryPool<char>::iterator begin, const MemoryPool<char>::iterator end)
|
||||
: m_ComponentPool(pool)
|
||||
, m_ComponentInfo(pool->m_ComponentInfo)
|
||||
, m_MemoryPoolIterator(begin)
|
||||
, m_MemoryPoolEnd(end)
|
||||
{ }
|
||||
|
||||
ComponentWrapper ComponentPoolForwardIterator::operator*() const
|
||||
{
|
||||
char* data = &(*m_MemoryPoolIterator);
|
||||
ComponentWrapper wrapper(m_ComponentInfo, data);
|
||||
EntityID entity = *reinterpret_cast<EntityID*>(data);
|
||||
ComponentWrapper wrapper(m_ComponentInfo, data, &m_ComponentPool->m_DirtySet[entity], m_ComponentPool->m_World);
|
||||
return wrapper;
|
||||
}
|
||||
|
||||
@@ -44,7 +52,7 @@ ComponentPool::ComponentPool(const ComponentPool& other)
|
||||
// Duplicate strings
|
||||
for (auto& name : m_ComponentInfo.StringFields) {
|
||||
for (auto& c : *this) {
|
||||
std::string& val = c[name];
|
||||
Field<std::string> val = c[name];
|
||||
ComponentWrapper::SolidifyStrings(c);
|
||||
}
|
||||
}
|
||||
@@ -71,7 +79,7 @@ ComponentWrapper ComponentPool::Allocate(EntityID entity)
|
||||
memcpy(data, &entity, sizeof(EntityID));
|
||||
|
||||
m_EntityToComponent[entity] = data;
|
||||
ComponentWrapper component(m_ComponentInfo, data);
|
||||
ComponentWrapper component(m_ComponentInfo, data, &m_DirtySet[entity], m_World);
|
||||
|
||||
// Copy defaults
|
||||
memcpy(component.Data, m_ComponentInfo.Defaults.get(), m_ComponentInfo.Stride);
|
||||
@@ -82,7 +90,9 @@ ComponentWrapper ComponentPool::Allocate(EntityID entity)
|
||||
|
||||
ComponentWrapper ComponentPool::GetByEntity(EntityID ent)
|
||||
{
|
||||
return ComponentWrapper(m_ComponentInfo, m_EntityToComponent.at(ent));
|
||||
auto data = m_EntityToComponent.at(ent);
|
||||
auto bitField = &m_DirtySet[ent];
|
||||
return ComponentWrapper(m_ComponentInfo, data, bitField, m_World);
|
||||
}
|
||||
|
||||
bool ComponentPool::KnowsEntity(EntityID ent)
|
||||
@@ -95,16 +105,17 @@ void ComponentPool::Delete(ComponentWrapper& wrapper)
|
||||
ComponentWrapper::Destroy(wrapper.Info, wrapper.Data);
|
||||
m_EntityToComponent.erase(wrapper.EntityID);
|
||||
m_Pool.Free(wrapper.Data - sizeof(EntityID));
|
||||
m_DirtySet.erase(wrapper.EntityID);
|
||||
}
|
||||
|
||||
ComponentPool::iterator ComponentPool::begin() const
|
||||
ComponentPool::iterator ComponentPool::begin()
|
||||
{
|
||||
return iterator(m_ComponentInfo, m_Pool.begin(), m_Pool.end());
|
||||
return iterator(this, m_Pool.begin(), m_Pool.end());
|
||||
}
|
||||
|
||||
ComponentPool::iterator ComponentPool::end() const
|
||||
ComponentPool::iterator ComponentPool::end()
|
||||
{
|
||||
return iterator(m_ComponentInfo, m_Pool.end(), m_Pool.end());
|
||||
return iterator(this, m_Pool.end(), m_Pool.end());
|
||||
}
|
||||
|
||||
size_t ComponentPool::size() const
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
#include "Core/World.h"
|
||||
#include "Core/ComponentWrapper.h"
|
||||
|
||||
ComponentWrapper::ComponentWrapper(const ComponentInfo& componentInfo, char* data, ::DirtyBitField* dirtyBitField, World* world)
|
||||
: Info(componentInfo)
|
||||
, EntityID(*reinterpret_cast<::EntityID*>(data))
|
||||
, Data(data + componentInfo.GetHeaderSize())
|
||||
, DirtyBitField(dirtyBitField)
|
||||
, m_World(world)
|
||||
{}
|
||||
|
||||
ComponentInfo::EnumType ComponentWrapper::Enum(const char* fieldName, const char* enumKey)
|
||||
{
|
||||
return Info.Meta->FieldEnumDefinitions.at(fieldName).at(enumKey);
|
||||
}
|
||||
|
||||
bool ComponentWrapper::Dirty(DirtySetType type, const std::string& fieldName)
|
||||
{
|
||||
if (DirtyBitField == nullptr) {
|
||||
return true;
|
||||
} else {
|
||||
auto& field = Info.Fields.at(fieldName);
|
||||
return DirtyBitField->operator[](type).count(field.Index) == 1;
|
||||
}
|
||||
}
|
||||
|
||||
void ComponentWrapper::SetDirty(DirtySetType type, const std::string& fieldName, bool dirty /* = true */)
|
||||
{
|
||||
if (DirtyBitField == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto& field = Info.Fields.at(fieldName);
|
||||
if (dirty) {
|
||||
DirtyBitField->operator[](type).insert(field.Index);
|
||||
// Because parents affects children when altered, we also need to flag all children as dirty.
|
||||
if (type == DirtySetType::Transform && m_World != nullptr) {
|
||||
auto children = m_World->GetDirectChildren(EntityID);
|
||||
for (auto kv = children.first; kv != children.second; ++kv) {
|
||||
const auto& child = kv->second;
|
||||
if (m_World->HasComponent(child, Info.Name)) {
|
||||
m_World->GetComponent(child, Info.Name).SetDirty(DirtySetType::Transform, fieldName, true);
|
||||
if (fieldName == "Orientation" || fieldName == "Scale") {
|
||||
m_World->GetComponent(child, Info.Name).SetDirty(DirtySetType::Transform, "Position", true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DirtyBitField->operator[](type).erase(field.Index);
|
||||
}
|
||||
}
|
||||
|
||||
void ComponentWrapper::SetAllDirty(const std::string& fieldName, bool dirty /* = true */)
|
||||
{
|
||||
for (auto& kv : *DirtyBitField) {
|
||||
SetDirty(kv.first, fieldName);
|
||||
}
|
||||
}
|
||||
@@ -94,8 +94,30 @@ EntityWrapper EntityWrapper::Clone(EntityWrapper parent /*= Invalid*/)
|
||||
return EntityWrapper::Invalid;
|
||||
}
|
||||
|
||||
EntityWrapper clone = cloneRecursive(*this, EntityWrapper::Invalid);
|
||||
this->World->SetParent(clone.ID, parent.ID);
|
||||
// Create a relationship map of children of this entity
|
||||
std::unordered_multimap<EntityWrapper, EntityWrapper> relationships;
|
||||
fillRelationships(relationships, *this);
|
||||
|
||||
::World* targetWorld = this->World;
|
||||
if (parent.Valid()) {
|
||||
targetWorld = parent.World;
|
||||
}
|
||||
|
||||
// Create root entity
|
||||
EntityWrapper clone(targetWorld, targetWorld->CreateEntity(parent.ID));
|
||||
// Copy name
|
||||
clone.World->SetName(clone.ID, this->Name());
|
||||
// Clone components
|
||||
for (auto& kv : this->World->GetComponentPools()) {
|
||||
if (kv.second->KnowsEntity(this->ID)) {
|
||||
ComponentWrapper c1 = kv.second->GetByEntity(this->ID);
|
||||
ComponentWrapper c2 = clone.World->AttachComponent(clone.ID, kv.first);
|
||||
c1.Copy(c2);
|
||||
}
|
||||
}
|
||||
// Recreate entity tree
|
||||
recreateRelationships(relationships, *this, clone);
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
@@ -207,30 +229,6 @@ EntityWrapper EntityWrapper::firstChildByNameRecursive(const std::string& name,
|
||||
return EntityWrapper::Invalid;
|
||||
}
|
||||
|
||||
EntityWrapper EntityWrapper::cloneRecursive(EntityWrapper entity, EntityWrapper parent)
|
||||
{
|
||||
EntityWrapper clone = EntityWrapper(entity.World, entity.World->CreateEntity(parent.ID));
|
||||
entity.World->SetName(clone.ID, entity.Name());
|
||||
|
||||
// Clone components
|
||||
for (auto& kv : entity.World->GetComponentPools()) {
|
||||
if (kv.second->KnowsEntity(entity.ID)) {
|
||||
ComponentWrapper c1 = kv.second->GetByEntity(entity.ID);
|
||||
ComponentWrapper c2 = entity.World->AttachComponent(clone.ID, kv.first);
|
||||
c1.Copy(c2);
|
||||
}
|
||||
}
|
||||
|
||||
// Clone children
|
||||
auto children = entity.World->GetDirectChildren(entity.ID);
|
||||
for (auto it = children.first; it != children.second; ++it) {
|
||||
EntityWrapper child(entity.World, it->second);
|
||||
cloneRecursive(child, clone);
|
||||
}
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
void EntityWrapper::childrenWithComponentRecursive(const std::string& componentType, EntityWrapper& entity, std::vector<EntityWrapper>& childrenWithComponent)
|
||||
{
|
||||
auto itPair = this->World->GetDirectChildren(entity.ID);
|
||||
@@ -246,3 +244,35 @@ void EntityWrapper::childrenWithComponentRecursive(const std::string& componentT
|
||||
childrenWithComponentRecursive(componentType, child, childrenWithComponent);
|
||||
}
|
||||
}
|
||||
|
||||
void EntityWrapper::fillRelationships(std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper entity)
|
||||
{
|
||||
auto children = entity.World->GetDirectChildren(entity.ID);
|
||||
for (auto it = children.first; it != children.second; ++it) {
|
||||
EntityWrapper child(entity.World, it->second);
|
||||
relationMap.insert(std::make_pair(entity, child));
|
||||
fillRelationships(relationMap, child);
|
||||
}
|
||||
}
|
||||
|
||||
void EntityWrapper::recreateRelationships(const std::unordered_multimap<EntityWrapper, EntityWrapper>& relationMap, EntityWrapper templateEntity, EntityWrapper parent /*= EntityWrapper::Invalid*/)
|
||||
{
|
||||
// Recursively create children
|
||||
auto children = relationMap.equal_range(templateEntity);
|
||||
for (auto it = children.first; it != children.second; ++it) {
|
||||
EntityWrapper child = it->second;
|
||||
// Create clone entity
|
||||
EntityWrapper clone(parent.World, parent.World->CreateEntity(parent.ID));
|
||||
// Copy name
|
||||
clone.World->SetName(clone.ID, child.Name());
|
||||
// Clone components
|
||||
for (auto& kv : child.World->GetComponentPools()) {
|
||||
if (kv.second->KnowsEntity(child.ID)) {
|
||||
ComponentWrapper c1 = kv.second->GetByEntity(child.ID);
|
||||
ComponentWrapper c2 = clone.World->AttachComponent(clone.ID, kv.first);
|
||||
c1.Copy(c2);
|
||||
}
|
||||
}
|
||||
recreateRelationships(relationMap, child, clone);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,6 +125,7 @@ void EntityXMLFilePreprocessor::parseComponentInfo()
|
||||
auto modelGroup = modelGroupParticle->getModelGroupTerm();
|
||||
|
||||
// <xs:element...
|
||||
unsigned char fieldIndex = 0;
|
||||
unsigned int fieldOffset = 0;
|
||||
auto particles = modelGroup->getParticles();
|
||||
for (unsigned int i = 0; i < particles->size(); ++i) {
|
||||
@@ -182,12 +183,14 @@ void EntityXMLFilePreprocessor::parseComponentInfo()
|
||||
auto& field = compInfo.Fields[name];
|
||||
field.Name = name;
|
||||
field.Type = effectiveType;
|
||||
field.Index = fieldIndex;
|
||||
field.Offset = fieldOffset;
|
||||
field.Stride = stride;
|
||||
compInfo.FieldsInOrder.push_back(name);
|
||||
if (field.Type == "string") {
|
||||
compInfo.StringFields.push_back(name);
|
||||
}
|
||||
fieldIndex += 1;
|
||||
fieldOffset += stride;
|
||||
}
|
||||
|
||||
|
||||
+118
-59
@@ -1,103 +1,162 @@
|
||||
#include "Core/Transform.h"
|
||||
#include "Core/TransformSystem.h"
|
||||
|
||||
glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
|
||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::PositionCache;
|
||||
std::unordered_map<EntityWrapper, glm::quat> TransformSystem::OrientationCache;
|
||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::ScaleCache;
|
||||
std::unordered_map<EntityWrapper, glm::mat4> TransformSystem::MatrixCache;
|
||||
|
||||
int TransformSystem::RecalculatedPositions = 0;
|
||||
int TransformSystem::RecalculatedOrientations = 0;
|
||||
int TransformSystem::RecalculatedScales = 0;
|
||||
|
||||
TransformSystem::TransformSystem(SystemParams params)
|
||||
: System(params)
|
||||
{
|
||||
glm::mat4 t = glm::mat4(1.f);
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &TransformSystem::OnEntityDeleted);
|
||||
}
|
||||
|
||||
while (entity.Valid()) {
|
||||
t = glm::translate((glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((glm::vec3&)entity["Transform"]["Scale"]) * t;
|
||||
entity = entity.Parent();
|
||||
bool TransformSystem::OnEntityDeleted(const Events::EntityDeleted& e)
|
||||
{
|
||||
// Clean up deleted entity
|
||||
PositionCache.erase(e.DeletedEntity);
|
||||
OrientationCache.erase(e.DeletedEntity);
|
||||
ScaleCache.erase(e.DeletedEntity);
|
||||
MatrixCache.erase(e.DeletedEntity);
|
||||
return true;
|
||||
}
|
||||
|
||||
//glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
|
||||
//{
|
||||
// glm::mat4 t = glm::mat4(1.f);
|
||||
//
|
||||
// while (entity.Valid()) {
|
||||
// t = glm::translate((const glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((const glm::vec3&)entity["Transform"]["Scale"]) * t;
|
||||
// entity = entity.Parent();
|
||||
// }
|
||||
//
|
||||
// return t;
|
||||
//}
|
||||
|
||||
glm::vec3 TransformSystem::AbsolutePosition(World* world, EntityID entity)
|
||||
{
|
||||
return TransformSystem::AbsolutePosition(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::AbsolutePosition(EntityWrapper entity)
|
||||
{
|
||||
if (!entity.Valid()) {
|
||||
return glm::vec3();
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
glm::vec3 Transform::AbsolutePosition(EntityWrapper entity)
|
||||
{
|
||||
return AbsolutePosition(entity.World, entity.ID);
|
||||
}
|
||||
|
||||
glm::vec3 Transform::AbsolutePosition(World* world, EntityID entity)
|
||||
{
|
||||
glm::vec3 position;
|
||||
|
||||
while (entity != EntityID_Invalid) {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
EntityID parent = world->GetParent(entity);
|
||||
position += Transform::AbsoluteScale(world, parent) * (Transform::AbsoluteOrientation(world, parent) * (glm::vec3)transform["Position"]);
|
||||
entity = parent;
|
||||
auto cacheIt = PositionCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformPosition = cTransform["Position"];
|
||||
if (cacheIt != PositionCache.end() && !cTransformPosition.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate position
|
||||
glm::vec3 position = AbsolutePosition(parent) + TransformSystem::AbsoluteOrientation(parent) * (TransformSystem::AbsoluteScale(parent) * (const glm::vec3&)cTransformPosition);
|
||||
// Cache it
|
||||
PositionCache[entity] = position;
|
||||
RecalculatedPositions++;
|
||||
// Unset dirty flag
|
||||
cTransformPosition.SetDirty(DirtySetType::Transform, false);
|
||||
return position;
|
||||
}
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
glm::vec3 Transform::AbsoluteOrientationEuler(EntityWrapper entity)
|
||||
glm::vec3 TransformSystem::AbsoluteOrientationEuler(EntityWrapper entity)
|
||||
{
|
||||
glm::vec3 orientation;
|
||||
|
||||
while (entity.Valid()) {
|
||||
ComponentWrapper transform = entity["Transform"];
|
||||
orientation += (glm::vec3)transform["Orientation"];
|
||||
orientation += (Field<glm::vec3>)transform["Orientation"];
|
||||
entity = entity.Parent();
|
||||
}
|
||||
|
||||
return orientation;
|
||||
}
|
||||
|
||||
glm::quat Transform::AbsoluteOrientation(EntityWrapper entity)
|
||||
glm::quat TransformSystem::AbsoluteOrientation(World* world, EntityID entity)
|
||||
{
|
||||
return AbsoluteOrientation(entity.World, entity.ID);
|
||||
return TransformSystem::AbsoluteOrientation(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::quat Transform::AbsoluteOrientation(World* world, EntityID entity)
|
||||
glm::quat TransformSystem::AbsoluteOrientation(EntityWrapper entity)
|
||||
{
|
||||
glm::quat orientation;
|
||||
|
||||
while (entity != EntityID_Invalid) {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
orientation = glm::quat((glm::vec3)transform["Orientation"]) * orientation;
|
||||
entity = world->GetParent(entity);
|
||||
if (!entity.Valid()) {
|
||||
return glm::quat();
|
||||
}
|
||||
|
||||
return orientation;
|
||||
auto cacheIt = OrientationCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformOrientation = cTransform["Orientation"];
|
||||
if (cacheIt != OrientationCache.end() && !cTransformOrientation.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate orientation
|
||||
glm::quat orientation = AbsoluteOrientation(parent) * glm::quat((const glm::vec3&)cTransformOrientation);
|
||||
// Cache it
|
||||
OrientationCache[entity] = orientation;
|
||||
RecalculatedOrientations++;
|
||||
// Unset dirty flag
|
||||
cTransformOrientation.SetDirty(DirtySetType::Transform, false);
|
||||
return orientation;
|
||||
}
|
||||
}
|
||||
|
||||
glm::vec3 Transform::AbsoluteScale(EntityWrapper entity)
|
||||
glm::vec3 TransformSystem::AbsoluteScale(World* world, EntityID entity)
|
||||
{
|
||||
return AbsoluteScale(entity.World, entity.ID);
|
||||
return TransformSystem::AbsoluteScale(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::vec3 Transform::AbsoluteScale(World* world, EntityID entity)
|
||||
glm::vec3 TransformSystem::AbsoluteScale(EntityWrapper entity)
|
||||
{
|
||||
glm::vec3 scale(1.f);
|
||||
|
||||
while (entity != EntityID_Invalid) {
|
||||
ComponentWrapper transform = world->GetComponent(entity, "Transform");
|
||||
scale *= (glm::vec3)transform["Scale"];
|
||||
entity = world->GetParent(entity);
|
||||
if (!entity.Valid()) {
|
||||
return glm::vec3(1.f);
|
||||
}
|
||||
|
||||
return scale;
|
||||
auto cacheIt = ScaleCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformScale = cTransform["Scale"];
|
||||
if (cacheIt != ScaleCache.end() && !cTransformScale.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate scale
|
||||
glm::vec3 scale = AbsoluteScale(parent) * (const glm::vec3&)cTransformScale;
|
||||
// Cache it
|
||||
ScaleCache[entity] = scale;
|
||||
RecalculatedPositions++;
|
||||
// Unset dirty flag
|
||||
cTransformScale.SetDirty(DirtySetType::Transform, false);
|
||||
return scale;
|
||||
}
|
||||
}
|
||||
|
||||
glm::mat4 Transform::ModelMatrix(EntityWrapper entity)
|
||||
glm::mat4 TransformSystem::ModelMatrix(EntityID entityID, World* world)
|
||||
{
|
||||
return ModelMatrix(entity.ID, entity.World);
|
||||
return ModelMatrix(EntityWrapper(world, entityID));
|
||||
}
|
||||
|
||||
glm::mat4 Transform::ModelMatrix(EntityID entity, World* world)
|
||||
glm::mat4 TransformSystem::ModelMatrix(EntityWrapper entity)
|
||||
{
|
||||
return AbsoluteTransformation(EntityWrapper(world, entity));
|
||||
|
||||
//glm::vec3 position = Transform::AbsolutePosition(world, entity);
|
||||
//glm::quat orientation = Transform::AbsoluteOrientation(world, entity);
|
||||
//glm::vec3 scale = Transform::AbsoluteScale(world, entity);
|
||||
|
||||
//glm::mat4 modelMatrix = glm::translate(glm::mat4(), position) * glm::toMat4(orientation) * glm::scale(scale);
|
||||
//return modelMatrix;
|
||||
auto cacheIt = MatrixCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
bool isDirty = cTransform["Position"].Dirty(DirtySetType::Transform) || cTransform["Orientation"].Dirty(DirtySetType::Transform) || cTransform["Scale"].Dirty(DirtySetType::Transform);
|
||||
if (cacheIt != MatrixCache.end() && !isDirty) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
glm::mat4 matrix = glm::translate(AbsolutePosition(entity)) * glm::toMat4(AbsoluteOrientation(entity)) * glm::scale(AbsoluteScale(entity));
|
||||
MatrixCache[entity] = matrix;
|
||||
return matrix;
|
||||
}
|
||||
}
|
||||
|
||||
glm::vec3 Transform::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
||||
glm::vec3 TransformSystem::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
||||
{
|
||||
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
|
||||
}
|
||||
@@ -0,0 +1,162 @@
|
||||
#include "Core/TransformSystem.h"
|
||||
|
||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::PositionCache;
|
||||
std::unordered_map<EntityWrapper, glm::quat> TransformSystem::OrientationCache;
|
||||
std::unordered_map<EntityWrapper, glm::vec3> TransformSystem::ScaleCache;
|
||||
std::unordered_map<EntityWrapper, glm::mat4> TransformSystem::MatrixCache;
|
||||
|
||||
int TransformSystem::RecalculatedPositions = 0;
|
||||
int TransformSystem::RecalculatedOrientations = 0;
|
||||
int TransformSystem::RecalculatedScales = 0;
|
||||
|
||||
TransformSystem::TransformSystem(SystemParams params)
|
||||
: System(params)
|
||||
{
|
||||
EVENT_SUBSCRIBE_MEMBER(m_EEntityDeleted, &TransformSystem::OnEntityDeleted);
|
||||
}
|
||||
|
||||
bool TransformSystem::OnEntityDeleted(const Events::EntityDeleted& e)
|
||||
{
|
||||
// Clean up deleted entity
|
||||
PositionCache.erase(e.DeletedEntity);
|
||||
OrientationCache.erase(e.DeletedEntity);
|
||||
ScaleCache.erase(e.DeletedEntity);
|
||||
MatrixCache.erase(e.DeletedEntity);
|
||||
return true;
|
||||
}
|
||||
|
||||
//glm::mat4 Transform::AbsoluteTransformation(EntityWrapper entity)
|
||||
//{
|
||||
// glm::mat4 t = glm::mat4(1.f);
|
||||
//
|
||||
// while (entity.Valid()) {
|
||||
// t = glm::translate((const glm::vec3&)entity["Transform"]["Position"]) * glm::toMat4(glm::quat((const glm::vec3&)entity["Transform"]["Orientation"])) * glm::scale((const glm::vec3&)entity["Transform"]["Scale"]) * t;
|
||||
// entity = entity.Parent();
|
||||
// }
|
||||
//
|
||||
// return t;
|
||||
//}
|
||||
|
||||
glm::vec3 TransformSystem::AbsolutePosition(World* world, EntityID entity)
|
||||
{
|
||||
return TransformSystem::AbsolutePosition(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::AbsolutePosition(EntityWrapper entity)
|
||||
{
|
||||
if (!entity.Valid()) {
|
||||
return glm::vec3();
|
||||
}
|
||||
|
||||
auto cacheIt = PositionCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformPosition = cTransform["Position"];
|
||||
if (cacheIt != PositionCache.end() && !cTransformPosition.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate position
|
||||
glm::vec3 position = AbsolutePosition(parent) + TransformSystem::AbsoluteOrientation(parent) * (TransformSystem::AbsoluteScale(parent) * (const glm::vec3&)cTransformPosition);
|
||||
// Cache it
|
||||
PositionCache[entity] = position;
|
||||
RecalculatedPositions++;
|
||||
// Unset dirty flag
|
||||
cTransformPosition.SetDirty(DirtySetType::Transform, false);
|
||||
return position;
|
||||
}
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::AbsoluteOrientationEuler(EntityWrapper entity)
|
||||
{
|
||||
glm::vec3 orientation;
|
||||
|
||||
while (entity.Valid()) {
|
||||
ComponentWrapper transform = entity["Transform"];
|
||||
orientation += (Field<glm::vec3>)transform["Orientation"];
|
||||
entity = entity.Parent();
|
||||
}
|
||||
|
||||
return orientation;
|
||||
}
|
||||
|
||||
glm::quat TransformSystem::AbsoluteOrientation(World* world, EntityID entity)
|
||||
{
|
||||
return TransformSystem::AbsoluteOrientation(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::quat TransformSystem::AbsoluteOrientation(EntityWrapper entity)
|
||||
{
|
||||
if (!entity.Valid()) {
|
||||
return glm::quat();
|
||||
}
|
||||
|
||||
auto cacheIt = OrientationCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformOrientation = cTransform["Orientation"];
|
||||
if (cacheIt != OrientationCache.end() && !cTransformOrientation.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate orientation
|
||||
glm::quat orientation = AbsoluteOrientation(parent) * glm::quat((const glm::vec3&)cTransformOrientation);
|
||||
// Cache it
|
||||
OrientationCache[entity] = orientation;
|
||||
RecalculatedOrientations++;
|
||||
// Unset dirty flag
|
||||
cTransformOrientation.SetDirty(DirtySetType::Transform, false);
|
||||
return orientation;
|
||||
}
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::AbsoluteScale(World* world, EntityID entity)
|
||||
{
|
||||
return TransformSystem::AbsoluteScale(EntityWrapper(world, entity));
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::AbsoluteScale(EntityWrapper entity)
|
||||
{
|
||||
if (!entity.Valid()) {
|
||||
return glm::vec3(1.f);
|
||||
}
|
||||
|
||||
auto cacheIt = ScaleCache.find(entity);
|
||||
ComponentWrapper cTransform = entity["Transform"];
|
||||
ComponentWrapper::SubscriptProxy cTransformScale = cTransform["Scale"];
|
||||
if (cacheIt != ScaleCache.end() && !cTransformScale.Dirty(DirtySetType::Transform)) {
|
||||
return cacheIt->second;
|
||||
} else {
|
||||
EntityWrapper parent = entity.Parent();
|
||||
// Calculate scale
|
||||
glm::vec3 scale = AbsoluteScale(parent) * (const glm::vec3&)cTransformScale;
|
||||
// Cache it
|
||||
ScaleCache[entity] = scale;
|
||||
RecalculatedPositions++;
|
||||
// Unset dirty flag
|
||||
cTransformScale.SetDirty(DirtySetType::Transform, false);
|
||||
return scale;
|
||||
}
|
||||
}
|
||||
|
||||
glm::mat4 TransformSystem::ModelMatrix(EntityID entityID, World* world)
|
||||
{
|
||||
return ModelMatrix(EntityWrapper(world, entityID));
|
||||
}
|
||||
|
||||
glm::mat4 TransformSystem::ModelMatrix(EntityWrapper entity)
|
||||
{
|
||||
//auto cacheIt = MatrixCache.find(entity);
|
||||
//ComponentWrapper cTransform = entity["Transform"];
|
||||
//bool isDirty = cTransform["Position"].Dirty(DirtySetType::Transform) || cTransform["Orientation"].Dirty(DirtySetType::Transform) || cTransform["Scale"].Dirty(DirtySetType::Transform);
|
||||
//if (cacheIt != MatrixCache.end() && !isDirty && false) {
|
||||
// return cacheIt->second;
|
||||
//} else {
|
||||
glm::mat4 matrix = glm::translate(AbsolutePosition(entity)) * glm::toMat4(AbsoluteOrientation(entity)) * glm::scale(AbsoluteScale(entity));
|
||||
// MatrixCache[entity] = matrix;
|
||||
return matrix;
|
||||
//}
|
||||
}
|
||||
|
||||
glm::vec3 TransformSystem::TransformPoint(const glm::vec3& point, const glm::mat4& matrix)
|
||||
{
|
||||
return glm::vec3(matrix * glm::vec4(point.x, point.y, point.z, 1));
|
||||
}
|
||||
@@ -13,8 +13,8 @@ void UniformScaleSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper
|
||||
return;
|
||||
}
|
||||
|
||||
float distance = glm::length((glm::vec3)entity["Transform"]["Position"] - (glm::vec3&)m_Camera["Transform"]["Position"]);
|
||||
entity["Transform"]["Scale"] = (glm::vec3&)cUniformScale["Scale"] * distance;
|
||||
float distance = glm::length((glm::vec3)entity["Transform"]["Position"] - (const glm::vec3&)m_Camera["Transform"]["Position"]);
|
||||
entity["Transform"]["Scale"] = (const glm::vec3&)cUniformScale["Scale"] * distance;
|
||||
}
|
||||
|
||||
bool UniformScaleSystem::OnSetCamera(const Events::SetCamera& e)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user