All pastes #2015990 Raw Edit

XML Shader for irrlicht patch rc

public text v1 · immutable
#2015990 ·published 2010-12-10 23:09 UTC
rendered paste body
Index: media/d3d9Shader.xml
===================================================================
--- media/d3d9Shader.xml	(revision 0)
+++ media/d3d9Shader.xml	(revision 0)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<irrlichtShader>
+   <shaderCode Type="HLSL" vsFile="../../media/d3d9.hlsl" vsTarget="vs_1_1" psTarget="ps_1_1" vsEntryPoint="vertexMain" psEntryPoint="pixelMain" fixedFunctionFallBack="solid"  /> <!-- psFile is ignored when HLSL, if gsFile not present/empty then geometry shader is not created -->
+   <shaderCodeFallBack Type="DXASM" vsFile="../../media/d3d9.vsh" psFile="../../media/d3d9.psh" /> <!-- FallBack shaders for older HW if possible, if node not present then not considered -->
+   <passParameters> <!-- We specify which built in params we want passed. If any of the parameter node not present, it is not passed... -->
+      <!-- Depending on using high level shaders or not the register or name is ignored accordingly, glsl shaders can pass to any shader type regardless of pixel, vertex or geom -->
+      <worldTransInv shader="vertex" register="0" name="mInvWorld">
+      <worldViewProjTrans shader="vertex" register="4" name="mWorldViewProj">
+      <worldTransposed shader="vertex" register="10" name="mTransWorld">
+   </passParameters>
+</irrlichtShader> 
Index: media/glShader.xml
===================================================================
--- media/glShader.xml	(revision 0)
+++ media/glShader.xml	(revision 0)
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<irrlichtShader>
+   <shaderCode Type="GLSL" vsFile="../../media/opengl.vert" psFile="../../media/opengl.frag" gsFile="" vsTarget="vs_1_1" psTarget="ps_1_1" gsTarget="" /> <!-- Second File is ignored when HLSL, if gsFile not present/empty then geometry shader is not created -->
+   <shaderCodeFallBack Type="ARB" vsFile="../../media/opengl.vsh" psFile="../../media/opengl.psh" fixedFunctionFallBack="solid" /> <!-- FallBack shaders for older HW if possible, if node not present then not considered -->
+   <passParameters> <!-- We specify which built in params we want passed. If any of the parameter node not present, it is not passed... -->
+      <!-- Depending on using high level shaders or not the register or name is ignored accordingly, glsl shaders can pass to any shader type regardless of pixel, vertex or geom -->
+      <worldTransInv shader="vertex" register="0" name="mInvWorld">
+      <worldViewProjTrans shader="vertex" register="4" name="mWorldViewProj">
+      <worldTransposed shader="vertex" register="10" name="mTransWorld">
+   </passParameters>
+</irrlichtShader> 
Index: media/d3d9.hlsl
===================================================================
--- media/d3d9.hlsl	(revision 3494)
+++ media/d3d9.hlsl	(working copy)
@@ -6,10 +6,16 @@
 //-----------------------------------------------------------------------------
 // Global variables
 //-----------------------------------------------------------------------------
+/*
 float4x4 mWorldViewProj;  // World * View * Projection transformation
 float4x4 mInvWorld;       // Inverted world matrix
 float4x4 mTransWorld;     // Transposed world matrix
 float3 mLightPos;         // Light position
+float4 mLightColor;       // Light color*/
+float4x4 mWorldViewProj;  // World * View * Projection transformation
+float4x4 mInvWorld;       // Inverted world matrix
+float4x4 mTransWorld;     // Transposed world matrix
+float3 mLightPos;         // Light position
 float4 mLightColor;       // Light color
 
 
Index: media/d3d8Shader.xml
===================================================================
--- media/d3d8Shader.xml	(revision 0)
+++ media/d3d8Shader.xml	(revision 0)
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<irrlichtShader>
+   <shaderCodeFallBack Type="DXASM" vsFile="../../media/d3d8.vsh" psFile="../../media/d3d8.psh" fixedFunctionFallBack="solid" /> <!-- d3d8 only supports assembly shaders, so we only specify these -->
+   <passParameters> <!-- We specify which built in params we want passed. If any of the parameter node not present, it is not passed... -->
+      <!-- Depending on using high level shaders or not the register or name is ignored accordingly, glsl shaders can pass to any shader type regardless of pixel, vertex or geom -->
+      <worldTransInv shader="vertex" register="0" name="mInvWorld">
+      <worldViewProjTrans shader="vertex" register="4" name="mWorldViewProj">
+      <worldTransposed shader="vertex" register="10" name="mTransWorld">
+   </passParameters>
+</irrlichtShader> 
Index: source/Irrlicht/CNullDriver.h
===================================================================
--- source/Irrlicht/CNullDriver.h	(revision 3494)
+++ source/Irrlicht/CNullDriver.h	(working copy)
@@ -21,6 +21,7 @@
 #include "SVertexIndex.h"
 #include "SLight.h"
 #include "SExposedVideoData.h"
+#include "SUniqueXmlShader.h"
 
 namespace irr
 {
@@ -569,6 +570,34 @@
 			E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
 			s32 userData=0);
 
+        //! Reads all required shaders from an xml file which references shader files.
+        virtual s32 getXMLMaterialType(io::IXMLReaderUTF8* xmlShaderFile,
+            const io::path& xmlShaderFileName,
+            bool& ForceHighLevelShaders,
+            s32 baseMaterial,
+            IShaderConstantSetCallBack* callback,
+            s32 userData);
+
+        //! Reads all required shaders from an xml file which references shader files.
+        virtual s32 getXMLMaterialType(const io::path& xmlShaderFileName,
+            bool& ForceHighLevelShaders,
+            s32 baseMaterial = -1,
+            IShaderConstantSetCallBack* callback = 0,
+            s32 userData = 0);
+
+        //! clears the cache of xmlShaders, doesnt delete the shaders and callbacks though
+        virtual void clearXMLShaderCache();
+
+        //! Returns how many XML shaders there are
+        //! \return xml shader count
+        virtual u32 getXMLShaderCount() const;
+
+        //! Returns an XML shader material type.
+        //! \param idx: Zero based index of the light. Note: first indices correspond
+        //! to EMT enums
+        //! \return Material Type.
+        virtual s32 getXMLShaderByIndex(u32 idx) const;
+
 		//! Returns a pointer to the mesh manipulator.
 		virtual scene::IMeshManipulator* getMeshManipulator();
 
@@ -596,6 +625,10 @@
 		//! looks if the image is already loaded
 		virtual video::ITexture* findTexture(const io::path& filename);
 
+		//! looks if the image is already loaded
+		virtual s32 findXMLShader(const io::path& filename, s32 baseMaterial, bool highLevel,
+                                    video::IShaderConstantSetCallBack* callback = 0, bool uniqueCallBack = false);
+
 		//! Set/unset a clipping plane.
 		//! There are at least 6 clipping planes available for the user to set at will.
 		//! \param index: The plane index. Must be between 0 and MaxUserClipPlanes.
@@ -653,6 +686,19 @@
 				const c8* name=0);
 
 		virtual bool checkDriverReset() {return false;}
+
+
+        //! For External Material Loaders
+        virtual s32 getMaterialType(const io::path& filename, s32 baseMaterial = -1, IShaderConstantSetCallBack* callback = 0, s32 userData = 0);
+
+        virtual void addExternalMaterialTypeLoader(IMaterialTypeLoader* loader);
+
+        virtual u32 getMaterialTypeLoaderCount() const;
+
+        virtual IMaterialTypeLoader* getMaterialTypeLoader(u32 n);
+
+        virtual void overrideIrrlichtMaterial(E_MATERIAL_TYPE type, SUniqueXmlShader newMaterialType);
+
 	protected:
 
 		//! deletes all textures
@@ -793,6 +839,8 @@
 		core::array<video::IImageWriter*> SurfaceWriter;
 		core::array<SLight> Lights;
 		core::array<SMaterialRenderer> MaterialRenderers;
+		core::array<video::IMaterialTypeLoader*> MaterialTypeLoader;
+		core::array<SUniqueXmlShader> xmlShaderCache;
 
 		//core::array<SHWBufferLink*> HWBufferLinks;
 		core::map< const scene::IMeshBuffer* , SHWBufferLink* > HWBufferMap;
Index: source/Irrlicht/Irrlicht-gcc.cbp
===================================================================
--- source/Irrlicht/Irrlicht-gcc.cbp	(revision 3494)
+++ source/Irrlicht/Irrlicht-gcc.cbp	(working copy)
@@ -430,6 +430,7 @@
 		<Unit filename="../../include/EAttributes.h" />
 		<Unit filename="../../include/ECullingTypes.h" />
 		<Unit filename="../../include/EDebugSceneTypes.h" />
+		<Unit filename="../../include/EDefaultShaderConstants.h" />
 		<Unit filename="../../include/EDeviceTypes.h" />
 		<Unit filename="../../include/EDriverFeatures.h" />
 		<Unit filename="../../include/EDriverTypes.h" />
@@ -456,6 +457,7 @@
 		<Unit filename="../../include/IBoneSceneNode.h" />
 		<Unit filename="../../include/ICameraSceneNode.h" />
 		<Unit filename="../../include/ICursorControl.h" />
+		<Unit filename="../../include/IDefaultShaderCallBack.h" />
 		<Unit filename="../../include/IDummyTransformationSceneNode.h" />
 		<Unit filename="../../include/IDynamicMeshBuffer.h" />
 		<Unit filename="../../include/IEventReceiver.h" />
@@ -570,6 +572,7 @@
 		<Unit filename="../../include/SParticle.h" />
 		<Unit filename="../../include/SSharedMeshBuffer.h" />
 		<Unit filename="../../include/SSkinMeshBuffer.h" />
+		<Unit filename="../../include/SUniqueXmlShader.h" />
 		<Unit filename="../../include/SVertexIndex.h" />
 		<Unit filename="../../include/SVertexManipulator.h" />
 		<Unit filename="../../include/SViewFrustum.h" />
@@ -667,6 +670,7 @@
 		<Unit filename="CDefaultSceneNodeAnimatorFactory.h" />
 		<Unit filename="CDefaultSceneNodeFactory.cpp" />
 		<Unit filename="CDefaultSceneNodeFactory.h" />
+		<Unit filename="CDefaultShaderCallBack.cpp" />
 		<Unit filename="CDepthBuffer.cpp" />
 		<Unit filename="CDepthBuffer.h" />
 		<Unit filename="CDummyTransformationSceneNode.cpp" />
Index: source/Irrlicht/CNullDriver.cpp
===================================================================
--- source/Irrlicht/CNullDriver.cpp	(revision 3494)
+++ source/Irrlicht/CNullDriver.cpp	(working copy)
@@ -14,6 +14,8 @@
 #include "IAnimatedMeshSceneNode.h"
 #include "CMeshManipulator.h"
 #include "CColorConverter.h"
+#include "EDefaultShaderConstants.h"
+#include "IDefaultShaderCallBack.h"
 
 
 namespace irr
@@ -198,6 +200,8 @@
 		InitMaterial2D.TextureLayer[i].TextureWrapV=video::ETC_REPEAT;
 	}
 	OverrideMaterial2D=InitMaterial2D;
