Added Editor Properties widget at the top of every World Editor tab, made tons of backend changes to get it to work properly

This commit is contained in:
parax0
2016-02-07 23:48:43 -07:00
parent 8e1b66fa5a
commit a46cd5446f
49 changed files with 930 additions and 299 deletions

View File

@@ -1,95 +0,0 @@
#include "CScriptLayer.h"
CScriptLayer::CScriptLayer()
{
mLayerName = "New Layer";
mActive = true;
mVisible = true;
}
CScriptLayer::~CScriptLayer()
{
for (auto it = mObjects.begin(); it != mObjects.end(); it++)
delete *it;
}
// ************* DATA MANIPULATION *************
void CScriptLayer::AddObject(CScriptObject* object)
{
mObjects.push_back(object);
}
void CScriptLayer::DeleteObjectByIndex(u32 index)
{
delete mObjects[index];
mObjects.erase(mObjects.begin() + index, mObjects.begin() + index);
}
void CScriptLayer::DeleteObjectByID(u32 ID)
{
for (auto it = mObjects.begin(); it != mObjects.end(); it++)
{
if ((*it)->InstanceID() == ID)
{
delete *it;
mObjects.erase(it, it);
break;
}
}
}
void CScriptLayer::Reserve(u32 amount)
{
mObjects.reserve(amount);
}
// ************* GETTERS *************
TString CScriptLayer::Name()
{
return mLayerName;
}
bool CScriptLayer::IsActive()
{
return mActive;
}
bool CScriptLayer::IsVisible()
{
return mVisible;
}
u32 CScriptLayer::GetNumObjects()
{
return mObjects.size();
}
CScriptObject* CScriptLayer::ObjectByIndex(u32 index)
{
return mObjects[index];
}
CScriptObject* CScriptLayer::ObjectByID(u32 ID)
{
for (auto it = mObjects.begin(); it != mObjects.end(); it++)
if ((*it)->InstanceID() == ID)
return *it;
return nullptr;
}
// ************* SETTERS *************
void CScriptLayer::SetName(const TString& name)
{
mLayerName = name;
}
void CScriptLayer::SetActive(bool active)
{
mActive = active;
}
void CScriptLayer::SetVisible(bool visible)
{
mVisible = visible;
}

View File

@@ -1,5 +1,5 @@
#ifndef SSCRIPTLAYER_H
#define SSCRIPTLAYER_H
#ifndef CSCRIPTLAYER_H
#define CSCRIPTLAYER_H
#include "CScriptObject.h"
#include <Common/types.h>
@@ -11,38 +11,85 @@ class CScriptLayer
TString mLayerName;
bool mActive;
bool mVisible;
std::vector<CScriptObject*> mObjects;
std::vector<CScriptObject*> mInstances;
public:
CScriptLayer();
~CScriptLayer();
CScriptLayer()
: mLayerName("New Layer")
, mActive(true)
, mVisible(true)
{
}
~CScriptLayer()
{
for (auto it = mInstances.begin(); it != mInstances.end(); it++)
delete *it;
}
// Data Manipulation
void AddObject(CScriptObject* object);
void DeleteObjectByIndex(u32 index);
void DeleteObjectByID(u32 ID);
void Reserve(u32 amount);
void AddInstance(CScriptObject *pObject)
{
mInstances.push_back(pObject);
}
// Getters and Setters
TString Name();
bool IsActive();
bool IsVisible();
u32 GetNumObjects();
CScriptObject* ObjectByIndex(u32 index);
CScriptObject* ObjectByID(u32 ID);
void RemoveInstance(CScriptObject *pInstance)
{
for (auto it = mInstances.begin(); it != mInstances.end(); it++)
{
if (*it == pInstance)
{
mInstances.erase(it);
break;
}
}
}
void SetName(const TString& name);
void SetActive(bool active);
void SetVisible(bool visible);
void RemoveInstanceByIndex(u32 Index)
{
mInstances.erase(mInstances.begin() + Index);
}
void RemoveInstanceByID(u32 ID)
{
for (auto it = mInstances.begin(); it != mInstances.end(); it++)
{
if ((*it)->InstanceID() == ID)
{
mInstances.erase(it);
break;
}
}
}
void Reserve(u32 Amount)
{
mInstances.reserve(Amount);
}
// Accessors
inline TString Name() const { return mLayerName; }
inline bool IsActive() const { return mActive; }
inline bool IsVisible() const { return mVisible; }
inline u32 NumInstances() const { return mInstances.size(); }
inline CScriptObject* InstanceByIndex(u32 Index) const { return mInstances[Index]; }
inline CScriptObject* InstanceByID(u32 ID) const
{
for (auto it = mInstances.begin(); it != mInstances.end(); it++)
{
if ((*it)->InstanceID() == ID)
return *it;
}
return nullptr;
}
inline void SetName(const TString& rkName) { mLayerName = rkName; }
inline void SetActive(bool Active) { mActive = Active; }
inline void SetVisible(bool Visible) { mVisible = Visible; }
// Operators
CScriptObject* operator[](u32 index);
CScriptObject* operator[](u32 Index) { return InstanceByIndex(Index); }
};
// ************* INLINE FUNCTIONS *************
inline CScriptObject* CScriptLayer::operator[](u32 index)
{
return mObjects[index];
}
#endif // SSCRIPTLAYER_H
#endif // CSCRIPTLAYER_H

