Browse Source

- Refactoring

Panagiotis Christopoulos Charitos 14 years ago
parent
commit
a3928dfb0d

+ 3 - 3
anki/renderer/Bl.cpp

@@ -105,7 +105,7 @@ void Bl::runSideBlur()
 
 	sideBlurSProg->bind();
 	sideBlurSProg->getUniformVariableByName("tex").set(*sideBlurMap, 0);
-	sideBlurSProg->getUniformVariableByName("factor").set(&sideBlurFactor);
+	sideBlurSProg->getUniformVariableByName("factor").set(sideBlurFactor);
 
 	r.drawQuad();
 }
@@ -129,7 +129,7 @@ void Bl::runBlur()
 		hBlurSProg->getUniformVariableByName("msNormalFai").set(
 			r.getMs().getNormalFai(), 1);
 		float tmp = r.getWidth();
-		hBlurSProg->getUniformVariableByName("imgDimension").set(&tmp);
+		hBlurSProg->getUniformVariableByName("imgDimension").set(tmp);
 
 		r.drawQuad();
 
@@ -141,7 +141,7 @@ void Bl::runBlur()
 		vBlurSProg->getUniformVariableByName("msNormalFai").set(
 			r.getMs().getNormalFai(), 1);
 		tmp = r.getHeight();
-		vBlurSProg->getUniformVariableByName("imgDimension").set(&tmp);
+		vBlurSProg->getUniformVariableByName("imgDimension").set(tmp);
 
 		r.drawQuad();
 	}

+ 1 - 1
anki/renderer/Dbg.cpp

@@ -433,7 +433,7 @@ void Dbg::end()
 	colorsVbo.write(&colors[0], 0, sizeof(Vec3) * pointIndex);
 
 	Mat4 pmv = r.getViewProjectionMat() * modelMat;
-	sProg->getUniformVariableByName("modelViewProjectionMat").set(&pmv);
+	sProg->getUniformVariableByName("modelViewProjectionMat").set(pmv);
 
 	vao.bind();
 	glDrawArrays(GL_LINES, 0, pointIndex);

+ 8 - 9
anki/renderer/Hdr.cpp

@@ -119,7 +119,7 @@ void Hdr::run()
 	// pass 0
 	toneFbo.bind();
 	toneSProg->bind();
-	toneSProg->getUniformVariableByName("exposure").set(&exposure);
+	toneSProg->getUniformVariableByName("exposure").set(exposure);
 	toneSProg->getUniformVariableByName("fai").set(
 		r.getPps().getPrePassFai(), 0);
 	r.drawQuad();
@@ -140,20 +140,19 @@ void Hdr::run()
 		{
 			hblurSProg->getUniformVariableByName("img").set(fai, 0);
 		}
-		float tmp = float(w);
-		hblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
-		tmp = blurringDist / w;
-		hblurSProg->getUniformVariableByName("blurringDist").set(&tmp);
+		//float tmp = float(w);
+		hblurSProg->getUniformVariableByName("imgDimension").set(float(w));
+		hblurSProg->getUniformVariableByName("blurringDist").set(
+			float(blurringDist / w));
 		r.drawQuad();
 
 		// vpass
 		vblurFbo.bind();
 		vblurSProg->bind();
 		vblurSProg->getUniformVariableByName("img").set(hblurFai, 0);
-		tmp = float(h);
-		vblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
-		tmp = blurringDist / h;
-		vblurSProg->getUniformVariableByName("blurringDist").set(&tmp);
+		vblurSProg->getUniformVariableByName("imgDimension").set(float(h));
+		vblurSProg->getUniformVariableByName("blurringDist").set(
+			float(blurringDist / h));
 		r.drawQuad();
 	}
 

+ 18 - 18
anki/renderer/Is.cpp

@@ -151,7 +151,7 @@ void Is::ambientPass(const Vec3& color)
 	ambientPassSProg->bind();
 
 	// set the uniforms
