Browse Source

- Bugfixing Material loading
- Adding test cases for Material

Panagiotis Christopoulos Charitos 15 years ago
parent
commit
1cc2928ca9

+ 74 - 30
.cproject

@@ -17,7 +17,7 @@
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 				<configuration artifactName="anki" buildProperties="" description="" errorParsers="org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser" id="cdt.managedbuild.toolchain.gnu.cross.base.1593777304" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
 					<folderInfo id="cdt.managedbuild.toolchain.gnu.cross.base.1593777304.1771284297" name="/" resourcePath="">
-						<toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.cross.base.652528495" name="cdt.managedbuild.toolchain.gnu.cross.base">
+						<toolChain errorParsers="" id="cdt.managedbuild.toolchain.gnu.cross.base.652528495" name="cdt.managedbuild.toolchain.gnu.cross.base" resourceTypeBasedDiscovery="false">
 							<option id="cdt.managedbuild.option.gnu.cross.prefix.124248385" name="Prefix" superClass="cdt.managedbuild.option.gnu.cross.prefix"/>
 							<option id="cdt.managedbuild.option.gnu.cross.path.568633506" name="Path" superClass="cdt.managedbuild.option.gnu.cross.path"/>
 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.2099631" isAbstract="false" osList="all"/>
@@ -29,7 +29,8 @@
 						</toolChain>
 					</folderInfo>
 					<sourceEntries>
-						<entry excluding="Collision" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+						<entry excluding="include|src|Collision" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
+						<entry flags="VALUE_WORKSPACE_PATH" kind="sourcePath" name="src"/>
 					</sourceEntries>
 				</configuration>
 			</storageModule>
@@ -118,26 +119,6 @@
 						<parser enabled="true"/>
 					</scannerInfoProvider>
 				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="false" filePath=""/>
-						<parser enabled="false"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfileCPP">
-					<buildOutputProvider>
-						<openAction enabled="false" filePath=""/>
-						<parser enabled="false"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlC" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
 				<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1593777304;cdt.managedbuild.toolchain.gnu.cross.base.1593777304.1771284297;cdt.managedbuild.tool.gnu.cross.cpp.compiler.454660912;cdt.managedbuild.tool.gnu.cpp.compiler.input.264866474">
 					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
 					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
@@ -220,23 +201,86 @@
 							<parser enabled="true"/>
 						</scannerInfoProvider>
 					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfile">
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.cross.base.1593777304">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
 						<buildOutputProvider>
-							<openAction enabled="false" filePath=""/>
-							<parser enabled="false"/>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
 						</buildOutputProvider>
 						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlc" useDefault="true"/>
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
 							<parser enabled="true"/>
 						</scannerInfoProvider>
 					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.xlc.core.XLCManagedMakePerProjectProfileCPP">
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
 						<buildOutputProvider>
-							<openAction enabled="false" filePath=""/>
-							<parser enabled="false"/>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
 						</buildOutputProvider>
 						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -v ${plugin_state_location}/${specs_file}" command="${XL_compilerRoot}/xlC" useDefault="true"/>
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
 							<parser enabled="true"/>
 						</scannerInfoProvider>
 					</profile>

+ 7 - 0
.project

@@ -83,4 +83,11 @@
 		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
 		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
 	</natures>
+	<linkedResources>
+		<link>
+			<name>include</name>
+			<type>2</type>
+			<location>/usr/include</location>
+		</link>
+	</linkedResources>
 </projectDescription>

+ 1 - 2
blender/main.py

@@ -27,8 +27,7 @@ for obj in objs:
 	mi.blSkeleton = skeleton.getBlSkeletonFromBlObj(obj)
 	mi.saveDir = "/home/godlike/src/anki/models/imp/"
 	#mtl = GetMaterial( mi.mesh )