+
+	clearXMLShaderCache();
 }
 
 
@@ -221,6 +225,9 @@
 	for (i=0; i<SurfaceWriter.size(); ++i)
 		SurfaceWriter[i]->drop();
 
+    for (i=0; i<MaterialTypeLoader.size(); ++i)
+        MaterialTypeLoader[i]->drop();
+
 	// delete material renderers
 	deleteMaterialRenders();
 
@@ -2270,7 +2277,487 @@
 	return result;
 }
 
+//! clears the cache of xmlShaders, doesnt delete the shaders and callbacks though
+void CNullDriver::clearXMLShaderCache()
+{
+	xmlShaderCache.set_used(0);
+	SUniqueXmlShader temp;
+    temp.highLevel = false;
+    temp.cb = 0;
+	for (u32 i=0; i<EMT_COUNT; i++)
+	{
+	    temp.filename = sBuiltInMaterialTypeNames[i];
+	    temp.MaterialType = (E_MATERIAL_TYPE)i;
+	    temp.baseMaterial = (E_MATERIAL_TYPE)i;
+        xmlShaderCache.push_back(temp);
+	}
+}
 
+//! Returns how many XML shaders there are
+//! \return xml shader count
+u32 CNullDriver::getXMLShaderCount() const
+{
+	return xmlShaderCache.size();
+}
+
+//! Returns an XML shader material type.
+//! \param idx: Zero based index of the light. Note: first indices correspond
+//! to EMT enums
+//! \return Material Type.
+s32 CNullDriver::getXMLShaderByIndex(u32 idx) const
+{
+    if ( idx < EMT_COUNT )
+        return idx;
+	else if ( idx < xmlShaderCache.size() )
+		return xmlShaderCache[idx].MaterialType;
+	else
+		return -1;
+}
+
+//! looks if the image is already loaded
+s32 CNullDriver::findXMLShader(const io::path& filename, s32 baseMaterial, bool highLevel,
+                IShaderConstantSetCallBack* callback, bool uniqueCallBack)
+{
+    for (s32 i=0; i<EMT_COUNT; i++)
+    {
+        if (filename==sBuiltInMaterialTypeNames[i])
+        {
+            return xmlShaderCache[i].MaterialType;
+        }
+    }
+
+    io::path tempPath = FileSystem->getAbsolutePath(filename);
+    if (baseMaterial!=-1)
+    {
+        if (uniqueCallBack)
+        {
+            for (u32 i=EMT_COUNT; i<xmlShaderCache.size(); i++)
+            {
+                if (xmlShaderCache[i].filename==tempPath&&xmlShaderCache[i].baseMaterial==baseMaterial&&xmlShaderCache[i].highLevel==highLevel&&xmlShaderCache[i].cb==callback)
+                {
+                    return xmlShaderCache[i].MaterialType;
+                }
+            }
+        }
+        else
+        {
+            for (u32 i=EMT_COUNT; i<xmlShaderCache.size(); i++)
+            {
+                if (xmlShaderCache[i].filename==tempPath&&xmlShaderCache[i].baseMaterial==baseMaterial&&xmlShaderCache[i].highLevel==highLevel)
+                {
+                    return xmlShaderCache[i].MaterialType;
+                }
+            }
+        }
+    }
+    else
+    {
+        if (uniqueCallBack)
+        {
+            for (u32 i=EMT_COUNT; i<xmlShaderCache.size(); i++)
+            {
+                if (xmlShaderCache[i].filename==tempPath&&xmlShaderCache[i].highLevel==highLevel&&xmlShaderCache[i].cb==callback)
+                {
+                    return xmlShaderCache[i].MaterialType;
+                }
+            }
+        }
+        else
+        {
+            for (u32 i=EMT_COUNT; i<xmlShaderCache.size(); i++)
+            {
+                if (xmlShaderCache[i].filename==tempPath&&xmlShaderCache[i].highLevel==highLevel)
+                {
+                    return xmlShaderCache[i].MaterialType;
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+//! Reads all required shaders from an xml file which references shader files.
+s32 CNullDriver::getXMLMaterialType(const io::path& xmlShaderFileName,
+            bool& ForceHighLevelShaders,
+            s32 baseMaterial,
+            IShaderConstantSetCallBack* callback,
+            s32 userData)
+{
+    s32 result = findXMLShader(xmlShaderFileName,baseMaterial,ForceHighLevelShaders,callback,true);
+    if (result!=-1)
+    {
+        return result;
+    }
+
+    io::IXMLReaderUTF8* xmlShaderFile = 0;
+
+	if (xmlShaderFileName.size() )
+	{
+		xmlShaderFile = FileSystem->createXMLReaderUTF8(xmlShaderFileName);
+		if (!xmlShaderFile)
+		{
+			os::Printer::log("Could not open shader xml file",
+				xmlShaderFileName, ELL_WARNING);
+		}
+	}
+
+	result = getXMLMaterialType(
+		xmlShaderFile, xmlShaderFileName, ForceHighLevelShaders,
+		baseMaterial, callback, userData);
+
+	if (xmlShaderFile)
+		xmlShaderFile->drop();
+
+	return result;
+}
+
+void readXMLUntilElement(io::IXMLReaderUTF8* xml) {
+    bool notEnd;
+    do
+    {
+        notEnd = xml->read();
+    }
+    while (xml->getNodeType()!=io::EXN_ELEMENT&&notEnd);
+}
+
+//! Reads all required shaders from an xml file which references shader files.
+s32 CNullDriver::getXMLMaterialType(io::IXMLReaderUTF8* xmlShaderFile,
+            const io::path& xmlShaderFileName,
+            bool& ForceHighLevelShaders,
+            s32 baseMaterial,
+            IShaderConstantSetCallBack* callback,
+            s32 userData)
+{
+    if (!queryFeature(video::EVDF_VERTEX_SHADER_1_1) &&
+		!queryFeature(video::EVDF_ARB_VERTEX_PROGRAM_1))
+	{
+		os::Printer::log("WARNING: Vertex shaders disabled "\
+			"because of missing driver/hardware support.", ELL_WARNING);
+		return -1;
+	}
+	if (!queryFeature(video::EVDF_PIXEL_SHADER_1_1) &&
+		!queryFeature(video::EVDF_ARB_FRAGMENT_PROGRAM_1))
+	{
+		os::Printer::log("WARNING: Pixel shaders disabled "\
+			"because of missing driver/hardware support.", ELL_WARNING);
+		return -1;
+	}
+
+	if (!xmlShaderFile)
+	{
+	    return -1;
+	}
+
+    readXMLUntilElement(xmlShaderFile);
+    if (core::stringc(xmlShaderFile->getNodeName())!="irrlichtShader")
+    {
+        return -1;
+    }
+
+    core::stringc temp;
+    core::stringc vsFile = "";
+    core::stringc psFile = "";
+    core::stringc gsFile = "";
+    core::stringc vsFileLow = "";
+    core::stringc psFileLow = "";
+    E_VERTEX_SHADER_TYPE vst = EVST_VS_1_1;
+    E_PIXEL_SHADER_TYPE pst = EPST_PS_1_1;
+    E_GEOMETRY_SHADER_TYPE gst = EGST_GS_4_0;
+    core::stringc vsEntry = "";
+    core::stringc psEntry = "";
+    s32 fixedFnFallBack = -1;
+    E_MATERIAL_TYPE baseMaterialXmlH;
+    E_MATERIAL_TYPE baseMaterialXmlL;
+
+    readXMLUntilElement(xmlShaderFile);
+    // No matter if <shaderCode> or fallback there are at least 3 attributes
+    if (xmlShaderFile->getAttributeCount()<4)
+    {
+        return -1;
+    }
+    bool failAtHighLevel = false;
+    if (core::stringc(xmlShaderFile->getNodeName())=="shaderCode"&&ForceHighLevelShaders)
+    {
+        if (!((core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="GLSL"&&getDriverType()==EDT_OPENGL)||
+            (core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="HLSL"&&getDriverType()==EDT_DIRECT3D9)))
+        {
+            os::Printer::log("The driver is not appropriate for shader type ",
+				core::stringc(xmlShaderFile->getAttributeValueSafe("Type")), ELL_WARNING);
+            return -1;
+        }
+        vsFile = xmlShaderFile->getAttributeValueSafe("vsFile");
+        psFile = xmlShaderFile->getAttributeValueSafe("psFile");
+        gsFile = xmlShaderFile->getAttributeValueSafe("gsFile");
+        vsEntry = xmlShaderFile->getAttributeValueSafe("vsEntryPoint");
+        psEntry = xmlShaderFile->getAttributeValueSafe("psEntryPoint");
+        temp = xmlShaderFile->getAttributeValueSafe("vsTarget");
+        for (u32 i=0; i<EVST_COUNT; i++)
+        {
+            if (temp==VERTEX_SHADER_TYPE_NAMES[i])
+                vst = (E_VERTEX_SHADER_TYPE)i;
+        }
+        temp = xmlShaderFile->getAttributeValueSafe("psTarget");
+        for (u32 i=0; i<EPST_COUNT; i++)
+        {
+            if (temp==PIXEL_SHADER_TYPE_NAMES[i])
+                pst = (E_PIXEL_SHADER_TYPE)i;
+        }
+        temp = xmlShaderFile->getAttributeValueSafe("gsTarget");
+        for (u32 i=0; i<EGST_COUNT; i++)
+        {
+            if (temp==GEOMETRY_SHADER_TYPE_NAMES[i])
+                gst = (E_GEOMETRY_SHADER_TYPE)i;
+        }
+        temp = xmlShaderFile->getAttributeValueSafe("fixedFnFallBack");
+        for (u32 i=0; i<EMT_COUNT; i++)
+        {
+            if (temp==sBuiltInMaterialTypeNames[i])
+                fixedFnFallBack=i;
+        }
+        temp = xmlShaderFile->getAttributeValueSafe("baseMaterial");
+        for (u32 i=0; i<EMT_COUNT; i++)
+        {
+            if (temp==sBuiltInMaterialTypeNames[i])
+                baseMaterialXmlH = (E_MATERIAL_TYPE)i;
+        }
+    }
+    else if (core::stringc(xmlShaderFile->getNodeName())=="shaderCodeFallBack")
+    {
+        if (!((core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="ARB"&&getDriverType()==EDT_OPENGL)||
+            (core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="DXASM"&&(getDriverType()==EDT_DIRECT3D9||getDriverType()==EDT_DIRECT3D8))))
+        {
+            os::Printer::log("The driver is not appropriate for shader type ",
+				core::stringc(xmlShaderFile->getAttributeValueSafe("Type")), ELL_WARNING);
+            return -1;
+        }
+        vsFileLow = xmlShaderFile->getAttributeValueSafe("vsFile");
+        psFileLow = xmlShaderFile->getAttributeValueSafe("psFile");
+        ForceHighLevelShaders = false; //! make sure
+        temp = xmlShaderFile->getAttributeValueSafe("fixedFnFallBack");
+        for (u32 i=0; i<EMT_COUNT; i++)
+        {
+            if (temp==sBuiltInMaterialTypeNames[i])
+                fixedFnFallBack=i;
+        }
+        temp = xmlShaderFile->getAttributeValueSafe("baseMaterial");
+        for (u32 i=0; i<EMT_COUNT; i++)
+        {
+            if (temp==sBuiltInMaterialTypeNames[i])
+                baseMaterialXmlL = (E_MATERIAL_TYPE)i;
+        }
+    }
+    else
+    {
+        failAtHighLevel = true;
+    }
+
+    if (failAtHighLevel) {
+        readXMLUntilElement(xmlShaderFile);
+        if (core::stringc(xmlShaderFile->getNodeName())=="shaderCodeFallBack")
+        {
+            if (!((core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="ARB"&&getDriverType()==EDT_OPENGL)||
+                (core::stringc(xmlShaderFile->getAttributeValueSafe("Type"))=="DXASM"&&(getDriverType()==EDT_DIRECT3D9||getDriverType()==EDT_DIRECT3D8))))
+            {
+                os::Printer::log("The driver is not appropriate for shader type ",
+                    core::stringc(xmlShaderFile->getAttributeValueSafe("Type")), ELL_WARNING);
+                return -1;
+            }
+            vsFileLow = xmlShaderFile->getAttributeValueSafe("vsFile");
+            psFileLow = xmlShaderFile->getAttributeValueSafe("psFile");
+            temp = xmlShaderFile->getAttributeValueSafe("fixedFnFallBack");
+            for (u32 i=0; i<EMT_COUNT; i++)
+            {
+                if (temp==sBuiltInMaterialTypeNames[i])
+                    fixedFnFallBack=i;
+            }
+            temp = xmlShaderFile->getAttributeValueSafe("baseMaterial");
+            for (u32 i=0; i<EMT_COUNT; i++)
+            {
+                if (temp==sBuiltInMaterialTypeNames[i])
+                    baseMaterialXmlL = (E_MATERIAL_TYPE)i;
+            }
+        }
+        else
+        {
+            os::Printer::log("<shaderCode> node blocks are missing in the shader xml.", ELL_WARNING);
+            return -1;
+        }
+        ForceHighLevelShaders = false;
+    }
+
+    readXMLUntilElement(xmlShaderFile);
+    if (core::stringc(xmlShaderFile->getNodeName())!="passParameters") {
+        readXMLUntilElement(xmlShaderFile);
+        if (core::stringc(xmlShaderFile->getNodeName())!="passParameters")
+            return -1;
+    }
+
+    u32 edscFlags = 0;
+    core::array<SDefaultShaderConstantRegisters> registers;
+    SDefaultShaderConstantRegisters tempReg;
+    tempReg.Name = "";
+    tempReg.Register = -1;
+    for (u32 i=0; i<EDSC_COUNT; i++)
+        registers.push_back(tempReg);
+    while (xmlShaderFile->read()) {
+        if (xmlShaderFile->getNodeType()==io::EXN_ELEMENT)
+        {
+            for (u32 i=0; i<EDSC_COUNT; i++)
+            {
+                if (core::stringc(xmlShaderFile->getNodeName())==DEFAULT_SHADER_CONSTANTS_NAMES[i])
+                {
+                    edscFlags |= (1 << i);
+                    registers[i].Name = xmlShaderFile->getAttributeValueSafe("name");
+                    registers[i].Register = xmlShaderFile->getAttributeValueAsInt("register");
+                    if (core::stringc(xmlShaderFile->getAttributeValueSafe("shader"))=="vertex")
+                        registers[i].pixelOrVertex = false;
+                    else
+                        registers[i].pixelOrVertex = true;
+                    break;
+                }
+            }
+        }
+    }
+    for (u32 i=0; registers.size()>0&&i<registers.size(); i++)
+    {
+        if (registers[i].Name.size()<1&&registers[i].Register<0)
+        {
+            registers.erase(i);
+            i--;
+        }
+    }
+    IDefaultShaderCallBack* cb = new IDefaultShaderCallBack(edscFlags,registers,callback);
+    s32 newMaterialType = 0;
+    if (ForceHighLevelShaders)
+    {
+        newMaterialType = addHighLevelShaderMaterialFromFiles(vsFile,vsEntry.c_str(),vst,psFile,psEntry.c_str(),pst,
+                                            gsFile,"geomMain",gst,scene::EPT_TRIANGLES,scene::EPT_TRIANGLE_STRIP,0,
+                                            cb,baseMaterial!=-1 ? ((E_MATERIAL_TYPE)baseMaterial):baseMaterialXmlH,userData);
+        if (newMaterialType==-1)
+            ForceHighLevelShaders=false;
+        else
+        {
+            cb->setHighorLowLevel(ForceHighLevelShaders);
+            SUniqueXmlShader tempSUXS;
+            tempSUXS.filename = FileSystem->getAbsolutePath(xmlShaderFileName);
+            tempSUXS.baseMaterial = baseMaterial!=-1 ? ((E_MATERIAL_TYPE)baseMaterial):baseMaterialXmlH;
+            tempSUXS.cb = callback;
+            tempSUXS.highLevel = true;
+            tempSUXS.MaterialType = newMaterialType;
+            xmlShaderCache.push_back(tempSUXS);
+            cb->drop();
+            return newMaterialType;
+        }
+    }
+    if (!ForceHighLevelShaders) //! DO NOT change into an "else"
+    {
+        newMaterialType = addShaderMaterialFromFiles(vsFileLow,psFileLow,cb,baseMaterial!=-1 ? ((E_MATERIAL_TYPE)baseMaterial):baseMaterialXmlL,userData);
+        cb->setHighorLowLevel(ForceHighLevelShaders);
+        if (newMaterialType!=-1) {
+            SUniqueXmlShader tempSUXS;
+            tempSUXS.filename = FileSystem->getAbsolutePath(xmlShaderFileName);
+            tempSUXS.baseMaterial = baseMaterial!=-1 ? ((E_MATERIAL_TYPE)baseMaterial):baseMaterialXmlL;
+            tempSUXS.cb = callback;
+            tempSUXS.highLevel = false;
+            tempSUXS.MaterialType = newMaterialType;
+            xmlShaderCache.push_back(tempSUXS);
+            cb->drop();
+            return newMaterialType;
+        }
+    }
+
+    return fixedFnFallBack;
+}
+
+
+s32 CNullDriver::getMaterialType(const io::path& filename, s32 baseMaterial, IShaderConstantSetCallBack* callback, s32 userData)
+{
+	if (filename.size()<1)
+		return -1;
+
+    s32 result = findXMLShader(filename,baseMaterial,true,callback,true);
+    if (result!=-1)
+    {
+        return result;
+    }
+
+	u32 i;
+
+	// try to load file based on file extension
+	for (i=0; i<MaterialTypeLoader.size(); ++i)
+	{
+		if (MaterialTypeLoader[i]->isALoadableFileExtension(filename))
+		{
+			result = MaterialTypeLoader[i]->loadMaterialType( filename,baseMaterial,callback,userData );
+			if (result!=-1)
+			{
+			    SUniqueXmlShader tempSUXS;
+                tempSUXS.filename = filename;
+                tempSUXS.baseMaterial = (E_MATERIAL_TYPE)baseMaterial;
+                tempSUXS.cb = callback;
+                tempSUXS.highLevel = true; //doesnt matter but default it
+                tempSUXS.MaterialType = result;
+                xmlShaderCache.push_back(tempSUXS);
+                return result;
+			}
+		}
+	}
+
+	// try to load file based on what is in it
+	for (i=0; i<MaterialTypeLoader.size(); ++i)
+	{
+		if (MaterialTypeLoader[i]->isALoadableFileFormat(filename))
+		{
+			result = MaterialTypeLoader[i]->loadMaterialType( filename,baseMaterial,callback,userData );
+			if (result!=-1)
+			{
+			    SUniqueXmlShader tempSUXS;
+                tempSUXS.filename = filename;
+                tempSUXS.baseMaterial = (E_MATERIAL_TYPE)baseMaterial;
+                tempSUXS.cb = callback;
+                tempSUXS.highLevel = true; //doesnt matter but default it
+                tempSUXS.MaterialType = result;
+                xmlShaderCache.push_back(tempSUXS);
+                return result;
+			}
+		}
+	}
+
+    bool temp=true;
+    if (result==-1)
+        result = getXMLMaterialType(filename,temp,baseMaterial,callback,userData);
+
+	return result; // failed to load
+}
+
+void CNullDriver::addExternalMaterialTypeLoader(IMaterialTypeLoader* loader)
+{
+	if (!loader)
+		return;
+
+	loader->grab();
+	MaterialTypeLoader.push_back(loader);
+}
+
+u32 CNullDriver::getMaterialTypeLoaderCount() const
+{
+    return MaterialTypeLoader.size();
+}
+
+IMaterialTypeLoader* CNullDriver::getMaterialTypeLoader(u32 n)
+{
+    if (n<MaterialTypeLoader.size())
+        return MaterialTypeLoader[n];
+
+    return 0;
+}
+
+void CNullDriver::overrideIrrlichtMaterial(E_MATERIAL_TYPE type, SUniqueXmlShader newMaterialType)
+{
+    if (type<EMT_COUNT)
+        xmlShaderCache[type]=newMaterialType;
+}
+
 //! Creates a render target texture.
 ITexture* CNullDriver::addRenderTargetTexture(const core::dimension2d<u32>& size,
 		const io::path&name, const ECOLOR_FORMAT format)
Index: source/Irrlicht/CDefaultShaderCallBack.cpp
===================================================================
--- source/Irrlicht/CDefaultShaderCallBack.cpp	(revision 0)
+++ source/Irrlicht/CDefaultShaderCallBack.cpp	(revision 0)
@@ -0,0 +1,315 @@
+#include "SMaterial.h"
+#include "IDefaultShaderCallBack.h"
+#include "IMaterialRendererServices.h"
+#include "IVideoDriver.h"
+#include "matrix4.h"
+#include "ICameraSceneNode.h"
+#include "os.h"
+
+namespace irr
+{
+namespace video
+{
+
+
+IDefaultShaderCallBack::IDefaultShaderCallBack(u32 flags, core::array<SDefaultShaderConstantRegisters> registers, IShaderConstantSetCallBack* callback)
+    : edscFlags(flags), Registers(registers), callBack(callback), highOrLowLevel(true)
+{
+    if (callBack)
+        callBack->grab();
+}
+
+IDefaultShaderCallBack::~IDefaultShaderCallBack()
+{
+    if (callBack)
+        callBack->drop();
+}
+
+void IDefaultShaderCallBack::OnSetMaterial(const SMaterial& material)
+{
+    if (callBack)
+        callBack->OnSetMaterial(material);
+}
+
+void setConstant(bool highOrLowLevel,video::IMaterialRendererServices* services,float* pointer,u32 size,SDefaultShaderConstantRegisters Register) {
+    if (highOrLowLevel)
+    {
+        if (Register.pixelOrVertex)
+            services->setPixelShaderConstant(Register.Name.c_str(),pointer,size);
+        else
+            services->setVertexShaderConstant(Register.Name.c_str(),pointer,size);
+    }
+    else
+    {
+        if (Register.pixelOrVertex)
+            services->setPixelShaderConstant(pointer,Register.Register,size/4);
+        else
+            services->setVertexShaderConstant(pointer,Register.Register,size/4);
+    }
+}
+
+void IDefaultShaderCallBack::OnSetConstants(video::IMaterialRendererServices* services,
+			s32 userData)
+{
+    video::IVideoDriver* driver = services->getVideoDriver();
+
+    u32 edscFlagsTmp = edscFlags;
+
+    for (u32 i=0; i<EDSC_COUNT&&i<Registers.size(); i++)
+    {
+        if (edscFlagsTmp & (1 << EDSC_WORLD_TFORM)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_WORLD);
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_TFORM);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_TFORM)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_VIEW);
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_TFORM);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_PROJ_TFORM)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_PROJ_TFORM);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_PROJ_TFORM)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_PROJ_TFORM);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_VIEW_PROJ_TFORM)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat *= driver->getTransform(video::ETS_WORLD);
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_VIEW_PROJ_TFORM);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_TFORM_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_WORLD);
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_TFORM_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_TFORM_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_VIEW);
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_TFORM_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_PROJ_TFORM_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_PROJ_TFORM_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_PROJ_TFORM_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_PROJ_TFORM_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_VIEW_PROJ_TFORM_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat *= driver->getTransform(video::ETS_WORLD);
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_VIEW_PROJ_TFORM_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_TRANSPOSED)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_WORLD);
+            mat = mat.getTransposed();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_TRANSPOSED);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_TRANSPOSED)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_VIEW);
+            mat = mat.getTransposed();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_TRANSPOSED);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_PROJ_TRANSPOSED)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat = mat.getTransposed();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_PROJ_TRANSPOSED);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_PROJ_TRANSPOSED)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat = mat.getTransposed();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_PROJ_TRANSPOSED);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_VIEW_PROJ_TRANSPOSED)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat *= driver->getTransform(video::ETS_WORLD);
+            mat = mat.getTransposed();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_VIEW_PROJ_TRANSPOSED);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_TRANSPOSED_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_WORLD);
+            mat = mat.getTransposed();
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_TRANSPOSED_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_TRANSPOSED_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_VIEW);
+            mat = mat.getTransposed();
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_TRANSPOSED_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_PROJ_TRANSPOSED_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat = mat.getTransposed();
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_PROJ_TRANSPOSED_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_VIEW_PROJ_TRANSPOSED_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat = mat.getTransposed();
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_VIEW_PROJ_TRANSPOSED_INV);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_WORLD_VIEW_PROJ_TRANSPOSED_INV)) {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            mat *= driver->getTransform(video::ETS_VIEW);
+            mat *= driver->getTransform(video::ETS_WORLD);
+            mat = mat.getTransposed();
+            mat.makeInverse();
+            setConstant(highOrLowLevel,services,mat.pointer(),16,Registers[i]);
+            edscFlagsTmp &= ~(1 << EDSC_WORLD_VIEW_PROJ_TRANSPOSED_INV);
+        }
+        //! HighLevel only
+        else if (edscFlagsTmp & (1 << EDSC_FRAME_BUFFER_SIZE))
+        {
+            core::dimension2df fbSize = core::dimension2df(driver->getCurrentRenderTargetSize().Width,driver->getCurrentRenderTargetSize().Height);
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),&fbSize.Width,2);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),&fbSize.Width,2);
+            edscFlagsTmp &= ~(1 << EDSC_FRAME_BUFFER_SIZE);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_CAMERA_FAR_DISTANCE))
+        {
+            core::matrix4 mat = driver->getTransform(video::ETS_PROJECTION);
+            f32 farDist;
+            if (mat.isOrthogonal())
+            {
+                if (mat[10]>0.f) // Left Handed
+                    farDist = 1.f/mat[10]-mat[14]/mat[10];
+                else // Right Handed
+                    farDist = mat[14]/mat[10]-1.f/mat[10];
+            }
+            else
+            {
+                if (mat[10]>0.f) // Left Handed
+                    farDist = -mat[14]/(mat[10]-1.f);
+                else // Right Handed
+                    farDist = mat[14]/(mat[10]+1.f);
+            }
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),&farDist,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),&farDist,1);
+            edscFlagsTmp &= ~(1 << EDSC_CAMERA_FAR_DISTANCE);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TIME))
+        {
+            f32 time = os::Timer::getTime();
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),&time,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),&time,1);
+            edscFlagsTmp &= ~(1 << EDSC_TIME);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX0))
+        {
+            s32 texIdx = 0;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX0);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX1))
+        {
+            s32 texIdx = 1;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX1);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX2))
+        {
+            s32 texIdx = 2;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX2);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX3))
+        {
+            s32 texIdx = 3;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX3);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX4))
+        {
+            s32 texIdx = 4;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX4);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX5))
+        {
+            s32 texIdx = 5;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX5);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX6))
+        {
+            s32 texIdx = 6;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX6);
+        }
+        else if (edscFlagsTmp & (1 << EDSC_TEX7))
+        {
+            s32 texIdx = 7;
+            if (Registers[i].pixelOrVertex)
+                services->setPixelShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            else
+                services->setVertexShaderConstant(Registers[i].Name.c_str(),(f32*)&texIdx,1);
+            edscFlagsTmp &= ~(1 << EDSC_TEX7);
+        }
+    }
+
+    if (callBack)
+        callBack->OnSetConstants(services,userData);
+}
+
+
+} // end namespace video
+} // end namespace irr
Index: include/SUniqueXmlShader.h
===================================================================
--- include/SUniqueXmlShader.h	(revision 0)
+++ include/SUniqueXmlShader.h	(revision 0)
@@ -0,0 +1,24 @@
+#ifndef __S_UNIQUE_XML_SHADER_H_INCLUDED__
+#define __S_UNIQUE_XML_SHADER_H_INCLUDED__
+
+#include "irrTypes.h"
+//#include "irrString.h"
+
+namespace irr
+{
+namespace video
+{
+
+struct SUniqueXmlShader
+{
+    io::path filename;
+    video::E_MATERIAL_TYPE baseMaterial;
+    video::IShaderConstantSetCallBack* cb;
+    bool highLevel;
+    s32 MaterialType;
+};
+
+} // end namespace video
+} // end namespace irr
+
+#endif // __S_UNIQUE_XML_SHADER_H_INCLUDED__
Index: include/IMaterialTypeLoader.h
===================================================================
--- include/IMaterialTypeLoader.h	(revision 0)
+++ include/IMaterialTypeLoader.h	(revision 0)
@@ -0,0 +1,31 @@
+#ifndef __I_MATERIAL_TYPE_LOADER_H_INCLUDED__
+#define __I_MATERIAL_TYPE_LOADER_H_INCLUDED__
+
+#include "irrTypes.h"
+#include "IShaderConstantSetCallBack.h"
+
+namespace irr
+{
+
+namespace video
+{
+
+
+class IMaterialTypeLoader : public virtual IReferenceCounted
+{
+public:
+
+        virtual bool isALoadableFileExtension(const io::path& filename) const = 0;
+
+
+        virtual bool isALoadableFileFormat(const io::path& filename) const = 0;
+
+
+        virtual s32 loadMaterialType(const io::path& filename, s32 baseMaterial = -1, IShaderConstantSetCallBack* callback = 0, s32 userData = 0) const =0;
+};
+
+
+} // end namespace io
+} // end namespace irr
+
+#endif
Index: include/IGPUProgrammingServices.h
===================================================================
--- include/IGPUProgrammingServices.h	(revision 3494)
+++ include/IGPUProgrammingServices.h	(working copy)
@@ -9,6 +9,7 @@
 #include "EMaterialTypes.h"
 #include "EPrimitiveTypes.h"
 #include "path.h"
