Browse Source

From now on AnKi requires boost library

- Work on HW skinning and transform feeback
- Creating dirs @ home
Panagiotis Christopoulos Charitos 15 years ago
parent
commit
6bade3a849

+ 1 - 1
build/debug/Makefile

@@ -1,7 +1,7 @@
 CXX = g++
 CFLAGS = -c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -pipe -O0 -g3 -pg -fsingle-precision-constant -DDEBUG_ENABLED -DPLATFORM_LINUX -DREVISION=\"`svnversion -c ../..`\" 
 PHFLAGS = -c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -pipe -O0 -g3 -pg -fsingle-precision-constant -DDEBUG_ENABLED -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 -pg
+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 -lboost_system -lboost_filesystem -Wl,-Bdynamic -lGL -ljpeg -lpng -ltiff -pg
 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/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//memory.cpp ../../src/Misc//collision.cpp ../../src/Misc//map.cpp ../../src//Main.cpp ../../src/Renderer//Smo.cpp ../../src/Renderer//Ez.cpp ../../src/Renderer//Ms.cpp ../../src/Renderer//Sm.cpp ../../src/Renderer//Pps.cpp ../../src/Renderer//Ssao.cpp ../../src/Renderer//Renderer.cpp ../../src/Renderer//Is.cpp ../../src/Renderer//MainRenderer.cpp ../../src/Renderer//Dbg.cpp ../../src/Renderer//Hdr.cpp ../../src/Renderer//Bs.cpp ../../src/Scene//MeshNode.cpp ../../src/Scene//SceneNode.cpp ../../src/Scene//SkelNode.cpp ../../src/Scene//Light.cpp ../../src/Scene//SkelModelNode.cpp ../../src/Scene//Camera.cpp ../../src/Scene//ParticleEmitter.cpp ../../src/Scene//Scene.cpp ../../src/Ui//Ui.cpp ../../src/Resources//ShaderProg.cpp ../../src/Resources//Material.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/Resources/Helpers//Image.cpp ../../src/Resources/Helpers//ShaderPrePreprocessor.cpp 

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

@@ -9,4 +9,4 @@ compiler = "g++"
 commonFlags_ = ""
 compilerFlags = "-c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -pipe -O0 -g3 -pg -fsingle-precision-constant -DDEBUG_ENABLED -DPLATFORM_LINUX -DREVISION=\\\"`svnversion -c ../..`\\\" "
 precompiledHeadersFlags = compilerFlags + " -x "
-linkerFlags = "-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 -pg"
+linkerFlags = "-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 -lboost_system -lboost_filesystem -Wl,-Bdynamic -lGL -ljpeg -lpng -ltiff -pg"

+ 2 - 0
docs/readme

@@ -187,6 +187,7 @@ This list contains some of the naming shortcuts we use in AnKi:
 - Camera                       : cam
 - Color                        : col
 - Controller                   : ctrl
+- Current                      : crnt
 - Feature                      : feat
 - Fragment                     : frag
 - Framebuffer Attachable Image : fai
@@ -196,6 +197,7 @@ This list contains some of the naming shortcuts we use in AnKi:
 - Matrix                       : mat
 - Number                       : num
 - Physics                      : phy
+- Position                     : pos
 - Property                     : prop
 - Quadrilateral                : quad
 - Quaternion                   : quat

+ 51 - 0
shaders/HwSkinningTrffbGeneric.glsl

@@ -0,0 +1,51 @@
+#pragma anki vertShaderBegins
+
+attribute vec3 position;
+attribute vec3 normal;
+attribute vec4 tangent;
+attribute float vertWeightBonesNum;
+attribute vec4  vertWeightBoneIds;
+attribute vec4  vertWeightWeights;
+
+const int MAX_BONES_PER_MESH = 60;
+uniform mat3 skinningRotations[MAX_BONES_PER_MESH];
+uniform vec3 skinningTranslations[MAX_BONES_PER_MESH];
+
+#pragma anki tranformFeedbackVarying outPosition
+varying vec3 outPosition;
+#pragma anki tranformFeedbackVarying outNormal
+varying vec3 outNormal;
+#pragma anki tranformFeedbackVarying outTangent
+varying vec4 outTangent;
+
+
+void main()
+{
+	rot = mat3(0.0);
+	tsl = vec3(0.0);
+
+	for(int i=0; i<int(vertWeightBonesNum); i++)
+	{
+		int boneId = int(vertWeightBoneIds[i]);
+		float weight = vertWeightWeights[i];
+
+		rot += skinningRotations[boneId] * weight;
+		tsl += skinningTranslations[boneId] * weight;
+	}
+	
+	outPosition = (rot * position) + tsl;
+	
+	#if defined(NORMAL_ENABLED)
+		outNormal = rot * normal;
+	#endif
+	
+	#if defined(TANGENT_ENABLED)
+		outTangent = vec4(rot * vec3(tangent), tangent.w);
+	#endif	
+}
+
+#pragma anki fragShaderBegins
+
+void main()
+{
+}