-	ambientPassSProg->getUniformVariableByName("ambientCol").set(&color);
+	ambientPassSProg->getUniformVariableByName("ambientCol").set(color);
 	ambientPassSProg->getUniformVariableByName("sceneColMap").set(
 		r.getMs().getDiffuseFai(), 0);
 
@@ -183,21 +183,21 @@ void Is::pointLightPass(const PointLight& light)
 		r.getMs().getSpecularFai(), 2);
 	shader.getUniformVariableByName("msDepthFai").set(
 		r.getMs().getDepthFai(), 3);
-	shader.getUniformVariableByName("planes").set(&r.getPlanes());
+	shader.getUniformVariableByName("planes").set(r.getPlanes());
 	shader.getUniformVariableByName("limitsOfNearPlane").set(
-		&r.getLimitsOfNearPlane());
+		r.getLimitsOfNearPlane());
 	shader.getUniformVariableByName("limitsOfNearPlane2").set(
-		&r.getLimitsOfNearPlane2());
+		r.getLimitsOfNearPlane2());
 	float zNear = cam.getZNear();
-	shader.getUniformVariableByName("zNear").set(&zNear);
+	shader.getUniformVariableByName("zNear").set(zNear);
 	const Vec3& origin = light.getWorldTransform().getOrigin();
 	Vec3 lightPosEyeSpace = origin.getTransformed(cam.getViewMatrix());
-	shader.getUniformVariableByName("lightPos").set(&lightPosEyeSpace);
+	shader.getUniformVariableByName("lightPos").set(lightPosEyeSpace);
 	shader.getUniformVariableByName("lightRadius").set(light.getRadius());
 	shader.getUniformVariableByName("lightDiffuseCol").set(
-		&light.getDiffuseColor());
+		light.getDiffuseColor());
 	shader.getUniformVariableByName("lightSpecularCol").set(
-		&light.getSpecularColor());
+		light.getSpecularColor());
 
 	// render quad
 	r.drawQuad();
@@ -266,24 +266,24 @@ void Is::spotLightPass(const SpotLight& light)
 	shdr->getUniformVariableByName("msDepthFai").set(ms.getDepthFai(), 3);
 
 	// the ???
-	shdr->getUniformVariableByName("planes").set(&r.getPlanes());
+	shdr->getUniformVariableByName("planes").set(r.getPlanes());
 	shdr->getUniformVariableByName("limitsOfNearPlane").set(
-		&r.getLimitsOfNearPlane());
+		r.getLimitsOfNearPlane());
 	shdr->getUniformVariableByName("limitsOfNearPlane2").set(
-		&r.getLimitsOfNearPlane2());
+		r.getLimitsOfNearPlane2());
 	float zNear = cam.getZNear();
-	shdr->getUniformVariableByName("zNear").set(&zNear);
+	shdr->getUniformVariableByName("zNear").set(zNear);
 
 	// the light params
 	const Vec3& origin = light.getWorldTransform().getOrigin();
 	Vec3 lightPosEyeSpace = origin.getTransformed(cam.getViewMatrix());
-	shdr->getUniformVariableByName("lightPos").set(&lightPosEyeSpace);
+	shdr->getUniformVariableByName("lightPos").set(lightPosEyeSpace);
 	float tmp = light.getDistance();
-	shdr->getUniformVariableByName("lightRadius").set(&tmp);
+	shdr->getUniformVariableByName("lightRadius").set(tmp);
 	shdr->getUniformVariableByName("lightDiffuseCol").set(
-		&light.getDiffuseColor());
+		light.getDiffuseColor());
 	shdr->getUniformVariableByName("lightSpecularCol").set(
-		&light.getSpecularColor());
+		light.getSpecularColor());
 	shdr->getUniformVariableByName("lightTex").set(light.getTexture(), 4);
 
 	// set texture matrix for texture & shadowmap projection
@@ -294,14 +294,14 @@ void Is::spotLightPass(const SpotLight& light)
 	texProjectionMat = biasMat4 * light.getCamera().getProjectionMatrix() *
 		Mat4::combineTransformations(light.getCamera().getViewMatrix(),
 		Mat4(cam.getWorldTransform()));
