Added ComponentInfo::Field_t::Index
This commit is contained in:
@@ -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<>
|
||||
|
||||
@@ -44,7 +44,7 @@ public:
|
||||
|
||||
ComponentPool(const ::ComponentInfo& ci)
|
||||
: m_ComponentInfo(ci)
|
||||
, m_Pool(ci.Meta->Allocation, sizeof(EntityID) + ci.Stride)
|
||||
, m_Pool(ci.Meta->Allocation, ci.GetHeaderSize() + ci.Stride)
|
||||
{ }
|
||||
~ComponentPool();
|
||||
ComponentPool(const ComponentPool& other);
|
||||
|
||||
@@ -30,7 +30,7 @@ struct ComponentWrapper
|
||||
ComponentWrapper(const ComponentInfo& componentInfo, char* data)
|
||||
: Info(componentInfo)
|
||||
, EntityID(*reinterpret_cast<::EntityID*>(data))
|
||||
, Data(data + sizeof(::EntityID))
|
||||
, Data(data + componentInfo.GetHeaderSize())
|
||||
{ }
|
||||
|
||||
const ComponentInfo& Info;
|
||||
@@ -43,7 +43,7 @@ struct ComponentWrapper
|
||||
}
|
||||
|
||||
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 +55,13 @@ struct ComponentWrapper
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void SetField(std::string name, const T value) { Field<T>(name) = value; }
|
||||
void SetField(const std::string& name, const T value) { Field<T>(name) = value; }
|
||||
//template <typename T>
|
||||
//void SetField(std::string name, T& value) { Field<T>(name) = value; }
|
||||
|
||||
// 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]) { Field<std::string>(name) = std::string(value); }
|
||||
|
||||
void Copy(ComponentWrapper& destination)
|
||||
{
|
||||
@@ -121,7 +121,7 @@ struct ComponentWrapper
|
||||
template <std::size_t N>
|
||||
void operator=(const char(&val)[N]) { m_Component->SetField<N>(m_PropertyName, val); }
|
||||
};
|
||||
SubscriptProxy operator[](std::string propertyName) { return SubscriptProxy(this, propertyName); }
|
||||
SubscriptProxy operator[](const std::string& propertyName) { return SubscriptProxy(this, propertyName); }
|
||||
};
|
||||
|
||||
// A component wrapper that "owns" its data through a shared pointer
|
||||
|
||||
Reference in New Issue
Block a user