+ 1 - 0
src/Renderer/Is.cpp

@@ -237,6 +237,7 @@ void Renderer::Is::spotLightPass(const SpotLight& light)
 		glEnable(GL_BLEND);
 		glBlendFunc(GL_ONE, GL_ONE);
 		glDisable(GL_DEPTH_TEST);
+		Renderer::setViewport(0, 0, r.width, r.height);
 	}
 
 	// stencil optimization

+ 3 - 18
src/Renderer/Sm.cpp

@@ -62,18 +62,9 @@ void Renderer::Is::Sm::run(const Camera& cam)
 	// FBO
 	fbo.bind();
 
-	// push attribs
-	/// @todo remove the matrices
-	glMatrixMode(GL_PROJECTION);
-	glPushMatrix();
-	glMatrixMode(GL_MODELVIEW);
-	glPushMatrix();
-	glPushAttrib(GL_VIEWPORT_BIT);
-
-
-	glClear(GL_DEPTH_BUFFER_BIT);
-	r.setProjectionViewMatrices(cam);
+	// set GL
 	Renderer::setViewport(0, 0, resolution, resolution);
+	glClear(GL_DEPTH_BUFFER_BIT);
 
 	// disable color & blend & enable depth test
 	glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
@@ -96,16 +87,10 @@ void Renderer::Is::Sm::run(const Camera& cam)
 		meshNode->renderDepth();
 	}
 
+	// restore GL
 	glDisable(GL_POLYGON_OFFSET_FILL);
-
 	glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
 
-	// restore attribs
-	glPopAttrib();
-	glMatrixMode(GL_MODELVIEW);
-	glPopMatrix();
-	glMatrixMode(GL_PROJECTION);
-	glPopMatrix();
 
 	// FBO
 	fbo.unbind();

+ 26 - 5
src/Resources/Helpers/ShaderPrePreprocessor.cpp

@@ -204,7 +204,7 @@ bool ShaderPrePreprocessor::parseFileForPragmas(const string& filename, int dept
 						fragShaderBegins.definedInLine = scanner.getLineNumber();
 						fragShaderBegins.globalLine = sourceLines.size() + 1;
 						sourceLines.push_back(string("#line ") + Util::intToStr(scanner.getLineNumber()) + ' ' +
-						                       Util::intToStr(depth) + " // " + lines[scanner.getLineNumber()-1]);
+						                      Util::intToStr(depth) + " // " + lines[scanner.getLineNumber()-1]);
 						// stop play
 					}
 /* include */
@@ -234,13 +234,32 @@ bool ShaderPrePreprocessor::parseFileForPragmas(const string& filename, int dept
 					        strcmp(token->getValue().getString(), "transformFeedbackVarying") == 0)
 					{
 						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_STRING)
+						if(token->getCode() == Scanner::TC_IDENTIFIER)
 						{
-							ERROR("todo");
+							string varName = token->getValue().getString();
+							// check if already defined and for circular includance
+							Vec<TrffbVaryingPragma>::const_iterator var = findNamed(output.trffbVaryings, varName);
+							if(var != output.trffbVaryings.end())
+							{
+								if(var->definedInLine==scanner.getLineNumber() && var->definedInFile==filename)
+								{
+									PARSE_ERR("\"" << varName << "\"" << MULTIPLE_DEF_MSG);
+								}
+								else
+								{
+									PARSE_ERR("Varying \"" << varName << "\" already defined at " << var->definedInFile << ":" <<
+														var->definedInLine);
+								}
+								return false;
+							}
+
+							// all ok, push it back
+							output.trffbVaryings.push_back(TrffbVaryingPragma(filename, scanner.getLineNumber(), varName));
+							sourceLines.push_back(lines[scanner.getLineNumber()-1]);
 						}
 						else
 						{
-							PARSE_ERR_EXPECTED("string");
+							PARSE_ERR_EXPECTED("identifier");
 							return false;
 						}
 					}