-	shdr->getUniformVariableByName("texProjectionMat").set(&texProjectionMat);
+	shdr->getUniformVariableByName("texProjectionMat").set(texProjectionMat);
 
 	// the shadowmap
 	if(light.getCastShadow() && sm.getEnabled())
 	{
 		shdr->getUniformVariableByName("shadowMap").set(sm.getShadowMap(), 5);
 		float smSize = sm.getShadowMap().getWidth();
-		shdr->getUniformVariableByName("shadowMapSize").set(&smSize);
+		shdr->getUniformVariableByName("shadowMapSize").set(smSize);
 	}
 
 	// render quad

+ 8 - 8
anki/renderer/SceneDrawer.cpp

@@ -36,7 +36,7 @@ template<typename Type>
 void SceneDrawer::UsrDefVarVisitor::operator()(const Type& x) const
 {
 	static_cast<const ShaderProgramUniformVariable&>(udvr.getMaterialVariable().
-		getShaderProgramVariable(key)).set(&x);
+		getShaderProgramVariable(key)).set(x);
 }
 
 
@@ -117,31 +117,31 @@ void SceneDrawer::setupShaderProg(
 	if(mtl.variableExistsAndInKey("modelMat", pt))
 	{
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelMat").
-			getShaderProgramVariable(pt)).set(&modelMat);
+			getShaderProgramVariable(pt)).set(modelMat);
 	}
 
 	if(mtl.variableExistsAndInKey("viewMat", pt))
 	{
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("viewMat").
-			getShaderProgramVariable(pt)).set(&viewMat);
+			getShaderProgramVariable(pt)).set(viewMat);
 	}
 
 	if(mtl.variableExistsAndInKey("projectionMat", pt))
 	{
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("projectionMat").
-			getShaderProgramVariable(pt)).set(&projectionMat);
+			getShaderProgramVariable(pt)).set(projectionMat);
 	}
 
 	if(mtl.variableExistsAndInKey("modelViewMat", pt))
 	{
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelMat").
-			getShaderProgramVariable(pt)).set(&modelViewMat);
+			getShaderProgramVariable(pt)).set(modelViewMat);
 	}
 
 	if(mtl.variableExistsAndInKey("viewProjectionMat", pt))
 	{
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("viewProjectionMat").
-			getShaderProgramVariable(pt)).set(&r.getViewProjectionMat());
+			getShaderProgramVariable(pt)).set(r.getViewProjectionMat());
 	}
 
 	if(mtl.variableExistsAndInKey("normalMat", pt))
@@ -149,7 +149,7 @@ void SceneDrawer::setupShaderProg(
 		normalMat = modelViewMat.getRotationPart();
 
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("normalMat").
-			getShaderProgramVariable(pt)).set(&normalMat);
+			getShaderProgramVariable(pt)).set(normalMat);
 	}
 
 	if(mtl.variableExistsAndInKey("modelViewProjectionMat", pt))
@@ -157,7 +157,7 @@ void SceneDrawer::setupShaderProg(
 		modelViewProjectionMat = projectionMat * modelViewMat;
 
 		static_cast<const ShaderProgramUniformVariable&>(mtl.findVariableByName("modelViewProjectionMat").
-			getShaderProgramVariable(pt)).set(&modelViewProjectionMat);
+			getShaderProgramVariable(pt)).set(modelViewProjectionMat);
 	}
 
 

+ 2 - 2
anki/renderer/Smo.cpp

@@ -148,7 +148,7 @@ void Smo::run(const PointLight& light)
 	Mat4 modelMat = Mat4(light.getWorldTransform().getOrigin(),
 		Mat3::getIdentity(), light.getRadius() * SCALE);
 	Mat4 trf = r.getViewProjectionMat() * modelMat;
-	sProg->getUniformVariableByName("modelViewProjectionMat").set(&trf);
+	sProg->getUniformVariableByName("modelViewProjectionMat").set(trf);
 
 	// render sphere to the stencil buffer
 	sphereGeom.vao.bind();
