Bladeren bron

- Added a Helper dir inside the Resources for classes that are not resources but used by a resource
- Moved ShaderPrePreprocessor.* to Helpers dir
- Moved the code of Image from Texture.* to a seperate file inside the Helpers
- WIP to remove the glUniform* from the new renderer and replace it with wrapper funcs located in ShaderProg::UniVar

Panagiotis Christopoulos Charitos 15 jaren geleden
bovenliggende
commit
3177e03e8f

+ 30 - 22
build/debug/Makefile

@@ -3,9 +3,9 @@ CFLAGS = -c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -pipe -O0 -g3 -pg
 PHFLAGS = -c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -pipe -O0 -g3 -pg -fsingle-precision-constant -D_DEBUG_ -D_TERMINAL_COLORING__ -DPLATFORM=LINUX -DREVISION=\"`svnversion -c ../..`\"  -x 
 LFLAGS = -rdynamic -L../../../SDL-hg/build/.libs -L../../../glew/lib -L../../../bullet_svn/src/BulletSoftBody -L../../../bullet_svn/src/BulletDynamics -L../../../bullet_svn/src/BulletCollision -L../../../bullet_svn/src/LinearMath -Wl,-Bstatic -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath -lGLEW -lSDL_image -lGLU -lSDL -Wl,-Bdynamic -lGL -ljpeg -lpng -ltiff
 EXECUTABLE = AnKi.bin
-INCPATH = -I../../src/Math/ -I../../src/Util/Tokenizer/ -I../../src/Misc/ -I../../src/ -I../../src/Renderer/ -I../../src/Scene/ -I../../src/Ui/ -I../../src/Resources/ -I../../src/Util/ -I../../src/Scene/Controllers/ -I../../src/Physics/ -I../../src/Renderer/BufferObjects/ -I../../src/Renderer2/ -I../../../bullet_svn/src/ -I../../../SDL-hg/include -I../../glew/include 
-SOURCES = ../../src/Util/Tokenizer//Scanner.cpp ../../src/Misc//skybox.cpp ../../src/Misc//particles.cpp ../../src/Misc//memory.cpp ../../src/Misc//collision.cpp ../../src/Misc//map.cpp ../../src//Main.cpp ../../src/Renderer//PpsHdr.cpp ../../src/Renderer//Pps.cpp ../../src/Renderer//Bs.cpp ../../src/Renderer//IsShadows.cpp ../../src/Renderer//MsEarlyz.cpp ../../src/Renderer//Renderer.cpp ../../src/Renderer//Is.cpp ../../src/Renderer//PpsLscatt.cpp ../../src/Renderer//Ms.cpp ../../src/Renderer//BulletDebuger.cpp ../../src/Renderer//Bs2.cpp ../../src/Renderer//PpsSsao.cpp ../../src/Renderer//Dbg.cpp ../../src/Scene//MeshNode.cpp ../../src/Scene//SkelNode.cpp ../../src/Scene//SkelModelNode.cpp ../../src/Scene//Light.cpp ../../src/Scene//Camera.cpp ../../src/Scene//Scene.cpp ../../src/Scene//ParticleEmitter.cpp ../../src/Scene//SceneNode.cpp ../../src/Ui//Ui.cpp ../../src/Resources//Material.cpp ../../src/Resources//ShaderProg.cpp ../../src/Resources//Texture.cpp ../../src/Resources//SkelAnim.cpp ../../src/Resources//Extension.cpp ../../src/Resources//Skeleton.cpp ../../src/Resources//ShaderPrePreprocessor.cpp ../../src/Resources//Resource.cpp ../../src/Resources//LightProps.cpp ../../src/Resources//Mesh.cpp ../../src/Util//Input.cpp ../../src/Util//App.cpp ../../src/Util//Common.cpp ../../src/Util//Util.cpp ../../src/Scene/Controllers//Controller.cpp ../../src/Scene/Controllers//SkelAnimCtrl.cpp ../../src/Physics//PhyWorld.cpp ../../src/Renderer2//Ms.cpp ../../src/Renderer2//Hdr.cpp ../../src/Renderer2//Is.cpp ../../src/Renderer2//Ssao.cpp ../../src/Renderer2//Renderer.cpp ../../src/Renderer2//Sm.cpp ../../src/Renderer2//Pps.cpp ../../src/Renderer2//MainRenderer.cpp ../../src/Renderer2//Dbg.cpp 
-OBJECTS = Scanner.o skybox.o particles.o memory.o collision.o map.o Main.o PpsHdr.o Pps.o Bs.o IsShadows.o MsEarlyz.o Renderer.o Is.o PpsLscatt.o Ms.o BulletDebuger.o Bs2.o PpsSsao.o Dbg.o MeshNode.o SkelNode.o SkelModelNode.o Light.o Camera.o Scene.o ParticleEmitter.o SceneNode.o Ui.o Material.o ShaderProg.o Texture.o SkelAnim.o Extension.o Skeleton.o ShaderPrePreprocessor.o Resource.o LightProps.o Mesh.o Input.o App.o Common.o Util.o Controller.o SkelAnimCtrl.o PhyWorld.o 96.Ms.o Hdr.o 68.Is.o Ssao.o 17.Renderer.o Sm.o 29.Pps.o MainRenderer.o 9.Dbg.o 
+INCPATH = -I../../src/Math/ -I../../src/Util/Tokenizer/ -I../../src/Misc/ -I../../src/ -I../../src/Renderer/ -I../../src/Scene/ -I../../src/Ui/ -I../../src/Resources/ -I../../src/Util/ -I../../src/Scene/Controllers/ -I../../src/Physics/ -I../../src/Renderer/BufferObjects/ -I../../src/Renderer2/ -I../../src/Resources/Helpers/ -I../../../bullet_svn/src/ -I../../../SDL-hg/include -I../../glew/include 
+SOURCES = ../../src/Util/Tokenizer//Scanner.cpp ../../src/Misc//skybox.cpp ../../src/Misc//particles.cpp ../../src/Misc//memory.cpp ../../src/Misc//collision.cpp ../../src/Misc//map.cpp ../../src//Main.cpp ../../src/Renderer//PpsHdr.cpp ../../src/Renderer//Pps.cpp ../../src/Renderer//Bs.cpp ../../src/Renderer//IsShadows.cpp ../../src/Renderer//MsEarlyz.cpp ../../src/Renderer//Renderer.cpp ../../src/Renderer//Is.cpp ../../src/Renderer//PpsLscatt.cpp ../../src/Renderer//Ms.cpp ../../src/Renderer//BulletDebuger.cpp ../../src/Renderer//Bs2.cpp ../../src/Renderer//PpsSsao.cpp ../../src/Renderer//Dbg.cpp ../../src/Scene//MeshNode.cpp ../../src/Scene//SkelNode.cpp ../../src/Scene//SkelModelNode.cpp ../../src/Scene//Light.cpp ../../src/Scene//Camera.cpp ../../src/Scene//Scene.cpp ../../src/Scene//ParticleEmitter.cpp ../../src/Scene//SceneNode.cpp ../../src/Ui//Ui.cpp ../../src/Resources//Material.cpp ../../src/Resources//ShaderProg.cpp ../../src/Resources//Texture.cpp ../../src/Resources//SkelAnim.cpp ../../src/Resources//Extension.cpp ../../src/Resources//Skeleton.cpp ../../src/Resources//Resource.cpp ../../src/Resources//LightProps.cpp ../../src/Resources//Mesh.cpp ../../src/Util//Input.cpp ../../src/Util//App.cpp ../../src/Util//Common.cpp ../../src/Util//Util.cpp ../../src/Scene/Controllers//Controller.cpp ../../src/Scene/Controllers//SkelAnimCtrl.cpp ../../src/Physics//PhyWorld.cpp ../../src/Renderer2//Ms.cpp ../../src/Renderer2//Hdr.cpp ../../src/Renderer2//Is.cpp ../../src/Renderer2//Ssao.cpp ../../src/Renderer2//Renderer.cpp ../../src/Renderer2//Sm.cpp ../../src/Renderer2//Pps.cpp ../../src/Renderer2//MainRenderer.cpp ../../src/Renderer2//Dbg.cpp ../../src/Resources/Helpers//ShaderPrePreprocessor.cpp ../../src/Resources/Helpers//Image.cpp 
+OBJECTS = Scanner.o skybox.o particles.o memory.o collision.o map.o Main.o PpsHdr.o Pps.o Bs.o IsShadows.o MsEarlyz.o Renderer.o Is.o PpsLscatt.o Ms.o BulletDebuger.o Bs2.o PpsSsao.o Dbg.o MeshNode.o SkelNode.o SkelModelNode.o Light.o Camera.o Scene.o ParticleEmitter.o SceneNode.o Ui.o Material.o ShaderProg.o Texture.o SkelAnim.o Extension.o Skeleton.o Resource.o LightProps.o Mesh.o Input.o App.o Common.o Util.o Controller.o SkelAnimCtrl.o PhyWorld.o 76.Ms.o Hdr.o 13.Is.o Ssao.o 25.Renderer.o Sm.o 1.Pps.o MainRenderer.o 4.Dbg.o ShaderPrePreprocessor.o Image.o 
 PRECOMPILED_HEADERS = 
 
 all: $(PRECOMPILED_HEADERS) $(SOURCES) $(EXECUTABLE)