+#include "IFileSystem.h"
 
 namespace irr
 {
@@ -357,6 +358,49 @@
 		IShaderConstantSetCallBack* callback = 0,
 		E_MATERIAL_TYPE baseMaterial = video::EMT_SOLID,
 		s32 userData = 0) = 0;
+
+    //! Reads all required shaders from an xml file which references shader files.
+    /** \param xmlShaderFileName: XML file name containing the parameters to
+    set up shader programs. Set to 0 if no shader shall be created.
+    \param baseMaterial: baseMaterial
+    \param IShaderConstantSetCallBack: A callback will be created by irrlicht
+    anyway, but the user specified callback will be called after that. Set to 0
+    if you do not wish for an extra custom callback.
+    \param ForceHighLevelShaders: if true AND the xml file specifies a high level
+    shader AND the hardware allows, a high level shader will be created. If false
+    AND the xml file defines a low level shader, a low level shader will be created.
+    The reference is used to return whether a high level shader has been created
+    \param userData: a user data int. This int can be set to any value and
+	will be set as parameter in the callback method when calling
+	OnSetConstants(). In this way it is easily possible to use the same
+	callback method for multiple materials and distinguish between them
+	during the call.
+	\return Returns the number of the material type which can be set in
+	SMaterial::MaterialType to use the renderer. -1 is returned if an
+	error occured. -1 is returned for example if a vertex or pixel shader
+	program could not be compiled, the error strings are then printed out
+	into the error log, and can be catched with a custom event receiver. */
+    virtual s32 getXMLMaterialType(const io::path& xmlShaderFileName,
+        bool& ForceHighLevelShaders,
+        s32 baseMaterial = -1,
+        IShaderConstantSetCallBack* callback = 0,
+        s32 userData = 0) = 0;
+
+
+    //! clears the cache of xmlShaders, doesnt delete the shaders and callbacks though
+    virtual void clearXMLShaderCache() = 0;
+
+    //! Returns how many XML shaders there are
+    //! \return xml shader count
+    virtual u32 getXMLShaderCount() const = 0;
+
+    //! Returns an XML shader material type.
+    //! \param idx: Zero based index of the light. Note: first indices correspond
+    //! to EMT enums
+    //! \return Material Type.
+    virtual s32 getXMLShaderByIndex(u32 idx) const = 0;
+
+
 };
 
 