@@ -228,7 +228,7 @@ void Smo::run(const SpotLight& light)
 	Mat4 modelMat = Mat4(lcam.getWorldTransform());
 
 	Mat4 trf = r.getViewProjectionMat() * modelMat * localMat;
-	sProg->getUniformVariableByName("modelViewProjectionMat").set(&trf);
+	sProg->getUniformVariableByName("modelViewProjectionMat").set(trf);
 
 	//
 	// Render

+ 8 - 8
anki/renderer/Ssao.cpp

@@ -124,19 +124,19 @@ void Ssao::run()
 	ssaoSProg->bind();
 	
 	// planes
-	ssaoSProg->getUniformVariableByName("planes").set(&r.getPlanes());
+	ssaoSProg->getUniformVariableByName("planes").set(r.getPlanes());
 
 	// limitsOfNearPlane
 	ssaoSProg->getUniformVariableByName("limitsOfNearPlane").set(
-		&r.getLimitsOfNearPlane());
+		r.getLimitsOfNearPlane());
 
 	// limitsOfNearPlane2
 	ssaoSProg->getUniformVariableByName("limitsOfNearPlane2").set(
-		&r.getLimitsOfNearPlane2());
+		r.getLimitsOfNearPlane2());
 
 	// zNear
 	float zNear = cam.getZNear();
-	ssaoSProg->getUniformVariableByName("zNear").set(&zNear);
+	ssaoSProg->getUniformVariableByName("zNear").set(zNear);
 
 	// msDepthFai
 	ssaoSProg->getUniformVariableByName("msDepthFai").set(
@@ -147,11 +147,11 @@ void Ssao::run()
 
 	// noiseMapSize
 	float noiseMapSize = noiseMap->getWidth();
-	ssaoSProg->getUniformVariableByName("noiseMapSize").set(&noiseMapSize);
+	ssaoSProg->getUniformVariableByName("noiseMapSize").set(noiseMapSize);
 
 	// screenSize
 	Vec2 screenSize(width * 2, height * 2);
-	ssaoSProg->getUniformVariableByName("screenSize").set(&screenSize);
+	ssaoSProg->getUniformVariableByName("screenSize").set(screenSize);
 
 	// msNormalFai
 	ssaoSProg->getUniformVariableByName("msNormalFai").set(
@@ -179,7 +179,7 @@ void Ssao::run()
 			hblurSProg->getUniformVariableByName("img").set(fai, 0);
 		}
 		float tmp = width;
-		hblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
+		hblurSProg->getUniformVariableByName("imgDimension").set(tmp);
 		r.drawQuad();
 
 		// vpass
@@ -187,7 +187,7 @@ void Ssao::run()
 		vblurSProg->bind();
 		vblurSProg->getUniformVariableByName("img").set(hblurFai, 0);
 		tmp = height;
-		vblurSProg->getUniformVariableByName("imgDimension").set(&tmp);
+		vblurSProg->getUniformVariableByName("imgDimension").set(tmp);
 		r.drawQuad();
 	}
 

+ 0 - 1
anki/resource/Material.cpp

@@ -271,7 +271,6 @@ void Material::populateVariables(const boost::property_tree::ptree& pt)
 		}
 	}
 
-
 	//
 	// Iterate all the <input> and get the value
 	//

+ 3 - 1
anki/resource/MaterialVariable.cpp