@@ -3169,7 +3169,7 @@ ShaderProg.o: ../../src/Resources//ShaderProg.cpp \
  ../../src/Math/Transform.inl.h ../../src/Renderer/Renderer.h \
  ../../src/Resources/ShaderProg.h ../../src/Scene/Camera.h \
  ../../src/Misc/collision.h ../../src/Scene/SceneNode.h \
- ../../src/Resources//ShaderPrePreprocessor.h \
+ ../../src/Resources/Helpers/ShaderPrePreprocessor.h \
  ../../src/Resources//Texture.h
 	@echo Compiling ../../src/Resources//ShaderProg.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Resources//ShaderProg.cpp -o ShaderProg.o
@@ -3241,14 +3241,6 @@ Skeleton.o: ../../src/Resources//Skeleton.cpp \
 	@echo Compiling ../../src/Resources//Skeleton.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Resources//Skeleton.cpp -o Skeleton.o
 
-ShaderPrePreprocessor.o: ../../src/Resources//ShaderPrePreprocessor.cpp \
- ../../src/Resources//ShaderPrePreprocessor.h ../../src/Util/Common.h \
- ../../src/Misc/memory.h ../../src/Util/Tokenizer/Scanner.h \
- ../../src/Util/Tokenizer/Parser.h ../../src/Util/Tokenizer/Scanner.h \
- ../../src/Util/Util.h ../../src/Util/Common.h
-	@echo Compiling ../../src/Resources//ShaderPrePreprocessor.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Resources//ShaderPrePreprocessor.cpp -o ShaderPrePreprocessor.o
-
 Resource.o: ../../src/Resources//Resource.cpp \
  ../../src/Resources//Resource.h ../../src/Util/Common.h \
  ../../src/Misc/memory.h ../../src/Util/Util.h ../../src/Util/Common.h \
@@ -3899,7 +3891,7 @@ PhyWorld.o: ../../src/Physics//PhyWorld.cpp ../../src/Physics//PhyWorld.h \
 	@echo Compiling ../../src/Physics//PhyWorld.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Physics//PhyWorld.cpp -o PhyWorld.o
 
-96.Ms.o: ../../src/Renderer2//Ms.cpp ../../src/Renderer2//Renderer.hpp \
+76.Ms.o: ../../src/Renderer2//Ms.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
  ../../src/Math/Vec2.h ../../src/Math/MathForwardDecls.h \
  ../../src/Math/Vec2.inl.h ../../src/Math/MathDfltHeader.h \
@@ -4079,7 +4071,7 @@ PhyWorld.o: ../../src/Physics//PhyWorld.cpp ../../src/Physics//PhyWorld.h \
  ../../src/Scene/SceneNode.h ../../src/Scene/MeshNode.h \
  ../../src/Resources/Material.h ../../src/Resources/ShaderProg.h
 	@echo Compiling ../../src/Renderer2//Ms.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Ms.cpp -o 96.Ms.o
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Ms.cpp -o 76.Ms.o
 
 Hdr.o: ../../src/Renderer2//Hdr.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
@@ -4100,7 +4092,7 @@ Hdr.o: ../../src/Renderer2//Hdr.cpp ../../src/Renderer2//Renderer.hpp \
 	@echo Compiling ../../src/Renderer2//Hdr.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Hdr.cpp -o Hdr.o
 
-68.Is.o: ../../src/Renderer2//Is.cpp ../../src/Renderer2//Renderer.hpp \
+13.Is.o: ../../src/Renderer2//Is.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
  ../../src/Math/Vec2.h ../../src/Math/MathForwardDecls.h \
  ../../src/Math/Vec2.inl.h ../../src/Math/MathDfltHeader.h \
@@ -4280,7 +4272,7 @@ Hdr.o: ../../src/Renderer2//Hdr.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Physics/PhyConversions.h ../../src/Physics/MotionState.h \
  ../../src/Scene/SceneNode.h ../../src/Physics/PhyWorld.h
 	@echo Compiling ../../src/Renderer2//Is.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Is.cpp -o 68.Is.o
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Is.cpp -o 13.Is.o
 
 Ssao.o: ../../src/Renderer2//Ssao.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
@@ -4302,7 +4294,7 @@ Ssao.o: ../../src/Renderer2//Ssao.cpp ../../src/Renderer2//Renderer.hpp \
 	@echo Compiling ../../src/Renderer2//Ssao.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Ssao.cpp -o Ssao.o
 
-17.Renderer.o: ../../src/Renderer2//Renderer.cpp \
+25.Renderer.o: ../../src/Renderer2//Renderer.cpp \
  ../../src/Renderer2//Renderer.hpp ../../src/Util/Common.h \
  ../../src/Misc/memory.h ../../src/Math/Math.h ../../src/Math/Vec2.h \
  ../../src/Math/MathForwardDecls.h ../../src/Math/Vec2.inl.h \
@@ -4322,7 +4314,7 @@ Ssao.o: ../../src/Renderer2//Ssao.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Misc/collision.h ../../src/Scene/SceneNode.h \
  ../../src/Renderer2//RendererInitializer.h
 	@echo Compiling ../../src/Renderer2//Renderer.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Renderer.cpp -o 17.Renderer.o
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Renderer.cpp -o 25.Renderer.o
 
 Sm.o: ../../src/Renderer2//Sm.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
@@ -4505,7 +4497,7 @@ Sm.o: ../../src/Renderer2//Sm.cpp ../../src/Renderer2//Renderer.hpp \
 	@echo Compiling ../../src/Renderer2//Sm.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Sm.cpp -o Sm.o
 
-29.Pps.o: ../../src/Renderer2//Pps.cpp ../../src/Renderer2//Renderer.hpp \
+1.Pps.o: ../../src/Renderer2//Pps.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
  ../../src/Math/Vec2.h ../../src/Math/MathForwardDecls.h \
  ../../src/Math/Vec2.inl.h ../../src/Math/MathDfltHeader.h \
@@ -4522,7 +4514,7 @@ Sm.o: ../../src/Renderer2//Sm.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Util.h ../../src/Util/Common.h \
  ../../src/Resources/ShaderProg.h
 	@echo Compiling ../../src/Renderer2//Pps.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Pps.cpp -o 29.Pps.o
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Pps.cpp -o 1.Pps.o
 
 MainRenderer.o: ../../src/Renderer2//MainRenderer.cpp \
  ../../src/Renderer2//MainRenderer.h ../../src/Util/Common.h \
@@ -4570,7 +4562,7 @@ MainRenderer.o: ../../src/Renderer2//MainRenderer.cpp \
 	@echo Compiling ../../src/Renderer2//MainRenderer.cpp...
 	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//MainRenderer.cpp -o MainRenderer.o
 
-9.Dbg.o: ../../src/Renderer2//Dbg.cpp ../../src/Renderer2//Renderer.hpp \
+4.Dbg.o: ../../src/Renderer2//Dbg.cpp ../../src/Renderer2//Renderer.hpp \
  ../../src/Util/Common.h ../../src/Misc/memory.h ../../src/Math/Math.h \
  ../../src/Math/Vec2.h ../../src/Math/MathForwardDecls.h \
  ../../src/Math/Vec2.inl.h ../../src/Math/MathDfltHeader.h \
@@ -4749,7 +4741,23 @@ MainRenderer.o: ../../src/Renderer2//MainRenderer.cpp \
  ../../src/Scene/SkelNode.h ../../src/Scene/SceneNode.h \
  ../../src/Scene/Controllers/Controller.h
 	@echo Compiling ../../src/Renderer2//Dbg.cpp...
-	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Dbg.cpp -o 9.Dbg.o
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Renderer2//Dbg.cpp -o 4.Dbg.o
+
+ShaderPrePreprocessor.o: \
+ ../../src/Resources/Helpers//ShaderPrePreprocessor.cpp \
+ ../../src/Resources/Helpers//ShaderPrePreprocessor.h \
+ ../../src/Util/Common.h ../../src/Misc/memory.h \
+ ../../src/Util/Tokenizer/Scanner.h ../../src/Util/Tokenizer/Parser.h \
+ ../../src/Util/Tokenizer/Scanner.h ../../src/Util/Util.h \
+ ../../src/Util/Common.h
+	@echo Compiling ../../src/Resources/Helpers//ShaderPrePreprocessor.cpp...
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Resources/Helpers//ShaderPrePreprocessor.cpp -o ShaderPrePreprocessor.o
+
+Image.o: ../../src/Resources/Helpers//Image.cpp \
+ ../../src/Resources/Helpers//Image.h ../../src/Util/Common.h \
+ ../../src/Misc/memory.h
+	@echo Compiling ../../src/Resources/Helpers//Image.cpp...
+	@$(CXX) $(INCPATH) $(CFLAGS) ../../src/Resources/Helpers//Image.cpp -o Image.o
 
 clean:
 	rm -f *.o

