Browse Source

Runtime material

Panagiotis Christopoulos Charitos 15 years ago
parent
commit
044dd58d95

+ 10 - 3
build/debug/Makefile

@@ -259,7 +259,9 @@ Main.o: ../../src/Main.cpp ../../src/Input/Input.h \
  ../../src/Resources/Model/Model.h ../../src/Resources/Model/ModelPatch.h \
  ../../src/Util/Util.h ../../src/Util/Vec.h ../../src/Util/HighRezTimer.h \
  ../../src/Scene/SkinNode.h ../../src/Scene/SkinPatchNode.h \
- ../../src/Resources/Skin.h
+ ../../src/Resources/Skin.h \
+ ../../src/Scene/MaterialRuntime/MaterialRuntime.h \
+ ../../src/Scene/MaterialRuntime/MtlUserDefinedVarRuntime.h
 	@echo Compiling ../../src/Main.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Main.cpp -o Main.o
 
@@ -1841,7 +1843,10 @@ PatchNode.o: ../../src/Scene/PatchNode.cpp ../../src/Scene/PatchNode.h \
  ../../src/Resources/Model/ModelPatch.h ../../src/Scene/RenderableNode.h \
  ../../src/Scene/SceneNode.h ../../src/Resources/Material/Material.h \
  ../../src/Resources/Material/MtlUserDefinedVar.h \
- ../../src/Resources/ShaderProg/SProgUniVar.h
+ ../../src/Resources/ShaderProg/SProgUniVar.h \
+ ../../src/Scene/MaterialRuntime/MaterialRuntime.h \
+ ../../src/Scene/MaterialRuntime/MtlUserDefinedVarRuntime.h \
+ ../../src/Resources/Material/MtlUserDefinedVar.h
 	@echo Compiling ../../src/Scene/PatchNode.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Scene/PatchNode.cpp -o PatchNode.o
 
@@ -5202,7 +5207,9 @@ SceneDrawer.o: ../../src/Renderer/Drawers/SceneDrawer.cpp \
  ../../src/Physics/BtAndAnkiConvertors.h \
  ../../src/Renderer/Drawers/PhyDbgDrawer.h \
  ../../extern/include/bullet/LinearMath/btIDebugDraw.h \
- ../../src/Scene/VisibilityTester.h
+ ../../src/Scene/VisibilityTester.h \
+ ../../src/Scene/MaterialRuntime/MaterialRuntime.h \
+ ../../src/Scene/MaterialRuntime/MtlUserDefinedVarRuntime.h
 	@echo Compiling ../../src/Renderer/Drawers/SceneDrawer.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer/Drawers/SceneDrawer.cpp -o SceneDrawer.o
 

+ 9 - 2
src/Main.cpp

@@ -37,10 +37,11 @@
 #include "HighRezTimer.h"
 #include "SkinNode.h"
 #include "Skin.h"
+#include "MaterialRuntime.h"
 
 
 // map (hard coded)
-ModelNode* floor__,* sarge,* horse,* crate;
+ModelNode* floor__,* sarge,* horse,* crate,* pentagram;
 SkinNode* imp;
 //SkelModelNode* imp;
 PointLight* point_lights[10];
@@ -155,7 +156,7 @@ void init()
 	sponza->setLocalTransform(Transform(Vec3(0.0), Mat3::getIdentity(), 0.05));
 
 	// Pentagram
-	ModelNode* pentagram = new ModelNode();
+	pentagram = new ModelNode();
 	pentagram->init("models/pentagram/pentagram.mdl");
 	pentagram->setLocalTransform(Transform(Vec3(2, 0, 0), Mat3::getIdentity(), 1.0));
 
@@ -288,6 +289,12 @@ void mainLoopExtra()
 	if(InputSingleton::getInstance().getKey(SDL_SCANCODE_I))
 		character->moveForward(0.1);
 