@@ -12,7 +12,7 @@ namespace anki {
 MaterialVariable::MaterialVariable(
 	const char* shaderProgVarName,
 	const PassLevelToShaderProgramHashMap& sProgs)
-:	type(T_BUILDIN)
+	: type(T_BUILDIN)
 {
 	init(shaderProgVarName, sProgs);
 }
@@ -51,6 +51,8 @@ void MaterialVariable::init(const char* shaderProgVarName,
 			const ShaderProgramVariable& sProgVar =
 				sProg.getVariableByName(shaderProgVarName);
 
+			ANKI_ASSERT(sProgVar.getType() == ShaderProgramVariable::T_UNIFORM);
+
 			sProgVars[key] = &sProgVar;
 
 			if(!oneSProgVar)

+ 27 - 39
anki/resource/ShaderProgramUniformVariable.cpp

@@ -7,8 +7,6 @@
 namespace anki {
 
 
-//==============================================================================
-// doSanityChecks                                                              =
 //==============================================================================
 void ShaderProgramUniformVariable::doSanityChecks() const
 {
@@ -24,82 +22,72 @@ void ShaderProgramUniformVariable::doSanityChecks() const
 // set uniforms                                                                =
 //==============================================================================
 
-void ShaderProgramUniformVariable::set(const float f) const
+void ShaderProgramUniformVariable::set(const float x) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT);
 
-	glUniform1f(getLocation(), f);
+	glUniform1f(getLocation(), x);
+}
+
+
+void ShaderProgramUniformVariable::set(const Vec2& x) const
+{
+	glUniform2f(getLocation(), x.x(), x.y());
 }
 
-void ShaderProgramUniformVariable::set(const float f[], uint size) const
+
+void ShaderProgramUniformVariable::set(const float x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT);
-
-	if(size == 1)
-	{
-		glUniform1f(getLocation(), f[0]);
-	}
-	else
-	{
-		glUniform1fv(getLocation(), size, f);
-	}
+	ANKI_ASSERT(size > 1);
+	glUniform1fv(getLocation(), size, x);
 }
 
 
-void ShaderProgramUniformVariable::set(const Vec2 v2[], uint size) const
+void ShaderProgramUniformVariable::set(const Vec2 x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT_VEC2);
-	if(size == 1)
-	{
-		glUniform2f(getLocation(), v2[0].x(), v2[0].y());
-	}
-	else
-	{
-		glUniform2fv(getLocation(), size, &(const_cast<Vec2&>(v2[0]))[0]);
-	}
+	ANKI_ASSERT(size > 1);
+	glUniform2fv(getLocation(), size, &(const_cast<Vec2&>(x[0]))[0]);
 }
 
 
-void ShaderProgramUniformVariable::set(const Vec3 v3[], uint size) const
+void ShaderProgramUniformVariable::set(const Vec3 x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT_VEC3);
-
-	if(size == 1)
-	{
-		glUniform3f(getLocation(), v3[0].x(), v3[0].y(), v3[0].z());
-	}
-	else
-	{
-		glUniform3fv(getLocation(), size, &(const_cast<Vec3&>(v3[0]))[0]);
-	}
+	ANKI_ASSERT(size > 0);
+	glUniform3fv(getLocation(), size, &(const_cast<Vec3&>(x[0]))[0]);
 }
 
 
-void ShaderProgramUniformVariable::set(const Vec4 v4[], uint size) const
+void ShaderProgramUniformVariable::set(const Vec4 x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT_VEC4);
-	glUniform4fv(getLocation(), size, &(const_cast<Vec4&>(v4[0]))[0]);
+	ANKI_ASSERT(size > 0);
+	glUniform4fv(getLocation(), size, &(const_cast<Vec4&>(x[0]))[0]);
 }
 
 
-void ShaderProgramUniformVariable::set(const Mat3 m3[], uint size) const
+void ShaderProgramUniformVariable::set(const Mat3 x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT_MAT3);
-	glUniformMatrix3fv(getLocation(), size, true, &(m3[0])[0]);
+	ANKI_ASSERT(size > 0);
+	glUniformMatrix3fv(getLocation(), size, true, &(x[0])[0]);
 }
 
 
-void ShaderProgramUniformVariable::set(const Mat4 m4[], uint size) const
+void ShaderProgramUniformVariable::set(const Mat4 x[], uint size) const
 {
 	doSanityChecks();
 	ANKI_ASSERT(getGlDataType() == GL_FLOAT_MAT4);
-	glUniformMatrix4fv(getLocation(), size, true, &(m4[0])[0]);
+	ANKI_ASSERT(size > 0);
+	glUniformMatrix4fv(getLocation(), size, true, &(x[0])[0]);
 }
 
 

+ 36 - 15
anki/resource/ShaderProgramUniformVariable.h