+ 1 - 1
build/debug/gen.cfg.py

@@ -1,4 +1,4 @@
-sourcePaths = [ "../../src/Math/", "../../src/Util/Tokenizer/", "../../src/Misc/", "../../src/", "../../src/Renderer/", "../../src/Scene/", "../../src/Ui/", "../../src/Resources/", "../../src/Util/", "../../src/Scene/Controllers/", "../../src/Physics/", "../../src/Renderer/BufferObjects/", "../../src/Renderer2/" ]
+sourcePaths = [ "../../src/Math/", "../../src/Util/Tokenizer/", "../../src/Misc/", "../../src/", "../../src/Renderer/", "../../src/Scene/", "../../src/Ui/", "../../src/Resources/", "../../src/Util/", "../../src/Scene/Controllers/", "../../src/Physics/", "../../src/Renderer/BufferObjects/", "../../src/Renderer2/", "../../src/Resources/Helpers/" ]
 
 includePaths = list(sourcePaths)
 #includePaths.extend( [ "../../../bullet_svn/src/", "/usr/include/SDL" ] )

+ 2 - 1
docs/Doxyfile

@@ -1267,7 +1267,8 @@ INCLUDE_PATH           = ../src/Util
 # directories. If left blank, the patterns specified with FILE_PATTERNS will 
 # be used.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  = *.h \
+                         *.hpp
 
 # The PREDEFINED tag can be used to specify one or more macro names that 
 # are defined before the preprocessor is started (similar to the -D option of 

+ 60 - 62
src/Renderer2/Is.cpp

@@ -35,9 +35,8 @@ void Renderer::Is::renderSMOUvS( const PointLight& light )
 
 	/// @todo Replace the rendering code. Use shader prog
 
-	/// @todo correct the bellow
-	/*R::multMatrix( Mat4( light.getWorldTransform().getOrigin(), Mat3::getIdentity(), light.radius*scale ) );
-	R::noShaders();*/
+	r.multMatrix( Mat4( light.getWorldTransform().getOrigin(), Mat3::getIdentity(), light.radius*scale ) );
+	Renderer::noShaders();
 
 	glBindBuffer( GL_ARRAY_BUFFER, sMOUvSVboId );
 	glEnableClientState( GL_VERTEX_ARRAY );
@@ -136,46 +135,46 @@ void Renderer::Is::init()
 
 	// load the shaders
 	ambientPassSProg.customLoad( "shaders/is_ap.glsl" );
-	ambientPassSProg.uniLocs.ambientCol = ambientPassSProg.findUniVar("ambientCol")->getLoc();
-	ambientPassSProg.uniLocs.sceneColMap = ambientPassSProg.findUniVar("sceneColMap")->getLoc();
+	ambientPassSProg.uniVars.ambientCol = ambientPassSProg.findUniVar("ambientCol");
+	ambientPassSProg.uniVars.sceneColMap = ambientPassSProg.findUniVar("sceneColMap");
 
 	pointLightSProg.customLoad( "shaders/is_lp_generic.glsl", "#define _POINT_LIGHT_\n" );
-	pointLightSProg.uniLocs.msNormalFai = pointLightSProg.findUniVar("msNormalFai")->getLoc();
-	pointLightSProg.uniLocs.msDiffuseFai = pointLightSProg.findUniVar("msDiffuseFai")->getLoc();
-	pointLightSProg.uniLocs.msSpecularFai = pointLightSProg.findUniVar("msSpecularFai")->getLoc();
-	pointLightSProg.uniLocs.msDepthFai = pointLightSProg.findUniVar("msDepthFai")->getLoc();
-	pointLightSProg.uniLocs.planes = pointLightSProg.findUniVar("planes")->getLoc();
-	pointLightSProg.uniLocs.lightPos = pointLightSProg.findUniVar("lightPos")->getLoc();
-	pointLightSProg.uniLocs.lightInvRadius = pointLightSProg.findUniVar("lightInvRadius")->getLoc();
-	pointLightSProg.uniLocs.lightDiffuseCol = pointLightSProg.findUniVar("lightDiffuseCol")->getLoc();
-	pointLightSProg.uniLocs.lightSpecularCol = pointLightSProg.findUniVar("lightSpecularCol")->getLoc();
+	pointLightSProg.uniVars.msNormalFai = pointLightSProg.findUniVar("msNormalFai");
+	pointLightSProg.uniVars.msDiffuseFai = pointLightSProg.findUniVar("msDiffuseFai");
+	pointLightSProg.uniVars.msSpecularFai = pointLightSProg.findUniVar("msSpecularFai");
+	pointLightSProg.uniVars.msDepthFai = pointLightSProg.findUniVar("msDepthFai");
+	pointLightSProg.uniVars.planes = pointLightSProg.findUniVar("planes");
+	pointLightSProg.uniVars.lightPos = pointLightSProg.findUniVar("lightPos");
+	pointLightSProg.uniVars.lightInvRadius = pointLightSProg.findUniVar("lightInvRadius");
+	pointLightSProg.uniVars.lightDiffuseCol = pointLightSProg.findUniVar("lightDiffuseCol");
+	pointLightSProg.uniVars.lightSpecularCol = pointLightSProg.findUniVar("lightSpecularCol");
 
 	spotLightNoShadowSProg.customLoad( "shaders/is_lp_generic.glsl", "#define _SPOT_LIGHT_\n" );
-	spotLightNoShadowSProg.uniLocs.msNormalFai = spotLightNoShadowSProg.findUniVar("msNormalFai")->getLoc();
-	spotLightNoShadowSProg.uniLocs.msDiffuseFai = spotLightNoShadowSProg.findUniVar("msDiffuseFai")->getLoc();
-	spotLightNoShadowSProg.uniLocs.msSpecularFai = spotLightNoShadowSProg.findUniVar("msSpecularFai")->getLoc();
-	spotLightNoShadowSProg.uniLocs.msDepthFai = spotLightNoShadowSProg.findUniVar("msDepthFai")->getLoc();
-	spotLightNoShadowSProg.uniLocs.planes = spotLightNoShadowSProg.findUniVar("planes")->getLoc();
-	spotLightNoShadowSProg.uniLocs.lightPos = spotLightNoShadowSProg.findUniVar("lightPos")->getLoc();
-	spotLightNoShadowSProg.uniLocs.lightInvRadius = spotLightNoShadowSProg.findUniVar("lightInvRadius")->getLoc();
-	spotLightNoShadowSProg.uniLocs.lightDiffuseCol = spotLightNoShadowSProg.findUniVar("lightDiffuseCol")->getLoc();
-	spotLightNoShadowSProg.uniLocs.lightSpecularCol = spotLightNoShadowSProg.findUniVar("lightSpecularCol")->getLoc();
-	spotLightNoShadowSProg.uniLocs.lightTex = spotLightNoShadowSProg.findUniVar("lightTex")->getLoc();
-	spotLightNoShadowSProg.uniLocs.texProjectionMat = spotLightNoShadowSProg.findUniVar("texProjectionMat")->getLoc();
+	spotLightNoShadowSProg.uniVars.msNormalFai = spotLightNoShadowSProg.findUniVar("msNormalFai");
+	spotLightNoShadowSProg.uniVars.msDiffuseFai = spotLightNoShadowSProg.findUniVar("msDiffuseFai");
+	spotLightNoShadowSProg.uniVars.msSpecularFai = spotLightNoShadowSProg.findUniVar("msSpecularFai");
+	spotLightNoShadowSProg.uniVars.msDepthFai = spotLightNoShadowSProg.findUniVar("msDepthFai");
+	spotLightNoShadowSProg.uniVars.planes = spotLightNoShadowSProg.findUniVar("planes");
+	spotLightNoShadowSProg.uniVars.lightPos = spotLightNoShadowSProg.findUniVar("lightPos");
+	spotLightNoShadowSProg.uniVars.lightInvRadius = spotLightNoShadowSProg.findUniVar("lightInvRadius");
+	spotLightNoShadowSProg.uniVars.lightDiffuseCol = spotLightNoShadowSProg.findUniVar("lightDiffuseCol");
+	spotLightNoShadowSProg.uniVars.lightSpecularCol = spotLightNoShadowSProg.findUniVar("lightSpecularCol");
+	spotLightNoShadowSProg.uniVars.lightTex = spotLightNoShadowSProg.findUniVar("lightTex");
+	spotLightNoShadowSProg.uniVars.texProjectionMat = spotLightNoShadowSProg.findUniVar("texProjectionMat");
 
 	spotLightShadowSProg.customLoad( "shaders/is_lp_generic.glsl", "#define _SPOT_LIGHT_\n#define _SHADOW_\n" );
