Explorar el Código

Moving the shaders in the renderer to the cache

Panagiotis Christopoulos Charitos hace 15 años
padre
commit
65d671678e

+ 5 - 6
blenderscripts/mesh.py

@@ -84,7 +84,7 @@ def updateAnkiVertsWithBoneWeights(mesh, skeleton, ankiVerts):
 
 
 	# for every non problematic vert do some shit
-	for i in range(len(mesh.verts))
+	for i in range(len(mesh.verts)):
 		vert = mesh.verts[i]
 		influences = mesh.getVertexInfluences(vert.index)
 		
@@ -104,7 +104,7 @@ def updateAnkiVertsWithBoneWeights(mesh, skeleton, ankiVerts):
 			raise RuntimeError("Cannot have more than 4 bones per vert")
 	
 		# write influences num
-		ankiVerts[i].bonesNum = str(influencesNum)
+		ankiVerts[i].bonesNum = influencesNum
 		
 		for j in range(len(influences)):
 			influence = influences[j]
@@ -259,13 +259,13 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName):
 	if skeleton != None:
 		updateAnkiVertsWithBoneWeights(mesh, skeleton, ankiVerts)
 		
-		ftxt += str(len(ankiVerts))
+		ftxt += str(len(ankiVerts)) + "\n"
 		
 		for i in range(len(ankiVerts)):
 			ankiVert = ankiVerts[i]
 			ftxt += str(ankiVert.bonesNum) + "\n"
-			for j in range(ankiVerts.bonesNum):
-				ftxt += str(ankiVerts.boneIds[j]) + " " + str(ankiVerts.weights[j]) + "\n"
+			for j in range(ankiVert.bonesNum):
+				ftxt += str(ankiVert.boneIds[j]) + " " + str(ankiVert.weights[j]) + "\n"
 	else:
 		ftxt += "0\n"
 
@@ -292,4 +292,3 @@ def export(meshInit):
 	filename = os.path.abspath(meshInit.saveDir + mesh.name + ".mesh")
 	common.WriteFile(filename, getAnkiMeshScript(mesh, skeleton, meshInit.mtlName))
 	print("Mesh exported!! \"" + filename + "\"")	
-

+ 1 - 4
src/Main.cpp

@@ -202,8 +202,6 @@ void init()
 	uint ticks = app->getTicks();
 
 	RendererInitializer initializer;
-	initializer.width = app->getWindowWidth();
-	initializer.height = app->getWindowHeight();
 	initializer.ms.ez.enabled = false;
 	initializer.dbg.enabled = true;
 	initializer.is.sm.bilinearEnabled = true;
@@ -244,6 +242,7 @@ void init()
 	// horse
 	horse = new MeshNode();
 	horse->init("meshes/horse/horse.mesh");
+	//horse->init("models/head/head.mesh");
 	horse->setLocalTransform(Transform(Vec3(-2, 0, 1), Mat3(Euler(-M::PI/2, 0.0, 0.0)), 0.5));
 	
 	// sarge
@@ -412,8 +411,6 @@ int main(int argc, char* argv[])
 {
 	new App(argc, argv);
 
-	INFO(ShaderProg::createSrcCodeToCache("shaders/IsLpGeneric.glsl", "miafora k enan kairo\n", "Prefix"));
-	return 0;
 	init();
 
 	mainLoop();

+ 21 - 16
src/Renderer/Hdr.cpp

@@ -57,20 +57,25 @@ void Renderer::Pps::Hdr::init()
 	// init shaders
 	const char* shaderFname = "shaders/PpsHdr.glsl";
 	string pps;
+	string prefix;
 
 	pps = "#define _PPS_HDR_PASS_0_\n#define IS_FAI_WIDTH " + Util::floatToStr(r.width) + "\n";
-	if(!pass0SProg.customLoad(shaderFname, pps.c_str()))
-		FATAL("See prev error");
-	pass0SProg.uniVars.fai = pass0SProg.findUniVar("fai");
+	prefix = "Pass0IsFaiWidth" + Util::floatToStr(r.width);
+	pass0SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
+	                                                                         prefix.c_str()).c_str()));
+	pass0SProgFaiUniVar = pass0SProg->findUniVar("fai");
 
 	pps = "#define _PPS_HDR_PASS_1_\n#define PASS0_HEIGHT " + Util::floatToStr(height) + "\n";