-	mi.mtlName = "models/imp/imp.mtl"
-	mi.flipYZ = 1
+	mi.flipYZ = True
 	mesh.export(mi)
 	
 	"""si = skeleton.Initializer()

+ 5 - 10
blender/mesh.py

@@ -13,9 +13,8 @@ class Initializer:
 	def __init__(self):
 		self.blMesh = None  # Blender Mesh
 		self.blSkeleton = None # Blender Armature
-		self.mtlName = "" # Material name
 		self.saveDir = "" # the name of the saved file
-		self.flipYZ = 0 #convert from bl to right handed coord system
+		self.flipYZ = False #convert from bl to right handed coord system
 	
 
 #=======================================================================================================================
@@ -144,7 +143,7 @@ def updateAnkiVertsWithBoneWeights(mesh, skeleton, ankiVerts):
 #=======================================================================================================================
 # getAnkiMeshScript                                                                                                    =
 #=======================================================================================================================
-def	getAnkiMeshScript(mesh, skeleton, mtlName, meshName, flipYZ):
+def	getAnkiMeshScript(mesh, skeleton, meshName, flipYZ):
 	# check verts number
 	vertsNum = len(mesh.verts)
 	if vertsNum < 3:
@@ -282,17 +281,13 @@ def	getAnkiMeshScript(mesh, skeleton, mtlName, meshName, flipYZ):
 	str_ = meshName
 	buff += pack("I" + str(len(str_)) + "s", len(str_), str_)
 	
-	# Mtl name
-	str_ = mtlName
-	buff += pack("I" + str(len(str_)) + "s", len(str_), str_)
-	
 	# Verts num
 	buff += pack("I", len(ankiVerts))
 	
 	# Verts
 	for i in range(len(ankiVerts)):
 		ankiVert = ankiVerts[i]
-		if flipYZ == 0:
+		if not flipYZ:
 			buff += pack("fff", ankiVert.x, ankiVert.y, ankiVert.z)
 		else:
 			buff += pack("fff", ankiVert.x, ankiVert.z, -ankiVert.y)
@@ -348,6 +343,6 @@ def export(meshInit):
 	print("Trying to export mesh \"" + mesh.name + "\"")
 	filename = os.path.abspath(meshInit.saveDir + "/" + mesh.name + ".mesh")
 	file = open(filename, "wb")
-	file.write(getAnkiMeshScript(mesh, skeleton, meshInit.saveDir + "/" + mesh.name + ".mtl", mesh.name + ".mesh", meshInit.flipYZ))
+	file.write(getAnkiMeshScript(mesh, skeleton, mesh.name + ".mesh", meshInit.flipYZ))
 	print("Mesh exported!! \"" + filename + "\"")	
-	
+	

File diff suppressed because it is too large
+ 1 - 2
build/debug/Makefile


+ 78 - 0
src/Misc/PropertyTree.cpp

@@ -0,0 +1,78 @@
+#include <boost/property_tree/ptree.hpp>
+#include "PropertyTree.h"
+#include "Exception.h"
+
+
+namespace PropertyTree {
+
+//======================================================================================================================
+// getBool                                                                                                             =
+//======================================================================================================================
+bool getBool(const boost::property_tree::ptree& pt, const char* tag)
+{
+	std::string str = pt.get<std::string>(tag);
+	if(str == "true")
+	{
+		return true;
+	}
+	else if(str == "false")
+	{
+		return false;
+	}
+	else
+	{
+		throw EXCEPTION("Expected true or false for tag " + tag + " and not " + str);
+	}
+}
+
+
+//======================================================================================================================
+// getBoolOptional                                                                                                     =
+//======================================================================================================================
+extern boost::optional<bool> getBoolOptional(const boost::property_tree::ptree& pt, const char* tag)
+{
+	boost::optional<std::string> str = pt.get_optional<std::string>(tag);
+	if(str)
+	{
+		if(str.get() == "true")
+		{
+			return boost::optional<bool>(true);
+		}
+		else if(str.get() == "false")
+		{
+			return boost::optional<bool>(true);
+		}
+		else
+		{
+			throw EXCEPTION("Expected true or false for tag " + tag + " and not " + str.get());
+		}
+	}
+	return boost::optional<bool>();
+}
+
+
+//======================================================================================================================
+// getFloat                                                                                                            =
+//======================================================================================================================
+float getFloat(const boost::property_tree::ptree& pt)
+{
+	return pt.get<float>("float");
+}
+
+
+//======================================================================================================================
+// getVec3                                                                                                             =
+//======================================================================================================================
+Vec3 getVec3(const boost::property_tree::ptree& pt)
+{
+	const boost::property_tree::ptree& vec3Tree = pt.get_child("vec3");
+	Vec3 v3;
+	v3.x = vec3Tree.get<float>("x");
+	v3.y = vec3Tree.get<float>("y");
+	v3.z = vec3Tree.get<float>("z");
+	return v3;
+}
+
+
+
+} // end namespace

+ 31 - 0
src/Misc/PropertyTree.h

@@ -0,0 +1,31 @@
+#ifndef PROPERTY_TREE_H
+#define PROPERTY_TREE_H
+
+#include <boost/optional.hpp>
+#include <boost/property_tree/ptree_fwd.hpp>
+#include "Math.h"
+
+
+namespace PropertyTree {
+
+/// Get a bool from a ptree or throw exception if not found or incorrect.
+/// Get something like this: @code<tag>true</tag>@endcode
+/// @param[in] pt The ptree
+/// @param[in] tag The name of tha tag
+extern bool getBool(const boost::property_tree::ptree& pt, const char* tag);
+
+/// Optionaly get a bool from a ptree and throw exception incorrect.
+/// Get something like this: @code<tag>true</tag>@endcode
+/// @param[in] pt The ptree
+/// @param[in] tag The name of tha tag
+extern boost::optional<bool> getBoolOptional(const boost::property_tree::ptree& pt, const char* tag);
+
+/// Get a @code<float>0.0</float>@endcode
+extern float getFloat(const boost::property_tree::ptree& pt);
+
+/// Get a @code<vec3><x>0.0</x><y>0.0</y><z>0.0</z></vec3>@endcode
+extern Vec3 getVec3(const boost::property_tree::ptree& pt);
+
+} // end namespace
+
+#endif

+ 1 - 1
src/Renderer/Renderer.cpp

@@ -310,7 +310,7 @@ void Renderer::renderModelNode(const ModelNode& modelNode, const Camera& cam, Mo
 		// Render
 		if(modelNode.hasSkeleton())
 		{
-			RASSERT_THROW_EXCEPTION(!mtl->hasHWSkinning()); // it has skel controller but no skinning
+			RASSERT_THROW_EXCEPTION(!mtl->hasHwSkinning()); // it has skel controller but no skinning
 
 			// first the uniforms
 			mtl->getStdUniVar(Material::SUV_SKINNING_ROTATIONS)->setMat3(&modelNode.getBoneRotations()[0],

+ 140 - 234
src/Resources/Material.cpp

@@ -1,12 +1,16 @@
 #include <cstring>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/foreach.hpp>
+#include <boost/lexical_cast.hpp>
 #include "Material.h"
 #include "Resource.h"
-#include "Scanner.h"
 #include "Parser.h"
 #include "Texture.h"
 #include "ShaderProg.h"
 #include "App.h"
 #include "MainRenderer.h"
+#include "PropertyTree.h"
 
 
 /// Customized THROW_EXCEPTION
@@ -110,6 +114,8 @@ static bool searchBlendEnum(const char* str, int& gl_enum)
 			gl_enum = ptr->glEnum;
 			return true;
 		}
+
+		++ptr;
 	}
 
 	return false;
@@ -136,174 +142,126 @@ Material::Material():
 //======================================================================================================================
 void Material::load(const char* filename)
 {
-	Scanner scanner(filename);
-	const Scanner::Token* token;
-
-	while(true)
+	try
 	{
-		token = &scanner.getNextToken();
-
-		//
-		// Shader program
-		//
-		if(Parser::isIdentifier(token, "shaderProg"))
-		{
-			if(shaderProg.get())
-			{
-				throw PARSER_EXCEPTION("Shader program already loaded");
-			}
-
-			token = &scanner.getNextToken();
-			std::string shaderFilename;
-			// Just a string
-			if(token->getCode() == Scanner::TC_STRING)
-			{
-				shaderFilename = token->getValue().getString();
-			}
-			// Its { so... build custom shader
-			else if(token->getCode() == Scanner::TC_LBRACKET)
-			{
-				std::string sProgFilename;
-				std::string source;
-				std::string prefix;
-
-				std::string op = Parser::parseIdentifier(scanner);
-				if(op == "customMsSProg")
-				{
-					parseCustomShader(msGenericDefines, scanner, sProgFilename, source, prefix);
-				}
-				else if(op == "customDpSProg")
-				{
-					parseCustomShader(dpGenericDefines, scanner, sProgFilename, source, prefix);
-				}
-				else
-				{
-					throw PARSER_EXCEPTION_EXPECTED("identifier customMsSProg or customDpSProg");
-				}
-
-				shaderFilename = ShaderProg::createSrcCodeToCache(sProgFilename.c_str(), source.c_str(), prefix.c_str());
-
-				// }
-				token = &scanner.getNextToken();
-				if(token->getCode() != Scanner::TC_RBRACKET)
-				{
-					throw PARSER_EXCEPTION_EXPECTED("}");
-				}
-			}
-			else
-			{
-				throw PARSER_EXCEPTION_EXPECTED("string or {");
-			}
-
-			shaderProg.loadRsrc(shaderFilename.c_str());
+		using namespace boost::property_tree;
+		ptree rpt;
+  	read_xml(filename, rpt);
+
+  	const ptree& pt = rpt.get_child("material");
+
+  	//
+  	// shaderProg
+  	//
+  	const ptree& shaderProgTree = pt.get_child("shaderProg");
+
+  	boost::optional<std::string> file = shaderProgTree.get_optional<std::string>("file");
+  	boost::optional<const ptree&> customMsSProgTree = shaderProgTree.get_child_optional("customMsSProg");
+		boost::optional<const ptree&> customDpSProgTree = shaderProgTree.get_child_optional("customDpSProg");
+
+  	// Just file
+  	if(file)
+  	{
+  		shaderProg.loadRsrc(file.get().c_str());
+  	}
+  	// customMsSProg
+  	else if(customMsSProgTree)
+  	{
+  		std::string source;
+  		std::string prefix;
+
+  		parseCustomShader(msGenericDefines, customMsSProgTree.get(), source, prefix);
+  		std::string shaderFilename = ShaderProg::createSrcCodeToCache("shaders/MsGeneric.glsl",
+  		                                                              source.c_str(), prefix.c_str());
+  		shaderProg.loadRsrc(shaderFilename.c_str());
 		}
-		//
-		// blendingStage
-		//
-		else if(Parser::isIdentifier(token, "blendingStage"))
+		// customDpSProg
+  	else if(customDpSProgTree)
+  	{
+  		std::string source;
+  		std::string prefix;
+
+  		parseCustomShader(dpGenericDefines, customDpSProgTree.get(), source, prefix);
+  		std::string shaderFilename = ShaderProg::createSrcCodeToCache("shaders/DpGeneric.glsl",
+  		                                                              source.c_str(), prefix.c_str());
+  		shaderProg.loadRsrc(shaderFilename.c_str());
+  	}
+  	// Error
+		else
 		{
-			blendingStage = Parser::parseBool(scanner);
+			throw EXCEPTION("Expected file or customMsSProg or customDpSProg");
 		}
-		//
-		// blendFuncs
-		//
-		else if(Parser::isIdentifier(token, "blendFuncs"))
-		{
-			// {
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_LBRACKET)
-			{
-				throw PARSER_EXCEPTION_EXPECTED("{");
-			}
 
-			// sFactor
-			Parser::parseIdentifier(scanner, "sFactor");
-			int glEnum;
-			if(!searchBlendEnum(Parser::parseIdentifier(scanner).c_str(), glEnum))
+  	//
+  	// blendingStage
+  	//
+  	boost::optional<bool> blendingStage_ = PropertyTree::getBoolOptional(pt, "blendingStage");
+  	if(blendingStage_)
+  	{
+  		blendingStage = blendingStage_.get();
+  	}
+
+  	//
+  	// blendFuncs
+  	//
+  	boost::optional<const ptree&> blendFuncsTree = pt.get_child_optional("blendFuncs");
+  	if(blendFuncsTree)
+  	{
+  		int glEnum;
+
+  		// sFactor
+  		std::string sFactor_ = blendFuncsTree.get().get<std::string>("sFactor");
+  		if(!searchBlendEnum(sFactor_.c_str(), glEnum))
 			{
-				throw PARSER_EXCEPTION("Incorrect blending factor \"" + token->getValue().getString() + "\"");
+				throw EXCEPTION("Incorrect blending factor \"" + sFactor_ + "\"");
 			}
 			blendingSfactor = glEnum;
 
 			// dFactor
-			Parser::parseIdentifier(scanner, "dFactor");
-			if(!searchBlendEnum(Parser::parseIdentifier(scanner).c_str(), glEnum))
+			std::string dFactor_ = blendFuncsTree.get().get<std::string>("dFactor");
+			if(!searchBlendEnum(dFactor_.c_str(), glEnum))
 			{
-				throw PARSER_EXCEPTION("Incorrect blending factor \"" + token->getValue().getString() + "\"");
+				throw EXCEPTION("Incorrect blending factor \"" + dFactor_ + "\"");
 			}
 			blendingDfactor = glEnum;
-
-			// }
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_RBRACKET)
-			{
-				throw PARSER_EXCEPTION_EXPECTED("}");
-			}
-
-		}
-		//
-		// depthTesting
-		//
-		else if(Parser::isIdentifier(token, "depthTesting"))
-		{
-			depthTesting = Parser::parseBool(scanner);
-		}
-		//
-		// wireframe
-		//
-		else if(Parser::isIdentifier(token, "wireframe"))
-		{
-			wireframe = Parser::parseBool(scanner);
-		}
-		//
-		// castsShadow
-		//
-		else if(Parser::isIdentifier(token, "castsShadow"))
-		{
-			castsShadow = Parser::parseBool(scanner);
-		}
-		//
-		// userDefinedVars
-		//
-		else if(Parser::isIdentifier(token, "userDefinedVars"))
-		{
-			// first check if the shader is defined
-			if(shaderProg.get() == NULL)
-			{
-				throw PARSER_EXCEPTION("You have to define the shader program before the user defined vars");
-			}
-
-			// {
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_LBRACKET)
+  	}
+
+  	//
+  	// depthTesting
+  	//
+  	boost::optional<bool> depthTesting_ = PropertyTree::getBoolOptional(pt, "depthTesting");
+  	if(depthTesting_)
+  	{
+  		depthTesting = depthTesting_.get();
+  	}
+
+  	//
+  	// wireframe
+  	//
+  	boost::optional<bool> wireframe_ = PropertyTree::getBoolOptional(pt, "wireframe");
+  	if(wireframe_)
+  	{
+  		wireframe = wireframe_.get();
+  	}
+
+  	//
+  	// userDefinedVars
+  	//
+  	boost::optional<const ptree&> userDefinedVarsTree = pt.get_child_optional("userDefinedVars");
+  	if(userDefinedVarsTree)
+  	{
+  		BOOST_FOREACH(const ptree::value_type& v, userDefinedVarsTree.get().get_child("userDefinedVar"))
 			{
-				throw PARSER_EXCEPTION_EXPECTED("{");
-			}
-			// loop all the vars
-			do
-			{
-				// read the name
-				token = &scanner.getNextToken();
-				if(token->getCode() == Scanner::TC_RBRACKET)
-				{
-					break;
-				}
-
-				if(token->getCode() != Scanner::TC_IDENTIFIER)
-				{
-					throw PARSER_EXCEPTION_EXPECTED("identifier");
-				}
-
-				std::string varName;
-				varName = token->getValue().getString();
+  			const ptree& userDefinedVar = v.second;
+  			std::string varName = userDefinedVar.get<std::string>("name");
 
-				userDefinedVars.push_back(new UserDefinedUniVar); // create new var
-				UserDefinedUniVar& var = userDefinedVars.back();
+  			userDefinedVars.push_back(new UserDefinedUniVar); // create new var
+  			UserDefinedUniVar& var = userDefinedVars.back();
 
 				// check if the uniform exists
 				if(!shaderProg->uniVarExists(varName.c_str()))
 				{
-					throw PARSER_EXCEPTION("The variable \"" + varName + "\" is not an active uniform");
+					throw EXCEPTION("The variable \"" + varName + "\" is not an active uniform");
 				}
 
 				var.sProgVar = shaderProg->findUniVar(varName.c_str());
@@ -313,54 +271,34 @@ void Material::load(const char* filename)
 				{
 					// texture
 					case GL_SAMPLER_2D:
-						var.value.texture.loadRsrc(Parser::parseString(scanner).c_str());
+						var.value.texture.loadRsrc(userDefinedVar.get<std::string>("texture").c_str());
 						break;
-					// float
+						// float
 					case GL_FLOAT:
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_NUMBER && token->getDataType() == Scanner::DT_FLOAT)
-						{
-							var.value.float_ = token->getValue().getFloat();
-						}
-						else
-						{
-							throw PARSER_EXCEPTION_EXPECTED("float");
-						}
+						var.value.float_ = PropertyTree::getFloat(userDefinedVar);
 						break;
-					// vec2
+						// vec2
 					case GL_FLOAT_VEC2:
-						Parser::parseMathVector(scanner, var.value.vec2);
+						/// @todo
 						break;
-					// vec3
+						// vec3
 					case GL_FLOAT_VEC3:
-						Parser::parseMathVector(scanner, var.value.vec3);
+						var.value.vec3 = PropertyTree::getVec3(userDefinedVar);
 						break;
-					// vec4
+						// vec4
 					case GL_FLOAT_VEC4:
-						Parser::parseMathVector(scanner, var.value.vec4);
+						/// @todo
 						break;
 				};
+			} // end for all userDefinedVars
+  	} // end userDefinedVars
 
-			}while(true); // end loop for all the vars
-
-		}
-		//
-		// EOF
-		//
-		else if(token->getCode() == Scanner::TC_EOF)
-		{
-			break;
-		}
-		//
-		// other crap
-		//
-		else
-		{
-			throw PARSER_EXCEPTION_UNEXPECTED();
-		}
-	} // end while
-
-	initStdShaderVars();
+		initStdShaderVars();
+	}
+	catch(std::exception& e)
+	{
+		throw EXCEPTION("Material \"" + filename + "\": " + e.what());
+	}
 }
 
 
@@ -422,75 +360,43 @@ void Material::initStdShaderVars()
 //======================================================================================================================
 // parseCustomShader                                                                                                   =
 //======================================================================================================================
-void Material::parseCustomShader(const PreprocDefines defines[], Scanner& scanner,
-		                             std::string& shaderFilename, std::string& source, std::string& prefix)
+void Material::parseCustomShader(const PreprocDefines defines[], const boost::property_tree::ptree& pt,
+                                 std::string& source, std::string& prefix)
 {
-	const Scanner::Token* token;
-
-	// {
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_LBRACKET)
-	{
-		throw PARSER_EXCEPTION_EXPECTED("{");
-	}
-
-	// file
-	Parser::parseIdentifier(scanner, "file");
-
-	// the shader prog
-	shaderFilename = Parser::parseString(scanner);
+	using namespace boost::property_tree;
 
-	// defines
-	Parser::parseIdentifier(scanner, "defines");
-
-	// {
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_LBRACKET)
+	boost::optional<const ptree&> definesTree = pt.get_child_optional("defines");
+	if(!definesTree)
 	{
-		throw PARSER_EXCEPTION_EXPECTED("{");
+		return;
 	}
 
-	// Get the defines
-	while(true)
+	BOOST_FOREACH(const ptree::value_type& v, definesTree.get())
 	{
-		token = &scanner.getNextToken();
-
-		// }
-		if(token->getCode() == Scanner::TC_RBRACKET)
-		{
-			break;
-		}
-		else if(token->getCode() != Scanner::TC_IDENTIFIER)
+		if(v.first != "define")
 		{
-			throw PARSER_EXCEPTION_EXPECTED("identifier");
+			throw EXCEPTION("Found " + v.first + " in defines");
 		}
 
-		// Check if acceptable value. Loop the switches array
+		const std::string& define = v.second.data();
+
 		const PreprocDefines* def = defines;
 		while(def->switchName != NULL)
 		{
-			if(!strcmp(def->switchName, token->getString()))
+			if (define == def->switchName)
 			{
 				break;
 			}
-
 			++def;
 		}
 
 		if(def->switchName == NULL)
 		{
-			throw PARSER_EXCEPTION("Not acceptable define " + token->getString());
+			throw EXCEPTION("Not acceptable define " + define);
 		}
 
-		source += std::string("#define ") + token->getString() + "\n";
-		prefix.push_back(def->prefix);
-	} // end get the switches
-
-	// }
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_RBRACKET)
-	{
-		throw PARSER_EXCEPTION_EXPECTED("}");
+		source += "#define " + define + "\n";
+    prefix.push_back(def->prefix);
 	}
 
 	std::sort(prefix.begin(), prefix.end());

+ 41 - 43
src/Resources/Material.h

@@ -2,6 +2,7 @@
 #define MATERIAL_H
 
 #include <boost/ptr_container/ptr_vector.hpp>
+#include <boost/property_tree/ptree_fwd.hpp>
 #include "Math.h"
 #include "Resource.h"
 #include "ShaderProg.h"
@@ -9,9 +10,6 @@
 #include "RsrcPtr.h"
 
 
-class Scanner;
-
-
 /// Mesh material Resource
 ///
 /// Every material keeps info of how to render a MeshNode. Among this info it keeps the locations of attribute and
@@ -21,41 +19,49 @@ class Scanner;
 /// variables (that we cannot longer use on GL >3) with a few additions. The user defined variables are defined and
 /// values inside the .mtl file. The attribute variables cannot be user defined, the uniform on the other hand can.
 ///
-/// File format:
+/// XML file format:
 /// @code
-/// shaderProg <string> |
-/// {
-/// 	customMsSProg {
-/// 		file <string>
-/// 		defines {
-/// 			<identifier>
-/// 			<identifier>
-/// 			...
-/// 			<identifier>
-/// 		}
-/// 	} |
-/// 	customDpSProg { <same as standardMsSProg> }
-/// }
-///
-/// [dpMtl <string>]
+/// <material>
+/// 	<shaderProg>
+/// 		<file>path/file.glsl</file> |
+/// 		<customMsSProg>
+/// 			[<defines>
+/// 				<define>DEFINE_SOMETHING</define>
+/// 				...
+/// 				<define>DEFINE_SOMETHING_ELSE</define>
+/// 			</defines>]
+/// 		</customMsSProg> |
+/// 		<customDpSProg>...</customDpSProg>
+/// 	</shaderProg>
 ///
-/// [blendingStage <true | false>]
+/// 	[<blendingStage>true|false</blendingStage>]
 ///
-/// [blendFuncs* {
-/// 	sFactor <identifier>
-/// 	dFactor <identifier>
-/// }]
+/// 	[<blendFuncs> *
+/// 		<sFactor>GL_SOMETHING</sFactor>
+/// 		<dFactor>GL_SOMETHING</dFactor>
+/// 	</blendFuncs>]
 ///
-/// [depthTesting <true | false>]
+/// 	[<depthTesting>true|false</depthTesting>]
 ///
-/// [wireFrame <true | false>]
+/// 	[<wireframe>true|false</wireframe>]
 ///
-/// [castsShadow <true | false>]
-///
-/// [userDefinedVars {
-/// 	<identifier> <value**>
-/// }]
+/// 	[<castsShadow>true|false</castsShadow>]
 ///
+/// 	[<userDefinedVars>
+/// 		<userDefinedVar>
+/// 			<name>varNameInShader</name>
+/// 			<value> **
+/// 				<texture>path/tex.png</texture> |
+/// 				<float>0.0</float> |
+/// 				<vec2><x>0.0</x><y>0.0</y></vec2> |
+/// 				<vec3><x>0.0</x><y>0.0</y><z>0.0</z></vec3> |
+/// 				<vec4><x>0.0</x><y>0.0</y><z>0.0</z><w>0.0</w></vec4>
+/// 			</value>
+/// 		</userDefinedVar>
+/// 		...
+/// 		<userDefinedVar>...</userDefinedVar>
+/// 	</userDefinedVars>]
+/// </material>
 ///
 /// *: Has nothing to do with the blendingStage. blendFuncs can be in material stage as well
 /// **: Depends on the type of the var
@@ -159,7 +165,7 @@ class Material: public Resource
 		/// @}
 
 		/// @return Return true if the shader has references to hardware skinning
-		bool hasHWSkinning() const {return stdAttribVars[SAV_VERT_WEIGHT_BONES_NUM] != NULL;}
+		bool hasHwSkinning() const {return stdAttribVars[SAV_VERT_WEIGHT_BONES_NUM] != NULL;}
 
 		/// @return Return true if the shader has references to texture coordinates
 		bool hasTexCoords() const {return stdAttribVars[SAV_TEX_COORDS] != NULL;}
@@ -198,17 +204,9 @@ class Material: public Resource
 		/// @exception Exception
 		void initStdShaderVars();
 
-		/// Parses the file for expressions like customMsSProg and customDpSProg in order to feed them into the
-		/// @ref ShaderProg::createSrcCodeToCache
-		/// @param[in] defines The available defines and their prefixes
-		/// @param[in,out] scanner The Scanner from to parse from
-		/// @param[out] shaderFilename The name of the generic shader program
-		/// @param[out] source The preprocessor source that will feed to the @ref ShaderProg::createSrcCodeToCache
-		/// @param[out] prefix The prefix of the custom shader program file that will feed to the
-		/// @ref ShaderProg::createSrcCodeToCache
-		/// @exception Exception
-		void parseCustomShader(const PreprocDefines defines[], Scanner& scanner,
-		                       std::string& shaderFilename, std::string& source, std::string& prefix);
+		/// @todo
+		static void parseCustomShader(const PreprocDefines defines[], const boost::property_tree::ptree& pt,
+		                              std::string& source, std::string& prefix);
 };
 
 

+ 7 - 5
src/Resources/Model.cpp

@@ -28,8 +28,10 @@ void Model::load(const char* filename)
 	try
   {
 		using namespace boost::property_tree;
-		ptree pt;
-  	read_xml(filename, pt);
+		ptree pt_;
+  	read_xml(filename, pt_);
+
+  	ptree& pt = pt_.get_child("model");
 
   	// subModels
   	BOOST_FOREACH(ptree::value_type& v, pt.get_child("subModels"))
@@ -115,7 +117,7 @@ void Model::load(const char* filename)
 //======================================================================================================================
 bool Model::SubModel::hasHwSkinning() const
 {
-	return material->hasHWSkinning();
+	return material->hasHwSkinning();
 }
 
 
@@ -149,12 +151,12 @@ void Model::SubModel::load(const char* meshFName, const char* mtlFName, const ch
 	}
 
 	// if mtl needs weights then mesh should have
-	if(material->hasHWSkinning() && !mesh->hasVertWeights())
+	if(material->hasHwSkinning() && !mesh->hasVertWeights())
 	{
 		throw EXCEPTION_INCOMPATIBLE_RSRCS(material, mesh);
 	}
 
-	if(dpMaterial->hasHWSkinning() && !mesh->hasVertWeights())
+	if(dpMaterial->hasHwSkinning() && !mesh->hasVertWeights())
 	{
 		throw EXCEPTION_INCOMPATIBLE_RSRCS(dpMaterial, mesh);
 	}

+ 17 - 15
src/Resources/Model.h

@@ -18,21 +18,23 @@ class Scanner;
 ///
 /// XML file format:
 /// @code
-/// <subModels>
-/// 	<subModel>
-/// 		<mesh>path/to/mesh.mesh</mesh>
-/// 		<material>path/to/material.mtl</material>
-/// 		<dpMaterial>path/to/dp.mtl</dpMaterial>
-/// 	</subModel>
-/// 	...
-/// 	<subModel>...</subModel>
-/// </subModels>
-/// <skeleton>path/to/skeleton.skel</skeleton>
-/// <skelAnims>
-/// 	<skelAnim>path/to/anim0.sanim</skelAnim>
-/// 	...
-/// 	<skelAnim>...</skelAnim>
-/// </skelAnims>
+/// <model>
+/// 	<subModels>
+/// 		<subModel>
+/// 			<mesh>path/to/mesh.mesh</mesh>
+/// 			<material>path/to/material.mtl</material>
+/// 			<dpMaterial>path/to/dp.mtl</dpMaterial>
+/// 		</subModel>
+/// 		...
+/// 		<subModel>...</subModel>
+/// 	</subModels>
+/// 	<skeleton>path/to/skeleton.skel</skeleton>
+/// 	<skelAnims>
+/// 		<skelAnim>path/to/anim0.sanim</skelAnim>
+/// 		...
+/// 		<skelAnim>...</skelAnim>
+/// 	</skelAnims>
+/// </model>
 /// @endcode
 ///
 /// Requirements:

+ 5 - 0
src/Resources/ShaderProg.cpp

@@ -356,6 +356,11 @@ bool ShaderProg::attribVarExists(const char* name) const
 std::string ShaderProg::createSrcCodeToCache(const char* sProgFPathName, const char* preAppendedSrcCode,
                                              const char* newFNamePrefix)
 {
+	if(strlen(preAppendedSrcCode) < 1 || strlen(newFNamePrefix) < 1)
+	{
+		return sProgFPathName;
+	}
+
 	boost::filesystem::path newfPathName = app->getCachePath() /
 			(std::string(newFNamePrefix) + "_" + boost::filesystem::path(sProgFPathName).filename());
 

+ 930 - 0
unit-tests/.cproject

@@ -0,0 +1,930 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?>
+
+<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+	<storageModule moduleId="org.eclipse.cdt.core.settings">
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.1435505813">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.1435505813" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.1435505813" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.1435505813." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1028908772" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.1890761974" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
+							<builder buildPath="${workspace_loc:/anki-unit-tests/build}" id="cdt.managedbuild.target.gnu.builder.exe.debug.2103212332" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="5" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1453599078" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1094794866" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
+								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1369436819" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.359123533" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.9523910" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1431861615" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
+								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1046509077" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.debug.option.debugging.level.374535908" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.346443456" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.1295042778" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.182951633" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1112282652" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.2052370952" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1095427141" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="scannerConfiguration">
+				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="makefileGenerator">
+						<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1600157178;cdt.managedbuild.config.gnu.exe.release.1600157178.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1635087590;cdt.managedbuild.tool.gnu.c.compiler.input.968421488">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1435505813;cdt.managedbuild.config.gnu.exe.debug.1435505813.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1094794866;cdt.managedbuild.tool.gnu.cpp.compiler.input.9523910">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1435505813;cdt.managedbuild.config.gnu.exe.debug.1435505813.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1431861615;cdt.managedbuild.tool.gnu.c.compiler.input.346443456">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1600157178;cdt.managedbuild.config.gnu.exe.release.1600157178.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1634290891;cdt.managedbuild.tool.gnu.cpp.compiler.input.401935880">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+		<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.1600157178">
+			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.1600157178" moduleId="org.eclipse.cdt.core.settings" name="Release">
+				<externalSettings/>
+				<extensions>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+				</extensions>
+			</storageModule>
+			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+				<configuration artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.release.1600157178" name="Release" parent="cdt.managedbuild.config.gnu.exe.release">
+					<folderInfo id="cdt.managedbuild.config.gnu.exe.release.1600157178." name="/" resourcePath="">
+						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.667669630" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
+							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.1375024984" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
+							<builder buildPath="${workspace_loc:/anki-unit-tests/Release}" id="cdt.managedbuild.target.gnu.builder.exe.release.1252615560" managedBuildOn="true" name="Gnu Make Builder.Release" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.archiver.base.576882754" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1634290891" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
+								<option id="gnu.cpp.compiler.exe.release.option.optimization.level.1611468757" superClass="gnu.cpp.compiler.exe.release.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+								<option id="gnu.cpp.compiler.exe.release.option.debugging.level.1787866573" superClass="gnu.cpp.compiler.exe.release.option.debugging.level" value="gnu.cpp.compiler.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.401935880" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.1635087590" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.release">
+								<option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.exe.release.option.optimization.level.1295710833" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/>
+								<option id="gnu.c.compiler.exe.release.option.debugging.level.734952708" superClass="gnu.c.compiler.exe.release.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.968421488" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.144067415" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.906570341" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.160144834" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.release.661192487" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1286853264" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
+						</toolChain>
+					</folderInfo>
+				</configuration>
+			</storageModule>
+			<storageModule moduleId="scannerConfiguration">
+				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="makefileGenerator">
+						<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+					<buildOutputProvider>
+						<openAction enabled="true" filePath=""/>
+						<parser enabled="true"/>
+					</buildOutputProvider>
+					<scannerInfoProvider id="specsFile">
+						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+						<parser enabled="true"/>
+					</scannerInfoProvider>
+				</profile>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1600157178;cdt.managedbuild.config.gnu.exe.release.1600157178.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1635087590;cdt.managedbuild.tool.gnu.c.compiler.input.968421488">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1435505813;cdt.managedbuild.config.gnu.exe.debug.1435505813.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1094794866;cdt.managedbuild.tool.gnu.cpp.compiler.input.9523910">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.1435505813;cdt.managedbuild.config.gnu.exe.debug.1435505813.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1431861615;cdt.managedbuild.tool.gnu.c.compiler.input.346443456">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+				<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.1600157178;cdt.managedbuild.config.gnu.exe.release.1600157178.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.1634290891;cdt.managedbuild.tool.gnu.cpp.compiler.input.401935880">
+					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP"/>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="makefileGenerator">
+							<runAction arguments="-E -P -v -dD" command="" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
+						<buildOutputProvider>
+							<openAction enabled="true" filePath=""/>
+							<parser enabled="true"/>
+						</buildOutputProvider>
+						<scannerInfoProvider id="specsFile">
+							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
+							<parser enabled="true"/>
+						</scannerInfoProvider>
+					</profile>
+				</scannerConfigBuildInfo>
+			</storageModule>
+			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+		</cconfiguration>
+	</storageModule>
+	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
+		<project id="anki-unit-tests.cdt.managedbuild.target.gnu.exe.1557576287" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
+	</storageModule>
+</cproject>

+ 83 - 0
unit-tests/.project

@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>anki-unit-tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+			<triggers>clean,full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>?name?</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.append_environment</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildArguments</key>
+					<value>-j5</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value>${workspace_loc:/anki-unit-tests/build}</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.contents</key>
+					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.core.ccnature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>

+ 27 - 0
unit-tests/Main.cpp

@@ -1,8 +1,35 @@
 #include <gtest/gtest.h>
+#include "App.h"
+#include "MainRenderer.h"
+#include "RendererInitializer.h"
 
 
 int main(int argc, char** argv)
 {
+	// Init app
+	new App(0, NULL);
+	app->initWindow();
+
+	// Init mainRenderer
+	RendererInitializer initializer;
+	initializer.ms.ez.enabled = false;
+	initializer.dbg.enabled = true;
+	initializer.is.sm.bilinearEnabled = true;
+	initializer.is.sm.enabled = true;
+	initializer.is.sm.pcfEnabled = true;
+	initializer.is.sm.resolution = 512;
+	initializer.pps.hdr.enabled = true;
+	initializer.pps.hdr.renderingQuality = 0.25;
+	initializer.pps.hdr.blurringDist = 1.0;
+	initializer.pps.hdr.blurringIterations = 2;
+	initializer.pps.hdr.exposure = 4.0;
+	initializer.pps.ssao.blurringIterations = 2;
+	initializer.pps.ssao.enabled = true;
+	initializer.pps.ssao.renderingQuality = 0.5;
+	initializer.mainRendererQuality = 1.0;
+	app->getMainRenderer().init(initializer);
+
+	// Tests
 	::testing::InitGoogleTest(&argc, argv);
 	return RUN_ALL_TESTS();
 }

+ 24 - 0
unit-tests/Resources/Material.ut.cpp

@@ -0,0 +1,24 @@
+#include <gtest/gtest.h>
+#include "Material.h"
+#include "RsrcPtr.h"
+
+
+
+TEST(MaterialTests, Test)
+{
+	// Tests
+	{
+		RsrcPtr<Material> mtl;
+		EXPECT_NO_THROW(mtl.loadRsrc("unit-tests/data/custom_sprog.mtl"));
+		EXPECT_EQ(mtl->isBlendingEnabled(), false);
+	}
+
+	{
+		RsrcPtr<Material> mtl;
+		EXPECT_NO_THROW(mtl.loadRsrc("unit-tests/data/custom_sprog_skinning.mtl"));
+		EXPECT_EQ(mtl->hasHwSkinning(), true);
+		EXPECT_EQ(mtl->getBlendingSfactor(), GL_ONE);
+		EXPECT_EQ(mtl->getBlendingDfactor(), GL_SRC_ALPHA);
+		EXPECT_EQ(mtl->isBlendingEnabled(), true);
+	}
+}

File diff suppressed because it is too large
+ 0 - 1
unit-tests/build/Makefile


+ 9 - 0
unit-tests/data/custom_sprog.mtl

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<material>
+	<shaderProg>
+		<customDpSProg>
+		</customDpSProg>
+	</shaderProg>
+</material>
+

+ 17 - 0
unit-tests/data/custom_sprog_skinning.mtl

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<material>
+	<shaderProg>
+		<customDpSProg>
+			<defines>
+				<define>HARDWARE_SKINNING</define>
+			</defines>
+		</customDpSProg>
+	</shaderProg>
+	
+	<blendFuncs>
+		<sFactor>GL_ONE</sFactor>
+		<dFactor>GL_SRC_ALPHA</dFactor>
+	</blendFuncs>
+</material>
+

Some files were not shown because too many files changed in this diff