-	spotLightShadowSProg.uniLocs.msNormalFai = spotLightShadowSProg.findUniVar("msNormalFai")->getLoc();
-	spotLightShadowSProg.uniLocs.msDiffuseFai = spotLightShadowSProg.findUniVar("msDiffuseFai")->getLoc();
-	spotLightShadowSProg.uniLocs.msSpecularFai = spotLightShadowSProg.findUniVar("msSpecularFai")->getLoc();
-	spotLightShadowSProg.uniLocs.msDepthFai = spotLightShadowSProg.findUniVar("msDepthFai")->getLoc();
-	spotLightShadowSProg.uniLocs.planes = spotLightShadowSProg.findUniVar("planes")->getLoc();
-	spotLightShadowSProg.uniLocs.lightPos = spotLightShadowSProg.findUniVar("lightPos")->getLoc();
-	spotLightShadowSProg.uniLocs.lightInvRadius = spotLightShadowSProg.findUniVar("lightInvRadius")->getLoc();
-	spotLightShadowSProg.uniLocs.lightDiffuseCol = spotLightShadowSProg.findUniVar("lightDiffuseCol")->getLoc();
-	spotLightShadowSProg.uniLocs.lightSpecularCol = spotLightShadowSProg.findUniVar("lightSpecularCol")->getLoc();
-	spotLightShadowSProg.uniLocs.lightTex = spotLightShadowSProg.findUniVar("lightTex")->getLoc();
-	spotLightShadowSProg.uniLocs.texProjectionMat = spotLightShadowSProg.findUniVar("texProjectionMat")->getLoc();
-	spotLightShadowSProg.uniLocs.shadowMap = spotLightShadowSProg.findUniVar("shadowMap")->getLoc();
+	spotLightShadowSProg.uniVars.msNormalFai = spotLightShadowSProg.findUniVar("msNormalFai");
+	spotLightShadowSProg.uniVars.msDiffuseFai = spotLightShadowSProg.findUniVar("msDiffuseFai");
+	spotLightShadowSProg.uniVars.msSpecularFai = spotLightShadowSProg.findUniVar("msSpecularFai");
+	spotLightShadowSProg.uniVars.msDepthFai = spotLightShadowSProg.findUniVar("msDepthFai");
+	spotLightShadowSProg.uniVars.planes = spotLightShadowSProg.findUniVar("planes");
+	spotLightShadowSProg.uniVars.lightPos = spotLightShadowSProg.findUniVar("lightPos");
+	spotLightShadowSProg.uniVars.lightInvRadius = spotLightShadowSProg.findUniVar("lightInvRadius");
+	spotLightShadowSProg.uniVars.lightDiffuseCol = spotLightShadowSProg.findUniVar("lightDiffuseCol");
+	spotLightShadowSProg.uniVars.lightSpecularCol = spotLightShadowSProg.findUniVar("lightSpecularCol");
+	spotLightShadowSProg.uniVars.lightTex = spotLightShadowSProg.findUniVar("lightTex");
+	spotLightShadowSProg.uniVars.texProjectionMat = spotLightShadowSProg.findUniVar("texProjectionMat");
+	spotLightShadowSProg.uniVars.shadowMap = spotLightShadowSProg.findUniVar("shadowMap");
 
 
 	// init the rest
@@ -199,8 +198,8 @@ void Renderer::Is::ambientPass( const Vec3& color )
 	ambientPassSProg.bind();
 
 	// set the uniforms
-	glUniform3fv( ambientPassSProg.uniLocs.ambientCol, 1, &(const_cast<Vec3&>(color)[0]) );
-	ambientPassSProg.locTexUnit( ambientPassSProg.uniLocs.sceneColMap, r.ms.diffuseFai, 0 );
+	ambientPassSProg.uniVars.ambientCol->setVec3( &color );
+	ambientPassSProg.uniVars.sceneColMap->setTexture( r.ms.diffuseFai, 0 );
 
 	// Draw quad
 	r.drawQuad( 0 );
@@ -331,17 +330,17 @@ void Renderer::Is::pointLightPass( const PointLight& light )
 	shader.bind();
 
 	// bind the material stage framebuffer attachable images
-	shader.locTexUnit( shader.uniLocs.msDepthFai, r.ms.normalFai, 0 );
-	shader.locTexUnit( shader.uniLocs.msDiffuseFai, r.ms.diffuseFai, 1 );
-	shader.locTexUnit( shader.uniLocs.msSpecularFai, r.ms.specularFai, 2 );
-	shader.locTexUnit( shader.uniLocs.msDepthFai, r.ms.depthFai, 3 );
-	glUniform2fv( shader.uniLocs.planes, 1, &planes[0] );
+	shader.uniVars.msNormalFai->setTexture( r.ms.normalFai, 0 );
+	shader.uniVars.msDiffuseFai->setTexture( r.ms.diffuseFai, 1 );
+	shader.uniVars.msSpecularFai->setTexture( r.ms.specularFai, 2 );
+	shader.uniVars.msDepthFai->setTexture( r.ms.depthFai, 3 );
+	shader.uniVars.planes->setVec2( &planes );
 
 	Vec3 lightPosEyeSpace = light.getWorldTransform().getOrigin().getTransformed( cam.getViewMatrix() );
-	glUniform3fv( shader.uniLocs.lightPos, 1, &lightPosEyeSpace[0] );
-	glUniform1f( shader.uniLocs.lightInvRadius, 1.0/light.radius );
-	glUniform3fv( shader.uniLocs.lightDiffuseCol, 1, &Vec3(light.lightProps->getDiffuseColor())[0] );
-	glUniform3fv( shader.uniLocs.lightSpecularCol, 1, &Vec3(light.lightProps->getSpecularColor())[0] );
+	shader.uniVars.lightPos->setVec3( &lightPosEyeSpace );
+	shader.uniVars.lightInvRadius->setFloat( 1.0/light.radius );
+	shader.uniVars.lightDiffuseCol->setVec3( &light.lightProps->getDiffuseColor() );
+	shader.uniVars.lightSpecularCol->setVec3( &light.lightProps->getSpecularColor() );
 
 	// render quad
 	glEnableVertexAttribArray( 0 );
@@ -406,27 +405,26 @@ void Renderer::Is::spotLightPass( const SpotLight& light )
 	shdr->bind();
 
 	// bind the framebuffer attachable images
-	shdr->locTexUnit( shdr->uniLocs.msNormalFai, r.ms.normalFai, 0 );
-	shdr->locTexUnit( shdr->uniLocs.msDiffuseFai, r.ms.diffuseFai, 1 );
-	shdr->locTexUnit( shdr->uniLocs.msSpecularFai, r.ms.specularFai, 2 );
-	shdr->locTexUnit( shdr->uniLocs.msDepthFai, r.ms.depthFai, 3 );
+	shdr->uniVars.msNormalFai->setTexture( r.ms.normalFai, 0 );
+	shdr->uniVars.msDiffuseFai->setTexture( r.ms.diffuseFai, 1 );
+	shdr->uniVars.msSpecularFai->setTexture( r.ms.specularFai, 2 );
+	shdr->uniVars.msDepthFai->setTexture( r.ms.depthFai, 3 );
 
 	if( light.lightProps->getTexture() == NULL )
 		ERROR( "No texture is attached to the light. lightProps name: " << light.lightProps->getRsrcName() );
 
 	// the planes
-	//glUniform2fv( shdr->getUniLoc("planes"), 1, &planes[0] );
-	glUniform2fv( shdr->uniLocs.planes, 1, &planes[0] );
+	shdr->uniVars.planes->setVec2( &planes );
 
 	// the light params
-	Vec3 light_pos_eye_space = light.getWorldTransform().getOrigin().getTransformed( cam.getViewMatrix() );
-	glUniform3fv( shdr->uniLocs.lightPos, 1, &light_pos_eye_space[0] );
-	glUniform1f( shdr->uniLocs.lightInvRadius, 1.0/light.getDistance() );
-	glUniform3fv( shdr->uniLocs.lightDiffuseCol, 1, &Vec3(light.lightProps->getDiffuseColor())[0] );
-	glUniform3fv( shdr->uniLocs.lightSpecularCol, 1, &Vec3(light.lightProps->getSpecularColor())[0] );
+	Vec3 lightPosEyeSpace = light.getWorldTransform().getOrigin().getTransformed( cam.getViewMatrix() );
+	shdr->uniVars.lightPos->setVec3( &lightPosEyeSpace );
+	shdr->uniVars.lightInvRadius->setFloat( 1.0/light.getDistance() );
+	shdr->uniVars.lightDiffuseCol->setVec3( &light.lightProps->getDiffuseColor() );
+	shdr->uniVars.lightSpecularCol->setVec3( &light.lightProps->getSpecularColor() );
 
 	// set the light texture