Index: include/IVideoDriver.h
===================================================================
--- include/IVideoDriver.h	(revision 3494)
+++ include/IVideoDriver.h	(working copy)
@@ -19,6 +19,8 @@
 #include "EDriverTypes.h"
 #include "EDriverFeatures.h"
 #include "SExposedVideoData.h"
+#include "IMaterialTypeLoader.h"
+#include "SUniqueXmlShader.h"
 
 namespace irr
 {
@@ -1442,6 +1444,19 @@
 		*/
 		virtual void convertColor(const void* sP, ECOLOR_FORMAT sF, s32 sN,
 				void* dP, ECOLOR_FORMAT dF) const =0;
+
+
+
+        //! For External Material Loaders
+        virtual s32 getMaterialType(const io::path& filename, s32 baseMaterial = -1, IShaderConstantSetCallBack* callback = 0, s32 userData = 0) = 0;
+
+        virtual void addExternalMaterialTypeLoader(IMaterialTypeLoader* loader) = 0;
+
+        virtual u32 getMaterialTypeLoaderCount() const = 0;
+
+        virtual IMaterialTypeLoader* getMaterialTypeLoader(u32 n) = 0;
+
+        virtual void overrideIrrlichtMaterial(video::E_MATERIAL_TYPE type, video::SUniqueXmlShader newMaterialType) = 0;
 	};
 
 } // end namespace video