@@ -3,6 +3,7 @@
 
 #include "anki/resource/ShaderProgramVariable.h"
 #include "anki/math/Math.h"
+#include <vector>
 
 
 namespace anki {
@@ -19,18 +20,45 @@ public:
 		int loc,
 		const char* name,
 		GLenum glDataType,
-		const ShaderProgram& fatherSProg);
+		const ShaderProgram& fatherSProg)
+		: ShaderProgramVariable(loc, name, glDataType, T_UNIFORM, fatherSProg)
+	{}
 
 	/// @name Set the var
 	/// @{
-	void set(const float f) const;
-	void set(const float f[], uint size = 1) const;
-	void set(const Vec2 v2[], uint size = 1) const;
-	void set(const Vec3 v3[], uint size = 1) const;
-	void set(const Vec4 v4[], uint size = 1) const;
-	void set(const Mat3 m3[], uint size = 1) const;
-	void set(const Mat4 m4[], uint size = 1) const;
+	void set(const float x) const;
+	void set(const Vec2& x) const;
+	void set(const Vec3& x) const
+	{
+		set(&x, 1);
+	}
+	void set(const Vec4& x) const
+	{
+		set(&x, 1);
+	}
+	void set(const Mat3& x) const
+	{
+		set(&x, 1);
+	}
+	void set(const Mat4& x) const
+	{
+		set(&x, 1);
+	}
 	void set(const Texture& tex, uint texUnit) const;
+
+	void set(const float x[], uint size) const;
+	void set(const Vec2 x[], uint size) const;
+	void set(const Vec3 x[], uint size) const;
+	void set(const Vec4 x[], uint size) const;
+	void set(const Mat3 x[], uint size) const;
+	void set(const Mat4 x[], uint size) const;
+
+	/// @tparam Type float, Vec2, etc
+	template<typename Type>
+	void set(const std::vector<Type>& c)
+	{
+		set(&c[0], c.size());
+	}
 	/// @}
 
 private:
@@ -42,13 +70,6 @@ private:
 };
 
 
-inline ShaderProgramUniformVariable::ShaderProgramUniformVariable(
-	int loc_, const char* name_,
-	GLenum glDataType_, const ShaderProgram& father_)
-	: ShaderProgramVariable(loc_, name_, glDataType_, T_UNIFORM, father_)
-{}
-
-
 } // end namespace
 
 

+ 1 - 1
anki/resource/ShaderProgramVariable.h

@@ -64,7 +64,7 @@ private:
 	/// GL_FLOAT, GL_FLOAT_VEC2 etc. See
 	/// http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniform.xml
 	GLenum glDataType;
-	Type type; ///< @ref ATTRIBUTE or @ref UNIFORM
+	Type type; ///< @ref T_ATTRIBUTE or @ref T_UNIFORM
 	/// We need the ShaderProg of this variable mainly for sanity checks
 	const ShaderProgram& fatherSProg;
 };

+ 3 - 3
anki/ui/UiPainter.cpp

@@ -78,7 +78,7 @@ void UiPainter::drawText(const char* text)
 	sProg->bind();
 
 	sProg->getUniformVariableByName("texture").set(font->getMap(), 0);
-	sProg->getUniformVariableByName("color").set(&col);
+	sProg->getUniformVariableByName("color").set(col);
 
 	// Vao
 	qVao.bind();
@@ -118,9 +118,9 @@ void UiPainter::drawText(const char* text)
 			trfM(1, 2) = p.y() + 2.0 * (font->getGlyphBearingY(cc) -
 				int(font->getGlyphHeight(cc))) / deviceSize.y();
 
-			sProg->getUniformVariableByName("transformation").set(&trfM);
+			sProg->getUniformVariableByName("transformation").set(trfM);
 			sProg->getUniformVariableByName("textureTranformation").set(
-				&font->getGlyphTextureMatrix(cc));
+				font->getGlyphTextureMatrix(cc));
 
 			// Render
 			glDrawElements(GL_TRIANGLES, 2 * 3, GL_UNSIGNED_SHORT, 0);