-	shdr->locTexUnit( shdr->uniLocs.lightTex, *light.lightProps->getTexture(), 4 );
+	shdr->uniVars.lightTex->setTexture( *light.lightProps->getTexture(), 3 );
 	// before we render disable anisotropic in the light.texture because it produces artefacts. ToDo: see if this is unececeary in future drivers
 	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
 	glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
@@ -439,13 +437,13 @@ void Renderer::Is::spotLightPass( const SpotLight& light )
 	static Mat4 biasMat4( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 );
 	Mat4 texProjectionMat;
 	texProjectionMat = biasMat4 * light.camera.getProjectionMatrix() * light.camera.getViewMatrix() * Mat4(cam.getWorldTransform());
-	glUniformMatrix4fv( shdr->uniLocs.texProjectionMat, 1, true, &texProjectionMat[0] );
+	shdr->uniVars.texProjectionMat->setMat4( &texProjectionMat );
 
 	// the shadow stuff
 	// render depth to texture and then bind it
 	if( light.castsShadow && sm.enabled )
 	{
-		shdr->locTexUnit( shdr->uniLocs.shadowMap, sm.shadowMap, 5 );
+		shdr->uniVars.shadowMap->setTexture( sm.shadowMap, 5 );
 	}
 
 	//

+ 16 - 4
src/Renderer2/Renderer.hpp

@@ -106,8 +106,9 @@ class Renderer
 					public:
 						struct
 						{
-							int ambientCol, sceneColMap;
-						}uniLocs;
+							const ShaderProg::UniVar* ambientCol;
+							const ShaderProg::UniVar* sceneColMap;
+						} uniVars;
 				};
 				/// Illumination stage light pass shader program
 				class LightShaderProg: public ShaderProg
@@ -115,8 +116,19 @@ class Renderer
 					public:
 						struct
 						{
-							int msNormalFai, msDiffuseFai, msSpecularFai, msDepthFai, planes, lightPos, lightInvRadius, lightDiffuseCol, lightSpecularCol, lightTex, texProjectionMat, shadowMap;
-						} uniLocs;
+							const ShaderProg::UniVar* msNormalFai;
+							const ShaderProg::UniVar* msDiffuseFai;
+							const ShaderProg::UniVar* msSpecularFai;
+							const ShaderProg::UniVar* msDepthFai;
+							const ShaderProg::UniVar* planes;
+							const ShaderProg::UniVar* lightPos;
+							const ShaderProg::UniVar* lightInvRadius;
+							const ShaderProg::UniVar* lightDiffuseCol;
+							const ShaderProg::UniVar* lightSpecularCol;
+							const ShaderProg::UniVar* lightTex;
+							const ShaderProg::UniVar* texProjectionMat;
+							const ShaderProg::UniVar* shadowMap;
+						} uniVars;
 				};
 				AmbientShaderProg ambientPassSProg; ///< Illumination stage ambient pass shader program
 				LightShaderProg pointLightSProg; ///< Illumination stage point light shader program

+ 290 - 0
src/Resources/Helpers/Image.cpp

@@ -0,0 +1,290 @@
+#include <SDL/SDL_image.h>
+#include "Image.h"
+#include "Util.h"
+
+
+unsigned char Image::tgaHeaderUncompressed[12] = {0,0,2,0,0,0,0,0,0,0,0,0};
+unsigned char Image::tgaHeaderCompressed[12]   = {0,0,10,0,0,0,0,0,0,0,0,0};
+
+
+//=====================================================================================================================================
+// loadUncompressedTGA                                                                                                                =
+//=====================================================================================================================================
+bool Image::loadUncompressedTGA( const char* filename, fstream& fs )
+{
+	// read the info from header
+	unsigned char header6[6];
+	fs.read( (char*)&header6[0], sizeof(header6) );
+	if( fs.gcount() != sizeof(header6) )
+	{
+		ERROR( "File \"" << filename << "\": Cannot read info header" );
+		return false;
+	}
+
+	width  = header6[1] * 256 + header6[0];
+	height = header6[3] * 256 + header6[2];
+	bpp	= header6[4];
+
+	if( (width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32)) )
+	{
+		ERROR( "File \"" << filename << "\": Invalid image information" );
+		return false;
+	}
+
+	// read the data
+	int bytes_per_pxl	= (bpp / 8);
+	int image_size = bytes_per_pxl * width * height;
+	data = new char [ image_size ];
+
+	fs.read( data, image_size );
+	if( fs.gcount() != image_size )
+	{
+		ERROR( "File \"" << filename << "\": Cannot read image data" );
+		return false;
+	}
+
+	// swap red with blue
+	for( int i=0; i<int(image_size); i+=bytes_per_pxl)
+	{
+		uint temp = data[i];
+		data[i] = data[i + 2];
+		data[i + 2] = temp;
+	}
+
+	return true;
+}
+
+
+//=====================================================================================================================================
+// loadCompressedTGA                                                                                                                  =
+//=====================================================================================================================================
+bool Image::loadCompressedTGA( const char* filename, fstream& fs )
+{
+	unsigned char header6[6];
+	fs.read( (char*)&header6[0], sizeof(header6) );
+	if( fs.gcount() != sizeof(header6) )
+	{
+		ERROR( "File \"" << filename << "\": Cannot read info header" );
+		return false;
+	}
+
+	width  = header6[1] * 256 + header6[0];
+	height = header6[3] * 256 + header6[2];
+	bpp	= header6[4];
+
+	if( (width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32)) )
+	{
+		ERROR( "File \"" << filename << "\": Invalid texture information" );
+		return false;
+	}
+
+
+	int bytes_per_pxl = (bpp / 8);
+	int image_size = bytes_per_pxl * width * height;
+	data = new char [image_size];
+
+	uint pixelcount = height * width;
+	uint currentpixel = 0;
+	uint currentbyte	= 0;
+	unsigned char colorbuffer [4];
+
+	do
+	{
+		unsigned char chunkheader = 0;
+
+		fs.read( (char*)&chunkheader, sizeof(unsigned char) );
+		if( fs.gcount() != sizeof(unsigned char) )
+		{
+			ERROR( "File \"" << filename << "\": Cannot read RLE header" );
+			return false;
+		}
+
+		if( chunkheader < 128 )
+		{
+			chunkheader++;
+			for( int counter = 0; counter < chunkheader; counter++ )
+			{
+				fs.read( (char*)&colorbuffer[0], bytes_per_pxl );
+				if( fs.gcount() != bytes_per_pxl )
+				{
+					ERROR( "File \"" << filename << "\": Cannot read image data" );
+					return false;
+				}
+
+				data[currentbyte		] = colorbuffer[2];
+				data[currentbyte + 1] = colorbuffer[1];
+				data[currentbyte + 2] = colorbuffer[0];
+
+				if( bytes_per_pxl == 4 )
+				{
+					data[currentbyte + 3] = colorbuffer[3];
+				}
+
+				currentbyte += bytes_per_pxl;
+				currentpixel++;
+
+				if( currentpixel > pixelcount )
+				{
+					ERROR( "File \"" << filename << "\": Too many pixels read" );
+					return false;
+				}
+			}
+		}
+		else
+		{
+			chunkheader -= 127;
+			fs.read( (char*)&colorbuffer[0], bytes_per_pxl );
+			if( fs.gcount() != bytes_per_pxl )
+			{
+				ERROR( "File \"" << filename << "\": Cannot read from file" );
+				return false;
+			}
+
+			for( int counter = 0; counter < chunkheader; counter++ )
+			{
+				data[currentbyte] = colorbuffer[2];
+				data[currentbyte+1] = colorbuffer[1];
+				data[currentbyte+2] = colorbuffer[0];
+
+				if( bytes_per_pxl == 4 )
+				{
+					data[currentbyte + 3] = colorbuffer[3];
+				}
+
+				currentbyte += bytes_per_pxl;
+				currentpixel++;
+
+				if( currentpixel > pixelcount )
+				{
+					ERROR( "File \"" << filename << "\": Too many pixels read" );
+					return false;
+				}
+			}
+		}
+	} while(currentpixel < pixelcount);
+
+	return true;
+}
+
+
+//=====================================================================================================================================
+// loadTGA                                                                                                                            =
+//=====================================================================================================================================
+bool Image::loadTGA( const char* filename )
+{
+	fstream fs;
+	char my_tga_header[12];
+	fs.open( filename, ios::in|ios::binary );
+
+	if( !fs.good() )
+	{
+		ERROR( "File \"" << filename << "\": Cannot open file" );
+		return false;
+	}
+
+	fs.read( &my_tga_header[0], sizeof(my_tga_header) );
+	if( fs.gcount() != sizeof(my_tga_header) )
+	{
+		ERROR( "File \"" << filename << "\": Cannot read file header" );
+		fs.close();
+		return false;
+	}
+
+	bool funcs_return;
+	if( memcmp(tgaHeaderUncompressed, &my_tga_header[0], sizeof(my_tga_header)) == 0 )
+	{
+		funcs_return = loadUncompressedTGA( filename, fs );
+	}
+	else if( memcmp(tgaHeaderCompressed, &my_tga_header[0], sizeof(my_tga_header)) == 0 )
+	{
+		funcs_return = loadCompressedTGA( filename, fs );
+	}
+	else
+	{
+		ERROR( "File \"" << filename << "\": Invalid image header" );
+		funcs_return = false;
+	}
+
+	fs.close();
+	return funcs_return;
+}
+
+
+//=====================================================================================================================================
+// loadPNG                                                                                                                            =
+//=====================================================================================================================================
+bool Image::loadPNG( const char* filename )
+{
+	SDL_Surface *sdli;
+	sdli = IMG_Load( filename );
+	if( !sdli )
+	{
+		ERROR( "File \"" << filename << "\": " << IMG_GetError() );
+		return false;
+	}
+
+	width = sdli->w;
+	height = sdli->h;
+
+	bpp = sdli->format->BitsPerPixel;
+
+	if( bpp != 24 && bpp != 32 )
+	{
+		ERROR( "File \"" << filename << "\": The image must be 24 or 32 bits" );
+		SDL_FreeSurface( sdli );
+		return false;
+	}
+
+	int bytespp = bpp/8;
+	int bytes = width * height * bytespp;
+	data = new char [ bytes ];
+
+	// copy and flip height
+	for( uint w=0; w<width; w++ )
+		for( uint h=0; h<height; h++ )
+		{
+			memcpy(
+				&data[ (width*h+w) * bytespp ],
+				&((char*)sdli->pixels)[ ( width*(height-h-1)+w ) * bytespp ],
+				bytespp
+			);
+		}
+
+	SDL_FreeSurface( sdli );
+	return true;
+}
+
+
+//=====================================================================================================================================
+// load                                                                                                                               =
+//=====================================================================================================================================
+bool Image::load( const char* filename )
+{
+	// get the extension
+	char* ext = Util::getFileExtension( filename );
+
+	// load from this extension
+	if( strcmp( ext, "tga" ) == 0 )
+	{
+		if( !loadTGA( filename ) )
+		{
+			unload();
+			return false;
+		}
+	}
+	else if( strcmp( ext, "png" ) == 0 )
+	{
+		if( !loadPNG( filename ) )
+		{
+			unload();
+			return false;
+		}
+	}
+	else
+	{
+		ERROR( "File \"" << filename << "\": Unsupported extension" );
+		return false;
+	}
+	return true;
+}
+