-	if(!pass1SProg.customLoad(shaderFname, pps.c_str()))
-		FATAL("See prev error");
-	pass1SProg.uniVars.fai = pass1SProg.findUniVar("fai");
-
-	if(!pass2SProg.customLoad(shaderFname, "#define _PPS_HDR_PASS_2_\n"))
-		FATAL("See prev error");
-	pass2SProg.uniVars.fai = pass2SProg.findUniVar("fai");
+	prefix = "Pass1Pass0Height" + Util::floatToStr(height);
+	pass1SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
+	                                                                         prefix.c_str()).c_str()));
+	pass1SProgFaiUniVar = pass1SProg->findUniVar("fai");
+
+	pps = "#define _PPS_HDR_PASS_2_\n";
+	prefix = "Pass2";
+	pass2SProg.reset(Resource::shaders.load(ShaderProg::createSrcCodeToCache(shaderFname, pps.c_str(),
+	                                                                         prefix.c_str()).c_str()));
+	pass2SProgFaiUniVar = pass2SProg->findUniVar("fai");
 }
 
 
@@ -88,23 +93,23 @@ void Renderer::Pps::Hdr::run()
 
 	// pass 0
 	pass0Fbo.bind();
-	pass0SProg.bind();
+	pass0SProg->bind();
 	r.is.fai.setRepeat(false);
-	pass0SProg.uniVars.fai->setTexture(r.pps.prePassFai, 0);
+	pass0SProgFaiUniVar->setTexture(r.pps.prePassFai, 0);
 	Renderer::drawQuad(0);
 
 	// pass 1
 	pass1Fbo.bind();
-	pass1SProg.bind();
+	pass1SProg->bind();
 	pass0Fai.setRepeat(false);
-	pass1SProg.uniVars.fai->setTexture(pass0Fai, 0);
+	pass1SProgFaiUniVar->setTexture(pass0Fai, 0);
 	Renderer::drawQuad(0);
 
 	// pass 2
 	pass2Fbo.bind();
-	pass2SProg.bind();
+	pass2SProg->bind();
 	pass1Fai.setRepeat(false);
-	pass2SProg.uniVars.fai->setTexture(pass1Fai, 0);
+	pass2SProgFaiUniVar->setTexture(pass1Fai, 0);
 	Renderer::drawQuad(0);
 
 	// end

+ 2 - 2
src/Renderer/Is.cpp

@@ -136,11 +136,11 @@ void Renderer::Is::init()
 
 	// spot light w/t shadow
 	string pps = string("\n#define SPOT_LIGHT_ENABLED\n#define SHADOW_ENABLED\n") +