+	if(InputSingleton::getInstance().getKey(SDL_SCANCODE_T))
+	{
+		pentagram->getModelPatchNodees()[0]->getCpMtlRun().getUserDefinedVarByName("specularCol").get<Vec3>() = Vec3(10.0, -1.6, 1.6);
+		pentagram->getModelPatchNodees()[0]->getCpMtlRun().getUserDefinedVarByName("shininess").get<float>() = 10.0;
+	}
+
 
 	if(InputSingleton::getInstance().getKey(SDL_SCANCODE_O) == 1)
 	{

+ 24 - 78
src/Renderer/Drawers/SceneDrawer.cpp

@@ -6,13 +6,15 @@
 #include "Renderer.h"
 #include "App.h"
 #include "Scene.h"
+#include "MaterialRuntime.h"
 
 
 //======================================================================================================================
 // Constructor                                                                                                         =
 //======================================================================================================================
-SceneDrawer::UsrDefVarVisitor::UsrDefVarVisitor(const MtlUserDefinedVar& udv_, const Renderer& r_, uint& texUnit_):
-	udv(udv_),
+SceneDrawer::UsrDefVarVisitor::UsrDefVarVisitor(const MtlUserDefinedVarRuntime& udvr_,
+                                                const Renderer& r_, uint& texUnit_):
+	udvr(udvr_),
 	r(r_),
 	texUnit(texUnit_)
 {}
@@ -24,28 +26,29 @@ SceneDrawer::UsrDefVarVisitor::UsrDefVarVisitor(const MtlUserDefinedVar& udv_, c
 
 void SceneDrawer::UsrDefVarVisitor::operator()(float x) const
 {
-	udv.getUniVar().setFloat(x);
+	udvr.getUniVar().setFloat(x);
 }
 
 void SceneDrawer::UsrDefVarVisitor::operator()(const Vec2& x) const
 {
-	udv.getUniVar().setVec2(&x);
+	udvr.getUniVar().setVec2(&x);
 }
 
 void SceneDrawer::UsrDefVarVisitor::operator()(const Vec3& x) const
 {
-	udv.getUniVar().setVec3(&x);
+	udvr.getUniVar().setVec3(&x);
 }
 
 void SceneDrawer::UsrDefVarVisitor::operator()(const Vec4& x) const
 {
-	udv.getUniVar().setVec4(&x);
+	udvr.getUniVar().setVec4(&x);
 }
 
-void SceneDrawer::UsrDefVarVisitor::operator()(const RsrcPtr<Texture>& x) const
+void SceneDrawer::UsrDefVarVisitor::operator()(const RsrcPtr<Texture>* x) const
 {
-	x->setRepeat(true);
-	udv.getUniVar().setTexture(*x, texUnit);
+	const RsrcPtr<Texture>& texPtr = *x;
+	texPtr->setRepeat(true);
+	udvr.getUniVar().setTexture(*texPtr, texUnit);
 	++texUnit;
 }
 
@@ -54,16 +57,16 @@ void SceneDrawer::UsrDefVarVisitor::operator()(MtlUserDefinedVar::Fai x) const
 	switch(x)
 	{
 		case MtlUserDefinedVar::MS_DEPTH_FAI:
-			udv.getUniVar().setTexture(r.getMs().getDepthFai(), texUnit);
+			udvr.getUniVar().setTexture(r.getMs().getDepthFai(), texUnit);
 			break;
 		case MtlUserDefinedVar::IS_FAI:
-			udv.getUniVar().setTexture(r.getIs().getFai(), texUnit);
+			udvr.getUniVar().setTexture(r.getIs().getFai(), texUnit);
 			break;
 		case MtlUserDefinedVar::PPS_PRE_PASS_FAI:
-			udv.getUniVar().setTexture(r.getPps().getPrePassFai(), texUnit);
+			udvr.getUniVar().setTexture(r.getPps().getPrePassFai(), texUnit);
 			break;
 		case MtlUserDefinedVar::PPS_POST_PASS_FAI:
-			udv.getUniVar().setTexture(r.getPps().getPostPassFai(), texUnit);
+			udvr.getUniVar().setTexture(r.getPps().getPostPassFai(), texUnit);
 			break;
 		default:
 			ASSERT(0);
@@ -76,11 +79,12 @@ void SceneDrawer::UsrDefVarVisitor::operator()(MtlUserDefinedVar::Fai x) const
 //======================================================================================================================
 // setupShaderProg                                                                                                     =
 //======================================================================================================================
-void SceneDrawer::setupShaderProg(const Material& mtl, const Transform& nodeWorldTransform, const Camera& cam,
+void SceneDrawer::setupShaderProg(const MaterialRuntime& mtlr, const Transform& nodeWorldTransform, const Camera& cam,
                                   const Renderer& r)
 {
 	uint textureUnit = 0;
 
+	const Material& mtl = mtlr.getMaterial();
 	mtl.getShaderProg().bind();
 
 	//
@@ -232,69 +236,11 @@ void SceneDrawer::setupShaderProg(const Material& mtl, const Transform& nodeWorl
 	//
 	// set user defined vars
 	//
-	BOOST_FOREACH(const MtlUserDefinedVar& udv, mtl.getUserDefinedVars())
+	BOOST_FOREACH(const MtlUserDefinedVarRuntime& udvr, mtlr.getUserDefinedVars())
 	{
-		boost::apply_visitor(UsrDefVarVisitor(udv, r, textureUnit), udv.getDataVariant());
+		boost::apply_visitor(UsrDefVarVisitor(udvr, r, textureUnit), udvr.getDataVariant());
 	}
 
-	/*boost::ptr_vector<MtlUserDefinedVar>::const_iterator it = mtl.getUserDefinedVars().begin();
-	for(; it !=  mtl.getUserDefinedVars().end(); it++)
-	{
-		const MtlUserDefinedVar& udv = *it;
-
-		switch(udv.getUniVar().getGlDataType())
-		{
-			// texture or FAI
-			case GL_SAMPLER_2D:
-				RsrcPtr<Texture>* tex;
-				MtlUserDefinedVar::Fai* fai;
-
-				if(fai = udv.get<RsrcPtr<Texture> >())
-				{
-					udv.getTexture()->setRepeat(true);
-					udv.getUniVar().setTexture(*udv.getTexture(), textureUnit);
-				}
-				else if(fai = udv.get< >())
-				{
-					switch(udv.getFai())
-					{
-						case MtlUserDefinedVar::MS_DEPTH_FAI:
-							udv.getUniVar().setTexture(r.getMs().getDepthFai(), textureUnit);
-							break;
-						case MtlUserDefinedVar::IS_FAI:
-							udv.getUniVar().setTexture(r.getIs().getFai(), textureUnit);
-							break;
-						case MtlUserDefinedVar::PPS_PRE_PASS_FAI:
-							udv.getUniVar().setTexture(r.getPps().getPrePassFai(), textureUnit);
-							break;
-						case MtlUserDefinedVar::PPS_POST_PASS_FAI:
-							udv.getUniVar().setTexture(r.getPps().getPostPassFai(), textureUnit);
-							break;
-						default:
-							ASSERT(0);
-					}
-				}
-				++textureUnit;
-				break;
-			// float
-			case GL_FLOAT:
-				udv.getUniVar().setFloat(udv.get<float>());
-				break;
-			// vec2
-			case GL_FLOAT_VEC2:
-				udv.getUniVar().setVec2(&udv.get<Vec2>());
-				break;
-			// vec3
-			case GL_FLOAT_VEC3:
-				udv.getUniVar().setVec3(&udv.get<Vec3>());
-				break;
-			// vec4
-			case GL_FLOAT_VEC4:
-				udv.getUniVar().setVec4(&udv.get<Vec4>());
-				break;
-		}
-	}*/
-
 	ON_GL_FAIL_THROW_EXCEPTION();
 }
 
@@ -305,23 +251,23 @@ void SceneDrawer::setupShaderProg(const Material& mtl, const Transform& nodeWorl
 void SceneDrawer::renderRenderableNode(const RenderableNode& renderable, const Camera& cam,
                                        RenderingPassType rtype) const
 {
-	const Material* mtl;
+	const MaterialRuntime* mtlr;
 	const Vao* vao;
 
 	switch(rtype)
 	{
 		case RPT_COLOR:
-			mtl = &renderable.getCpMtl();
+			mtlr = &renderable.getCpMtlRun();
 			vao = &renderable.getCpVao();
 			break;
 
 		case RPT_DEPTH:
-			mtl = &renderable.getDpMtl();
+			mtlr = &renderable.getDpMtlRun();
 			vao = &renderable.getDpVao();
 			break;
 	}
 
-	setupShaderProg(*mtl, renderable.getWorldTransform(), cam, r);
+	setupShaderProg(*mtlr, renderable.getWorldTransform(), cam, r);
 
 	vao->bind();
 	glDrawElements(GL_TRIANGLES, renderable.getVertIdsNum(), GL_UNSIGNED_SHORT, 0);

+ 8 - 6
src/Renderer/Drawers/SceneDrawer.h

@@ -10,6 +10,8 @@ class RenderableNode;
 class Renderer;
 class Camera;
 class Material;
+class MaterialRuntime;
+class MtlUserDefinedVarRuntime;
 
 
 /// It includes all the functions to render a RenderableNode
@@ -32,17 +34,17 @@ class SceneDrawer
 		class UsrDefVarVisitor: public boost::static_visitor<void>
 		{
 			public:
-				const MtlUserDefinedVar& udv;
+				const MtlUserDefinedVarRuntime& udvr;
 				const Renderer& r;
 				mutable uint& texUnit;
 
-				UsrDefVarVisitor(const MtlUserDefinedVar& udv, const Renderer& r, uint& texUnit);
+				UsrDefVarVisitor(const MtlUserDefinedVarRuntime& udvr, const Renderer& r, uint& texUnit);
 
 				void operator()(float x) const;
 				void operator()(const Vec2& x) const;
 				void operator()(const Vec3& x) const;
 				void operator()(const Vec4& x) const;
-				void operator()(const RsrcPtr<Texture>& x) const;
+				void operator()(const RsrcPtr<Texture>* x) const;
 				void operator()(MtlUserDefinedVar::Fai x) const;
 		};
 
@@ -52,12 +54,12 @@ class SceneDrawer
 		/// - binds the shader program
 		/// - loads the uniforms
 		/// - sets the GL state
-		/// @param mtl The material containing the shader program and the locations
+		/// @param mtlr The material runtime
 		/// @param nodeWorldTransform The world transformation to pass to the shader
 		/// @param cam Needed for some matrices (view & projection)
 		/// @param r The renderer, needed for some FAIs and some matrices
-		static void setupShaderProg(const Material& mtl, const Transform& nodeWorldTransform, const Camera& cam,
-		                            const Renderer& r);
+		static void setupShaderProg(const MaterialRuntime& mtlr, const Transform& nodeWorldTransform,
+		                            const Camera& cam, const Renderer& r);
 };
 
 

+ 2 - 3
src/Resources/ShaderProg/SProgAttribVar.h

@@ -8,13 +8,12 @@
 class SProgAttribVar: public SProgVar
 {
 	public:
-		SProgAttribVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_);
-		SProgAttribVar(const SProgAttribVar& var): SProgVar(var) {}
+		SProgAttribVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg& fatherSProg_);
 };
 
 
 inline SProgAttribVar::SProgAttribVar(int loc_, const char* name_, GLenum glDataType_,
-                                      const ShaderProg* fatherSProg_):
+                                      const ShaderProg& fatherSProg_):
 	SProgVar(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
 {}
 

+ 2 - 3
src/Resources/ShaderProg/SProgUniVar.h

@@ -12,8 +12,7 @@ class Texture;
 class SProgUniVar: public SProgVar
 {
 	public:
-		SProgUniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_);
-		SProgUniVar(const SProgUniVar& var): SProgVar(var) {}
+		SProgUniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg& fatherSProg_);
 
 		/// @name Set the var
 		/// @{
@@ -29,7 +28,7 @@ class SProgUniVar: public SProgVar
 };
 
 
-inline SProgUniVar::SProgUniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_):
+inline SProgUniVar::SProgUniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg& fatherSProg_):
 	SProgVar(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
 {}
 

+ 6 - 15
src/Resources/ShaderProg/SProgVar.h

@@ -3,6 +3,7 @@
 
 #include <GL/glew.h>
 #include <string>
+#include <boost/noncopyable.hpp>
 #include "Properties.h"
 
 
@@ -10,7 +11,7 @@ class ShaderProg;
 
 
 /// Shader program variable. The type is attribute or uniform
-class SProgVar
+class SProgVar: public boost::noncopyable
 {
 	public:
 		/// Shader var types
@@ -21,12 +22,11 @@ class SProgVar
 		};
 
 		SProgVar(GLint loc_, const char* name_, GLenum glDataType_, ShaderVarType type_,
-		         const ShaderProg* fatherSProg_);
-		SProgVar(const SProgVar& var);
+		         const ShaderProg& fatherSProg_);
 
 		/// @name Accessors
 		/// @{
