27dec2fbf8
of images that are too big. This is then used to automatically resize any textures (except fonts, background screen) to be automatically resized to 512x512 if they are bigger.
1666 lines
44 KiB
C++
1666 lines
44 KiB
C++
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
// This file is part of the "Irrlicht Engine".
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
#include "CAttributes.h"
|
|
#include "CAttributeImpl.h"
|
|
#include "ITexture.h"
|
|
#include "IXMLWriter.h"
|
|
#include "IVideoDriver.h"
|
|
|
|
namespace irr
|
|
{
|
|
namespace io
|
|
{
|
|
|
|
CAttributes::CAttributes(video::IVideoDriver* driver)
|
|
: Driver(driver)
|
|
{
|
|
#ifdef _DEBUG
|
|
setDebugName("CAttributes");
|
|
#endif
|
|
|
|
if (Driver)
|
|
Driver->grab();
|
|
}
|
|
|
|
CAttributes::~CAttributes()
|
|
{
|
|
clear();
|
|
|
|
if (Driver)
|
|
Driver->drop();
|
|
}
|
|
|
|
|
|
//! Removes all attributes
|
|
void CAttributes::clear()
|
|
{
|
|
for (u32 i=0; i<Attributes.size(); ++i)
|
|
Attributes[i]->drop();
|
|
|
|
Attributes.clear();
|
|
}
|
|
|
|
|
|
//! Sets a string attribute.
|
|
//! \param attributeName: Name for the attribute
|
|
//! \param value: Value for the attribute. Set this to 0 to delete the attribute
|
|
void CAttributes::setAttribute(const c8* attributeName, const c8* value)
|
|
{
|
|
for (u32 i=0; i<Attributes.size(); ++i)
|
|
if (Attributes[i]->Name == attributeName)
|
|
{
|
|
if (!value)
|
|
{
|
|
Attributes[i]->drop();
|
|
Attributes.erase(i);
|
|
}
|
|
else
|
|
Attributes[i]->setString(value);
|
|
|
|
return;
|
|
}
|
|
|
|
if (value)
|
|
{
|
|
Attributes.push_back(new CStringAttribute(attributeName, value));
|
|
}
|
|
}
|
|
|
|
//! Gets a string attribute.
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setStringAttribute()
|
|
//! or 0 if attribute is not set.
|
|
core::stringc CAttributes::getAttributeAsString(const c8* attributeName)
|
|
{
|
|
core::stringc str;
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getString();
|
|
else
|
|
return str;
|
|
}
|
|
|
|
//! Gets a string attribute.
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \param target: Buffer where the string is copied to.
|
|
void CAttributes::getAttributeAsString(const c8* attributeName, char* target)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
{
|
|
core::stringc str = att->getString();
|
|
strcpy(target,str.c_str());
|
|
}
|
|
else
|
|
target[0] = 0;
|
|
}
|
|
|
|
//! Returns string attribute value by index.
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::stringc CAttributes::getAttributeAsString(s32 index)
|
|
{
|
|
core::stringc str;
|
|
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getString();
|
|
|
|
return str;
|
|
}
|
|
|
|
|
|
//! Sets a string attribute.
|
|
//! \param attributeName: Name for the attribute
|
|
//! \param value: Value for the attribute. Set this to 0 to delete the attribute
|
|
void CAttributes::setAttribute(const c8* attributeName, const wchar_t* value)
|
|
{
|
|
for (u32 i=0; i<Attributes.size(); ++i)
|
|
{
|
|
if (Attributes[i]->Name == attributeName)
|
|
{
|
|
if (!value)
|
|
{
|
|
Attributes[i]->drop();
|
|
Attributes.erase(i);
|
|
}
|
|
else
|
|
Attributes[i]->setString(value);
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (value)
|
|
{
|
|
Attributes.push_back(new CStringAttribute(attributeName, value));
|
|
}
|
|
}
|
|
|
|
//! Gets a string attribute.
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setStringAttribute()
|
|
//! or 0 if attribute is not set.
|
|
core::stringw CAttributes::getAttributeAsStringW(const c8* attributeName)
|
|
{
|
|
core::stringw str;
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
str = att->getStringW();
|
|
|
|
return str;
|
|
}
|
|
|
|
//! Gets a string attribute.
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \param target: Buffer where the string is copied to.
|
|
void CAttributes::getAttributeAsStringW(const c8* attributeName, wchar_t* target)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
{
|
|
core::stringw str = att->getStringW();
|
|
wcscpy(target,str.c_str());
|
|
}
|
|
else
|
|
target[0] = 0;
|
|
}
|
|
|
|
//! Returns string attribute value by index.
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::stringw CAttributes::getAttributeAsStringW(s32 index)
|
|
{
|
|
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getStringW();
|
|
else
|
|
return core::stringw();
|
|
}
|
|
|
|
|
|
//! Adds an attribute as an array of wide strings
|
|
void CAttributes::addArray(const c8* attributeName, const core::array<core::stringw>& value)
|
|
{
|
|
Attributes.push_back(new CStringWArrayAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Sets an attribute value as an array of wide strings.
|
|
void CAttributes::setAttribute(const c8* attributeName, const core::array<core::stringw>& value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setArray(value);
|
|
else
|
|
{
|
|
Attributes.push_back(new CStringWArrayAttribute(attributeName, value));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as an array of wide strings.
|
|
core::array<core::stringw> CAttributes::getAttributeAsArray(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getArray();
|
|
else
|
|
return core::array<core::stringw>();
|
|
}
|
|
|
|
//! Returns attribute value as an array of wide strings by index.
|
|
core::array<core::stringw> CAttributes::getAttributeAsArray(s32 index)
|
|
{
|
|
core::array<core::stringw> ret;
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getArray();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as an array of wide strings
|
|
void CAttributes::setAttribute(s32 index, const core::array<core::stringw>& value)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setArray(value);
|
|
}
|
|
|
|
|
|
|
|
|
|
//! Returns attribute index from name, -1 if not found
|
|
s32 CAttributes::findAttribute(const c8* attributeName) const
|
|
{
|
|
for (u32 i=0; i<Attributes.size(); ++i)
|
|
if (Attributes[i]->Name == attributeName)
|
|
return i;
|
|
|
|
return -1;
|
|
}
|
|
|
|
|
|
IAttribute* CAttributes::getAttributeP(const c8* attributeName) const
|
|
{
|
|
for (u32 i=0; i<Attributes.size(); ++i)
|
|
if (Attributes[i]->Name == attributeName)
|
|
return Attributes[i];
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//! Sets a attribute as boolean value
|
|
void CAttributes::setAttribute(const c8* attributeName, bool value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setBool(value);
|
|
else
|
|
{
|
|
Attributes.push_back(new CBoolAttribute(attributeName, value));
|
|
}
|
|
}
|
|
|
|
//! Gets a attribute as boolean value
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute() as bool
|
|
//! or 0 if attribute is not set.
|
|
bool CAttributes::getAttributeAsBool(const c8* attributeName)
|
|
{
|
|
bool ret = false;
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getBool();
|
|
|
|
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
return ret;
|
|
}
|
|
|
|
//! Sets a attribute as integer value
|
|
void CAttributes::setAttribute(const c8* attributeName, s32 value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setInt(value);
|
|
else
|
|
{
|
|
Attributes.push_back(new CIntAttribute(attributeName, value));
|
|
}
|
|
}
|
|
|
|
//! Gets a attribute as integer value
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute() as integer
|
|
//! or 0 if attribute is not set.
|
|
s32 CAttributes::getAttributeAsInt(const c8* attributeName) const
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getInt();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//! Sets a attribute as float value
|
|
void CAttributes::setAttribute(const c8* attributeName, f32 value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setFloat(value);
|
|
else
|
|
Attributes.push_back(new CFloatAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets a attribute as integer value
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute() as float value
|
|
//! or 0 if attribute is not set.
|
|
f32 CAttributes::getAttributeAsFloat(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getFloat();
|
|
|
|
return 0.f;
|
|
}
|
|
|
|
//! Sets a attribute as color
|
|
void CAttributes::setAttribute(const c8* attributeName, video::SColor value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setColor(value);
|
|
else
|
|
Attributes.push_back(new CColorAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as color
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
video::SColor CAttributes::getAttributeAsColor(const c8* attributeName)
|
|
{
|
|
video::SColor ret(0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getColor();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets a attribute as floating point color
|
|
void CAttributes::setAttribute(const c8* attributeName, video::SColorf value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setColor(value);
|
|
else
|
|
Attributes.push_back(new CColorfAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as floating point color
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
video::SColorf CAttributes::getAttributeAsColorf(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getColorf();
|
|
else
|
|
return video::SColorf();
|
|
}
|
|
|
|
//! Sets a attribute as 2d position
|
|
void CAttributes::setAttribute(const c8* attributeName, core::position2di value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setPosition(value);
|
|
else
|
|
Attributes.push_back(new CPosition2DAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as 2d position
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
core::position2di CAttributes::getAttributeAsPosition2d(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getPosition();
|
|
else
|
|
return core::position2di();
|
|
}
|
|
|
|
//! Sets a attribute as rectangle
|
|
void CAttributes::setAttribute(const c8* attributeName, core::rect<s32> value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setRect(value);
|
|
else
|
|
Attributes.push_back(new CRectAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as rectangle
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
core::rect<s32> CAttributes::getAttributeAsRect(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getRect();
|
|
else
|
|
return core::rect<s32>();
|
|
}
|
|
|
|
//! Sets a attribute as dimension2d
|
|
void CAttributes::setAttribute(const c8* attributeName, core::dimension2d<u32> value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setDimension2d(value);
|
|
else
|
|
Attributes.push_back(new CDimension2dAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as dimension2d
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
core::dimension2d<u32> CAttributes::getAttributeAsDimension2d(const c8* attributeName) const
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getDimension2d();
|
|
else
|
|
return core::dimension2d<u32>();
|
|
}
|
|
|
|
//! Sets a attribute as vector
|
|
void CAttributes::setAttribute(const c8* attributeName, core::vector3df value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setVector(value);
|
|
else
|
|
Attributes.push_back(new CVector3DAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Sets a attribute as vector
|
|
void CAttributes::setAttribute(const c8* attributeName, core::vector2df value)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setVector2d(value);
|
|
else
|
|
Attributes.push_back(new CVector2DAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Gets an attribute as vector
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
core::vector3df CAttributes::getAttributeAsVector3d(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getVector();
|
|
else
|
|
return core::vector3df();
|
|
}
|
|
|
|
//! Gets an attribute as vector
|
|
core::vector2df CAttributes::getAttributeAsVector2d(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getVector2d();
|
|
else
|
|
return core::vector2df();
|
|
}
|
|
|
|
//! Sets an attribute as binary data
|
|
void CAttributes::setAttribute(const c8* attributeName, void* data, s32 dataSizeInBytes )
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setBinary(data, dataSizeInBytes);
|
|
else
|
|
Attributes.push_back(new CBinaryAttribute(attributeName, data, dataSizeInBytes));
|
|
}
|
|
|
|
//! Gets an attribute as binary data
|
|
//! \param attributeName: Name of the attribute to get.
|
|
void CAttributes::getAttributeAsBinaryData(const c8* attributeName, void* outData, s32 maxSizeInBytes)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->getBinary(outData, maxSizeInBytes);
|
|
}
|
|
|
|
//! Sets an attribute as enumeration
|
|
void CAttributes::setAttribute(const c8* attributeName, const char* enumValue, const char* const* enumerationLiterals)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setEnum(enumValue, enumerationLiterals);
|
|
else
|
|
Attributes.push_back(new CEnumAttribute(attributeName, enumValue, enumerationLiterals));
|
|
}
|
|
|
|
//! Gets an attribute as enumeration
|
|
//! \param attributeName: Name of the attribute to get.
|
|
//! \return Returns value of the attribute previously set by setAttribute()
|
|
const char* CAttributes::getAttributeAsEnumeration(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getEnum();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//! Gets an attribute as enumeration
|
|
s32 CAttributes::getAttributeAsEnumeration(const c8* attributeName, const char* const* enumerationLiteralsToUse)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
|
|
if (enumerationLiteralsToUse && att)
|
|
{
|
|
const char* value = att->getEnum();
|
|
if (value)
|
|
{
|
|
for (s32 i=0; enumerationLiteralsToUse[i]; ++i)
|
|
if (!strcmp(value, enumerationLiteralsToUse[i]))
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//! Gets the list of enumeration literals of an enumeration attribute
|
|
//! \param attributeName: Name of the attribute to get.
|
|
void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(const c8* attributeName, core::array<core::stringc>& outLiterals)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
|
|
if (att && att->getType() == EAT_ENUM)
|
|
outLiterals = ((CEnumAttribute*)att)->EnumLiterals;
|
|
}
|
|
|
|
//! Sets an attribute as texture reference
|
|
void CAttributes::setAttribute(const c8* attributeName, video::ITexture* value, const io::path& filename)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setTexture(value, filename);
|
|
else
|
|
Attributes.push_back(new CTextureAttribute(attributeName, value, Driver, filename));
|
|
}
|
|
|
|
|
|
//! Gets an attribute as texture reference
|
|
//! \param attributeName: Name of the attribute to get.
|
|
video::ITexture* CAttributes::getAttributeAsTexture(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getTexture();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//! Gets an attribute as texture reference
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
video::ITexture* CAttributes::getAttributeAsTexture(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getTexture();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
//! Returns amount of string attributes set in this scene manager.
|
|
u32 CAttributes::getAttributeCount() const
|
|
{
|
|
return Attributes.size();
|
|
}
|
|
|
|
//! Returns string attribute name by index.
|
|
//! \param index: Index value, must be between 0 and getStringAttributeCount()-1.
|
|
const c8* CAttributes::getAttributeName(s32 index)
|
|
{
|
|
if ((u32)index >= Attributes.size())
|
|
return 0;
|
|
|
|
return Attributes[index]->Name.c_str();
|
|
}
|
|
|
|
//! Returns the type of an attribute
|
|
E_ATTRIBUTE_TYPE CAttributes::getAttributeType(const c8* attributeName)
|
|
{
|
|
E_ATTRIBUTE_TYPE ret = EAT_UNKNOWN;
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getType();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Returns attribute type by index.
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
E_ATTRIBUTE_TYPE CAttributes::getAttributeType(s32 index)
|
|
{
|
|
if ((u32)index >= Attributes.size())
|
|
return EAT_UNKNOWN;
|
|
|
|
return Attributes[index]->getType();
|
|
}
|
|
|
|
//! Returns the type of an attribute
|
|
const wchar_t* CAttributes::getAttributeTypeString(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getTypeString();
|
|
else
|
|
return L"unknown";
|
|
}
|
|
|
|
//! Returns attribute type string by index.
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
const wchar_t* CAttributes::getAttributeTypeString(s32 index)
|
|
{
|
|
if ((u32)index >= Attributes.size())
|
|
return L"unknown";
|
|
|
|
return Attributes[index]->getTypeString();
|
|
}
|
|
|
|
//! Gets an attribute as boolean value
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
bool CAttributes::getAttributeAsBool(s32 index)
|
|
{
|
|
bool ret = false;
|
|
|
|
if ((u32)index < Attributes.size())
|
|
ret = Attributes[index]->getBool();
|
|
|
|
_IRR_IMPLEMENT_MANAGED_MARSHALLING_BUGFIX;
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as integer value
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
s32 CAttributes::getAttributeAsInt(s32 index) const
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getInt();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
//! Gets an attribute as float value
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
f32 CAttributes::getAttributeAsFloat(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getFloat();
|
|
else
|
|
return 0.f;
|
|
}
|
|
|
|
//! Gets an attribute as color
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
video::SColor CAttributes::getAttributeAsColor(s32 index)
|
|
{
|
|
video::SColor ret(0);
|
|
|
|
if ((u32)index < Attributes.size())
|
|
ret = Attributes[index]->getColor();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as floating point color
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
video::SColorf CAttributes::getAttributeAsColorf(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getColorf();
|
|
|
|
return video::SColorf();
|
|
}
|
|
|
|
//! Gets an attribute as 3d vector
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::vector3df CAttributes::getAttributeAsVector3d(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getVector();
|
|
else
|
|
return core::vector3df();
|
|
}
|
|
|
|
//! Gets an attribute as 2d vector
|
|
core::vector2df CAttributes::getAttributeAsVector2d(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getVector2d();
|
|
else
|
|
return core::vector2df();
|
|
}
|
|
|
|
//! Gets an attribute as position2d
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::position2di CAttributes::getAttributeAsPosition2d(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getPosition();
|
|
else
|
|
return core::position2di();
|
|
}
|
|
|
|
//! Gets an attribute as rectangle
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::rect<s32> CAttributes::getAttributeAsRect(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getRect();
|
|
else
|
|
return core::rect<s32>();
|
|
}
|
|
|
|
//! Gets an attribute as dimension2d
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
core::dimension2d<u32> CAttributes::getAttributeAsDimension2d(s32 index) const
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getDimension2d();
|
|
else
|
|
return core::dimension2d<u32>();
|
|
}
|
|
|
|
|
|
//! Gets an attribute as binary data
|
|
///! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
void CAttributes::getAttributeAsBinaryData(s32 index, void* outData, s32 maxSizeInBytes)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->getBinary(outData, maxSizeInBytes);
|
|
}
|
|
|
|
|
|
//! Gets an attribute as enumeration
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
const char* CAttributes::getAttributeAsEnumeration(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getEnum();
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
|
|
//! Gets an attribute as enumeration
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
s32 CAttributes::getAttributeAsEnumeration(s32 index, const char* const* enumerationLiteralsToUse)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
{
|
|
IAttribute* att = Attributes[index];
|
|
|
|
if (enumerationLiteralsToUse && att)
|
|
{
|
|
const char* value = att->getEnum();
|
|
if (value)
|
|
{
|
|
for (s32 i=0; enumerationLiteralsToUse[i]; ++i)
|
|
if (!strcmp(value, enumerationLiteralsToUse[i]))
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
//! Gets the list of enumeration literals of an enumeration attribute
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
void CAttributes::getAttributeEnumerationLiteralsOfEnumeration(s32 index, core::array<core::stringc>& outLiterals)
|
|
{
|
|
if ((u32)index < Attributes.size() &&
|
|
Attributes[index]->getType() == EAT_ENUM)
|
|
outLiterals = ((CEnumAttribute*)Attributes[index])->EnumLiterals;
|
|
}
|
|
|
|
|
|
//! Adds an attribute as integer
|
|
void CAttributes::addInt(const c8* attributeName, s32 value)
|
|
{
|
|
Attributes.push_back(new CIntAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as float
|
|
void CAttributes::addFloat(const c8* attributeName, f32 value)
|
|
{
|
|
Attributes.push_back(new CFloatAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as string
|
|
void CAttributes::addString(const c8* attributeName, const char* value)
|
|
{
|
|
Attributes.push_back(new CStringAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as wchar string
|
|
void CAttributes::addString(const c8* attributeName, const wchar_t* value)
|
|
{
|
|
Attributes.push_back(new CStringAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as bool
|
|
void CAttributes::addBool(const c8* attributeName, bool value)
|
|
{
|
|
Attributes.push_back(new CBoolAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as enum
|
|
void CAttributes::addEnum(const c8* attributeName, const char* enumValue, const char* const* enumerationLiterals)
|
|
{
|
|
Attributes.push_back(new CEnumAttribute(attributeName, enumValue, enumerationLiterals));
|
|
}
|
|
|
|
//! Adds an attribute as enum
|
|
void CAttributes::addEnum(const c8* attributeName, s32 enumValue, const char* const* enumerationLiterals)
|
|
{
|
|
addEnum(attributeName, "", enumerationLiterals);
|
|
Attributes.getLast()->setInt(enumValue);
|
|
}
|
|
|
|
//! Adds an attribute as color
|
|
void CAttributes::addColor(const c8* attributeName, video::SColor value)
|
|
{
|
|
Attributes.push_back(new CColorAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as floating point color
|
|
void CAttributes::addColorf(const c8* attributeName, video::SColorf value)
|
|
{
|
|
Attributes.push_back(new CColorfAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as 3d vector
|
|
void CAttributes::addVector3d(const c8* attributeName, core::vector3df value)
|
|
{
|
|
Attributes.push_back(new CVector3DAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as 2d vector
|
|
void CAttributes::addVector2d(const c8* attributeName, core::vector2df value)
|
|
{
|
|
Attributes.push_back(new CVector2DAttribute(attributeName, value));
|
|
}
|
|
|
|
|
|
//! Adds an attribute as 2d position
|
|
void CAttributes::addPosition2d(const c8* attributeName, core::position2di value)
|
|
{
|
|
Attributes.push_back(new CPosition2DAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as rectangle
|
|
void CAttributes::addRect(const c8* attributeName, core::rect<s32> value)
|
|
{
|
|
Attributes.push_back(new CRectAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as dimension2d
|
|
void CAttributes::addDimension2d(const c8* attributeName, core::dimension2d<u32> value)
|
|
{
|
|
Attributes.push_back(new CDimension2dAttribute(attributeName, value));
|
|
}
|
|
|
|
//! Adds an attribute as binary data
|
|
void CAttributes::addBinary(const c8* attributeName, void* data, s32 dataSizeInBytes)
|
|
{
|
|
Attributes.push_back(new CBinaryAttribute(attributeName, data, dataSizeInBytes));
|
|
}
|
|
|
|
//! Adds an attribute as texture reference
|
|
void CAttributes::addTexture(const c8* attributeName, video::ITexture* texture, const io::path& filename)
|
|
{
|
|
Attributes.push_back(new CTextureAttribute(attributeName, texture, Driver, filename));
|
|
}
|
|
|
|
//! Returns if an attribute with a name exists
|
|
bool CAttributes::existsAttribute(const c8* attributeName)
|
|
{
|
|
return getAttributeP(attributeName) != 0;
|
|
}
|
|
|
|
//! Sets an attribute value as string.
|
|
//! \param attributeName: Name for the attribute
|
|
void CAttributes::setAttribute(s32 index, const c8* value)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setString(value);
|
|
}
|
|
|
|
//! Sets an attribute value as string.
|
|
//! \param attributeName: Name for the attribute
|
|
void CAttributes::setAttribute(s32 index, const wchar_t* value)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setString(value);
|
|
}
|
|
|
|
//! Sets an attribute as boolean value
|
|
void CAttributes::setAttribute(s32 index, bool value)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setBool(value);
|
|
}
|
|
|
|
//! Sets an attribute as integer value
|
|
void CAttributes::setAttribute(s32 index, s32 value)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setInt(value);
|
|
}
|
|
|
|
//! Sets a attribute as float value
|
|
void CAttributes::setAttribute(s32 index, f32 value)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setFloat(value);
|
|
}
|
|
|
|
//! Sets a attribute as color
|
|
void CAttributes::setAttribute(s32 index, video::SColor color)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setColor(color);
|
|
}
|
|
|
|
//! Sets a attribute as floating point color
|
|
void CAttributes::setAttribute(s32 index, video::SColorf color)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setColor(color);
|
|
}
|
|
|
|
//! Sets a attribute as vector
|
|
void CAttributes::setAttribute(s32 index, core::vector3df v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setVector(v);
|
|
}
|
|
|
|
//! Sets a attribute as vector
|
|
void CAttributes::setAttribute(s32 index, core::vector2df v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setVector2d(v);
|
|
}
|
|
|
|
//! Sets a attribute as position
|
|
void CAttributes::setAttribute(s32 index, core::position2di v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setPosition(v);
|
|
}
|
|
|
|
//! Sets a attribute as rectangle
|
|
void CAttributes::setAttribute(s32 index, core::rect<s32> v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setRect(v);
|
|
}
|
|
|
|
//! Sets a attribute as dimension2d
|
|
void CAttributes::setAttribute(s32 index, core::dimension2d<u32> v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setDimension2d(v);
|
|
}
|
|
|
|
//! Sets an attribute as binary data
|
|
void CAttributes::setAttribute(s32 index, void* data, s32 dataSizeInBytes )
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setBinary(data, dataSizeInBytes);
|
|
}
|
|
|
|
|
|
//! Sets an attribute as enumeration
|
|
void CAttributes::setAttribute(s32 index, const char* enumValue, const char* const* enumerationLiterals)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setEnum(enumValue, enumerationLiterals);
|
|
}
|
|
|
|
|
|
//! Sets an attribute as texture reference
|
|
void CAttributes::setAttribute(s32 index, video::ITexture* texture, const io::path& filename)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setTexture(texture, filename);
|
|
}
|
|
|
|
|
|
//! Adds an attribute as matrix
|
|
void CAttributes::addMatrix(const c8* attributeName, const core::matrix4& v)
|
|
{
|
|
Attributes.push_back(new CMatrixAttribute(attributeName, v));
|
|
}
|
|
|
|
|
|
//! Sets an attribute as matrix
|
|
void CAttributes::setAttribute(const c8* attributeName, const core::matrix4& v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setMatrix(v);
|
|
else
|
|
Attributes.push_back(new CMatrixAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Gets an attribute as a matrix4
|
|
core::matrix4 CAttributes::getAttributeAsMatrix(const c8* attributeName)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
return att->getMatrix();
|
|
else
|
|
return core::matrix4();
|
|
|
|
}
|
|
|
|
//! Gets an attribute as matrix
|
|
core::matrix4 CAttributes::getAttributeAsMatrix(s32 index)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
return Attributes[index]->getMatrix();
|
|
else
|
|
return core::matrix4();
|
|
}
|
|
|
|
//! Sets an attribute as matrix
|
|
void CAttributes::setAttribute(s32 index, const core::matrix4& v)
|
|
{
|
|
if ((u32)index < Attributes.size())
|
|
Attributes[index]->setMatrix(v);
|
|
}
|
|
|
|
|
|
//! Adds an attribute as quaternion
|
|
void CAttributes::addQuaternion(const c8* attributeName, core::quaternion v)
|
|
{
|
|
Attributes.push_back(new CQuaternionAttribute(attributeName, v));
|
|
}
|
|
|
|
|
|
//! Sets an attribute as quaternion
|
|
void CAttributes::setAttribute(const c8* attributeName, core::quaternion v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setQuaternion(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CQuaternionAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a quaternion
|
|
core::quaternion CAttributes::getAttributeAsQuaternion(const c8* attributeName)
|
|
{
|
|
core::quaternion ret(0,1,0, 0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getQuaternion();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as quaternion
|
|
core::quaternion CAttributes::getAttributeAsQuaternion(s32 index)
|
|
{
|
|
core::quaternion ret(0,1,0, 0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getQuaternion();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as quaternion
|
|
void CAttributes::setAttribute(s32 index, core::quaternion v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setQuaternion(v);
|
|
}
|
|
|
|
//! Adds an attribute as axis aligned bounding box
|
|
void CAttributes::addBox3d(const c8* attributeName, core::aabbox3df v)
|
|
{
|
|
Attributes.push_back(new CBBoxAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Sets an attribute as axis aligned bounding box
|
|
void CAttributes::setAttribute(const c8* attributeName, core::aabbox3df v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setBBox(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CBBoxAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a axis aligned bounding box
|
|
core::aabbox3df CAttributes::getAttributeAsBox3d(const c8* attributeName)
|
|
{
|
|
core::aabbox3df ret(0,0,0, 0,0,0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getBBox();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as axis aligned bounding box
|
|
core::aabbox3df CAttributes::getAttributeAsBox3d(s32 index)
|
|
{
|
|
core::aabbox3df ret(0,0,0, 0,0,0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getBBox();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as axis aligned bounding box
|
|
void CAttributes::setAttribute(s32 index, core::aabbox3df v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setBBox(v);
|
|
}
|
|
|
|
//! Adds an attribute as 3d plane
|
|
void CAttributes::addPlane3d(const c8* attributeName, core::plane3df v)
|
|
{
|
|
Attributes.push_back(new CPlaneAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Sets an attribute as 3d plane
|
|
void CAttributes::setAttribute(const c8* attributeName, core::plane3df v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setPlane(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CPlaneAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a 3d plane
|
|
core::plane3df CAttributes::getAttributeAsPlane3d(const c8* attributeName)
|
|
{
|
|
core::plane3df ret(0,0,0, 0,1,0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getPlane();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as 3d plane
|
|
core::plane3df CAttributes::getAttributeAsPlane3d(s32 index)
|
|
{
|
|
core::plane3df ret(0,0,0, 0,1,0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getPlane();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as 3d plane
|
|
void CAttributes::setAttribute(s32 index, core::plane3df v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setPlane(v);
|
|
}
|
|
|
|
//! Adds an attribute as 3d triangle
|
|
void CAttributes::addTriangle3d(const c8* attributeName, core::triangle3df v)
|
|
{
|
|
Attributes.push_back(new CTriangleAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Sets an attribute as 3d triangle
|
|
void CAttributes::setAttribute(const c8* attributeName, core::triangle3df v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setTriangle(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CTriangleAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a 3d triangle
|
|
core::triangle3df CAttributes::getAttributeAsTriangle3d(const c8* attributeName)
|
|
{
|
|
core::triangle3df ret;
|
|
ret.pointA = ret.pointB = ret.pointC = core::vector3df(0,0,0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getTriangle();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as 3d triangle
|
|
core::triangle3df CAttributes::getAttributeAsTriangle3d(s32 index)
|
|
{
|
|
core::triangle3df ret;
|
|
ret.pointA = ret.pointB = ret.pointC = core::vector3df(0,0,0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getTriangle();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as 3d triangle
|
|
void CAttributes::setAttribute(s32 index, core::triangle3df v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setTriangle(v);
|
|
}
|
|
|
|
//! Adds an attribute as a 2d line
|
|
void CAttributes::addLine2d(const c8* attributeName, core::line2df v)
|
|
{
|
|
Attributes.push_back(new CLine2dAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Sets an attribute as a 2d line
|
|
void CAttributes::setAttribute(const c8* attributeName, core::line2df v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setLine2d(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CLine2dAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a 2d line
|
|
core::line2df CAttributes::getAttributeAsLine2d(const c8* attributeName)
|
|
{
|
|
core::line2df ret(0,0, 0,0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getLine2d();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as a 2d line
|
|
core::line2df CAttributes::getAttributeAsLine2d(s32 index)
|
|
{
|
|
core::line2df ret(0,0, 0,0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getLine2d();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as a 2d line
|
|
void CAttributes::setAttribute(s32 index, core::line2df v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setLine2d(v);
|
|
}
|
|
|
|
//! Adds an attribute as a 3d line
|
|
void CAttributes::addLine3d(const c8* attributeName, core::line3df v)
|
|
{
|
|
Attributes.push_back(new CLine3dAttribute(attributeName, v));
|
|
}
|
|
|
|
//! Sets an attribute as a 3d line
|
|
void CAttributes::setAttribute(const c8* attributeName, core::line3df v)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setLine3d(v);
|
|
else
|
|
{
|
|
Attributes.push_back(new CLine3dAttribute(attributeName, v));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as a 3d line
|
|
core::line3df CAttributes::getAttributeAsLine3d(const c8* attributeName)
|
|
{
|
|
core::line3df ret(0,0,0, 0,0,0);
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
ret = att->getLine3d();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Gets an attribute as a 3d line
|
|
core::line3df CAttributes::getAttributeAsLine3d(s32 index)
|
|
{
|
|
core::line3df ret(0,0,0, 0,0,0);
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
ret = Attributes[index]->getLine3d();
|
|
|
|
return ret;
|
|
}
|
|
|
|
//! Sets an attribute as a 3d line
|
|
void CAttributes::setAttribute(s32 index, core::line3df v)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setLine3d(v);
|
|
|
|
}
|
|
|
|
|
|
//! Adds an attribute as user pointner
|
|
void CAttributes::addUserPointer(const c8* attributeName, void* userPointer)
|
|
{
|
|
Attributes.push_back(new CUserPointerAttribute(attributeName, userPointer));
|
|
}
|
|
|
|
//! Sets an attribute as user pointer
|
|
void CAttributes::setAttribute(const c8* attributeName, void* userPointer)
|
|
{
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
att->setUserPointer(userPointer);
|
|
else
|
|
{
|
|
Attributes.push_back(new CUserPointerAttribute(attributeName, userPointer));
|
|
}
|
|
}
|
|
|
|
//! Gets an attribute as user pointer
|
|
//! \param attributeName: Name of the attribute to get.
|
|
void* CAttributes::getAttributeAsUserPointer(const c8* attributeName)
|
|
{
|
|
void* value = 0;
|
|
|
|
IAttribute* att = getAttributeP(attributeName);
|
|
if (att)
|
|
value = att->getUserPointer();
|
|
|
|
return value;
|
|
}
|
|
|
|
//! Gets an attribute as user pointer
|
|
//! \param index: Index value, must be between 0 and getAttributeCount()-1.
|
|
void* CAttributes::getAttributeAsUserPointer(s32 index)
|
|
{
|
|
void* value = 0;
|
|
|
|
if (index >= 0 && index < (s32)Attributes.size())
|
|
value = Attributes[index]->getUserPointer();
|
|
|
|
return value;
|
|
}
|
|
|
|
//! Sets an attribute as user pointer
|
|
void CAttributes::setAttribute(s32 index, void* userPointer)
|
|
{
|
|
if (index >= 0 && index < (s32)Attributes.size() )
|
|
Attributes[index]->setUserPointer(userPointer);
|
|
}
|
|
|
|
|
|
//! Reads attributes from a xml file.
|
|
//! \param readCurrentElementOnly: If set to true, reading only works if current element has the name 'attributes'.
|
|
//! IF set to false, the first appearing list attributes are read.
|
|
bool CAttributes::read(io::IXMLReader* reader, bool readCurrentElementOnly,
|
|
const wchar_t* nonDefaultElementName)
|
|
{
|
|
if (!reader)
|
|
return false;
|
|
|
|
clear();
|
|
|
|
core::stringw elementName = L"attributes";
|
|
if (nonDefaultElementName)
|
|
elementName = nonDefaultElementName;
|
|
|
|
if (readCurrentElementOnly)
|
|
{
|
|
if (elementName != reader->getNodeName())
|
|
return false;
|
|
}
|
|
|
|
while(reader->read())
|
|
{
|
|
switch(reader->getNodeType())
|
|
{
|
|
case io::EXN_ELEMENT:
|
|
readAttributeFromXML(reader);
|
|
break;
|
|
case io::EXN_ELEMENT_END:
|
|
if (elementName == reader->getNodeName())
|
|
return true;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
void CAttributes::readAttributeFromXML(io::IXMLReader* reader)
|
|
{
|
|
core::stringw element = reader->getNodeName();
|
|
core::stringc name = reader->getAttributeValue(L"name");
|
|
|
|
if (element == L"enum")
|
|
{
|
|
addEnum(name.c_str(), 0, 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"binary")
|
|
{
|
|
addBinary(name.c_str(), 0, 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"color")
|
|
{
|
|
addColor(name.c_str(), video::SColor());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"colorf")
|
|
{
|
|
addColorf(name.c_str(), video::SColorf());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"float")
|
|
{
|
|
addFloat(name.c_str(), 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"int")
|
|
{
|
|
addInt(name.c_str(), 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"bool")
|
|
{
|
|
addBool(name.c_str(), 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"string")
|
|
{
|
|
addString(name.c_str(), L"");
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"texture")
|
|
{
|
|
addTexture(name.c_str(), 0);
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"vector3d")
|
|
{
|
|
addVector3d(name.c_str(), core::vector3df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"vector2d")
|
|
{
|
|
addVector2d(name.c_str(), core::vector2df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"position")
|
|
{
|
|
addPosition2d(name.c_str(), core::position2di());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"rect")
|
|
{
|
|
addRect(name.c_str(), core::rect<s32>());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"matrix")
|
|
{
|
|
addMatrix(name.c_str(), core::matrix4());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"quaternion")
|
|
{
|
|
addQuaternion(name.c_str(), core::quaternion());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"box3d")
|
|
{
|
|
addBox3d(name.c_str(), core::aabbox3df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"plane")
|
|
{
|
|
addPlane3d(name.c_str(), core::plane3df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"triangle")
|
|
{
|
|
addTriangle3d(name.c_str(), core::triangle3df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"line2d")
|
|
{
|
|
addLine2d(name.c_str(), core::line2df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"line3d")
|
|
{
|
|
addLine3d(name.c_str(), core::line3df());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
else
|
|
if (element == L"stringwarray")
|
|
{
|
|
core::array<core::stringw> tmpArray;
|
|
|
|
s32 count = reader->getAttributeValueAsInt(L"count");
|
|
s32 n=0;
|
|
const core::stringw tmpName(L"value");
|
|
for (; n<count; ++n)
|
|
{
|
|
tmpArray.push_back(reader->getAttributeValue((tmpName+core::stringw(n)).c_str()));
|
|
}
|
|
addArray(name.c_str(),tmpArray);
|
|
}
|
|
else
|
|
if (element == L"userPointer")
|
|
{
|
|
// It's debatable if a pointer should be set or not, but it's more likely that adding it now would wreck user-applications.
|
|
// Also it probably doesn't makes sense setting this to a value when it comes from file.
|
|
}
|
|
else
|
|
if (element == L"dimension2d")
|
|
{
|
|
addDimension2d(name.c_str(), core::dimension2d<u32>());
|
|
Attributes.getLast()->setString(reader->getAttributeValue(L"value"));
|
|
}
|
|
}
|
|
|
|
//! Write these attributes into a xml file
|
|
bool CAttributes::write(io::IXMLWriter* writer, bool writeXMLHeader,
|
|
const wchar_t* nonDefaultElementName)
|
|
{
|
|
if (!writer)
|
|
return false;
|
|
|
|
if (writeXMLHeader)
|
|
writer->writeXMLHeader();
|
|
|
|
core::stringw elementName = L"attributes";
|
|
if (nonDefaultElementName)
|
|
elementName = nonDefaultElementName;
|
|
|
|
writer->writeElement(elementName.c_str(), false);
|
|
writer->writeLineBreak();
|
|
|
|
s32 i=0;
|
|
for (; i<(s32)Attributes.size(); ++i)
|
|
{
|
|
if ( Attributes[i]->getType() == EAT_STRINGWARRAY )
|
|
{
|
|
core::array<core::stringw> arraynames, arrayvalues;
|
|
core::array<core::stringw> arrayinput = Attributes[i]->getArray();
|
|
|
|
// build arrays
|
|
|
|
// name
|
|
arraynames.push_back(core::stringw(L"name"));
|
|
arrayvalues.push_back(core::stringw(Attributes[i]->Name.c_str()) );
|
|
|
|
// count
|
|
arraynames.push_back(core::stringw(L"count"));
|
|
arrayvalues.push_back(core::stringw((s32)arrayinput.size()));
|
|
|
|
// array...
|
|
u32 n=0;
|
|
const core::stringw tmpName(L"value");
|
|
for (; n < arrayinput.size(); ++n)
|
|
{
|
|
arraynames.push_back((tmpName+core::stringw(n)).c_str());
|
|
arrayvalues.push_back(arrayinput[n]);
|
|
}
|
|
|
|
// write them
|
|
writer->writeElement( Attributes[i]->getTypeString(), true, arraynames, arrayvalues);
|
|
}
|
|
else
|
|
{
|
|
writer->writeElement(
|
|
Attributes[i]->getTypeString(), true,
|
|
L"name", core::stringw(Attributes[i]->Name.c_str()).c_str(),
|
|
L"value", Attributes[i]->getStringW().c_str() );
|
|
}
|
|
|
|
writer->writeLineBreak();
|
|
}
|
|
|
|
writer->writeClosingTag(elementName.c_str());
|
|
writer->writeLineBreak();
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
} // end namespace io
|
|
} // end namespace irr
|
|
|