+ 34 - 0
src/Resources/Helpers/Image.h

@@ -0,0 +1,34 @@
+#ifndef _IMAGE_H_
+#define _IMAGE_H_
+
+#include "Common.h"
+
+
+/**
+ * Image class. Used in Texture::load
+ */
+class Image
+{
+	protected:
+		static unsigned char tgaHeaderUncompressed[12];
+		static unsigned char tgaHeaderCompressed[12];
+
+		bool loadUncompressedTGA( const char* filename, fstream& fs );
+		bool loadCompressedTGA( const char* filename, fstream& fs );
+		bool loadPNG( const char* filename );
+		bool loadTGA( const char* filename );
+
+	public:
+		uint  width;
+		uint  height;
+		uint  bpp;
+		char* data;
+
+		 Image(): data(NULL) {}
+		~Image() { unload(); }
+
+		bool load( const char* filename );
+		void unload() { if( data ) delete [] data; data=NULL; }
+};
+
+#endif

+ 0 - 0
src/Resources/ShaderPrePreprocessor.cpp → src/Resources/Helpers/ShaderPrePreprocessor.cpp


+ 0 - 0
src/Resources/ShaderPrePreprocessor.h → src/Resources/Helpers/ShaderPrePreprocessor.h


+ 59 - 15
src/Resources/ShaderProg.cpp

@@ -11,11 +11,50 @@
 //=====================================================================================================================================
 // set uniforms                                                                                                                       =
 //=====================================================================================================================================
+/**
+ * Standard set uniform check
+ */
+#define STD_SET_UNI_CHECK() DEBUG_ERR( getLoc() == -1 || ShaderProg::getCurrentProgramGlId() != fatherSProg->getGlId() );
+
+
+void ShaderProg::UniVar::setFloat( float f ) const
+{
+	STD_SET_UNI_CHECK();
+	glUniform1f( getLoc(), f );
+}
+
+void ShaderProg::UniVar::setFloatVec( float f[], uint size ) const
+{
+	STD_SET_UNI_CHECK();
+	glUniform1fv( getLoc(), size, f );
+}
+
+void ShaderProg::UniVar::setVec2( const Vec2 v2[], uint size ) const
+{
+	STD_SET_UNI_CHECK();
+	glUniform2fv( getLoc(), size, &( const_cast<Vec2&>(v2[0]) )[0] );
+}
+
+void ShaderProg::UniVar::setVec3( const Vec3 v3[], uint size ) const
+{
+	STD_SET_UNI_CHECK();
+	glUniform3fv( getLoc(), size, &( const_cast<Vec3&>(v3[0]) )[0] );
+}
+
 void ShaderProg::UniVar::setMat4( const Mat4 m4[], uint size ) const
 {
+	STD_SET_UNI_CHECK();
 	glUniformMatrix4fv( getLoc(), size, true, &(m4[0])[0] );
 }
 
+void ShaderProg::UniVar::setTexture( const Texture& tex, uint texUnit ) const
+{
+	STD_SET_UNI_CHECK();
+	DEBUG_ERR( getGlDataType() != GL_TEXTURE_2D );
+	tex.bind( texUnit );
+	glUniform1i( getLoc(), texUnit );
+}
+
 
 //=====================================================================================================================================
 // createAndCompileShader                                                                                                             =
@@ -23,17 +62,17 @@ void ShaderProg::UniVar::setMat4( const Mat4 m4[], uint size ) const
 uint ShaderProg::createAndCompileShader( const char* sourceCode, const char* preproc, int type ) const
 {
 	uint glId = 0;
-	const char* source_strs[2] = {NULL, NULL};
+	const char* sourceStrs[2] = {NULL, NULL};
 
 	// create the shader
 	glId = glCreateShader( type );
 
 	// attach the source
-	source_strs[1] = sourceCode;
-	source_strs[0] = preproc;
+	sourceStrs[1] = sourceCode;
+	sourceStrs[0] = preproc;
 
 	// compile
-	glShaderSource( glId, 2, source_strs, NULL );
+	glShaderSource( glId, 2, sourceStrs, NULL );
 	glCompileShader( glId );
 
 	int success;
@@ -43,28 +82,28 @@ uint ShaderProg::createAndCompileShader( const char* sourceCode, const char* pre
 	{
 		// print info log
 		int info_len = 0;
-		int chars_written = 0;
-		char* info_log = NULL;
+		int charsWritten = 0;
+		char* infoLog = NULL;
 
 		glGetShaderiv( glId, GL_INFO_LOG_LENGTH, &info_len );
-		info_log = (char*)malloc( (info_len+1)*sizeof(char) );
-		glGetShaderInfoLog( glId, info_len, &chars_written, info_log );
+		infoLog = (char*)malloc( (info_len+1)*sizeof(char) );
+		glGetShaderInfoLog( glId, info_len, &charsWritten, infoLog );
 		
-		const char* shader_type;
+		const char* shaderType;
 		switch( type )
 		{
 			case GL_VERTEX_SHADER:
-				shader_type = "Vertex shader";
+				shaderType = "Vertex shader";
 				break;
 			case GL_FRAGMENT_SHADER:
-				shader_type = "Fragment shader";
+				shaderType = "Fragment shader";
 				break;
 			default:
 				DEBUG_ERR( 1 ); // Not supported
 		}
-		SHADER_ERROR( shader_type << " compiler log follows:\n" << info_log );
+		SHADER_ERROR( shaderType << " compiler log follows:\n" << infoLog );
 		
-		free( info_log );
+		free( infoLog );
 		return 0;
 	}
 
@@ -131,7 +170,7 @@ void ShaderProg::getUniAndAttribVars()
 			continue;
 		}
 
-		attribVars.push_back( AttribVar( loc, name_, type ) );
+		attribVars.push_back( AttribVar( loc, name_, type, this ) );
 		attribNameToVar[ name_ ] = &attribVars.back();
 	}
 
@@ -152,7 +191,7 @@ void ShaderProg::getUniAndAttribVars()
 			continue;
 		}
 
-		uniVars.push_back( UniVar( loc, name_, type ) );
+		uniVars.push_back( UniVar( loc, name_, type, this ) );
 		uniNameToVar[ name_ ] = &uniVars.back();
 	}
 }
@@ -216,6 +255,11 @@ bool ShaderProg::customLoad( const char* filename, const char* extraSource )
 
 	// 2) create program and attach shaders
 	glId = glCreateProgram();
+	if( glId == 0 )
+	{
+		ERROR( "glCreateProgram failed" );
+		return false;
+	}
 	glAttachShader( glId, vertGlId );
 	glAttachShader( glId, fragGlId );
 