View File

@@ -1,4 +1,5 @@
#include "CScriptObject.h"
#include "CScriptLayer.h"
#include "CMasterTemplate.h"
#include "Core/Resource/CAnimSet.h"
@@ -69,6 +70,16 @@ bool CScriptObject::IsEditorProperty(IProperty *pProp)
);
}
void CScriptObject::SetLayer(CScriptLayer *pLayer)
{
if (pLayer != mpLayer)
{
mpLayer->RemoveInstance(this);
mpLayer = pLayer;
mpLayer->AddInstance(this);
}
}
// ************ GETTERS ************
IProperty* CScriptObject::PropertyByIndex(u32 index) const
{

View File

@@ -50,6 +50,7 @@ public:
void EvaluateCollisionModel();
void EvaluateVolume();
bool IsEditorProperty(IProperty *pProp);
void SetLayer(CScriptLayer *pLayer);
CScriptTemplate* Template() const;
CMasterTemplate* MasterTemplate() const;
@@ -84,6 +85,12 @@ public:
CCollisionMeshGroup* GetCollision() const;
EVolumeShape VolumeShape() const;
float VolumeScale() const;
TStringProperty* InstanceNameProperty() const { return mpInstanceName; }
TVector3Property* PositionProperty() const { return mpPosition; }
TVector3Property* RotationProperty() const { return mpRotation; }
TVector3Property* ScaleProperty() const { return mpScale; }
TBoolProperty* ActiveProperty() const { return mpActive; }
};
#endif // CSCRIPTOBJECT_H

View File

@@ -2,6 +2,11 @@
#include "IPropertyTemplate.h"
// ************ IProperty ************
CPropertyStruct* IProperty::RootStruct()
{
return (mpParent ? mpParent->RootStruct() : Type() == eStructProperty ? static_cast<CPropertyStruct*>(this) : nullptr);
}
IPropertyTemplate* IProperty::Template() const
{
return mpTemplate;
@@ -111,23 +116,23 @@ CPropertyStruct* CPropertyStruct::StructByIDString(const TIDString& rkStr) const
}
// ************ CArrayProperty ************
void CArrayProperty::Resize(u32 Size)
void CArrayProperty::Resize(int Size)
{
u32 OldSize = mProperties.size();
int OldSize = mProperties.size();
if (OldSize == Size) return;
if (Size < OldSize)
{
for (u32 i = mProperties.size() - 1; i >= Size; i--)
delete mProperties[i];
for (int iProp = mProperties.size() - 1; iProp >= Size; iProp--)
delete mProperties[iProp];
}
mProperties.resize(Size);
if (Size > OldSize)
{
for (u32 i = OldSize; i < Size; i++)
mProperties[i] = static_cast<CArrayTemplate*>(mpTemplate)->CreateSubStruct(this);
for (int iProp = OldSize; iProp < Size; iProp++)
mProperties[iProp] = static_cast<CArrayTemplate*>(mpTemplate)->CreateSubStruct(this);
}
}

View File

@@ -47,6 +47,8 @@ public:
inline CPropertyStruct* Parent() const { return mpParent; }
inline void SetParent(CPropertyStruct *pParent) { mpParent = pParent; }
CPropertyStruct* RootStruct();
// These functions can't be in the header to avoid circular includes with IPropertyTemplate.h
IPropertyTemplate* Template() const;
TString Name() const;
@@ -178,7 +180,7 @@ public:
inline void Reserve(u32 amount) { mProperties.reserve(amount); }
// Functions
void Resize(u32 Size);
void Resize(int Size);
CStructTemplate* SubStructTemplate() const;
TString ElementName() const;
};