-		const ShaderProg& getFatherSProg() const {return *fatherSProg;}
+		const ShaderProg& getFatherSProg() const {return fatherSProg;}
 		GETTER_R(GLint, loc, getLoc)
 		GETTER_R(std::string, name, getName)
 		GETTER_R(GLenum, glDataType, getGlDataType)
@@ -39,12 +39,12 @@ class SProgVar
 		/// GL_FLOAT, GL_FLOAT_VEC2 etc. See http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniform.xml
 		GLenum glDataType;
 		ShaderVarType type; ///< @ref SVT_ATTRIBUTE or @ref SVT_UNIFORM
-		const ShaderProg* fatherSProg; ///< We need the ShaderProg of this variable mainly for sanity checks
+		const ShaderProg& fatherSProg; ///< We need the ShaderProg of this variable mainly for sanity checks
 };
 
 
 inline SProgVar::SProgVar(GLint loc_, const char* name_, GLenum glDataType_, ShaderVarType type_,
-                          const ShaderProg* fatherSProg_):
+                          const ShaderProg& fatherSProg_):
 	loc(loc_),
 	name(name_),
 	glDataType(glDataType_),
@@ -53,13 +53,4 @@ inline SProgVar::SProgVar(GLint loc_, const char* name_, GLenum glDataType_, Sha
 {}
 
 
-inline SProgVar::SProgVar(const SProgVar& var):
-	loc(var.loc),
-	name(var.name),
-	glDataType(var.glDataType),
-	type(var.type),
-	fatherSProg(var.fatherSProg)
-{}
-
-
 #endif

+ 2 - 2
src/Resources/ShaderProg/ShaderProg.cpp

@@ -131,7 +131,7 @@ void ShaderProg::getUniAndAttribVars()
 			continue;
 		}
 
