36b84f7cc3
Moved some methods in ComponentWrapper to a .cpp.
59 lines
2.1 KiB
C++
59 lines
2.1 KiB
C++
#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);
|
|
}
|
|
} |