-	             "#define SHADOWMAP_SIZE " + Util::intToStr(sm.resolution);
+	             "#define SHADOWMAP_SIZE " + Util::intToStr(sm.resolution) + "\n";
 	string prefix = "SpotShadowSms" + Util::intToStr(sm.resolution);
 	if(sm.pcfEnabled)
 	{
-		pps += "#define PCF_ENABLED";
+		pps += "#define PCF_ENABLED\n";
 		prefix += "Pcf";
 	}
 	spotLightShadowSProg = Resource::shaders.load(ShaderProg::createSrcCodeToCache("shaders/IsLpGeneric.glsl",

+ 21 - 34
src/Renderer/Renderer.h

@@ -223,16 +223,15 @@ class Renderer
 					PROPERTY_R(float, renderingQuality, getRenderingQuality)
 
 					private:
-						Fbo pass0Fbo, pass1Fbo, pass2Fbo;
-						class HdrShaderProg: public ShaderProg
-						{
-							public:
-								struct
-								{
-									const ShaderProg::UniVar* fai;
-								} uniVars;
-						};
-						HdrShaderProg pass0SProg, pass1SProg, pass2SProg;
+						Fbo pass0Fbo;
+						Fbo pass1Fbo;
+						Fbo pass2Fbo;
+						auto_ptr<ShaderProg> pass0SProg;
+						auto_ptr<ShaderProg> pass1SProg;
+						auto_ptr<ShaderProg> pass2SProg;
+						const ShaderProg::UniVar* pass0SProgFaiUniVar;
+						const ShaderProg::UniVar* pass1SProgFaiUniVar;
+						const ShaderProg::UniVar* pass2SProgFaiUniVar;
 
 						void initFbos(Fbo& fbo, Texture& fai, int internalFormat);
 						void init();
@@ -264,32 +263,20 @@ class Renderer
 					PROPERTY_R(float, bluringQuality, getBluringQuality)
 
 					private:
-						Fbo pass0Fbo, pass1Fbo, pass2Fbo;
+						Fbo pass0Fbo;
+						Fbo pass1Fbo;
+						Fbo pass2Fbo;
 						uint width, height, bwidth, bheight;
 						Texture* noiseMap;
-
-						class SsaoShaderProg: public ShaderProg
-						{
-							public:
-								struct
-								{
-									const ShaderProg::UniVar* camerarange;
-									const ShaderProg::UniVar* msDepthFai;
-									const ShaderProg::UniVar* noiseMap;
-									const ShaderProg::UniVar* msNormalFai;
-								} uniVars;
-						};
-						SsaoShaderProg ssaoSProg;
-
-						class BlurSProg: public ShaderProg
-						{
-							public:
-								struct
-								{
-									const ShaderProg::UniVar* fai;
-								} uniVars;
-						};
-						BlurSProg blurSProg, blurSProg2;
+						ShaderProg* ssaoSProg;
+						ShaderProg* blurSProg;
+						ShaderProg* blurSProg2;
+						const ShaderProg::UniVar* camerarangeUniVar;
+						const ShaderProg::UniVar* msDepthFaiUniVar;
+						const ShaderProg::UniVar* noiseMapUniVar;
+						const ShaderProg::UniVar* msNormalFaiUniVar;
+						const ShaderProg::UniVar* blurSProgFaiUniVar;
+						const ShaderProg::UniVar* blurSProg2FaiUniVar;
 
 						void initBlurFbo(Fbo& fbo, Texture& fai);
 						void init();

+ 27 - 20
src/Renderer/Ssao.cpp

@@ -82,18 +82,25 @@ void Renderer::Pps::Ssao::init()
 	// Shaders
 	//
 
-	ssaoSProg.customLoad("shaders/PpsSsao.glsl");
-	blurSProg.customLoad("shaders/PpsSsaoBlur.glsl", ("#define _PPS_SSAO_PASS_0_\n#define PASS0_FAI_WIDTH " +
-	                      Util::floatToStr(width) + "\n").c_str());
-	blurSProg2.customLoad("shaders/PpsSsaoBlur.glsl", ("#define _PPS_SSAO_PASS_1_\n#define PASS1_FAI_HEIGHT " +
-	                       Util::floatToStr(bheight) + "\n").c_str());
+	ssaoSProg = Resource::shaders.load("shaders/PpsSsao.glsl");
 
-	ssaoSProg.uniVars.camerarange = ssaoSProg.findUniVar("camerarange");
-	ssaoSProg.uniVars.msDepthFai = ssaoSProg.findUniVar("msDepthFai");
-	ssaoSProg.uniVars.noiseMap = ssaoSProg.findUniVar("noiseMap");
-	ssaoSProg.uniVars.msNormalFai = ssaoSProg.findUniVar("msNormalFai");
-	blurSProg.uniVars.fai = blurSProg.findUniVar("tex"); /// @todo rename the tex in the shader
-	blurSProg2.uniVars.fai = blurSProg2.findUniVar("tex"); /// @todo rename the tex in the shader
+	string pps = "#define _PPS_SSAO_PASS_0_\n#define PASS0_FAI_WIDTH " + Util::floatToStr(width) + "\n";
+	string prefix = "Pass0Width" + Util::floatToStr(width);
+	blurSProg = Resource::shaders.load(ShaderProg::createSrcCodeToCache("shaders/PpsSsaoBlur.glsl", pps.c_str(),
+	                                                                    prefix.c_str()).c_str());
+
+
+	pps = "#define _PPS_SSAO_PASS_1_\n#define PASS1_FAI_HEIGHT " + Util::floatToStr(bheight) + "\n";
+	prefix = "Pass1Height" + Util::floatToStr(bheight);
+	blurSProg2 = Resource::shaders.load(ShaderProg::createSrcCodeToCache("shaders/PpsSsaoBlur.glsl", pps.c_str(),
+	                                                                    prefix.c_str()).c_str());
+
+	camerarangeUniVar = ssaoSProg->findUniVar("camerarange");
+	msDepthFaiUniVar = ssaoSProg->findUniVar("msDepthFai");
+	noiseMapUniVar = ssaoSProg->findUniVar("noiseMap");
+	msNormalFaiUniVar = ssaoSProg->findUniVar("msNormalFai");
+	blurSProgFaiUniVar = blurSProg->findUniVar("tex"); /// @todo rename the tex in the shader
+	blurSProg2FaiUniVar = blurSProg2->findUniVar("tex"); /// @todo rename the tex in the shader
 
 
 	//
@@ -131,12 +138,12 @@ void Renderer::Pps::Ssao::run()
 	// 1st pass
 	Renderer::setViewport(0, 0, width, height);
 	pass0Fbo.bind();
-	ssaoSProg.bind();
+	ssaoSProg->bind();
 	Vec2 camRange(cam.getZNear(), cam.getZFar());
-	ssaoSProg.uniVars.camerarange->setVec2(&camRange);
-	ssaoSProg.uniVars.msDepthFai->setTexture(r.ms.depthFai, 0);
-	ssaoSProg.uniVars.noiseMap->setTexture(*noiseMap, 1);
-	ssaoSProg.uniVars.msNormalFai->setTexture(r.ms.normalFai, 2);
+	camerarangeUniVar->setVec2(&camRange);
+	msDepthFaiUniVar->setTexture(r.ms.depthFai, 0);
+	noiseMapUniVar->setTexture(*noiseMap, 1);
+	msNormalFaiUniVar->setTexture(r.ms.normalFai, 2);
 	Renderer::drawQuad(0);
 
 	// for 2nd and 3rd passes
@@ -144,14 +151,14 @@ void Renderer::Pps::Ssao::run()
 
 	// 2nd pass
 	pass1Fbo.bind();
-	blurSProg.bind();
-	blurSProg.uniVars.fai->setTexture(pass0Fai, 0);
+	blurSProg->bind();
+	blurSProgFaiUniVar->setTexture(pass0Fai, 0);
 	Renderer::drawQuad(0);
 
 	// 3rd pass
 	pass2Fbo.bind();
-	blurSProg2.bind();
-	blurSProg2.uniVars.fai->setTexture(pass1Fai, 0);
+	blurSProg2->bind();
+	blurSProg2FaiUniVar->setTexture(pass1Fai, 0);
 	Renderer::drawQuad(0);
 
 	// end

+ 7 - 2
src/Resources/Mesh.cpp

@@ -262,8 +262,13 @@ void Mesh::createVertTangents()
 
 
 		float det = (uvedge01.y * uvedge02.x) - (uvedge01.x * uvedge02.y);
-		DEBUG_ERR(isZero(det));
-		det = 1.0f / det;
+		if(isZero(det))
+		{
+			ERROR("det == " << fixed << det);
+			det = 0.0001;
+		}
+		else
+			det = 1.0 / det;
 
 		Vec3 t = (edge02 * uvedge01.y - edge01 * uvedge02.y) * det;
 		Vec3 b = (edge02 * uvedge01.x - edge01 * uvedge02.x) * det;

+ 0 - 1
src/Resources/Resource.cpp

@@ -17,4 +17,3 @@ ResourceContainer<Mesh>       Resource::meshes;
 ResourceContainer<Skeleton>   Resource::skeletons;
 ResourceContainer<SkelAnim>   Resource::skelAnims;
 ResourceContainer<LightProps> Resource::lightProps;
-

+ 25 - 3
src/Resources/Resource.h

@@ -49,9 +49,31 @@ class Resource
 		 * @return True on success
 		 */
 		virtual bool load(const char* filename) = 0;
-		virtual void unload() = 0;
 
-		Resource(): usersNum(0) {}
-		virtual ~Resource() {};
+		/**
+		 * Dont make it pure virtual because the destructor calls it
+		 */
+		virtual void unload();
+
+		Resource();
+		virtual ~Resource();
 };
+
+
+inline Resource::Resource():
+	usersNum(0)
+{}
+
+
+inline Resource::~Resource()
+{
+	unload();
+}
+
+
+inline void Resource::unload()
+{
+	FATAL("You have to reimplement this");
+}
+
 #endif