-		SProgAttribVar* var = new SProgAttribVar(loc, &name_[0], type, this);
+		SProgAttribVar* var = new SProgAttribVar(loc, &name_[0], type, *this);
 		attribVars.push_back(var);
 		attribNameToVar[attribVars.back().getName().c_str()] = var;
 	}
@@ -154,7 +154,7 @@ void ShaderProg::getUniAndAttribVars()
 			continue;
 		}
 
-		SProgUniVar* var = new SProgUniVar(loc, &name_[0], type, this);
+		SProgUniVar* var = new SProgUniVar(loc, &name_[0], type, *this);
 		uniVars.push_back(var);
 		uniNameToVar[uniVars.back().getName().c_str()] = var;
 	}

+ 1 - 1
src/Scene/MaterialRuntime/MaterialRuntime.cpp

@@ -14,7 +14,7 @@ MaterialRuntime::MaterialRuntime(const Material& mtl_):
 	{
 		MtlUserDefinedVarRuntime* udvr = new MtlUserDefinedVarRuntime(udv);
 		userDefVars.push_back(udvr);
-		userDefVarsHashMap[udvr->getMtlUserDefinedVar().getUniVar().getName().c_str()] = udvr;
+		userDefVarsHashMap[udvr->getName().c_str()] = udvr;
 	}
 }
 

