diff -r fe8f05ba49e1 lib/irrlicht/include/EAttributes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/irrlicht/include/EAttributes.h Mon Sep 01 16:35:04 2008 +0200 @@ -0,0 +1,115 @@ +// This file is part of the "Irrlicht Engine". +// For conditions of distribution and use, see copyright notice in irrlicht.h + +#ifndef __E_ATTRIBUTES_H_INCLUDED__ +#define __E_ATTRIBUTES_H_INCLUDED__ + +namespace irr +{ + +namespace io +{ + +//! Types of attributes available for IAttributes +enum E_ATTRIBUTE_TYPE +{ + // integer attribute + EAT_INT = 0, + + // float attribute + EAT_FLOAT, + + // string attribute + EAT_STRING, + + // boolean attribute + EAT_BOOL, + + // enumeration attribute + EAT_ENUM, + + // color attribute + EAT_COLOR, + + // floating point color attribute + EAT_COLORF, + + // 3d vector attribute + EAT_VECTOR3D, + + // 2d position attribute + EAT_POSITION2D, + + // vector 2d + EAT_VECTOR2D, + + // rectangle attribute + EAT_RECT, + + // matrix attribute + EAT_MATRIX, + + // quaternion attribute + EAT_QUATERNION, + + // 3d bounding box + EAT_BBOX, + + // plane + EAT_PLANE, + + // 3d triangle + EAT_TRIANGLE3D, + + // line 2d + EAT_LINE2D, + + // line 3d + EAT_LINE3D, + + // array of stringws attribute + EAT_STRINGWARRAY, + + // array of float + EAT_FLOATARRAY, + + // array of int + EAT_INTARRAY, + + // binary data attribute + EAT_BINARY, + + // texture reference attribute + EAT_TEXTURE, + + // user pointer void* + EAT_USER_POINTER, + + // known attribute type count + EAT_COUNT, + + // unknown attribute + EAT_UNKNOWN +}; + + +//! usage for default attributes +enum E_DEFAULT_ATTRIBUTE_USAGE +{ + //! do not use default attributes + EDAU_IGNORE, + + //! use default attributes on reading when no other attribute with that name exists + EDAU_READ_ONLY, + + //! do not write attributes if a default attribute with the same name does exist + EDAU_WRITE_ONLY, + + //! like EDAU_READ_ONLY and EDAU_WRITE_ONLY combined + EDAU_READ_WRITE, +}; + +} // end namespace io +} // end namespace irr + +#endif // __E_ATTRIBUTES_H_INCLUDED__ diff -r fe8f05ba49e1 lib/irrlicht/include/IAttributes.h --- a/lib/irrlicht/include/IAttributes.h Sun Aug 31 23:47:13 2008 +0200 +++ b/lib/irrlicht/include/IAttributes.h Mon Sep 01 16:35:04 2008 +0200 @@ -23,6 +23,7 @@ #include "irrString.h" #include "irrArray.h" #include "IXMLReader.h" +#include "EAttributes.h" namespace irr { @@ -34,92 +35,94 @@ { class IXMLWriter; -//! Types of attributes available for IAttributes -enum E_ATTRIBUTE_TYPE + +class IAttribute : public virtual IReferenceCounted { - // integer attribute - EAT_INT = 0, +public: - // float attribute - EAT_FLOAT, + virtual ~IAttribute() {}; - // string attribute - EAT_STRING, + virtual s32 getInt() { return 0; } + virtual f32 getFloat() { return 0; } + virtual video::SColorf getColorf() { return video::SColorf(1.0f,1.0f,1.0f,1.0f); } + virtual video::SColor getColor() { return video::SColor(255,255,255,255); } + virtual core::stringc getString() { return core::stringc(getStringW().c_str()); } + virtual core::stringw getStringW() { return core::stringw(); } + virtual core::array getArray() { return core::array(); }; + virtual bool getBool() { return false; } + virtual void getBinary(void* outdata, s32 maxLength) {}; + virtual core::vector3df getVector() { return core::vector3df(); } + virtual core::position2di getPosition() { return core::position2di(); } + virtual core::rect getRect() { return core::rect(); } + virtual core::quaternion getQuaternion(){ return core::quaternion(); } + virtual core::matrix4 getMatrix() { return core::matrix4(); } + virtual core::triangle3df getTriangle() { return core::triangle3df(); } + virtual core::vector2df getVector2d() { return core::vector2df(); } + virtual core::vector2di getVector2di() { return core::vector2di(); } + virtual core::line2df getLine2d() { return core::line2df(); } + virtual core::line2di getLine2di() { return core::line2di(); } + virtual core::line3df getLine3d() { return core::line3df(); } + virtual core::line3di getLine3di() { return core::line3di(); } + virtual core::dimension2di getDimension2d() { return core::dimension2di(); } + virtual core::aabbox3d getBBox() { return core::aabbox3d(); } + virtual core::plane3df getPlane() { return core::plane3df(); } - // boolean attribute - EAT_BOOL, + virtual video::ITexture* getTexture() { return 0; } + virtual const char* getEnum() { return 0; } + virtual void* getUserPointer() { return 0; } - // enumeration attribute - EAT_ENUM, + virtual void setInt(s32 intValue) {}; + virtual void setFloat(f32 floatValue) {}; + virtual void setString(const char* text) {}; + virtual void setString(const wchar_t* text){ setString(core::stringc(text).c_str()); }; + virtual void setArray( core::array arr ) {}; + virtual void setColor(video::SColorf color) {}; + virtual void setColor(video::SColor color) {}; + virtual void setBool(bool boolValue) {}; + virtual void setBinary(void* data, s32 maxLenght) {}; + virtual void setVector(core::vector3df v) {}; + virtual void setPosition(core::position2di v) {}; + virtual void setRect(core::rect v) {}; + virtual void setQuaternion(core::quaternion v) {}; + virtual void setMatrix(core::matrix4 v) {}; + virtual void setTriangle(core::triangle3df v) {}; + virtual void setVector2d(core::vector2df v) {}; + virtual void setVector2d(core::vector2di v) {}; + virtual void setLine2d(core::line2df v) {}; + virtual void setLine2d(core::line2di v) {}; + virtual void setLine3d(core::line3df v) {}; + virtual void setLine3d(core::line3di v) {}; + virtual void setDimension2d(core::dimension2di v) {}; + virtual void setBBox(core::aabbox3d v) {}; + virtual void setPlane(core::plane3df v) {}; + virtual void setUserPointer(void* v) {}; - // color attribute - EAT_COLOR, + virtual void setEnum(const char* enumValue, const char* const* enumerationLiterals) {}; + virtual void setTexture(video::ITexture*) {}; - // floating point color attribute - EAT_COLORF, + core::stringc Name; - // 3d vector attribute - EAT_VECTOR3D, + virtual E_ATTRIBUTE_TYPE getType() const = 0; + virtual const wchar_t* getTypeString() const = 0; - // 2d position attribute - EAT_POSITION2D, - - // vector 2d - EAT_VECTOR2D, - - // rectangle attribute - EAT_RECT, - - // matrix attribute - EAT_MATRIX, - - // quaternion attribute - EAT_QUATERNION, - - // 3d bounding box - EAT_BBOX, - - // plane - EAT_PLANE, - - // 3d triangle - EAT_TRIANGLE3D, - - // line 2d - EAT_LINE2D, - - // line 3d - EAT_LINE3D, - - // array of stringws attribute - EAT_STRINGWARRAY, - - // array of float - EAT_FLOATARRAY, - - // array of int - EAT_INTARRAY, - - // binary data attribute - EAT_BINARY, - - // texture reference attribute - EAT_TEXTURE, - - // user pointer void* - EAT_USER_POINTER, - - // known attribute type count - EAT_COUNT, - - // unknown attribute - EAT_UNKNOWN + virtual bool isEqualTo(IAttribute* attrib) { return attrib ? (getStringW() == attrib->getStringW()) && (getType()==attrib->getType()) : false; } }; //! Provides a generic interface for attributes and their values and the possiblity to serialize them class IAttributes : public virtual IReferenceCounted { public: + //! Set a set of default attribute values which can be used when usual attributnames are not found + virtual void setDefaultAttributes(IAttributes * attrib) = 0; + + //! Get the current set of default attributes + virtual const IAttributes * getDefaultAttributes() const = 0; + + //! set in which situations default attributes should be used. + virtual void setDefaultAttributeUsage(E_DEFAULT_ATTRIBUTE_USAGE usage) = 0; + + //! get attribute by name + virtual IAttribute* getAttributeP(const c8* attributeName) = 0; //! Returns amount of attributes in this collection of attributes. virtual u32 getAttributeCount() const = 0; diff -r fe8f05ba49e1 lib/irrlicht/source/Irrlicht/CAttributeImpl.h --- a/lib/irrlicht/source/Irrlicht/CAttributeImpl.h Sun Aug 31 23:47:13 2008 +0200 +++ b/lib/irrlicht/source/Irrlicht/CAttributeImpl.h Mon Sep 01 16:35:04 2008 +0200 @@ -1899,18 +1899,25 @@ { public: - CStringWArrayAttribute(const char* name, core::array value) + CStringWArrayAttribute(const char* name, const core::array& value) { Name = name; setArray(value); } + + virtual bool isEqualTo(IAttribute* attrib) + { + if ( !attrib || attrib->getType() != EAT_STRINGWARRAY ) + return false; + return Value == static_cast(attrib)->Value; + } virtual core::array getArray() { return Value; } - virtual void setArray(core::array value) + virtual void setArray(const core::array& value) { Value = value; } diff -r fe8f05ba49e1 lib/irrlicht/source/Irrlicht/CAttributes.cpp --- a/lib/irrlicht/source/Irrlicht/CAttributes.cpp Sun Aug 31 23:47:13 2008 +0200 +++ b/lib/irrlicht/source/Irrlicht/CAttributes.cpp Mon Sep 01 16:35:04 2008 +0200 @@ -15,6 +15,8 @@ CAttributes::CAttributes(video::IVideoDriver* driver) : Driver(driver) +, DefaultAttributes(NULL) +, DefaultAttributeUsage(EDAU_IGNORE) { #ifdef _DEBUG setDebugName("CAttributes"); @@ -28,10 +30,32 @@ { clear(); + if ( DefaultAttributes ) + DefaultAttributes->drop(); + if (Driver) Driver->drop(); } +void CAttributes::setDefaultAttributes(IAttributes * attrib) +{ + if ( DefaultAttributes ) + DefaultAttributes->drop(); + DefaultAttributes = attrib; + if ( DefaultAttributes ) + DefaultAttributes->grab(); +} + +const IAttributes * CAttributes::getDefaultAttributes() const +{ + return DefaultAttributes; +} + +// set in which situations default attributes should be used. +void CAttributes::setDefaultAttributeUsage(E_DEFAULT_ATTRIBUTE_USAGE usage) +{ + DefaultAttributeUsage = usage; +} //! Removes all attributes void CAttributes::clear() @@ -246,6 +270,13 @@ if (Attributes[i]->Name == attributeName) return Attributes[i]; + // check if we can return a default attribute instead + if ( DefaultAttributes && + (DefaultAttributeUsage == EDAU_READ_ONLY || DefaultAttributeUsage == EDAU_READ_WRITE) ) + { + return DefaultAttributes->getAttributeP(attributeName); + } + return 0; } @@ -1483,6 +1514,18 @@ } } +bool CAttributes::isEqualToDefaultAttribute(IAttribute* attrib) +{ + if ( !DefaultAttributes ) + return false; + + IAttribute * defaultAttrib = DefaultAttributes->getAttributeP(attrib->Name.c_str()); + if (!defaultAttrib) + return false; + + return attrib->isEqualTo( defaultAttrib ); +} + //! Write these attributes into a xml file bool CAttributes::write(io::IXMLWriter* writer, bool writeXMLHeader, const wchar_t* nonDefaultElementName) @@ -1503,6 +1546,11 @@ s32 i=0; for (; i<(s32)Attributes.size(); ++i) { + // check if we should not write because it's already in the default attributes + if ( (DefaultAttributeUsage == EDAU_WRITE_ONLY || DefaultAttributeUsage ==EDAU_READ_WRITE) + && isEqualToDefaultAttribute(Attributes[i]) ) + continue; + if ( Attributes[i]->getType() == EAT_STRINGWARRAY ) { core::array arraynames, arrayvalues; diff -r fe8f05ba49e1 lib/irrlicht/source/Irrlicht/CAttributes.h --- a/lib/irrlicht/source/Irrlicht/CAttributes.h Sun Aug 31 23:47:13 2008 +0200 +++ b/lib/irrlicht/source/Irrlicht/CAttributes.h Mon Sep 01 16:35:04 2008 +0200 @@ -17,8 +17,6 @@ namespace io { -class IAttribute; - //! Implementation of the IAttributes interface class CAttributes : public IAttributes { @@ -27,6 +25,14 @@ CAttributes(video::IVideoDriver* driver=0); ~CAttributes(); + //! Default attribute values are returned as result when usual attributnames are not found + virtual void setDefaultAttributes(IAttributes * attrib); + virtual const IAttributes * getDefaultAttributes() const; + + // set in which situations default attributes should be used. + virtual void setDefaultAttributeUsage(E_DEFAULT_ATTRIBUTE_USAGE usage); + + //! Returns amount of attributes in this collection of attributes. virtual u32 getAttributeCount() const; @@ -643,86 +649,20 @@ //! Sets an attribute as user pointer virtual void setAttribute(s32 index, void* userPointer); + //! get attribute by name + IAttribute* getAttributeP(const c8* attributeName); + protected: + bool isEqualToDefaultAttribute(IAttribute* attrib); void readAttributeFromXML(io::IXMLReader* reader); core::array Attributes; - IAttribute* getAttributeP(const c8* attributeName); + video::IVideoDriver* Driver; - video::IVideoDriver* Driver; -}; - - -class IAttribute : public virtual IReferenceCounted -{ -public: - - virtual ~IAttribute() {}; - - virtual s32 getInt() { return 0; } - virtual f32 getFloat() { return 0; } - virtual video::SColorf getColorf() { return video::SColorf(1.0f,1.0f,1.0f,1.0f); } - virtual video::SColor getColor() { return video::SColor(255,255,255,255); } - virtual core::stringc getString() { return core::stringc(getStringW().c_str()); } - virtual core::stringw getStringW() { return core::stringw(); } - virtual core::array getArray() { return core::array(); }; - virtual bool getBool() { return false; } - virtual void getBinary(void* outdata, s32 maxLength) {}; - virtual core::vector3df getVector() { return core::vector3df(); } - virtual core::position2di getPosition() { return core::position2di(); } - virtual core::rect getRect() { return core::rect(); } - virtual core::quaternion getQuaternion(){ return core::quaternion(); } - virtual core::matrix4 getMatrix() { return core::matrix4(); } - virtual core::triangle3df getTriangle() { return core::triangle3df(); } - virtual core::vector2df getVector2d() { return core::vector2df(); } - virtual core::vector2di getVector2di() { return core::vector2di(); } - virtual core::line2df getLine2d() { return core::line2df(); } - virtual core::line2di getLine2di() { return core::line2di(); } - virtual core::line3df getLine3d() { return core::line3df(); } - virtual core::line3di getLine3di() { return core::line3di(); } - virtual core::dimension2di getDimension2d() { return core::dimension2di(); } - virtual core::aabbox3d getBBox() { return core::aabbox3d(); } - virtual core::plane3df getPlane() { return core::plane3df(); } - - virtual video::ITexture* getTexture() { return 0; } - virtual const char* getEnum() { return 0; } - virtual void* getUserPointer() { return 0; } - - virtual void setInt(s32 intValue) {}; - virtual void setFloat(f32 floatValue) {}; - virtual void setString(const char* text) {}; - virtual void setString(const wchar_t* text){ setString(core::stringc(text).c_str()); }; - virtual void setArray( core::array arr ) {}; - virtual void setColor(video::SColorf color) {}; - virtual void setColor(video::SColor color) {}; - virtual void setBool(bool boolValue) {}; - virtual void setBinary(void* data, s32 maxLenght) {}; - virtual void setVector(core::vector3df v) {}; - virtual void setPosition(core::position2di v) {}; - virtual void setRect(core::rect v) {}; - virtual void setQuaternion(core::quaternion v) {}; - virtual void setMatrix(core::matrix4 v) {}; - virtual void setTriangle(core::triangle3df v) {}; - virtual void setVector2d(core::vector2df v) {}; - virtual void setVector2d(core::vector2di v) {}; - virtual void setLine2d(core::line2df v) {}; - virtual void setLine2d(core::line2di v) {}; - virtual void setLine3d(core::line3df v) {}; - virtual void setLine3d(core::line3di v) {}; - virtual void setDimension2d(core::dimension2di v) {}; - virtual void setBBox(core::aabbox3d v) {}; - virtual void setPlane(core::plane3df v) {}; - virtual void setUserPointer(void* v) {}; - - virtual void setEnum(const char* enumValue, const char* const* enumerationLiterals) {}; - virtual void setTexture(video::ITexture*) {}; - - core::stringc Name; - - virtual E_ATTRIBUTE_TYPE getType() const = 0; - virtual const wchar_t* getTypeString() const = 0; + IAttributes * DefaultAttributes; + E_DEFAULT_ATTRIBUTE_USAGE DefaultAttributeUsage; }; } // end namespace io