+ 81 - 26
src/Resources/ShaderProg.h

@@ -21,7 +21,7 @@ class ShaderProg: public Resource
 	
 	friend class Material;
 
-	private:
+	public:
 		/**
 		 * Shader program variable. The type is attribute or uniform
 		 */
@@ -35,28 +35,33 @@ class ShaderProg: public Resource
 					SVT_UNIFORM    ///< SVT_UNIFORM
 				};
 
-			PROPERTY_R( int, loc, getLoc ) ///< @todo
-			PROPERTY_R( string, name, getName ) ///< @todo
-			PROPERTY_R( GLenum, glDataType, getGlDataType ) ///< @ref PROPERTY_R : GL_FLOAT, GL_FLOAT_VEC2... etc
+			PROPERTY_R( GLint, loc, getLoc ) ///< @ref PROPERTY_R : GL location
+			PROPERTY_R( string, name, getName ) ///< @ref PROPERTY_R : The name inside the shader program
+			PROPERTY_R( GLenum, glDataType, getGlDataType ) ///< @ref PROPERTY_R : GL_FLOAT, GL_FLOAT_VEC2 etc. See http://www.opengl.org/sdk/docs/man/xhtml/glGetActiveUniform.xml
 			PROPERTY_R( Type, type, getType ) ///< @ref PROPERTY_R : @ref SVT_ATTRIBUTE or @ref SVT_UNIFORM
 
+			protected:
+				const ShaderProg* fatherSProg;
+
 			public:
-				Var( int loc_, const char* name_, GLenum glDataType_, Type type_ ):
-					loc(loc_), name(name_), glDataType(glDataType_), type(type_)
+				Var( GLint loc_, const char* name_, GLenum glDataType_, Type type_, const ShaderProg* fatherSProg_ ):
+					loc(loc_), name(name_), glDataType(glDataType_), type(type_), fatherSProg(fatherSProg_)
 				{}
 
 				/// copy constructor
 				Var( const Var& var ):
-					loc(var.loc), name(var.name), glDataType(var.glDataType), type(var.type)
+					loc(var.loc), name(var.name), glDataType(var.glDataType), type(var.type), fatherSProg(var.fatherSProg)
 				{}
 		};
 
-		/// Uniform shader variable
+		/**
+		 * Uniform shader variable
+		 */
 		class UniVar: public Var
 		{
 			public:
-				UniVar( int loc_, const char* name_, GLenum glDataType_ ):
-					Var( loc_, name_, glDataType_, SVT_UNIFORM )
+				UniVar( int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_ ):
+					Var( loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_ )
 				{}
 
 				/// copy constructor
@@ -64,15 +69,22 @@ class ShaderProg: public Resource
 					Var( var )
 				{}
 
+				void setFloat( float f ) const;
+				void setFloatVec( float f[], uint size = 1 ) const;
+				void setVec2( const Vec2 v2[], uint size = 1 ) const;
+				void setVec3( const Vec3 v3[], uint size = 1 ) const;
 				void setMat4( const Mat4 m4[], uint size = 1 ) const;
+				void setTexture( const Texture& tex, uint texUnit ) const;
 		};
 
-		/// Attribute shader variable
+		/**
+		 * Attribute shader variable
+		 */
 		class AttribVar: public Var
 		{
 			public:
-				AttribVar( int loc_, const char* name_, GLenum glDataType_ ):
-					Var( loc_, name_, glDataType_, SVT_UNIFORM )
+				AttribVar( int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_ ):
+					Var( loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_ )
 				{}
 
 				/// copy constructor
@@ -81,9 +93,10 @@ class ShaderProg: public Resource
 				{}
 		};
 
-		Vec<UniVar> uniVars;
-		Vec<AttribVar> attribVars;
-		map<string,UniVar*> uniNameToVar;  ///< A map for quick searching
+	private:
+		Vec<UniVar> uniVars; ///< All the uniform variables
+		Vec<AttribVar> attribVars; ///< All the attribute variables
+		map<string,UniVar*> uniNameToVar;  ///< A map for quick variable searching
 		map<string,AttribVar*> attribNameToVar; ///< @see uniNameToVar
 		typedef map<string,UniVar*>::const_iterator NameToUniVarIterator; ///< Uniform variable name to variable iterator
 		typedef map<string,AttribVar*>::const_iterator NameToAttribVarIterator; ///< Attribute variable name to variable iterator
@@ -96,24 +109,62 @@ class ShaderProg: public Resource
 	public:
 		ShaderProg(): glId(0) {}
 		virtual ~ShaderProg() {}
-		
+
+		/**
+		 * Bind the shader program
+		 */
 		inline void bind() const { DEBUG_ERR( glId==0 ); glUseProgram(glId); }
+		
+		/**
+		 * Unbind all shader programs
+		 */
 		static void unbind() { glUseProgram(0); }
-		static uint getCurrentProgramGlId() { int i; glGetIntegerv( GL_CURRENT_PROGRAM, &i ); return i; } ///< Query the GL driver for the current shader program GL ID
 
+		/**
+		 * Query the GL driver for the current shader program GL ID
+		 * @return Shader program GL id
+		 */
+		static uint getCurrentProgramGlId() { int i; glGetIntegerv( GL_CURRENT_PROGRAM, &i ); return i; }
+
+		/**
+		 * Resource load
+		 */
 		bool load( const char* filename );
-		bool customLoad( const char* filename, const char* extraSource = "" ); ///< Used by the renderer's shader programs
-		void unload() { /* ToDo: add code */ }
 
-		const Vec<UniVar>&    getUniVars() const { return uniVars; } ///< Accessor to uniform vars vector
-		const Vec<AttribVar>& getAttribVars() const { return attribVars; } ///< Accessor to attribute vars vector
+		/**
+		 * Used by the renderer's shader programs
+		 * @param filename
+		 * @param extraSource Extra source code on top of the file's source
+		 * @return True on success
+		 */
+		bool customLoad( const char* filename, const char* extraSource = "" );
+
+		/**
+		 * Free GL program
+		 */
+		void unload() { /** @todo add code */ }
+
+		/**
+		 * Accessor to uniform vars vector
+		 */
+		const Vec<UniVar>&    getUniVars() const { return uniVars; }
+
+		/**
+		 * Accessor to attribute vars vector
+		 */
+		const Vec<AttribVar>& getAttribVars() const { return attribVars; }
 
 		/**
 		 * @param varName The name of the var
-		 * @return It returns a uniform variable and on failure it throws an error and returns something random
+		 * @return It returns a uniform variable and on failure it throws an error and returns NULL
+		 */
+		const UniVar* findUniVar( const char* varName ) const;
+
+		/**
+		 * @see findUniVar
 		 */
-		const UniVar*    findUniVar( const char* varName ) const;
-		const AttribVar* findAttribVar( const char* varName ) const; ///< @see findUniVar
+		const AttribVar* findAttribVar( const char* varName ) const;
+
 		bool uniVarExists( const char* varName ) const;
 		bool attribVarExists( const char* varName ) const;
 
@@ -124,7 +175,11 @@ class ShaderProg: public Resource
 		 * @param texUnit The number of the texture unit
 		 */
 		void locTexUnit( int varLoc, const class Texture& tex, uint texUnit ) const;
-		void locTexUnit( const char* varName, const class Texture& tex, uint texUnit ) const; ///< @see locTexUnit
+
+		/**
+		 * @see locTexUnit
+		 */
+		void locTexUnit( const char* varName, const class Texture& tex, uint texUnit ) const;
 }; 
 
 #endif

+ 1 - 297
src/Resources/Texture.cpp

@@ -1,304 +1,8 @@
-#include <fstream>
-#include <SDL/SDL_image.h>
 #include "Texture.h"
 #include "Renderer.h"