+ 5 - 2
src/Scene/MaterialRuntime/MaterialRuntime.h

@@ -10,7 +10,7 @@
 class Material;
 
 
-/// @todo
+/// One layer above material resource
 class MaterialRuntime
 {
 	public:
@@ -18,7 +18,7 @@ class MaterialRuntime
 
 		/// @name Accessors
 		/// @{
-		GETTER_RW(boost::ptr_vector<MtlUserDefinedVarRuntime>, userDefVars, getUserDefVars)
+		GETTER_RW(boost::ptr_vector<MtlUserDefinedVarRuntime>, userDefVars, getUserDefinedVars)
 
 		/// Find MtlUserDefinedVarRuntime variable. On failure it throws an exception
 		/// @param[in] name The name of the var
@@ -26,8 +26,11 @@ class MaterialRuntime
 		/// @exception Exception
 		MtlUserDefinedVarRuntime& getUserDefinedVarByName(const char* name);
 
+		/// The const version of getUserDefinedVarByName
 		/// @see getUserDefinedVarByName
 		const MtlUserDefinedVarRuntime& getUserDefinedVarByName(const char* name) const;
+
+		const Material& getMaterial() const {return mtl;}
 		/// @}
 
 	private:

+ 7 - 2
src/Scene/MaterialRuntime/MtlUserDefinedVarRuntime.h

@@ -13,11 +13,16 @@ class MtlUserDefinedVarRuntime
 		/// The data union. The Texture resource is read-only at runtime
 		typedef boost::variant<float, Vec2, Vec3, Vec4, const RsrcPtr<Texture>*, MtlUserDefinedVar::Fai> DataVariant;
 
+		/// The one and only constructor
 		MtlUserDefinedVarRuntime(const MtlUserDefinedVar& rsrc);
 
 		/// @name Accessors
 		/// @{
-		const MtlUserDefinedVar& getMtlUserDefinedVar() const {return rsrc;}
+		const SProgUniVar& getUniVar() const {return rsrc.getUniVar();}
+
+		const std::string& getName() const {return getUniVar().getName();}
+
+		GETTER_RW(DataVariant, data, getDataVariant)
 
 		/// Get the value of the variant
 		/// @exception boost::exception when you try to get the incorrect data type
@@ -48,7 +53,7 @@ class MtlUserDefinedVarRuntime
 		};
 
 		DataVariant data;