@@ -257,7 +276,7 @@ bool ShaderPrePreprocessor::parseFileForPragmas(const string& filename, int dept
 								uint loc = token->getValue().getInt();
 
 								// check if already defined and for circular includance
-								Vec<ShaderVarPragma>::iterator attrib = findShaderVar(output.attributes, varName);
+								Vec<ShaderVarPragma>::const_iterator attrib = findNamed(output.attributes, varName);
 								if(attrib != output.attributes.end())
 								{
 									if(attrib->definedInLine==scanner.getLineNumber() && attrib->definedInFile==filename)
@@ -349,6 +368,8 @@ bool ShaderPrePreprocessor::parseFile(const char* filename)
 	// parse master file
 	if(!parseFileForPragmas(filename)) return false;
 
+	// rearrange the trffbVaryings
+
 	// sanity checks
 	if(vertShaderBegins.globalLine == -1)
 	{

+ 24 - 18
src/Resources/Helpers/ShaderPrePreprocessor.h

@@ -10,10 +10,18 @@
  *
  * The class fills some of the GLSL spec deficiencies. It adds the include preprocessor directive and the support to
  * have all the shaders in the same file. The file that includes all the shaders is called
- * ShaderPrePreprocessor-compatible. The preprocessor pragmas are four: include, vertShaderBegins, fragShaderBegins and
- * attribute. The *ShaderBegins indicate where the shader code begins and must be in certain order, first the vert
- * shader then the optional geom and then the frag. The include is self-explanatory. The attribute is used to bind
- * custom locations to attributes.
+ * ShaderPrePreprocessor-compatible.
+ *
+ * The preprocessor pragmas are:
+ *
+ * - #pragma anki vertShaderBegins
+ * - #pragma anki geomShaderBegins
+ * - #pragma anki fragShaderBegins
+ * - #pragma anki attribute <varName> <customLocation>
+ * - #pragma anki include "<filename>"
+ * - #pragma anki transformFeedbackVarying <varName>
+ *
+ * @note The order of the *ShaderBegins is important
  */
 class ShaderPrePreprocessor
 {
@@ -26,7 +34,6 @@ class ShaderPrePreprocessor
 		 */
 		struct Pragma
 		{
-			
 			string definedInFile;
 			int    definedInLine;
 			Pragma();
@@ -49,9 +56,8 @@ class ShaderPrePreprocessor
 		struct TrffbVaryingPragma: Pragma
 		{
 			string name;
-			uint   id;
 
-			TrffbVaryingPragma(const string& definedInFile_, int definedInLine_, const string& name_, uint id_);
+			TrffbVaryingPragma(const string& definedInFile_, int definedInLine_, const string& name_);
 		};
 	
 		struct CodeBeginningPragma: Pragma
@@ -124,12 +130,13 @@ class ShaderPrePreprocessor
 		Vec<ShaderVarPragma>::iterator findShaderVar(Vec<ShaderVarPragma>& vec, const string& name) const;
 
 		/**
-		 * Searches inside the Output::attributes or  vectors
-		 * @param vec Output::uniforms or Output::attributes
-		 * @param name The name of the location
+		 * Searches inside the Output::attributes or Output::trffbVaryings vectors
+		 * @param vec Output::uniforms or Output::trffbVaryings
+		 * @param what The name of the varying or attrib
 		 * @return Iterator to the vector
 		 */
-		template<typename Type> typename Vec<Type>::iterator findNamed(const Vec<Type>& vec, const string& what) const;
+		template<typename Type>
+		typename Vec<Type>::const_iterator findNamed(const Vec<Type>& vec, const string& what) const;
 
 		void printSourceLines() const;  ///< For debugging
 		void printShaderVars() const;  ///< For debugging
@@ -159,11 +166,10 @@ inline ShaderPrePreprocessor::ShaderVarPragma::ShaderVarPragma(const string& def
 
 
 inline ShaderPrePreprocessor::TrffbVaryingPragma::TrffbVaryingPragma(const string& definedInFile_,
-                                                                         int definedInLine_,
-                                                                         const string& name_, uint id_):
+                                                                     int definedInLine_,
+                                                                     const string& name_):
 	Pragma(definedInFile_, definedInLine_),
-	name(name_),
-	id(id_)
+	name(name_)
 {}
 
 
@@ -172,10 +178,10 @@ inline ShaderPrePreprocessor::CodeBeginningPragma::CodeBeginningPragma():
 {}
 
 
-template<typename Type> typename Vec<Type>::iterator ShaderPrePreprocessor::findNamed(const Vec<Type>& vec,
-                                                                                      const string& what) const
+template<typename Type>
+typename Vec<Type>::const_iterator ShaderPrePreprocessor::findNamed(const Vec<Type>& vec, const string& what) const
 {
-	typename Vec<Type>::iterator it = vec.begin();
+	typename Vec<Type>::const_iterator it = vec.begin();
 	while(it != vec.end() && it->name != what)
 	{
 		++it;

+ 15 - 3
src/Resources/ShaderProg.cpp

@@ -19,6 +19,7 @@ string ShaderProg::stdSourceCode(
 	#pragma debug(off)\n"
 );
 
+
 //======================================================================================================================
 // set uniforms                                                                                                        =
 //======================================================================================================================
@@ -284,11 +285,11 @@ bool ShaderProg::customLoad(const char* filename, const char* extraSource)
 	// 1) create and compile the shaders
 	string preprocSource = stdSourceCode + extraSource;
 	uint vertGlId = createAndCompileShader(pars.getOutput().getVertShaderSource().c_str(), preprocSource.c_str(),
-	                                        GL_VERTEX_SHADER);
+	                                       GL_VERTEX_SHADER);
 	if(vertGlId == 0) return false;
 
 	uint fragGlId = createAndCompileShader(pars.getOutput().getFragShaderSource().c_str(), preprocSource.c_str(),
-	                                        GL_FRAGMENT_SHADER);
+	                                       GL_FRAGMENT_SHADER);
 	if(fragGlId == 0) return false;
 
 	// 2) create program and attach shaders
@@ -304,7 +305,18 @@ bool ShaderProg::customLoad(const char* filename, const char* extraSource)
 	// 3) bind the custom attrib locs
 	if(!bindCustomAttribLocs(pars)) return false;
 
-	// 5) link
+	// 5) set the TRFFB varyings
+	if(pars.getOutput().getTrffbVaryings().size() > 1)
+	{
+		const char* varsArr[128];
+		for(uint i=0; i<pars.getOutput().getTrffbVaryings().size(); i++)
+		{
+			varsArr[i] = pars.getOutput().getTrffbVaryings()[i].name.c_str();
+		}
+		glTransformFeedbackVaryings(glId, pars.getOutput().getTrffbVaryings().size(), varsArr, GL_SEPARATE_ATTRIBS);
+	}
+
+	// 6) link
 	if(!link()) return false;
 	
 

+ 73 - 28
src/Resources/ShaderProg.h

@@ -43,14 +43,8 @@ class ShaderProg: public Resource
 			PROPERTY_R(Type, type, getType) ///< @ref PROPERTY_R : @ref SVT_ATTRIBUTE or @ref SVT_UNIFORM
 
 			public:
-				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), fatherSProg(var.fatherSProg)
-				{}
+				Var(GLint loc_, const char* name_, GLenum glDataType_, Type type_, const ShaderProg* fatherSProg_);
+				Var(const Var& var);
 
 			protected:
 				const ShaderProg* fatherSProg; ///< We need the ShaderProg of this variable mainly for sanity checks
@@ -62,14 +56,8 @@ class ShaderProg: public Resource
 		class UniVar: public Var
 		{
 			public:
-				UniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_):
-					Var(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
-				{}
-
-				/// copy constructor
-				UniVar(const UniVar& var):
-					Var(var)
-				{}
+				UniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_);
+				UniVar(const UniVar& var);
 
 				void setFloat(float f) const;
 				void setFloatVec(float f[], uint size = 1) const;
@@ -87,21 +75,15 @@ class ShaderProg: public Resource
 		class AttribVar: public Var
 		{
 			public:
-				AttribVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_):
-					Var(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
-				{}
-
-				/// copy constructor
-				AttribVar(const UniVar& var):
-					Var(var)
-				{}
+				AttribVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_);
+				AttribVar(const UniVar& var);
 		};
 		
 	//====================================================================================================================
 	// Public                                                                                                            =
 	//====================================================================================================================
 	public:
-		ShaderProg(): glId(numeric_limits<uint>::max()) {}
+		ShaderProg();
 		virtual ~ShaderProg() {}
 
 		/**
@@ -167,6 +149,8 @@ class ShaderProg: public Resource
 		bool uniVarExists(const char* varName) const;
 		bool attribVarExists(const char* varName) const;
 
+		static bool writeSrcCodeToCache(const char* filename, const char* extraSource);
+
 	//====================================================================================================================
 	// Private                                                                                                           =
 	//====================================================================================================================
@@ -181,10 +165,71 @@ class ShaderProg: public Resource
 		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
 
-		void getUniAndAttribVars(); ///< After the linking of the shader prog is done gather all the vars in custom containers
-		bool bindCustomAttribLocs(const class ShaderPrePreprocessor& pars) const; ///< Uses glBindAttribLocation for every parser attrib location
-		uint createAndCompileShader(const char* sourceCode, const char* preproc, int type) const; ///< @return Returns zero on failure
+		/**
+		 * After the linking of the shader prog is done gather all the vars in custom containers
+		 */
+		void getUniAndAttribVars();
+
+		/**
+		 * Uses glBindAttribLocation for every parser attrib location
+		 */
+		bool bindCustomAttribLocs(const class ShaderPrePreprocessor& pars) const;
+
+		/**
+		 * @return Returns zero on failure
+		 */
+		uint createAndCompileShader(const char* sourceCode, const char* preproc, int type) const;
 		bool link(); ///< Link the shader prog
 }; 
 
+
+//======================================================================================================================
+// Inlines                                                                                                             =
+//======================================================================================================================
+
+inline ShaderProg::Var::Var(GLint loc_, const char* name_, GLenum glDataType_, Type type_,
+                            const ShaderProg* fatherSProg_):
+	loc(loc_),
+	name(name_),
+	glDataType(glDataType_),
+	type(type_),
+	fatherSProg(fatherSProg_)
+{}
+
+
+inline ShaderProg::Var::Var(const Var& var):
+	loc(var.loc),
+	name(var.name),
+	glDataType(var.glDataType),
+	type(var.type),
+	fatherSProg(var.fatherSProg)
+{}
+
+
+inline ShaderProg::UniVar::UniVar(int loc_, const char* name_, GLenum glDataType_, const ShaderProg* fatherSProg_):
+	Var(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
+{}
+
+
+inline ShaderProg::UniVar::UniVar(const UniVar& var):
+	Var(var)
+{}
+
+
+inline ShaderProg::AttribVar::AttribVar(int loc_, const char* name_, GLenum glDataType_,
+                                        const ShaderProg* fatherSProg_):
+	Var(loc_, name_, glDataType_, SVT_UNIFORM, fatherSProg_)
+{}
+
+
+inline ShaderProg::AttribVar::AttribVar(const UniVar& var):
+	Var(var)
+{}
+
+
+inline ShaderProg::ShaderProg():
+	glId(numeric_limits<uint>::max())
+{}
+
+
 #endif

+ 20 - 0
src/Util/App.cpp

@@ -4,9 +4,11 @@
 #include "App.h"
 #include "Scene.h"
 #include "MainRenderer.h"
+#include <boost/filesystem.hpp>
 
 bool App::isCreated = false;
 
+
 //======================================================================================================================
 // parseCommandLineArgs                                                                                                =
 //======================================================================================================================
@@ -52,6 +54,24 @@ App::App(int argc, char* argv[]):
 
 	isCreated = true;
 
+	// dirs
+	settingsPath = boost::filesystem::path(getenv("HOME")) / ".anki";
+	if(!boost::filesystem::exists(settingsPath))
+	{
+		INFO("Creating settings dir \"" << settingsPath << "\"");
+		boost::filesystem::create_directory(settingsPath);
+	}
+
+	cachePath = settingsPath / "cache";
+	if(boost::filesystem::exists(cachePath))
+	{
+		boost::filesystem::remove_all(cachePath);
+	}
+
+	INFO("Creating cache dir \"" << cachePath << "\"");
+	boost::filesystem::create_directory(cachePath);
+
+
 	scene = new Scene;
 	mainRenderer = new MainRenderer;
 	activeCam = NULL;

+ 3 - 0
src/Util/App.h

@@ -2,6 +2,7 @@
 #define _APP_H_
 
 #include <SDL.h>
+#include <boost/filesystem.hpp>
 #include "Common.h"
 
 
@@ -14,6 +15,8 @@ class App
 	PROPERTY_R(uint, windowW, getWindowWidth) ///< @ref PROPERTY_R : The main window width
 	PROPERTY_R(uint, windowH, getWindowHeight) ///< @ref PROPERTY_R : The main window height
 	PROPERTY_R(bool, terminalColoringEnabled, isTerminalColoringEnabled) ///< @ref PROPERTY_R : Terminal coloring for Unix terminals. Default is enabled
+	PROPERTY_R(boost::filesystem::path, settingsPath, getSettingsPath)
+	PROPERTY_R(boost::filesystem::path, cachePath, getCachePath)
 
 	PROPERTY_RW(class Scene*, scene, setScene, getScene) ///< @ref PROPERTY_RW : Pointer to the current scene
 	PROPERTY_RW(class MainRenderer*, mainRenderer, setMainRenderer, getMainRenderer) ///< @ref PROPERTY_RW : Pointer to the main renderer