Index: include/irrlicht.h
===================================================================
--- include/irrlicht.h	(revision 3494)
+++ include/irrlicht.h	(working copy)
@@ -39,6 +39,7 @@
 #include "dimension2d.h"
 #include "ECullingTypes.h"
 #include "EDebugSceneTypes.h"
+#include "EDefaultShaderConstants.h"
 #include "EDriverFeatures.h"
 #include "EDriverTypes.h"
 #include "EGUIAlignment.h"
@@ -64,6 +65,7 @@
 #include "IBoneSceneNode.h"
 #include "ICameraSceneNode.h"
 #include "ICursorControl.h"
+#include "IDefaultShaderCallBack.h"
 #include "IDummyTransformationSceneNode.h"
 #include "IDynamicMeshBuffer.h"
 #include "IEventReceiver.h"
@@ -178,6 +180,7 @@
 #include "SParticle.h"
 #include "SSharedMeshBuffer.h"
 #include "SSkinMeshBuffer.h"
+#include "SUniqueXmlShader.h"
 #include "SVertexIndex.h"
 #include "SViewFrustum.h"
 #include "triangle3d.h"
Index: include/EMaterialTypes.h
===================================================================
--- include/EMaterialTypes.h	(revision 3494)
+++ include/EMaterialTypes.h	(working copy)
@@ -192,6 +192,9 @@
 		/** Using only first texture. Generic blending method. */
 		EMT_ONETEXTURE_BLEND,
 
+		//! Tells how many built in materials there are
+		EMT_COUNT,
+
 		//! This value is not used. It only forces this enumeration to compile to 32 bit.
 		EMT_FORCE_32BIT = 0x7fffffff
 	};
Index: include/IDefaultShaderCallBack.h
===================================================================
--- include/IDefaultShaderCallBack.h	(revision 0)
+++ include/IDefaultShaderCallBack.h	(revision 0)
@@ -0,0 +1,38 @@
+#ifndef __I_DEFAULT_SHADER_CALLBACK_H_INCLUDED__
+#define __I_DEFAULT_SHADER_CALLBACK_H_INCLUDED__
+
+#include "EDefaultShaderConstants.h"
+#include "irrArray.h"
+#include "IShaderConstantSetCallBack.h"
+#include "ISceneManager.h"
+
+namespace irr
+{
+namespace video
+{
+
+
+class IDefaultShaderCallBack : public IShaderConstantSetCallBack
+{
+private:
+
+    u32 edscFlags;
+    core::array<SDefaultShaderConstantRegisters> Registers;
+    IShaderConstantSetCallBack* callBack;
+    bool highOrLowLevel;
+
+public:
+
+	IDefaultShaderCallBack(u32 flags, core::array<SDefaultShaderConstantRegisters> registers, IShaderConstantSetCallBack* callback=0);
+	~IDefaultShaderCallBack();
+
+	void OnSetMaterial(const SMaterial& material);
+	void OnSetConstants(video::IMaterialRendererServices* services,s32 userData);
+	void setHighorLowLevel(bool level) {highOrLowLevel=level;}
+};
+
+
+} // end namespace video
+} // end namespace irr
+
+#endif
Index: include/EDefaultShaderConstants.h
===================================================================
--- include/EDefaultShaderConstants.h	(revision 0)
+++ include/EDefaultShaderConstants.h	(revision 0)
@@ -0,0 +1,100 @@
+#ifndef __E_DEFAULT_SHADER_CONSTANTS_H_INCLUDED__
+#define __E_DEFAULT_SHADER_CONSTANTS_H_INCLUDED__
+
+#include "irrTypes.h"
+#include "irrString.h"
+
+namespace irr
+{
+namespace video
+{
+
+struct SDefaultShaderConstantRegisters
+{
+    int Register;
+    core::stringc Name;
+    bool pixelOrVertex;
+};
+
+//! Default Shader Constants enumeration to be passed by the IDefaultShaderCallBack
+enum E_DEFAULT_SHADER_CONSTANTS
+{
+	EDSC_WORLD_TFORM = 0,
+	EDSC_VIEW_TFORM,
+	EDSC_PROJ_TFORM,
+	EDSC_VIEW_PROJ_TFORM,
+	EDSC_WORLD_VIEW_PROJ_TFORM,
+	EDSC_WORLD_TFORM_INV,
+	EDSC_VIEW_TFORM_INV,
+	EDSC_PROJ_TFORM_INV,
+	EDSC_VIEW_PROJ_TFORM_INV,
+	EDSC_WORLD_VIEW_PROJ_TFORM_INV,
+	EDSC_WORLD_TRANSPOSED,
+	EDSC_VIEW_TRANSPOSED,
+	EDSC_PROJ_TRANSPOSED,
+	EDSC_VIEW_PROJ_TRANSPOSED,
+	EDSC_WORLD_VIEW_PROJ_TRANSPOSED,
+	EDSC_WORLD_TRANSPOSED_INV,
+	EDSC_VIEW_TRANSPOSED_INV,
+	EDSC_PROJ_TRANSPOSED_INV,
+	EDSC_VIEW_PROJ_TRANSPOSED_INV,
+	EDSC_WORLD_VIEW_PROJ_TRANSPOSED_INV,
+	EDSC_FRAME_BUFFER_SIZE,
+	EDSC_CAMERA_FAR_DISTANCE,
+	EDSC_TIME,
+	EDSC_TEX0,
+	EDSC_TEX1,
+	EDSC_TEX2,
+	EDSC_TEX3,
+	EDSC_TEX4,
+	EDSC_TEX5,
+	EDSC_TEX6,
+	EDSC_TEX7,
+
+	//! This is not a type, but a value indicating how many types there are.
+	EDSC_COUNT,
+	EDSC_FORCE_32BIT = 0x7fffffff
+};
+
+//! Names for all vertex shader types, each entry corresponds to a E_DEFAULT_SHADER_CONSTANTS entry.
+const c8* const DEFAULT_SHADER_CONSTANTS_NAMES[] = {
+	"worldTrans",
+    "viewTrans",
+    "projTrans",
+    "viewProjTrans",
+    "worldViewProjTrans",
+    "worldTransInv",
+    "viewTransInv",
+    "projTransInv",
+    "viewProjTransInv",
+    "worldViewProjTransInv",
+    "worldTransposed",
+    "viewTransposed",
+    "projTransposed",
+    "viewProjTransposed",
+    "worldViewProjTransposed",
+    "worldTransposedInv",
+    "viewTransposedInv",
+    "projTransposedInv",
+    "viewProjTransposedInv",
+    "worldViewProjTransposedInv",
+    "frameBufferSize",
+    "camFarDistance",
+    "time",
+    "tex0",
+    "tex1",
+    "tex2",
+    "tex3",
+    "tex4",
+    "tex5",
+    "tex6",
+    "tex7",
+	0 };
+
+
+} // end namespace video
+} // end namespace irr
+
+#endif // __E_DEFAULT_SHADER_CONSTANTS_H_INCLUDED__
+
+
Index: lib/Linux/libIrrlicht.a
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: lib/Linux/libIrrlicht.a
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Index: bin/Linux/XMLShaders
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream

Property changes on: bin/Linux/XMLShaders
___________________________________________________________________
Added: svn:executable
   + *
Added: svn:mime-type
   + application/octet-stream

