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<core::stringw> getArray()	{ return core::array<core::stringw>(); };
+	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<s32> getRect()		{ return core::rect<s32>(); }
+	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<f32> getBBox()		{ return core::aabbox3d<f32>(); }
+	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<core::stringw> 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<s32> 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<f32> 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<core::stringw> value)
+	CStringWArrayAttribute(const char* name, const core::array<core::stringw>& value)
 	{
 		Name = name;
 		setArray(value);
 	}
+
+	virtual bool isEqualTo(IAttribute* attrib) 
+	{ 
+		if ( !attrib || attrib->getType() != EAT_STRINGWARRAY )
+			return false;
+		return Value == static_cast<CStringWArrayAttribute*>(attrib)->Value;
+	}	
 
 	virtual core::array<core::stringw> getArray()
 	{
 		return Value;
 	}
 
-	virtual void setArray(core::array<core::stringw> value)
+	virtual void setArray(const core::array<core::stringw>& 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<core::stringw> 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<IAttribute*> 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<core::stringw> getArray()	{ return core::array<core::stringw>(); };
-	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<s32> getRect()		{ return core::rect<s32>(); }
-	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<f32> getBBox()		{ return core::aabbox3d<f32>(); }
-	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<core::stringw> 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<s32> 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<f32> 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