+#include "Image.h"
 
 
-unsigned char Image::tgaHeaderUncompressed[12] = {0,0,2,0,0,0,0,0,0,0,0,0};
-unsigned char Image::tgaHeaderCompressed[12]   = {0,0,10,0,0,0,0,0,0,0,0,0};
-
-
-//=====================================================================================================================================
-// loadUncompressedTGA                                                                                                                =
-//=====================================================================================================================================
-bool Image::loadUncompressedTGA( const char* filename, fstream& fs )
-{
-	// read the info from header
-	unsigned char header6[6];
-	fs.read( (char*)&header6[0], sizeof(header6) );
-	if( fs.gcount() != sizeof(header6) )
-	{
-		ERROR( "File \"" << filename << "\": Cannot read info header" );
-		return false;
-	}
-
-	width  = header6[1] * 256 + header6[0];
-	height = header6[3] * 256 + header6[2];
-	bpp	= header6[4];
-
-	if( (width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32)) )
-	{
-		ERROR( "File \"" << filename << "\": Invalid image information" );
-		return false;
-	}
-
-	// read the data
-	int bytes_per_pxl	= (bpp / 8);
-	int image_size = bytes_per_pxl * width * height;
-	data = new char [ image_size ];
-
-	fs.read( data, image_size );
-	if( fs.gcount() != image_size )
-	{
-		ERROR( "File \"" << filename << "\": Cannot read image data" );
-		return false;
-	}
-
-	// swap red with blue
-	for( int i=0; i<int(image_size); i+=bytes_per_pxl)
-	{
-		uint temp = data[i];
-		data[i] = data[i + 2];
-		data[i + 2] = temp;
-	}
-
-	return true;
-}
-
-
-//=====================================================================================================================================
-// loadCompressedTGA                                                                                                                  =
-//=====================================================================================================================================
-bool Image::loadCompressedTGA( const char* filename, fstream& fs )
-{
-	unsigned char header6[6];
-	fs.read( (char*)&header6[0], sizeof(header6) );
-	if( fs.gcount() != sizeof(header6) )
-	{
-		ERROR( "File \"" << filename << "\": Cannot read info header" );
-		return false;
-	}
-
-	width  = header6[1] * 256 + header6[0];
-	height = header6[3] * 256 + header6[2];
-	bpp	= header6[4];
-
-	if( (width <= 0) || (height <= 0) || ((bpp != 24) && (bpp !=32)) )
-	{
-		ERROR( "File \"" << filename << "\": Invalid texture information" );
-		return false;
-	}
-
-
-	int bytes_per_pxl = (bpp / 8);
-	int image_size = bytes_per_pxl * width * height;
-	data = new char [image_size];
-
-	uint pixelcount = height * width;
-	uint currentpixel = 0;
-	uint currentbyte	= 0;
-	unsigned char colorbuffer [4];
-
-	do
-	{
-		unsigned char chunkheader = 0;
-
-		fs.read( (char*)&chunkheader, sizeof(unsigned char) );
-		if( fs.gcount() != sizeof(unsigned char) )
-		{
-			ERROR( "File \"" << filename << "\": Cannot read RLE header" );
-			return false;
-		}
-
-		if( chunkheader < 128 )
-		{
-			chunkheader++;
-			for( int counter = 0; counter < chunkheader; counter++ )
-			{
-				fs.read( (char*)&colorbuffer[0], bytes_per_pxl );
-				if( fs.gcount() != bytes_per_pxl )
-				{
-					ERROR( "File \"" << filename << "\": Cannot read image data" );
-					return false;
-				}
-
-				data[currentbyte		] = colorbuffer[2];
-				data[currentbyte + 1] = colorbuffer[1];
-				data[currentbyte + 2] = colorbuffer[0];
-
-				if( bytes_per_pxl == 4 )
-				{
-					data[currentbyte + 3] = colorbuffer[3];
-				}
-
-				currentbyte += bytes_per_pxl;
-				currentpixel++;
-
-				if( currentpixel > pixelcount )
-				{
-					ERROR( "File \"" << filename << "\": Too many pixels read" );
-					return false;
-				}
-			}
-		}
-		else
-		{
-			chunkheader -= 127;
-			fs.read( (char*)&colorbuffer[0], bytes_per_pxl );
-			if( fs.gcount() != bytes_per_pxl )
-			{
-				ERROR( "File \"" << filename << "\": Cannot read from file" );
-				return false;
-			}
-
-			for( int counter = 0; counter < chunkheader; counter++ )
-			{
-				data[currentbyte] = colorbuffer[2];
-				data[currentbyte+1] = colorbuffer[1];
-				data[currentbyte+2] = colorbuffer[0];
-
-				if( bytes_per_pxl == 4 )
-				{
-					data[currentbyte + 3] = colorbuffer[3];
-				}
-
-				currentbyte += bytes_per_pxl;
-				currentpixel++;
-
-				if( currentpixel > pixelcount )
-				{
-					ERROR( "File \"" << filename << "\": Too many pixels read" );
-					return false;
-				}
-			}
-		}
-	} while(currentpixel < pixelcount);
-
-	return true;
-}
-
-
-//=====================================================================================================================================
-// loadTGA                                                                                                                            =
-//=====================================================================================================================================
-/// load a tga using the help of the above
-bool Image::loadTGA( const char* filename )
-{
-	fstream fs;
-	char my_tga_header[12];
-	fs.open( filename, ios::in|ios::binary );
-
-	if( !fs.good() )
-	{
-		ERROR( "File \"" << filename << "\": Cannot open file" );
-		return false;
-	}
-
-	fs.read( &my_tga_header[0], sizeof(my_tga_header) );
-	if( fs.gcount() != sizeof(my_tga_header) )
-	{
-		ERROR( "File \"" << filename << "\": Cannot read file header" );
-		fs.close();
-		return false;
-	}
-
-	bool funcs_return;
-	if( memcmp(tgaHeaderUncompressed, &my_tga_header[0], sizeof(my_tga_header)) == 0 )
-	{
-		funcs_return = loadUncompressedTGA( filename, fs );
-	}
-	else if( memcmp(tgaHeaderCompressed, &my_tga_header[0], sizeof(my_tga_header)) == 0 )
-	{
-		funcs_return = loadCompressedTGA( filename, fs );
-	}
-	else
-	{
-		ERROR( "File \"" << filename << "\": Invalid image header" );
-		funcs_return = false;
-	}
-
-	fs.close();
-	return funcs_return;
-}
-
-
-//=====================================================================================================================================
-// loadPNG                                                                                                                            =
-//=====================================================================================================================================
-bool Image::loadPNG( const char* filename )
-{
-	SDL_Surface *sdli;
-	sdli = IMG_Load( filename );
-	if( !sdli )
-	{
-		ERROR( "File \"" << filename << "\": " << IMG_GetError() );
-		return false;
-	}
-
-	width = sdli->w;
-	height = sdli->h;
-
-	bpp = sdli->format->BitsPerPixel;
-
-	if( bpp != 24 && bpp != 32 )
-	{
-		ERROR( "File \"" << filename << "\": The image must be 24 or 32 bits" );
-		SDL_FreeSurface( sdli );
-		return false;
-	}
-
-	int bytespp = bpp/8;
-	int bytes = width * height * bytespp;
-	data = new char [ bytes ];
-
-	// copy and flip height
-	for( uint w=0; w<width; w++ )
-		for( uint h=0; h<height; h++ )
-		{
-			memcpy(
-				&data[ (width*h+w) * bytespp ],
-				&((char*)sdli->pixels)[ ( width*(height-h-1)+w ) * bytespp ],
-				bytespp
-			);
-		}
-
-	SDL_FreeSurface( sdli );
-	return true;
-}
-
-
-//=====================================================================================================================================
-// load                                                                                                                               =
-//=====================================================================================================================================
-bool Image::load( const char* filename )
-{
-	// get the extension
-	char* ext = Util::getFileExtension( filename );
-
-	// load from this extension
-	if( strcmp( ext, "tga" ) == 0 )
-	{
-		if( !loadTGA( filename ) )
-		{
-			unload();
-			return false;
-		}
-	}
-	else if( strcmp( ext, "png" ) == 0 )
-	{
-		if( !loadPNG( filename ) )
-		{
-			unload();
-			return false;
-		}
-	}
-	else
-	{
-		ERROR( "File \"" << filename << "\": Unsupported extension" );
-		return false;
-	}
-	return true;
-}
-
-
-
-
-/*
-=======================================================================================================================================
-Texture                                                                                                                             =
-=======================================================================================================================================
-*/
-
 //=====================================================================================================================================
 // load                                                                                                                               =
 //=====================================================================================================================================

+ 4 - 26
src/Resources/Texture.h

@@ -7,32 +7,6 @@
 #include "Resource.h"
 
 
-/// Image class. Used in Texture::load
-class Image
-{
-	protected:
-		static unsigned char tgaHeaderUncompressed[12];
-		static unsigned char tgaHeaderCompressed[12];
-
-		bool loadUncompressedTGA( const char* filename, fstream& fs );
-		bool loadCompressedTGA( const char* filename, fstream& fs );
-		bool loadPNG( const char* filename );
-		bool loadTGA( const char* filename );
-
-	public:
-		uint  width;
-		uint  height;
-		uint  bpp;
-		char* data;
-
-		 Image(): data(NULL) {}
-		~Image() { unload(); }
-
-		bool load( const char* filename );
-		void unload() { if( data ) delete [] data; data=NULL; }
-};
-
-
 /**
  * Texture resource class
  *
@@ -44,6 +18,10 @@ class Texture: public Resource
 	protected:
 		uint   glId; ///< Identification for OGL
 		GLenum type; ///< GL_TEXTURE_2D, GL_TEXTURE_3D... etc
+		static int  textureUnitsNum;
+		static bool mipmappingEnabled;
+		static bool compressionEnabled;
+		static int  anisotropyLevel;
 
 	public:
 		 Texture(): glId(numeric_limits<uint>::max()), type(GL_TEXTURE_2D) {}