Index: examples/26.XMLShaders/main.cpp
===================================================================
--- examples/26.XMLShaders/main.cpp	(revision 0)
+++ examples/26.XMLShaders/main.cpp	(revision 0)
@@ -0,0 +1,273 @@
+/** Example 026 XML Shaders
+
+This tutorial shows how to use an XML file to load shaders for D3D8, D3D9,
+and OpenGL with the engine and use the default shader callback to pass global
+parameters such as transform matrices. It also shows how to pass your own custom
+constants on top of the default callback.
+
+This tutorial does not explain how irrlicht handles shaders, look in example 010.
+
+At first, we need to include all headers and do the stuff we always do, like in
+nearly all other tutorials:
+*/
+#include <irrlicht.h>
+#include <iostream>
+#include "driverChoice.h"
+
+using namespace irr;
+
+#ifdef _MSC_VER
+#pragma comment(lib, "Irrlicht.lib")
+#endif
+
+
+/*
+If you look at the code for example 010 you can see that this callback doesn't
+pass the transform matrices, irrlicht does it automatically.
+
+However in this case we need to pass some custom, non standard variables and
+constants, to do this we create a shader callback that is used on top of the
+irrlicht callback (and gets called by it).
+*/
+
+IrrlichtDevice* device = 0;
+bool UseHighLevelShaders = false;
+
+class MyShaderCallBack : public video::IShaderConstantSetCallBack
+{
+public:
+
+	virtual void OnSetConstants(video::IMaterialRendererServices* services,
+			s32 userData)
+	{
+		video::IVideoDriver* driver = services->getVideoDriver();
+
+		// set camera position
+
+		core::vector3df pos = device->getSceneManager()->
+			getActiveCamera()->getAbsolutePosition();
+
+		if (UseHighLevelShaders)
+			services->setVertexShaderConstant("mLightPos", reinterpret_cast<f32*>(&pos), 3);
+		else
+			services->setVertexShaderConstant(reinterpret_cast<f32*>(&pos), 8, 1);
+
+		// set light color
+
+		video::SColorf col(0.0f,1.0f,1.0f,0.0f);
+
+		if (UseHighLevelShaders)
+			services->setVertexShaderConstant("mLightColor",
+					reinterpret_cast<f32*>(&col), 4);
+		else
+			services->setVertexShaderConstant(reinterpret_cast<f32*>(&col), 9, 1);
+
+	}
+};
+
+
+
+int main()
+{
+	// ask user for driver
+	video::E_DRIVER_TYPE driverType=driverChoiceConsole();
+	if (driverType==video::EDT_COUNT)
+		return 1;
+
+	// ask the user if we should use high level shaders for this example
+	if (driverType == video::EDT_DIRECT3D9 ||
+		 driverType == video::EDT_OPENGL)
+	{
+		char i;
+		printf("Please press 'y' if you want to use high level shaders.\n");
+		std::cin >> i;
+		if (i == 'y')
+			UseHighLevelShaders = true;
+	}
+
+	// create device
+
+	device = createDevice(driverType, core::dimension2d<u32>(640, 480));
+
+	if (device == 0)
+		return 1; // could not create selected driver.
+
+
+	video::IVideoDriver* driver = device->getVideoDriver();
+	scene::ISceneManager* smgr = device->getSceneManager();
+	gui::IGUIEnvironment* gui = device->getGUIEnvironment();
+
+	/*
+	If you notice the only consideration we must take is what driver we are using
+	as to which xml we are going to use
+	*/
+
+	io::path xmlFileName; // filename for the XML shader file
+
+	switch(driverType)
+	{
+	case video::EDT_DIRECT3D8:
+		xmlFileName = "../../media/d3d8Shader.xml";
+		break;
+	case video::EDT_DIRECT3D9:
+		xmlFileName = "../../media/d3d9Shader.xml";
+		break;
+
+	case video::EDT_OPENGL:
+		xmlFileName = "../../media/glShader.xml";
+		break;
+	}
+
+	/*
+	Now lets create the new materials. As you maybe know from previous
+	examples, a material type in the Irrlicht engine is set by simply
+	changing the MaterialType value in the SMaterial struct. And this value
+	is just a simple 32 bit value, like video::EMT_SOLID. So we only need
+	the engine to create a new value for us which we can set there. To do
+	this, we get a pointer to the IGPUProgrammingServices and call
+	addShaderMaterialFromXML(), which returns such a new 32 bit value.
+	That's all.
+
+	However there is one more compulsory parameter, ForceHighLevelShaders
+	which you must set. It takes a reference and changes the bool if a
+	High Level Shader couldn't be created.
+
+	To demonstrate this, we create two materials with a different base
+	material, one with EMT_SOLID and one with EMT_TRANSPARENT_ADD_COLOR.
+
+	The last material is here to prove that there are fake xmlShaders
+	already created for fixed function materials
+	*/
+
+	// create materials
+
+	video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
+	s32 newMaterialType1 = 0;
+	s32 newMaterialType2 = 0;
+	s32 newMaterialType3 = video::EMT_TRANSPARENT_ADD_COLOR; // will change to EMT_SOLID
+
+	if (gpu)
+	{
+		MyShaderCallBack* mc = new MyShaderCallBack();
+
+		newMaterialType1 = gpu->getXMLMaterialType(xmlFileName, UseHighLevelShaders, video::EMT_SOLID, mc);
+
+        newMaterialType2 = gpu->getXMLMaterialType(xmlFileName, UseHighLevelShaders, video::EMT_TRANSPARENT_ADD_COLOR, mc);
+
+        newMaterialType3 = gpu->getXMLMaterialType("solid", UseHighLevelShaders);
+
+		mc->drop();
+	}
+
+	/*
+	Now it's time for testing the materials. We create a test cube and set
+	the material we created. In addition, we add a text scene node to the
+	cube and a rotation animator to make it look more interesting and
+	important.
+	*/
+
+	// create test scene node 1, with the new created material type 1
+
+	scene::ISceneNode* node = smgr->addCubeSceneNode(50);
+	node->setPosition(core::vector3df(0,0,0));
+	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
+	node->setMaterialFlag(video::EMF_LIGHTING, false);
+	node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType1);
+
+	scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
+			core::vector3df(0,0.3f,0));
+	node->addAnimator(anim);
+	anim->drop();
+
+	/*
+	Same for the second cube, but with the second material we created.
+	*/
+
+	// create test scene node 2, with the new created material type 2
+
+	node = smgr->addCubeSceneNode(50);
+	node->setPosition(core::vector3df(0,-10,50));
+	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
+	node->setMaterialFlag(video::EMF_LIGHTING, false);
+	node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType2);
+
+	anim = smgr->createRotationAnimator(core::vector3df(0,0.3f,0));
+	node->addAnimator(anim);
+	anim->drop();
+
+	/*
+	Then we add a third cube without a shader on it, to be able to compare
+	the cubes.
+	*/
+
+	// add a scene node with no shader
+
+	node = smgr->addCubeSceneNode(50);
+	node->setPosition(core::vector3df(0,50,25));
+	node->setMaterialTexture(0, driver->getTexture("../../media/wall.bmp"));
+	node->setMaterialFlag(video::EMF_LIGHTING, false);
+	node->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType3);
+
+	/*
+	And last, we add a skybox and a user controlled camera to the scene.
+	For the skybox textures, we disable mipmap generation, because we don't
+	need mipmaps on it.
+	*/
+
+	// add a nice skybox
+
+	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
+
+	smgr->addSkyBoxSceneNode(
+		driver->getTexture("../../media/irrlicht2_up.jpg"),
+		driver->getTexture("../../media/irrlicht2_dn.jpg"),
+		driver->getTexture("../../media/irrlicht2_lf.jpg"),
+		driver->getTexture("../../media/irrlicht2_rt.jpg"),
+		driver->getTexture("../../media/irrlicht2_ft.jpg"),
+		driver->getTexture("../../media/irrlicht2_bk.jpg"));
+
+	driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
+
+	// add a camera and disable the mouse cursor
+
+	scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS();
+	cam->setPosition(core::vector3df(-100,50,100));
+	cam->setTarget(core::vector3df(0,0,0));
+	device->getCursorControl()->setVisible(false);
+
+	/*
+	Now draw everything. That's all.
+	*/
+
+	int lastFPS = -1;
+
+	while(device->run())
+		if (device->isWindowActive())
+	{
+		driver->beginScene(true, true, video::SColor(255,0,0,0));
+		smgr->drawAll();
+		driver->endScene();
+
+		int fps = driver->getFPS();
+
+		if (lastFPS != fps)
+		{
+			core::stringw str = L"Irrlicht Engine - Vertex and pixel shader example [";
+			str += driver->getName();
+			str += "] FPS:";
+			str += fps;
+
+			device->setWindowCaption(str.c_str());
+			lastFPS = fps;
+		}
+	}
+
+	device->drop();
+
+	return 0;
+}
+
+/*
+Compile and run this, and I hope you have fun with your new little shader
+writing tool :).
+**/
Index: examples/26.XMLShaders/XMLShaders.layout
===================================================================
--- examples/26.XMLShaders/XMLShaders.layout	(revision 0)
+++ examples/26.XMLShaders/XMLShaders.layout	(revision 0)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+	<ActiveTarget name="Linux" />
+	<File name="main.cpp" open="1" top="1" tabpos="1">
+		<Cursor position="2743" topLine="228" />
+	</File>
+</CodeBlocks_layout_file>
Index: examples/26.XMLShaders/XMLShaders.depend
===================================================================
--- examples/26.XMLShaders/XMLShaders.depend	(revision 0)
+++ examples/26.XMLShaders/XMLShaders.depend	(revision 0)
@@ -0,0 +1,993 @@
+# depslib dependency file v1.0
+1292009597 source:/home/kielanmatt/irrlicht/examples/26.XMLShaders/main.cpp
+	<irrlicht.h>
+	<iostream>
+	"driverChoice.h"
+
+1291634064 /home/kielanmatt/irrlicht/include/irrlicht.h
+	"IrrCompileConfig.h"
+	"aabbox3d.h"
+	"CDynamicMeshBuffer.h"
+	"CIndexBuffer.h"
+	"CMeshBuffer.h"
+	"coreutil.h"
+	"CVertexBuffer.h"
+	"dimension2d.h"
+	"ECullingTypes.h"
+	"EDebugSceneTypes.h"
+	"EDefaultShaderConstants.h"
+	"EDriverFeatures.h"
+	"EDriverTypes.h"
+	"EGUIAlignment.h"
+	"EGUIElementTypes.h"
+	"EHardwareBufferFlags.h"
+	"EMaterialFlags.h"
+	"EMaterialTypes.h"
+	"EMeshWriterEnums.h"
+	"EMessageBoxFlags.h"
+	"ESceneNodeAnimatorTypes.h"
+	"ESceneNodeTypes.h"
+	"ETerrainElements.h"
+	"fast_atof.h"
+	"heapsort.h"
+	"IAnimatedMesh.h"
+	"IAnimatedMeshMD2.h"
+	"IAnimatedMeshMD3.h"
+	"IAnimatedMeshSceneNode.h"
+	"IAttributeExchangingObject.h"
+	"IAttributes.h"
+	"IBillboardSceneNode.h"
+	"IBillboardTextSceneNode.h"
+	"IBoneSceneNode.h"
+	"ICameraSceneNode.h"
+	"ICursorControl.h"
+	"IDefaultShaderCallBack.h"
+	"IDummyTransformationSceneNode.h"
+	"IDynamicMeshBuffer.h"
+	"IEventReceiver.h"
+	"IFileList.h"
+	"IFileSystem.h"
+	"IGeometryCreator.h"
+	"IGPUProgrammingServices.h"
+	"IGUIButton.h"
+	"IGUICheckBox.h"
+	"IGUIColorSelectDialog.h"
+	"IGUIComboBox.h"
+	"IGUIContextMenu.h"
+	"IGUIEditBox.h"
+	"IGUIElement.h"
+	"IGUIElementFactory.h"
+	"IGUIEnvironment.h"
+	"IGUIFileOpenDialog.h"
+	"IGUIFont.h"
+	"IGUIFontBitmap.h"
+	"IGUIImage.h"
+	"IGUIInOutFader.h"
+	"IGUIListBox.h"
+	"IGUIMeshViewer.h"
+	"IGUIScrollBar.h"
+	"IGUISkin.h"
+	"IGUISpinBox.h"
+	"IGUISpriteBank.h"
+	"IGUIStaticText.h"
+	"IGUITabControl.h"
+	"IGUITable.h"
+	"IGUIToolbar.h"
+	"IGUIWindow.h"
+	"IGUITreeView.h"
+	"IImage.h"
+	"IImageLoader.h"
+	"IImageWriter.h"
+	"IIndexBuffer.h"
+	"ILightSceneNode.h"
+	"ILogger.h"
+	"IMaterialRenderer.h"
+	"IMaterialRendererServices.h"
+	"IMesh.h"
+	"IMeshBuffer.h"
+	"IMeshCache.h"
+	"IMeshLoader.h"
+	"IMeshManipulator.h"
+	"IMeshSceneNode.h"
+	"IMeshWriter.h"
+	"IMetaTriangleSelector.h"
+	"IOSOperator.h"
+	"IParticleSystemSceneNode.h"
+	"IQ3LevelMesh.h"
+	"IQ3Shader.h"
+	"IReadFile.h"
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"IrrlichtDevice.h"
+	"irrList.h"
+	"irrMap.h"
+	"irrMath.h"
+	"irrString.h"
+	"irrTypes.h"
+	"path.h"
+	"irrXML.h"
+	"ISceneCollisionManager.h"
+	"ISceneManager.h"
+	"ISceneNode.h"
+	"ISceneNodeAnimator.h"
+	"ISceneNodeAnimatorCameraFPS.h"
+	"ISceneNodeAnimatorCameraMaya.h"
+	"ISceneNodeAnimatorCollisionResponse.h"
+	"ISceneNodeAnimatorFactory.h"
+	"ISceneNodeFactory.h"
+	"ISceneUserDataSerializer.h"
+	"IShaderConstantSetCallBack.h"
+	"IShadowVolumeSceneNode.h"
+	"ISkinnedMesh.h"
+	"ITerrainSceneNode.h"
+	"ITextSceneNode.h"
+	"ITexture.h"
+	"ITimer.h"
+	"ITriangleSelector.h"
+	"IVertexBuffer.h"
+	"IVideoDriver.h"
+	"IVideoModeList.h"
+	"IVolumeLightSceneNode.h"
+	"IWriteFile.h"
+	"IXMLReader.h"
+	"IXMLWriter.h"
+	"ILightManager.h"
+	"Keycodes.h"
+	"line2d.h"
+	"line3d.h"
+	"matrix4.h"
+	"plane3d.h"
+	"position2d.h"
+	"quaternion.h"
+	"rect.h"
+	"S3DVertex.h"
+	"SAnimatedMesh.h"
+	"SceneParameters.h"
+	"SColor.h"
+	"SExposedVideoData.h"
+	"SIrrCreationParameters.h"
+	"SKeyMap.h"
+	"SLight.h"
+	"SMaterial.h"
+	"SMesh.h"
+	"SMeshBuffer.h"
+	"SMeshBufferLightMap.h"
+	"SMeshBufferTangents.h"
+	"SParticle.h"
+	"SSharedMeshBuffer.h"
+	"SSkinMeshBuffer.h"
+	"SUniqueXmlShader.h"
+	"SVertexIndex.h"
+	"SViewFrustum.h"
+	"triangle3d.h"
+	"vector2d.h"
+	"vector3d.h"
+	"SIrrCreationParameters.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IrrCompileConfig.h
+	<stdio.h>
+	<xtl.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/aabbox3d.h
+	"irrMath.h"
+	"plane3d.h"
+	"line3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/irrMath.h
+	"IrrCompileConfig.h"
+	"irrTypes.h"
+	<math.h>
+	<float.h>
+	<stdlib.h>
+	<limits.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/irrTypes.h
+	"IrrCompileConfig.h"
+	<wchar.h>
+	<crtdbg.h>
+	"assert.h"
+	<stdlib.h>
+	<crtdbg.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/plane3d.h
+	"irrMath.h"
+	"vector3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/vector3d.h
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/line3d.h
+	"irrTypes.h"
+	"vector3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/CDynamicMeshBuffer.h
+	"IDynamicMeshBuffer.h"
+	"CVertexBuffer.h"
+	"CIndexBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IDynamicMeshBuffer.h
+	"IMeshBuffer.h"
+	"IVertexBuffer.h"
+	"IIndexBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshBuffer.h
+	"IReferenceCounted.h"
+	"SMaterial.h"
+	"aabbox3d.h"
+	"S3DVertex.h"
+	"SVertexIndex.h"
+	"EHardwareBufferFlags.h"
+	"EPrimitiveTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IReferenceCounted.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SMaterial.h
+	"SColor.h"
+	"matrix4.h"
+	"irrArray.h"
+	"irrMath.h"
+	"EMaterialTypes.h"
+	"EMaterialFlags.h"
+	"SMaterialLayer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SColor.h
+	"irrTypes.h"
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/matrix4.h
+	"irrMath.h"
+	"vector3d.h"
+	"vector2d.h"
+	"plane3d.h"
+	"aabbox3d.h"
+	"rect.h"
+	"irrString.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/vector2d.h
+	"irrMath.h"
+	"dimension2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/dimension2d.h
+	"irrTypes.h"
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/rect.h
+	"irrTypes.h"
+	"dimension2d.h"
+	"position2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/position2d.h
+	"vector2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/irrString.h
+	"irrTypes.h"
+	"irrAllocator.h"
+	"irrMath.h"
+	<stdio.h>
+	<string.h>
+	<stdlib.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/irrAllocator.h
+	"irrTypes.h"
+	<new>
+	<memory.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/irrArray.h
+	"irrTypes.h"
+	"heapsort.h"
+	"irrAllocator.h"
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/heapsort.h
+	"irrTypes.h"
+
+1291630679 /home/kielanmatt/irrlicht/include/EMaterialTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EMaterialFlags.h
+
+1291554635 /home/kielanmatt/irrlicht/include/SMaterialLayer.h
+	"matrix4.h"
+	"irrAllocator.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/S3DVertex.h
+	"vector3d.h"
+	"vector2d.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SVertexIndex.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EHardwareBufferFlags.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EPrimitiveTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/IVertexBuffer.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"S3DVertex.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IIndexBuffer.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"SVertexIndex.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/CVertexBuffer.h
+	"IVertexBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/CIndexBuffer.h
+	"IIndexBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/CMeshBuffer.h
+	"irrArray.h"
+	"IMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/coreutil.h
+	"irrString.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/path.h
+	"irrString.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ECullingTypes.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EDebugSceneTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EDriverFeatures.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EDriverTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EGUIAlignment.h
+
+1291554635 /home/kielanmatt/irrlicht/include/EGUIElementTypes.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EMeshWriterEnums.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EMessageBoxFlags.h
+
+1291554635 /home/kielanmatt/irrlicht/include/ESceneNodeAnimatorTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/ESceneNodeTypes.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ETerrainElements.h
+
+1291554635 /home/kielanmatt/irrlicht/include/fast_atof.h
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAnimatedMesh.h
+	"aabbox3d.h"
+	"IMesh.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMesh.h
+	"IReferenceCounted.h"
+	"SMaterial.h"
+	"EHardwareBufferFlags.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAnimatedMeshMD2.h
+	"IAnimatedMesh.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAnimatedMeshMD3.h
+	"IAnimatedMesh.h"
+	"IQ3Shader.h"
+	"quaternion.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IQ3Shader.h
+	"irrArray.h"
+	"fast_atof.h"
+	"IFileSystem.h"
+	"IVideoDriver.h"
+	"coreutil.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IFileSystem.h
+	"IReferenceCounted.h"
+	"IXMLReader.h"
+	"IFileArchive.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IXMLReader.h
+	"IReferenceCounted.h"
+	"irrXML.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/irrXML.h
+	<stdio.h>
+	"IrrCompileConfig.h"
+	<irrXML.h>
+	<string>
+	<irrXML.h>
+	<irrXML.h>
+	<irrXML.h>
+
+1291554635 /home/kielanmatt/irrlicht/include/IFileArchive.h
+	"IReadFile.h"
+	"IFileList.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IReadFile.h
+	"IReferenceCounted.h"
+	"coreutil.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IFileList.h
+	"IReferenceCounted.h"
+	"path.h"
+
+1292016771 /home/kielanmatt/irrlicht/include/IVideoDriver.h
+	"rect.h"
+	"SColor.h"
+	"ITexture.h"
+	"irrArray.h"
+	"matrix4.h"
+	"plane3d.h"
+	"dimension2d.h"
+	"position2d.h"
+	"SMaterial.h"
+	"IMeshBuffer.h"
+	"triangle3d.h"
+	"EDriverTypes.h"
+	"EDriverFeatures.h"
+	"SExposedVideoData.h"
+	"IMaterialTypeLoader.h"
+	"SUniqueXmlShader.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ITexture.h
+	"IReferenceCounted.h"
+	"IImage.h"
+	"dimension2d.h"
+	"EDriverTypes.h"
+	"path.h"
+	"matrix4.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IImage.h
+	"IReferenceCounted.h"
+	"position2d.h"
+	"rect.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/triangle3d.h
+	"vector3d.h"
+	"line3d.h"
+	"plane3d.h"
+	"aabbox3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SExposedVideoData.h
+
+1291554635 /home/kielanmatt/irrlicht/include/quaternion.h
+	"irrTypes.h"
+	"irrMath.h"
+	"matrix4.h"
+	"vector3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAnimatedMeshSceneNode.h
+	"ISceneNode.h"
+	"IBoneSceneNode.h"
+	"IAnimatedMeshMD2.h"
+	"IAnimatedMeshMD3.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNode.h
+	"IAttributeExchangingObject.h"
+	"ESceneNodeTypes.h"
+	"ECullingTypes.h"
+	"EDebugSceneTypes.h"
+	"ISceneNodeAnimator.h"
+	"ITriangleSelector.h"
+	"SMaterial.h"
+	"irrString.h"
+	"aabbox3d.h"
+	"matrix4.h"
+	"irrList.h"
+	"IAttributes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAttributeExchangingObject.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeAnimator.h
+	"IReferenceCounted.h"
+	"vector3d.h"
+	"ESceneNodeAnimatorTypes.h"
+	"IAttributeExchangingObject.h"
+	"IEventReceiver.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IEventReceiver.h
+	"ILogger.h"
+	"Keycodes.h"
+	"irrString.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ILogger.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/Keycodes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/ITriangleSelector.h
+	"IReferenceCounted.h"
+	"triangle3d.h"
+	"aabbox3d.h"
+	"matrix4.h"
+	"line3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/irrList.h
+	"irrTypes.h"
+	"irrAllocator.h"
+	"irrMath.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IAttributes.h
+	"IReferenceCounted.h"
+	"SColor.h"
+	"vector3d.h"
+	"vector2d.h"
+	"line2d.h"
+	"line3d.h"
+	"triangle3d.h"
+	"position2d.h"
+	"rect.h"
+	"matrix4.h"
+	"quaternion.h"
+	"plane3d.h"
+	"triangle3d.h"
+	"line2d.h"
+	"line3d.h"
+	"irrString.h"
+	"irrArray.h"
+	"IXMLReader.h"
+	"EAttributes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/line2d.h
+	"irrTypes.h"
+	"vector2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EAttributes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/IBoneSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IBillboardSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IBillboardTextSceneNode.h
+	"IBillboardSceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ICameraSceneNode.h
+	"ISceneNode.h"
+	"IEventReceiver.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ICursorControl.h
+	"IReferenceCounted.h"
+	"position2d.h"
+	"rect.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IDummyTransformationSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGeometryCreator.h
+	"IReferenceCounted.h"
+	"IMesh.h"
+	"IImage.h"
+
+1292013034 /home/kielanmatt/irrlicht/include/IGPUProgrammingServices.h
+	"EShaderTypes.h"
+	"EMaterialTypes.h"
+	"EPrimitiveTypes.h"
+	"path.h"
+	"IFileSystem.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EShaderTypes.h
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIButton.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIElement.h
+	"IAttributeExchangingObject.h"
+	"irrList.h"
+	"rect.h"
+	"irrString.h"
+	"IEventReceiver.h"
+	"EGUIElementTypes.h"
+	"EGUIAlignment.h"
+	"IAttributes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUICheckBox.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIColorSelectDialog.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIComboBox.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIContextMenu.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIEditBox.h
+	"IGUIElement.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIElementFactory.h
+	"IReferenceCounted.h"
+	"EGUIElementTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIEnvironment.h
+	"IReferenceCounted.h"
+	"IGUISkin.h"
+	"rect.h"
+	"EMessageBoxFlags.h"
+	"IEventReceiver.h"
+	"IXMLReader.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUISkin.h
+	"IAttributeExchangingObject.h"
+	"EGUIAlignment.h"
+	"SColor.h"
+	"rect.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIFileOpenDialog.h
+	"IGUIElement.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIFont.h
+	"IReferenceCounted.h"
+	"SColor.h"
+	"rect.h"
+	"irrString.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIFontBitmap.h
+	"IGUIFont.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIImage.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIInOutFader.h
+	"IGUIElement.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIListBox.h
+	"IGUIElement.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIMeshViewer.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIScrollBar.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUISpinBox.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUISpriteBank.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"SColor.h"
+	"rect.h"
+
+1291570753 /home/kielanmatt/irrlicht/include/IGUIStaticText.h
+	"IGUIElement.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUITabControl.h
+	"IGUIElement.h"
+	"SColor.h"
+	"IGUISkin.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUITable.h
+	"IGUIElement.h"
+	"irrTypes.h"
+	"SColor.h"
+	"IGUISkin.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIToolbar.h
+	"IGUIElement.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIWindow.h
+	"IGUIElement.h"
+	"EMessageBoxFlags.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUITreeView.h
+	"IGUIElement.h"
+	"IGUIImageList.h"
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IGUIImageList.h
+	"IGUIElement.h"
+	"rect.h"
+	"irrTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IImageLoader.h
+	"IReferenceCounted.h"
+	"IImage.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IImageWriter.h
+	"IReferenceCounted.h"
+	"irrString.h"
+	"coreutil.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ILightSceneNode.h
+	"ISceneNode.h"
+	"SLight.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SLight.h
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMaterialRenderer.h
+	"IReferenceCounted.h"
+	"SMaterial.h"
+	"S3DVertex.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMaterialRendererServices.h
+	"SMaterial.h"
+	"S3DVertex.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshCache.h
+	"IReferenceCounted.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshLoader.h
+	"IReferenceCounted.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshManipulator.h
+	"IReferenceCounted.h"
+	"vector3d.h"
+	"aabbox3d.h"
+	"matrix4.h"
+	"IAnimatedMesh.h"
+	"IMeshBuffer.h"
+	"SVertexManipulator.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SVertexManipulator.h
+	"S3DVertex.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMeshWriter.h
+	"IReferenceCounted.h"
+	"EMeshWriterEnums.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IMetaTriangleSelector.h
+	"ITriangleSelector.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IOSOperator.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleSystemSceneNode.h
+	"ISceneNode.h"
+	"IParticleAnimatedMeshSceneNodeEmitter.h"
+	"IParticleBoxEmitter.h"
+	"IParticleCylinderEmitter.h"
+	"IParticleMeshEmitter.h"
+	"IParticleRingEmitter.h"
+	"IParticleSphereEmitter.h"
+	"IParticleAttractionAffector.h"
+	"IParticleFadeOutAffector.h"
+	"IParticleGravityAffector.h"
+	"IParticleRotationAffector.h"
+	"dimension2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleAnimatedMeshSceneNodeEmitter.h
+	"IParticleEmitter.h"
+	"IAnimatedMeshSceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleEmitter.h
+	"IAttributeExchangingObject.h"
+	"SParticle.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SParticle.h
+	"vector3d.h"
+	"dimension2d.h"
+	"SColor.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleBoxEmitter.h
+	"IParticleEmitter.h"
+	"aabbox3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleCylinderEmitter.h
+	"IParticleEmitter.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleMeshEmitter.h
+	"IParticleEmitter.h"
+	"IMesh.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleRingEmitter.h
+	"IParticleEmitter.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleSphereEmitter.h
+	"IParticleEmitter.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleAttractionAffector.h
+	"IParticleAffector.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleAffector.h
+	"IAttributeExchangingObject.h"
+	"SParticle.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleFadeOutAffector.h
+	"IParticleAffector.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleGravityAffector.h
+	"IParticleAffector.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IParticleRotationAffector.h
+	"IParticleAffector.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IQ3LevelMesh.h
+	"IAnimatedMesh.h"
+	"IQ3Shader.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IrrlichtDevice.h
+	"IReferenceCounted.h"
+	"dimension2d.h"
+	"IVideoDriver.h"
+	"EDriverTypes.h"
+	"EDeviceTypes.h"
+	"IEventReceiver.h"
+	"ICursorControl.h"
+	"IVideoModeList.h"
+	"ITimer.h"
+	"IOSOperator.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/EDeviceTypes.h
+
+1291554635 /home/kielanmatt/irrlicht/include/IVideoModeList.h
+	"IReferenceCounted.h"
+	"dimension2d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ITimer.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/irrMap.h
+	"irrTypes.h"
+	"irrMath.h"
+
+1292003309 /home/kielanmatt/irrlicht/include/ISceneCollisionManager.h
+	"IReferenceCounted.h"
+	"vector3d.h"
+	"triangle3d.h"
+	"position2d.h"
+	"line3d.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneManager.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"irrString.h"
+	"path.h"
+	"vector3d.h"
+	"dimension2d.h"
+	"SColor.h"
+	"ETerrainElements.h"
+	"ESceneNodeTypes.h"
+	"ESceneNodeAnimatorTypes.h"
+	"EMeshWriterEnums.h"
+	"SceneParameters.h"
+	"IGeometryCreator.h"
+	"ISkinnedMesh.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SceneParameters.h
+
+1291554635 /home/kielanmatt/irrlicht/include/ISkinnedMesh.h
+	"irrArray.h"
+	"IBoneSceneNode.h"
+	"IAnimatedMesh.h"
+	"SSkinMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SSkinMeshBuffer.h
+	"IMeshBuffer.h"
+	"S3DVertex.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeAnimatorCameraFPS.h
+	"ISceneNodeAnimator.h"
+	"IEventReceiver.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeAnimatorCameraMaya.h
+	"ISceneNodeAnimator.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeAnimatorCollisionResponse.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeAnimatorFactory.h
+	"IReferenceCounted.h"
+	"ESceneNodeAnimatorTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneNodeFactory.h
+	"IReferenceCounted.h"
+	"ESceneNodeTypes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ISceneUserDataSerializer.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IShaderConstantSetCallBack.h
+	"IReferenceCounted.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IShadowVolumeSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ITerrainSceneNode.h
+	"ETerrainElements.h"
+	"ISceneNode.h"
+	"IDynamicMeshBuffer.h"
+	"irrArray.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ITextSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IVolumeLightSceneNode.h
+	"ISceneNode.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IWriteFile.h
+	"IReferenceCounted.h"
+	"path.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/IXMLWriter.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+	"irrString.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/ILightManager.h
+	"IReferenceCounted.h"
+	"irrArray.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SAnimatedMesh.h
+	"IAnimatedMesh.h"
+	"IMesh.h"
+	"aabbox3d.h"
+	"irrArray.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SIrrCreationParameters.h
+	"EDriverTypes.h"
+	"EDeviceTypes.h"
+	"dimension2d.h"
+	"ILogger.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SKeyMap.h
+	"Keycodes.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SMesh.h
+	"IMesh.h"
+	"IMeshBuffer.h"
+	"aabbox3d.h"
+	"irrArray.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SMeshBuffer.h
+	"CMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SMeshBufferLightMap.h
+	"CMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SMeshBufferTangents.h
+	"CMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SSharedMeshBuffer.h
+	"irrArray.h"
+	"IMeshBuffer.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/SViewFrustum.h
+	"plane3d.h"
+	"vector3d.h"
+	"line3d.h"
+	"aabbox3d.h"
+	"matrix4.h"
+	"IVideoDriver.h"
+
+1291554635 /home/kielanmatt/irrlicht/include/driverChoice.h
+	<iostream>
+	"EDriverTypes.h"
+
+1292017729 /home/kielanmatt/irrlicht/include/EDefaultShaderConstants.h
+	"irrTypes.h"
+	"irrString.h"
+
+1291645132 /home/kielanmatt/irrlicht/include/IDefaultShaderCallBack.h
+	"EDefaultShaderConstants.h"
+	"irrArray.h"
+	"IShaderConstantSetCallBack.h"
+	"ISceneManager.h"
+
+1291634981 /home/kielanmatt/irrlicht/include/SUniqueXmlShader.h
+	"irrTypes.h"
+
+1292014882 /home/kielanmatt/irrlicht/include/IMaterialTypeLoader.h
+	"irrTypes.h"
+	"IShaderConstantSetCallBack.h"
+
Index: examples/26.XMLShaders/Makefile
===================================================================
--- examples/26.XMLShaders/Makefile	(revision 0)
+++ examples/26.XMLShaders/Makefile	(revision 0)
@@ -0,0 +1,38 @@
+# Makefile for Irrlicht Examples
+# It's usually sufficient to change just the target name and source file list
+# and be sure that CXX is set to a valid compiler
+Target = 26.XMLShaders
+Sources = main.cpp
+
+# general compiler settings
+CPPFLAGS = -I../../include -I/usr/X11R6/include
+CXXFLAGS = -O3 -ffast-math
+#CXXFLAGS = -g -Wall
+
+#default target is Linux
+all: all_linux
+
+ifeq ($(HOSTTYPE), x86_64)
+LIBSELECT=64
+endif
+
+# target specific settings
+all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/Linux -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lXcursor
+all_linux clean_linux: SYSTEM=Linux
+all_win32: LDFLAGS = -L../../lib/Win32-gcc -lIrrlicht -lopengl32 -lm
+all_win32 clean_win32: SYSTEM=Win32-gcc
+all_win32 clean_win32: SUF=.exe
+# name of the binary - only valid for targets which set SYSTEM
+DESTPATH = ../../bin/$(SYSTEM)/$(Target)$(SUF)
+
+all_linux all_win32:
+	$(warning Building...)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(Sources) -o $(DESTPATH) $(LDFLAGS)
+
+clean: clean_linux clean_win32
+	$(warning Cleaning...)
+
+clean_linux clean_win32:
+	@$(RM) $(DESTPATH)
+
+.PHONY: all all_win32 clean clean_linux clean_win32
Index: examples/26.XMLShaders/XMLShaders.cbp
===================================================================
--- examples/26.XMLShaders/XMLShaders.cbp	(revision 0)
+++ examples/26.XMLShaders/XMLShaders.cbp	(revision 0)
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+	<FileVersion major="1" minor="6" />
+	<Project>
+		<Option title="Irrlicht Example 26 XML Shaders" />
+		<Option pch_mode="0" />
+		<Option compiler="gcc" />
+		<Build>
+			<Target title="Windows">
+				<Option platforms="Windows;" />
+				<Option output="../../bin/Win32-gcc/XMLShaders" prefix_auto="0" extension_auto="1" />
+				<Option type="1" />
+				<Option compiler="gcc" />
+				<Option projectResourceIncludeDirsRelation="1" />
+				<Compiler>
+					<Add option="-W" />
+					<Add option="-g" />
+				</Compiler>
+				<Linker>
+					<Add directory="../../lib/Win32-gcc" />
+				</Linker>
+			</Target>
+			<Target title="Linux">
+				<Option platforms="Unix;" />
+				<Option output="../../bin/Linux/XMLShaders" prefix_auto="0" extension_auto="0" />
+				<Option type="1" />
+				<Option compiler="gcc" />
+				<Compiler>
+					<Add option="-W" />
+					<Add option="-g" />
+					<Add option="-D_IRR_STATIC_LIB_" />
+				</Compiler>
+				<Linker>
+					<Add library="Xxf86vm" />
+					<Add library="/usr/lib/libXcursor.so.1" />
+					<Add library="GL" />
+					<Add directory="../../lib/Linux" />
+				</Linker>
+			</Target>
+		</Build>
+		<VirtualTargets>
+			<Add alias="All" targets="Windows;" />
+		</VirtualTargets>
+		<Compiler>
+			<Add option="-W" />
+			<Add option="-g" />
+			<Add directory="../../include" />
+		</Compiler>
+		<Linker>
+			<Add library="Irrlicht" />
+		</Linker>
+		<Unit filename="main.cpp" />
+		<Extensions>
+			<code_completion />
+			<debugger />
+		</Extensions>
+	</Project>
+</CodeBlocks_project_file>