-		const MtlUserDefinedVar& rsrc;
+		const MtlUserDefinedVar& rsrc; ///< Know the resource
 };
 
 

+ 13 - 0
src/Scene/PatchNode.cpp

@@ -1,5 +1,18 @@
 #include "PatchNode.h"
 #include "Material.h"
+#include "MaterialRuntime.h"
+
+
+//======================================================================================================================
+// Constructor                                                                                                         =
+//======================================================================================================================
+PatchNode::PatchNode(const ModelPatch& modelPatch, SceneNode* parent):
+	RenderableNode(parent),
+	rsrc(modelPatch)
+{
+	cpMtlRun.reset(new MaterialRuntime(rsrc.getCpMtl()));
+	dpMtlRun.reset(new MaterialRuntime(rsrc.getDpMtl()));
+}
 
 
 //======================================================================================================================

+ 10 - 7
src/Scene/PatchNode.h

@@ -1,7 +1,7 @@
 #ifndef PATCH_NODE_H
 #define PATCH_NODE_H
 
-
+#include <memory>
 #include "Vao.h"
 #include "Vbo.h"
 #include "Mesh.h" // For the Vbos enum
@@ -11,6 +11,7 @@
 
 
 class Material;
+class MaterialRuntime;
 
 
 /// Inherited by ModelPatchNode and SkinPatchNode. It contains common code, the derived classes are responsible to
@@ -27,6 +28,12 @@ class PatchNode: public RenderableNode
 		/// @{
 		const Material& getCpMtl() const {return rsrc.getCpMtl();}
 		const Material& getDpMtl() const {return rsrc.getDpMtl();}
+
+		MaterialRuntime& getCpMtlRun() {return *cpMtlRun;}
+		MaterialRuntime& getDpMtlRun() {return *dpMtlRun;}
+		const MaterialRuntime& getCpMtlRun() const {return *cpMtlRun;}
+		const MaterialRuntime& getDpMtlRun() const {return *dpMtlRun;}
+
 		const ModelPatch& getModelPatchRsrc() const {return rsrc;}
 		const Vao& getCpVao() const {return cpVao;}
 		const Vao& getDpVao() const {return dpVao;}
@@ -37,16 +44,12 @@ class PatchNode: public RenderableNode
 		const ModelPatch& rsrc;
 		Vao dpVao; /// VAO for depth passes. All VBOs could be attached except for the vert weights
 		Vao cpVao; /// VAO for MS and BS. All VBOs could be attached except for the vert weights
+		std::auto_ptr<MaterialRuntime> cpMtlRun;
+		std::auto_ptr<MaterialRuntime> dpMtlRun;
 
 		/// Create a VAO given a material and an array of VBOs
 		static void createVao(const Material& material, const boost::array<const Vbo*, Mesh::VBOS_NUM>& vbos, Vao& vao);
 };
 
 
-inline PatchNode::PatchNode(const ModelPatch& modelPatch, SceneNode* parent):
-	RenderableNode(parent),
-	rsrc(modelPatch)
-{}
-
-
 #endif

+ 5 - 0
src/Scene/RenderableNode.h

@@ -6,6 +6,7 @@
 
 class Vao;
 class Material;
+class MaterialRuntime;
 
 
 /// Abstract class that acts as an interface for the renderable objects of the scene
@@ -19,6 +20,10 @@ class RenderableNode: public SceneNode
 		virtual uint getVertIdsNum() const = 0;  ///< Get vert ids number for rendering
 		virtual const Material& getCpMtl() const = 0;  ///< Get color pass material
 		virtual const Material& getDpMtl() const = 0;  ///< Get depth pass material
+		virtual MaterialRuntime& getCpMtlRun() = 0;
+		virtual MaterialRuntime& getDpMtlRun() = 0;
+		virtual const MaterialRuntime& getCpMtlRun() const = 0;
+		virtual const MaterialRuntime& getDpMtlRun() const = 0;
 };