Jelajahi Sumber

Working on lens flare. Removing some legacy files. Bug fixes on texture

Panagiotis Christopoulos Charitos 12 tahun lalu
induk
melakukan
d8d72f2b2a

+ 2 - 1
include/anki/gl/GlState.h

@@ -45,7 +45,8 @@ public:
 		return gpu;
 	}
 
-	void init(const U32 major_, const U32 minor_);
+	void init(const U32 major_, const U32 minor_, 
+		Bool registerDebugMessages = false);
 
 private:
 	/// Minor major GL version

+ 37 - 0
include/anki/renderer/Lf.h

@@ -0,0 +1,37 @@
+#ifndef ANKI_RENDERER_LF_H
+#define ANKI_RENDERER_LF_H
+
+#include "anki/renderer/RenderingPass.h"
+#include "anki/gl/Gl.h"
+#include "anki/resource/Resource.h"
+#include "anki/resource/ShaderProgramResource.h"
+#include "anki/resource/TextureResource.h"
+
+namespace anki {
+
+/// Lens flare rendering pass
+class Lf: public OptionalRenderingPass
+{
+public:
+	Lf(Renderer* r_)
+		: OptionalRenderingPass(r_)
+	{}
+
+	~Lf();
+
+	void init(const RendererInitializer& initializer);
+	void run();
+
+private:
+	ShaderProgramResourcePointer drawProg;
+	Ubo flareDataUbo;
+
+	U8 maxLensFlareCount;
+	U8 maxLightsWidthFlaresCount;
+
+	TextureResourcePointer tex;
+};
+
+} // end namespace anki
+
+#endif

+ 2 - 0
include/anki/renderer/Pps.h

@@ -8,6 +8,7 @@
 #include "anki/renderer/Hdr.h"
 #include "anki/renderer/Ssao.h"
 #include "anki/renderer/Bl.h"
+#include "anki/renderer/Lf.h"
 
 namespace anki {
 
@@ -66,6 +67,7 @@ private:
 	Hdr hdr;
 	Ssao ssao;
 	Bl bl;
+	Lf lf;
 	/// @}
 
 	Fbo fbo;

+ 9 - 0
include/anki/renderer/Renderer.h

@@ -77,6 +77,15 @@ struct RendererInitializer
 			U blurringIterationsNum = 2;
 			F32 sideBlurFactor = 1.0;
 		} bl;
+
+		// Lf
+		struct Lf
+		{
+			Bool enabled = true;
+			U8 maxLensFlareCount = 8;
+			U8 maxLightsWidthFlaresCount = 4;
+		} lf;
+
 		Bool enabled = false;
 		Bool sharpen = false;
 	} pps;

+ 3 - 3
include/anki/renderer/RenderingPass.h

@@ -26,7 +26,7 @@ protected:
 	Renderer* r; ///< Know your father
 };
 
-/// Rendering pass that can be enabled or disabled
+/// Rendering pass that can be enabled or disabled at runtime
 class SwitchableRenderingPass: public RenderingPass
 {
 public:
@@ -44,7 +44,7 @@ public:
 	}
 
 protected:
-	Bool enabled = false;
+	Bool8 enabled = false;
 };
 
 /// Rendering pass that can be enabled or disabled
@@ -61,7 +61,7 @@ public:
 	}
 
 protected:
-	Bool enabled = false;
+	Bool8 enabled = false;
 };
 
 } // end namespace anki

+ 40 - 0
shaders/PpsLfPass.glsl

@@ -0,0 +1,40 @@
+// XXX
+
+#pragma anki start vertexShader
+
+// Per flare information
+struct Flare
+{
+	vec4 posAndScale; // xy: Position, z: Scale, w: Scale again
+};
+
+// The block contains data for all flares
+layout(std140) uniform FlaresBlock
+{
+	Flare flares[MAX_FLARES];
+};
+
+layout(location = 0) in vec2 position;
+
+out vec3 vTexCoords;
+
+void main()
+{
+	vTexCoords = vec3((position * 0.5) + 0.5, float(gl_InstanceID));
+
+	vec4 posAndScale = flares[gl_InstanceID].posAndScale;
+	gl_Position = vec4(position * posAndScale.zw + posAndScale.xy , 0.0, 1.0);
+}
+
+#pragma anki start fragmentShader
+
+uniform sampler2DArray images;
+
+in vec3 vTexCoords;
+
+out vec3 fColor;
+
+void main()
+{
+	fColor = texture(images, vec3(vTexCoords.st, 0.0)).rgb;
+}

+ 1 - 1
shaders/SimpleVert.glsl

@@ -11,6 +11,6 @@ out vec2 vTexCoords;
 
 void main()
 {
-	vTexCoords = position * 0.5 + 0.5;
+	vTexCoords = (position * 0.5) + 0.5;
 	gl_Position = vec4(position, 0.0, 1.0);
 }

+ 84 - 2
src/gl/GlState.cpp

@@ -3,6 +3,7 @@
 #include "anki/gl/Fbo.h"
 #include "anki/gl/Vao.h"
 #include "anki/util/Assert.h"
+#include "anki/core/Logger.h"
 #include <limits>
 #include <algorithm>
 
@@ -12,8 +13,70 @@ namespace anki {
 // GlStateCommon                                                               = 
 //==============================================================================
 
+struct GlDbg
+{
+	GLenum token;
+	const char* str;
+};
+
+static const GlDbg gldbgsource[] = {
+	{GL_DEBUG_SOURCE_API, "GL_DEBUG_SOURCE_API"},
+	{GL_DEBUG_SOURCE_WINDOW_SYSTEM, "GL_DEBUG_SOURCE_WINDOW_SYSTEM"},
+	{GL_DEBUG_SOURCE_SHADER_COMPILER, "GL_DEBUG_SOURCE_SHADER_COMPILER"}, 
+	{GL_DEBUG_SOURCE_THIRD_PARTY, "GL_DEBUG_SOURCE_THIRD_PARTY"},
+	{GL_DEBUG_SOURCE_APPLICATION, "GL_DEBUG_SOURCE_APPLICATION"},
+	{GL_DEBUG_SOURCE_OTHER, "GL_DEBUG_SOURCE_OTHER"}};
+
+static const GlDbg gldbgtype[] = {
+	{GL_DEBUG_TYPE_ERROR, "GL_DEBUG_TYPE_ERROR"},
+	{GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR, "GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR"},
+	{GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR, "GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR"},
+	{GL_DEBUG_TYPE_PORTABILITY, "GL_DEBUG_TYPE_PORTABILITY"},
+	{GL_DEBUG_TYPE_PERFORMANCE, "GL_DEBUG_TYPE_PERFORMANCE"},
+	{GL_DEBUG_TYPE_OTHER, "GL_DEBUG_TYPE_OTHER"}};
+
+static const GlDbg gldbgseverity[] = {
+	{GL_DEBUG_SEVERITY_LOW, "GL_DEBUG_SEVERITY_LOW"},
+	{GL_DEBUG_SEVERITY_MEDIUM, "GL_DEBUG_SEVERITY_MEDIUM"},
+	{GL_DEBUG_SEVERITY_HIGH, "GL_DEBUG_SEVERITY_HIGH"}};
+
+//==============================================================================
+static void oglMessagesCallback(GLenum source,
+	GLenum type, GLuint id, GLenum severity, GLsizei length,
+	const char* message, GLvoid* userParam)
+{
+	const GlDbg* sourced = &gldbgsource[0];
+	while(source != sourced->token)
+	{
+		++sourced;
+	}
+
+	const GlDbg* typed = &gldbgtype[0];
+	while(type != typed->token)
+	{
+		++typed;
+	}
+
+	switch(severity)
+	{
+	case GL_DEBUG_SEVERITY_LOW:
+		ANKI_LOGI("GL: " << sourced->str 
+			<< ", " << typed->str << ": " << message);
+		break;
+	case GL_DEBUG_SEVERITY_MEDIUM:
+		ANKI_LOGW("GL: " << sourced->str 
+			<< ", " << typed->str << ": " << message);
+		break;
+	case GL_DEBUG_SEVERITY_HIGH:
+		ANKI_LOGE("GL: " << sourced->str 
+			<< ", " << typed->str << ": " << message);
+		break;
+	}
+}
+
 //==============================================================================
-void GlStateCommon::init(const U32 major_, const U32 minor_)
+void GlStateCommon::init(const U32 major_, const U32 minor_, 
+	Bool registerDebugMessages)
 {
 	major = (I32)major_;
 	minor = (I32)minor_;
@@ -30,6 +93,25 @@ void GlStateCommon::init(const U32 major_, const U32 minor_)
 	{
 		gpu = GPU_NVIDIA;
 	}
+
+	// Enable debug messages
+	if(registerDebugMessages)
+	{
+		glDebugMessageCallback(oglMessagesCallback, nullptr);
+
+		for(U s = 0; s < sizeof(gldbgsource) / sizeof(GlDbg); s++)
+		{
+			for(U t = 0; t < sizeof(gldbgtype) / sizeof(GlDbg); t++)
+			{
+				for(U sv = 0; sv < sizeof(gldbgseverity) / sizeof(GlDbg); sv++)
+				{
+					glDebugMessageControl(gldbgsource[s].token, 
+						gldbgtype[t].token, gldbgseverity[sv].token, 0, 
+						nullptr, GL_TRUE);
+				}
+			}
+		}
+	}
 }
 
 //==============================================================================
@@ -82,7 +164,7 @@ U GlState::getIndexFromGlEnum(const GLenum cap)
 }
 
 //==============================================================================
-void GlState::enable(GLenum cap, bool enable)
+void GlState::enable(GLenum cap, Bool enable)
 {
 	U index = getIndexFromGlEnum(cap);
 	Bool state = flags[index];

+ 2 - 1
src/gl/ShaderProgram.cpp

@@ -147,7 +147,8 @@ void ShaderProgramUniformVariable::set(const Texture& tex) const
 	ANKI_ASSERT(getGlDataType() == GL_SAMPLER_2D 
 		|| getGlDataType() == GL_SAMPLER_2D_SHADOW
 		|| getGlDataType() == GL_UNSIGNED_INT_SAMPLER_2D
-		|| getGlDataType() == GL_SAMPLER_2D_ARRAY_SHADOW);
+		|| getGlDataType() == GL_SAMPLER_2D_ARRAY_SHADOW
+		|| getGlDataType() == GL_SAMPLER_2D_ARRAY);
 	
 	glUniform1i(getLocation(), tex.bind());
 }

+ 18 - 8
src/gl/Texture.cpp

@@ -16,6 +16,7 @@ static Bool isCompressedInternalFormat(const GLenum internalFormat)
 	{
 #if ANKI_GL == ANKI_GL_DESKTOP
 	case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+	case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
 	case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
 		out = true;
 		break;
@@ -302,17 +303,24 @@ void Texture::create(const Initializer& init)
 
 				// Gather the data
 				Vector<U8> data;
-				for(U d = 0; d < depth; d++)
+				memset(&data[0], 0, data.size());
+
+				// Check if there are data
+				if(init.data[level][0].ptr != nullptr)
 				{
-					if(init.data[level][d].size == 0)
+					PtrSize layerSize = init.data[level][0].size;
+					ANKI_ASSERT(layerSize > 0);
+					data.resize(layerSize * depth);
+
+					for(U d = 0; d < depth; d++)
 					{
-						break;
-					}
+						ANKI_ASSERT(init.data[level][d].size == layerSize
+							&& init.data[level][d].ptr != nullptr);
 
-					data.resize(init.data[level][d].size);
-					ANKI_ASSERT(init.data[level][d].ptr);
-					memcpy(&data[0], init.data[level][d].ptr, 
-						init.data[level][d].size);
+						memcpy(&data[0] + d * layerSize, 
+							init.data[level][d].ptr, 
+							layerSize);
+					}
 				}
 
 				if(!isCompressedInternalFormat(internalFormat))
@@ -331,6 +339,8 @@ void Texture::create(const Initializer& init)
 				}
 				else
 				{
+					ANKI_ASSERT(data.size() > 0);
+						
 					glCompressedTexImage3D(
 						target, 
 						level, 

+ 31 - 2
src/renderer/Dbg.cpp

@@ -58,8 +58,8 @@ void Dbg::run()
 		it != scene.getSceneNodesEnd(); it++)
 	{
 		SceneNode* node = *it;
-		/*Spatial* sp = node->getSpatial();
-		if(bitsEnabled(DF_SPATIAL) && sp)*/
+		Spatial* sp = node->getSpatial();
+		if(bitsEnabled(DF_SPATIAL) && sp)
 		{
 			sceneDrawer->draw(*node);
 		}
@@ -88,6 +88,35 @@ void Dbg::run()
 		scene.getPhysics().debugDraw();
 	}
 
+	// XXX
+	{
+		SceneNode& sn = scene.findSceneNode("horse");
+		Vec3 pos = sn.getMovable()->getWorldTransform().getOrigin();
+
+		Vec4 posclip = r->getViewProjectionMatrix() * Vec4(pos, 1.0);
+		Vec2 posndc = (posclip.xyz() / posclip.w()).xy();
+
+		drawer->setModelMatrix(Mat4::getIdentity());
+		drawer->setViewProjectionMatrix(Mat4::getIdentity());
+
+		//drawer->drawLine(Vec3(0.0), posndc, Vec4(1.0));
+
+		Vec2 dist = -posndc;
+		F32 len = dist.getLength();
+		dist /= len;
+
+		U count = 1;
+
+		while(count-- != 0)
+		{
+			Vec2 foopos = posndc + dist * (len * 2.0);
+
+			drawer->drawLine(Vec3(posndc, 0.0), Vec3(foopos, 0.0), 
+				Vec4(1.0, 0.0, 1.0, 1.0));
+		}
+
+	}
+
 	drawer->flush();
 }
 

+ 88 - 0
src/renderer/Lf.cpp

@@ -0,0 +1,88 @@
+#include "anki/renderer/Lf.h"
+#include "anki/renderer/Renderer.h"
+#include "anki/scene/SceneGraph.h"
+#include "anki/scene/Movable.h"
+#include "anki/scene/Camera.h"
+
+namespace anki {
+
+//==============================================================================
+// Misc                                                                        =
+//==============================================================================
+
+//==============================================================================
+struct Flare
+{
+	Vec2 pos; ///< Position in NDC
+	Vec2 scale; ///< Scale of the quad
+	//F32 alpha; ///< Difference in alpha
+};
+
+//==============================================================================
+// Lf                                                                          =
+//==============================================================================
+
+//==============================================================================
+Lf::~Lf()
+{}
+
+//==============================================================================
+void Lf::init(const RendererInitializer& initializer)
+{
+	enabled = initializer.pps.lf.enabled;
+	if(!enabled)
+	{
+		return;
+	}
+
+	tex.load("data/textures/lens_flare/flares0.ankitex");
+
+	maxLensFlareCount = initializer.pps.lf.maxLensFlareCount;
+	maxLightsWidthFlaresCount = initializer.pps.lf.maxLightsWidthFlaresCount;
+
+	// Load the shader
+	std::string pps = "#define MAX_FLARES " 
+		+ std::to_string(initializer.pps.lf.maxLensFlareCount) + "\n";
+	std::string fname = ShaderProgramResource::createSrcCodeToCache(
+		"shaders/PpsLfPass.glsl", pps.c_str());
+	drawProg.load(fname.c_str());
+
+	// Init UBO
+	flareDataUbo.create(
+		sizeof(Flare) * maxLensFlareCount * maxLightsWidthFlaresCount,
+		nullptr);
+}
+
+//==============================================================================
+void Lf::run()
+{
+	ANKI_ASSERT(enabled);
+
+	// Update the UBO
+	{
+		SceneGraph& scene = r->getSceneGraph();
+		const Camera& cam = scene.getActiveCamera();
+
+		SceneNode& sn = scene.findSceneNode("vase_plight0");
+		Vec4 snPos = Vec4(sn.getMovable()->getWorldTransform().getOrigin(), 1.0);
+		snPos = cam.getViewProjectionMatrix() * snPos;
+		Vec2 posNdc = snPos.xy() / snPos.w();
+
+		Flare flare;
+		flare.pos = posNdc;
+		flare.scale = Vec2(0.2 * 3.0, r->getAspectRatio() * 0.2);
+		//flare.alpha = 0.2;
+
+		flareDataUbo.write(&flare, 0, sizeof(Flare));
+	}
+	
+	drawProg->bind();
+	drawProg->findUniformVariable("images").set(*tex);
+	flareDataUbo.setBinding(0);
+
+	/*GlStateSingleton::get().enable(GL_BLEND);
+	GlStateSingleton::get().setBlendFunctions(GL_ONE, GL_ONE);*/
+	r->drawQuad();
+}
+
+} // end namespace anki

+ 2 - 0
src/renderer/MainRenderer.cpp

@@ -68,6 +68,8 @@ void MainRenderer::initGl()
 	GlStateSingleton::get().setDepthMaskEnabled(true);
 	glDepthFunc(GL_LESS);
 
+	glDisable(GL_DITHER);
+
 	// Check for error
 	ANKI_CHECK_GL_ERROR();
 }

+ 8 - 2
src/renderer/Pps.cpp

@@ -8,7 +8,7 @@ namespace anki {
 
 //==============================================================================
 Pps::Pps(Renderer* r_)
-	: RenderingPass(r_), hdr(r_), ssao(r_), bl(r_)
+	: RenderingPass(r_), hdr(r_), ssao(r_), bl(r_), lf(r_)
 {}
 
 //==============================================================================
@@ -20,6 +20,7 @@ void Pps::initInternal(const RendererInitializer& initializer)
 {
 	ssao.init(initializer);
 	hdr.init(initializer);
+	lf.init(initializer);
 
 	width = initializer.width / initializer.renderingQuality;
 	height = initializer.height / initializer.renderingQuality;
@@ -115,9 +116,14 @@ void Pps::run()
 	{
 		prog->findUniformVariable("ppsHdrFai").set(hdr.getFai());
 	}
-	//prog->findUniformVariable("msDepthFai").set(r->getMs().getDepthFai());
 
 	r->drawQuad();
+
+	// Draw flares
+	if(lf.getEnabled())
+	{
+		lf.run();
+	}
 }
 
 } // end namespace anki

+ 20 - 19
src/resource/Image.cpp

@@ -438,13 +438,15 @@ static PtrSize calcSurfaceSize(const U width, const U height,
 {
 	PtrSize out = 0;
 
+	ANKI_ASSERT(width >= 4 || height >= 4);
+
 	switch(comp)
 	{
 	case Image::DC_RAW:
 		out = width * height * ((cf == Image::CF_RGB8) ? 3 : 4);
 		break;
 	case Image::DC_S3TC:
-		out = ((width + 3) / 4) * ((height + 3) / 4) 
+		out = (width / 4) * (height / 4) 
 			* (cf == Image::CF_RGB8) ? 8 : 16; // This is the block size
 		break;
 	case Image::DC_ETC:
@@ -465,14 +467,16 @@ static PtrSize calcSizeOfSegment(const AnkiTextureHeader& header,
 	Image::DataCompression comp)
 {
 	PtrSize out = 0;
-	U size = header.width;
+	U width = header.width;
+	U height = header.height;
 	U mips = header.mipLevels;
 
 	while(mips-- != 0)
 	{
-		out += calcSurfaceSize(size, size, comp, 
+		out += calcSurfaceSize(width, height, comp, 
 			(Image::ColorFormat)header.colorFormat);
-		size /= 2;
+		width /= 2;
+		height /= 2;
 	}
 
 	return out;
@@ -512,11 +516,6 @@ static void loadAnkiTexture(
 		throw ANKI_EXCEPTION("Incorrect width/height value");
 	}
 
-	if(header.width != header.height)
-	{
-		throw ANKI_EXCEPTION("Only square textures are supported");
-	}
-
 	if(header.depth < 1 || header.depth > 16)
 	{
 		throw ANKI_EXCEPTION("Zero or too big depth");
@@ -544,7 +543,7 @@ static void loadAnkiTexture(
 	}
 
 	// Check mip levels
-	U size = header.width;
+	U size = std::min(header.width, header.height);
 	mipLevels = 0;
 	while(size >= 4) // The minimum size is 4x4
 	{
@@ -619,28 +618,29 @@ static void loadAnkiTexture(
 	surfaces.resize(mipLevels * depth);
 
 	// Read all surfaces
-	U mipSize = header.width;
+	U mipWidth = header.width;
+	U mipHeight = header.height;
 	for(U mip = 0; mip < header.mipLevels; mip++)
 	{
 		for(U d = 0; d < depth; d++)
 		{
 			Image::Surface& surf = surfaces[mip * depth + d];
-			surf.width = mipSize;
-			surf.height = mipSize;
+			surf.width = mipWidth;
+			surf.height = mipHeight;
 			U dataSize = 0;
 
 			switch(preferredCompression)
 			{
 			case Image::DC_RAW:
-				dataSize = mipSize * mipSize 
-					* ((header.type == Image::CF_RGB8) ? 3 : 4);
+				dataSize = mipWidth * mipHeight 
+					* ((header.colorFormat == Image::CF_RGB8) ? 3 : 4);
 				break;
 			case Image::DC_S3TC:
-				dataSize = ((mipSize + 3) / 4) * ((mipSize + 3) / 4)
-					* ((header.type == Image::CF_RGB8) ? 8 : 16);
+				dataSize = (mipWidth / 4) * (mipHeight / 4)
+					* ((header.colorFormat == Image::CF_RGB8) ? 8 : 16);
 				break;
 			case Image::DC_ETC:
-				dataSize = (mipSize / 4) * (mipSize / 4) * 8;
+				dataSize = (mipWidth / 4) * (mipHeight / 4) * 8;
 				break;
 			default:
 				ANKI_ASSERT(0);
@@ -650,7 +650,8 @@ static void loadAnkiTexture(
 			file.read(&surf.data[0], dataSize);
 		}
 
-		mipSize /= 2;
+		mipWidth /= 2;
+		mipHeight /= 2;
 	}
 }
 

+ 3 - 14
testapp/Main.cpp

@@ -494,15 +494,6 @@ void mainLoop()
 	ANKI_COUNTERS_FLUSH();
 }
 
-
-//==============================================================================
-void glDebugCallback(GLenum source,
-	GLenum type, GLuint id, GLenum severity, GLsizei length,
-	const char* message, GLvoid* userParam)
-{
-	ANKI_LOGI("GL driver reports: " << message);
-}
-
 //==============================================================================
 // initSubsystems                                                              =
 //==============================================================================
@@ -527,15 +518,13 @@ void initSubsystems(int argc, char* argv[])
 	nwinit.minorVersion = glminor;
 	nwinit.depthBits = 0;
 	nwinit.stencilBits = 0;
-	nwinit.fullscreenDesktopRez = true;
-	nwinit.debugContext = true;
+	nwinit.fullscreenDesktopRez = false;
+	nwinit.debugContext = false;
 	win = new NativeWindow;	
 	win->create(nwinit);
 
 	// GL stuff
-	GlStateCommonSingleton::get().init(glmajor, glminor);
-
-	glDebugMessageCallback(glDebugCallback, nullptr);
+	GlStateCommonSingleton::get().init(glmajor, glminor, nwinit.debugContext);
 
 	// Input
 	InputSingleton::get().init(win);

+ 0 - 491
tools/dae2anki/dae2anki.py

@@ -1,491 +0,0 @@
-#!/usr/bin/python3
-
-import optparse
-import xml.etree.cElementTree as xml
-from struct import pack
-import os
-
-class Vector:
-	""" 3D vector """
-	def __init__(self, x, y, z):
-		self.x = x
-		self.y = y
-		self.z = z
-
-	def __eq__(self, b):
-		return self.x == b.x and self.y == b.y and self.z == b.z
-
-	def __ne__(self, b):
-		return not self.__eq__(b)
-
-	def __str__(self):
-		return "x: %f, y: %f, z: %f" %(self.x, self.y, self.z)
-
-class Vertex:
-	""" Vertex """
-	def __init__(self):
-		self.position = Vector(0.0, 0.0, 0.0)
-		self.uv = Vector(0.0, 0.0, 0.0)
-		self.bones_count = 0
-		self.bone_ids = [-1, -1, -1, -1]
-		self.weights = [-1.0, -1.0, -1.0, -1.0]
-		self.index = -1
-
-	def __eq__(self, b):
-		return self.position == b.position and self.uv == b.uv \
-			and self.bones_count == b.bones_count \
-			and compare_arr(self.bone_ids, b.bone_ids) \
-			and compare_arr(self.weights, b.weights)
-
-	def __ne__(self, b):
-		return not self.__eq__(b)
-
-	def __srt__(self):
-		return "pos: %s, uv: %s" % (self.position.__str__(), self.uv.__str__())
-
-class Mesh:
-	def __init__(self):
-		self.name = ""
-		self.vertices = []
-		self.indices = []
-		self.id = "" # The mesh:id needed for skinning
-		# The mesh/source/float_array that includes the vertex positions. 
-		# Needed for skinning
-		self.vert_positions = None
-		self.material_name = "unnamed.mtl"
-
-def compare_arr(a, b):
-	""" Compare 2 arrays """
-	la = len(a)
-	lb = len(b)
-	if la != lb:
-		raise Exception("Arrays don't have the same size")
-	for i in range(la):
-		if a[i] != b[i]:
-			return False
-
-	return True
-
-def search_in_array(arr, el):
-	""" Self explanatory. Return index in array or -1 if not found """
-	for i in range(0, len(arr)):
-		if arr[i] == el:
-			return i
-	return -1
-
-def to_collada_tag(name):
-	""" Transform a name of the tag to something that COLLADA format 
-	    understands """
-	collada_str = "{http://www.collada.org/2005/11/COLLADASchema}"
-	s = name.replace("/", "/" + collada_str)
-	return collada_str + s
-
-def parse_commandline():
-	""" Parse the command line arguments """
-	parser = optparse.OptionParser("usage: %prog [options]")
-	parser.add_option("-i", "--input", dest="inp",
-		type="string", help="specify the .DAE file to parse")
-	parser.add_option("-o", "--output", dest="out",
-		type="string", help="specify the directory to save the files")
-	parser.add_option("-f", "--flip-yz", dest="flip",
-		type="string", default=False, 
-		help="flip Y with Z (from blender to AnKi)")
-	parser.add_option("-m", "--model", dest="export_model",
-		type="string", default=False, 
-		help="create a model file as well")
-	(options, args) = parser.parse_args()
-
-	if not options.inp or not options.out:
-		parser.error("argument is missing")
-
-	return (options.inp, options.out, options.flip, options.export_model)
-
-def parse_library_geometries(el):
-	geometries = []
-
-	geometry_el_arr = el.findall(to_collada_tag("geometry"))
-	for geometry_el in geometry_el_arr:
-		geometries.append(parse_geometry(geometry_el))
-
-	return geometries
-
-def parse_float_array(float_array_el):
-	""" XXX """
-	floats = []
-
-	tokens = [x.strip() for x in float_array_el.text.split(' ')]
-
-	for token in tokens:
-		if token:
-			floats.append(float(token))
-
-	return floats
-
-def get_positions_and_uvs(mesh_el):
-	""" Given a <mesh> get the positions and the UVs float_array. Also return
-	    the offset of the mesh/polylist/input:offset for those two arrays """
-	positions_float_array = None
-	uvs_float_array = None
-
-	# First get all
-	source_elarr = mesh_el.findall(to_collada_tag("source"))
-	all_float_array = {}
-	for source_el in source_elarr:
-		source_id = source_el.get("id")
-	
-		float_array_el = source_el.find(to_collada_tag("float_array"))
-		all_float_array[source_id] = parse_float_array(float_array_el)
-
-	# Create a link between vertices:id and vertices/input:source
-	vertices_id_to_source = {}
-	vertices_el = mesh_el.find(to_collada_tag("vertices"))
-	vertices_id = vertices_el.get("id")
-	input_el = vertices_el.find(to_collada_tag("input"))
-	vertices_input_source = input_el.get("source")
-	vertices_id_to_source[vertices_id] = vertices_input_source[1:]
-
-	# Now find what it is what
-	input_elarr = mesh_el.findall(to_collada_tag("polylist/input"))
-	for input_el in input_elarr:
-		semantic = input_el.get("semantic")
-		source = input_el.get("source")
-		offset = input_el.get("offset")
-
-		if semantic == "VERTEX":
-			print("------ Found positions float_array")
-			positions_float_array = \
-				all_float_array[vertices_id_to_source[source[1:]]]
-			positions_offset = offset
-		elif semantic == "TEXCOORD":
-			print("------ Found uvs float_array")
-			uvs_float_array = all_float_array[source[1:]]
-			uvs_offset = offset
-
-	if positions_float_array == None:
-		raise Exception("Positions not found")
-	if uvs_float_array == None:
-		raise Exception("UVs not found")
-
-	# Convert the positions float array to a Vector array
-	positions_vec_array = []
-	for i in range(int(len(positions_float_array) / 3)):
-		x = positions_float_array[i * 3]
-		y = positions_float_array[i * 3 + 1]
-		z = positions_float_array[i * 3 + 2]
-		vec = Vector(x, y, z)
-		positions_vec_array.append(vec)
-
-	return (positions_vec_array, int(positions_offset), 
-		uvs_float_array, int(uvs_offset))
-
-def parse_geometry(geometry_el):
-	""" XXX """
-
-	geom_name = geometry_el.get("name")
-	geom_id = geometry_el.get("id")
-	print("---- Parsing geometry: %s" % geom_name)
-
-	mesh_el = geometry_el.find(to_collada_tag("mesh"))
-
-	# Get positions and UVs
-	(positions_vec_array, positions_offset, uvs_float_array, uvs_offset) = \
-		get_positions_and_uvs(mesh_el)
-
-	# Get polylist
-	polylist_el = mesh_el.find(to_collada_tag("polylist"))
-	inputs_count = len(polylist_el.findall(to_collada_tag("input")))
-
-	# Get material
-	mtl = polylist_el.get("material")
-
-	# Make sure that we are dealing with triangles
-	tokens = [x.strip() for x in 
-		polylist_el.find(to_collada_tag("vcount")).text.split(" ")]
-
-	for token in tokens:
-		if token:
-			if int(token) != 3:
-				raise Exception("Only triangles are alowed")	
-
-	# Get face number
-	face_count = int(mesh_el.find(to_collada_tag("polylist")).get("count"))
-
-	# Get p. p is a 3D array where the 1st dim is the face, 2nd is the vertex
-	# and the 3rd is 0 for position, 1 for normal and 2 for text coord
-	p = []
-	tokens = [x.strip() for x in 
-		polylist_el.find(to_collada_tag("p")).text.split(" ")]
-
-	for token in tokens:
-		if token:
-			p.append(int(token))
-
-	# For every face
-	verts = []
-	indices = []
-	for fi in range(0, face_count):
-		# Get the positions for each vertex
-		for vi in range(0, 3):
-			# index = p[fi][vi][positions_offset]
-			pindex = p[fi * 3 * inputs_count + vi * inputs_count 
-				+ positions_offset]
-			
-			pos = positions_vec_array[pindex]
-
-			uvindex = p[fi * 3 * inputs_count + vi * inputs_count + uvs_offset]
-
-			uv = Vector(uvs_float_array[uvindex * 2], 
-				uvs_float_array[uvindex * 2 + 1], 0.0)
-			
-			vert = Vertex()
-			vert.position = pos
-			vert.uv = uv
-			vert.index = pindex
-
-			i = search_in_array(verts, vert)
-			if i == -1:
-				verts.append(vert)
-				indices.append(len(verts) - 1)
-			else:
-				indices.append(i)
-
-	# Create geometry
-	geom = Mesh()
-	geom.vertices = verts
-	geom.indices = indices
-	geom.name = geom_name
-	geom.id = geom_id
-	geom.vert_positions = positions_vec_array
-	if mtl:
-		geom.material_name = mtl
-
-	print("------ Number of verts: %d" % len(geom.vertices))
-	print("------ Number of faces: %d" % (len(geom.indices) / 3))
-	return geom
-
-def update_mesh_with_vertex_weights(mesh, skin_el):
-	""" XXX """
-	print("---- Updating with skin information: %s" % mesh.name)
-
-	# Get all <source>
-	source_data = {}
-	source_elarr = skin_el.findall(to_collada_tag("source"))
-	for source_el in source_elarr:
-		source_id = source_el.get("id")
-	
-		float_array_el = source_el.find(to_collada_tag("float_array"))
-		name_array_el = source_el.find(to_collada_tag("Name_array"))
-
-		if float_array_el != None:
-			source_data[source_id] = parse_float_array(float_array_el)
-		elif name_array_el != None:
-			tokens = [x.strip() for x in name_array_el.text.split(' ')]
-			array = []
-			for token in tokens:
-				if token:
-					array.append(token)
-			source_data[source_id] = array
-		else:
-			raise Exception("Expected float_array or name_array")
-
-	# Now find the joint names and the weights
-	joint_names = None
-	joint_names_offset = -1
-	weight_arr = None
-	weight_arr_offset = -1
-
-	vertex_weights_el = skin_el.find(to_collada_tag("vertex_weights"))
-	input_elarr = vertex_weights_el.findall(to_collada_tag("input"))
-	for input_el in input_elarr:
-		semantic = input_el.get("semantic")
-		source = input_el.get("source")
-		source = source[1:]
-		offset = int(input_el.get("offset"))
-
-		source_array = source_data[source]
-
-		if semantic == "JOINT":
-			joint_names = source_array
-			joint_names_offset = offset
-			print("------ Found bone names")
-		elif semantic == "WEIGHT":
-			weight_arr = source_array
-			weight_arr_offset = offset
-			print("------ Found weights")
-		else:
-			raise Exception("Unrecognized semantic: %s" % semantic)
-			
-	# Get <vcount>
-	vcount = []
-	tokens = [x.strip() for x in 
-		vertex_weights_el.find(to_collada_tag("vcount")).text.split(" ")]
-
-	for token in tokens:
-		if token:
-			vcount.append(int(token))
-
-	# Get <v>
-	v = []
-	tokens = [x.strip() for x in 
-		vertex_weights_el.find(to_collada_tag("v")).text.split(" ")]
-
-	for token in tokens:
-		if token:
-			v.append(int(token))
-
-	# Do a sanity check because we made an assumption
-	if len(vcount) != len(mesh.vert_positions):
-		raise Exception("Wrong assumption made")
-
-	# Now that you have all do some magic... connect them
-	#
-	
-	# For every vert
-	other_index = 0
-	for vert_id in range(len(vcount)):
-		bones_in_vert = vcount[vert_id]
-
-		if bones_in_vert > 4:
-			raise Exception("You cannot have more than 4 bones per vertex")
-
-		if bones_in_vert == 0:
-			print("------ *WARNING* Vertex does not have bones: %d" % vert_id)
-
-		# Get weigths and ids for the vertex
-		bone_ids = [-1, -1, -1, -1]
-		vweights = [0.0, 0.0, 0.0, 0.0]
-		for i in range(bones_in_vert):
-			bone_name_index = v[other_index * 2 + joint_names_offset]
-			weight_index = v[other_index * 2 + weight_arr_offset]
-
-			bone_ids[i] = bone_name_index
-			vweights[i] = weight_arr[weight_index]
-
-			other_index += 1
-
-		# Update the vertex and the duplicates
-		for vert in mesh.vertices:
-			if vert.index != vert_id:
-				continue
-			vert.bones_count = bones_in_vert
-			vert.bone_ids = bone_ids
-			vert.weights = vweights
-
-	# Do a sanity check. Go to all verts and check if bones_count is set
-	for vert in mesh.vertices:
-		if vert.bones_count == -1:
-			raise Exception("Vertex skining information not set for vertex")
-
-def write_mesh(mesh, directory, flip):
-	""" Write mesh to file """
-	filename = directory + "/" + mesh.name + ".mesh"
-	print("---- Writing file: %s" % filename)
-	f = open(filename, "wb")
-	
-	# Magic
-	buff = pack("8s", b"ANKIMESH")
-
-	# Mesh name
-	buff += pack("I" + str(len(mesh.name)) + "s", len(mesh.name), 
-		mesh.name.encode("utf-8"))
-
-	# Verts num
-	buff += pack("I", len(mesh.vertices))
-
-	# Verts
-	if flip:
-		for vert in mesh.vertices:
-			buff += pack("fff", vert.position.x, vert.position.z, 
-				-vert.position.y)
-	else:
-		for vert in mesh.vertices:
-			buff += pack("fff", vert.position.x, vert.position.y, 
-				vert.position.z)
-
-	# Tris num
-	buff += pack("I", int(len(mesh.indices) / 3))
-
-	# Indices
-	for i in mesh.indices:
-		buff += pack("I", int(i))
-
-	# Tex coords
-	buff += pack("I", len(mesh.vertices))
-	for vert in mesh.vertices:
-		buff += pack("ff", vert.uv.x, vert.uv.y)
-
-	# Vert weight
-	if mesh.vertices[0].bones_count > 0:
-		buff += pack("I", len(mesh.vertices))
-
-		for vert in mesh.vertices:
-			buff += pack("I", vert.bones_count)
-			for i in range(vert.bones_count):
-				buff += pack("If", vert.bone_ids[i], vert.weights[i])
-	else:
-		buff += pack("I", 0)
-
-	f.write(buff)
-	f.close()
-
-def write_mesh_v2(mesh, directory, flip):
-	noop
-
-def write_model(meshes, directory, mdl_name):
-	""" Write the .model XML file """
-	filename = directory + "/" + mdl_name + ".mdl"
-	print("---- Writing file: %s" % filename)
-	f = open(filename, "w")
-
-	f.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n")
-	f.write("<model>\n")
-	f.write("\t<modelPatches>\n")
-
-	for mesh in meshes:
-		f.write("\t\t<modelPatch>\n")
-		f.write("\t\t\t<mesh>%s</mesh>\n" 
-			% os.path.abspath(directory + "/" + mesh.name + ".mesh"))
-		f.write("\t\t\t<material>%s</material>\n" % "unnamed.mtl")
-		f.write("\t\t</modelPatch>\n")
-
-	f.write("\t</modelPatches>\n")
-	f.write("</model>\n")
-
-	f.close()
-
-def main():
-	(infile, outdir, flip, export_model) = parse_commandline()
-
-	print("-- Begin...")
-	xml.register_namespace("", "http://www.collada.org/2005/11/COLLADASchema")
-	tree = xml.parse(infile)
-
-	# Get meshes
-	el_arr = tree.findall(to_collada_tag("library_geometries"))
-	for el in el_arr:
-		meshes = parse_library_geometries(el)
-
-	# Update with skin info
-	skin_elarr = tree.findall(to_collada_tag(
-		"library_controllers/controller/skin"))
-	for skin_el in skin_elarr:
-		source = skin_el.get("source")
-		source = source[1:]
-
-		for mesh in meshes:
-			if mesh.id == source:
-				update_mesh_with_vertex_weights(mesh, skin_el)
-
-	# Now write meshes
-	for mesh in meshes:
-		write_mesh(mesh, outdir, flip)
-
-	# Write the model
-	if export_model:
-		mdl_name = os.path.splitext(os.path.basename(infile))[0]
-		write_model(meshes, outdir, mdl_name)
-
-	print("-- Bye!")
-
-if __name__ == "__main__":
-	main()

+ 0 - 1132
tools/shredder/.cproject

@@ -1,1132 +0,0 @@
-<?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.869647399">
-<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.869647399" 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.MakeErrorParser" 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="shredder" 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.869647399" name="Debug" parent="cdt.managedbuild.config.gnu.exe.debug">
-<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.869647399." name="/" resourcePath="">
-<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1125227427" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
-<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.2143821015" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
-<builder buildPath="${workspace_loc:/shredder/build}" id="cdt.managedbuild.target.gnu.builder.exe.debug.1998304766" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="4" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
-<tool id="cdt.managedbuild.tool.gnu.archiver.base.1275509942" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1688420106" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
-<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.604856362" 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.1830372305" 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.560719263" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1756238392" 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.360616929" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
-<option id="gnu.c.compiler.exe.debug.option.debugging.level.546551448" 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.504420008" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.2105899280" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.1625534569" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
-<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.375963770" 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.971881667" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
-<inputType id="cdt.managedbuild.tool.gnu.assembler.input.418280354" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-</tool>
-</toolChain>
-</folderInfo>
-</configuration>
-</storageModule>
-<storageModule moduleId="scannerConfiguration">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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.config.gnu.exe.release.789362958;cdt.managedbuild.config.gnu.exe.release.789362958.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1823035346;cdt.managedbuild.tool.gnu.c.compiler.input.651758583">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.789362958;cdt.managedbuild.config.gnu.exe.release.789362958.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.699180961;cdt.managedbuild.tool.gnu.cpp.compiler.input.1255098767">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.869647399;cdt.managedbuild.config.gnu.exe.debug.869647399.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1688420106;cdt.managedbuild.tool.gnu.cpp.compiler.input.560719263">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.869647399;cdt.managedbuild.config.gnu.exe.debug.869647399.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1756238392;cdt.managedbuild.tool.gnu.c.compiler.input.504420008">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-</storageModule>
-<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
-<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
-</cconfiguration>
-<cconfiguration id="cdt.managedbuild.config.gnu.exe.release.789362958">
-<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.release.789362958" 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.MakeErrorParser" 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="shredder" 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.789362958" name="Release" parent="cdt.managedbuild.config.gnu.exe.release">
-<folderInfo id="cdt.managedbuild.config.gnu.exe.release.789362958." name="/" resourcePath="">
-<toolChain id="cdt.managedbuild.toolchain.gnu.exe.release.34693017" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.release">
-<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.release.1666426585" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.release"/>
-<builder buildPath="${workspace_loc:/shredder/Release}" id="cdt.managedbuild.target.gnu.builder.exe.release.1115876575" managedBuildOn="true" name="Gnu Make Builder.Release" superClass="cdt.managedbuild.target.gnu.builder.exe.release"/>
-<tool id="cdt.managedbuild.tool.gnu.archiver.base.210186379" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.699180961" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.release">
-<option id="gnu.cpp.compiler.exe.release.option.optimization.level.444150919" 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.1450068889" 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.1255098767" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.release.1823035346" 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.228873152" superClass="gnu.c.compiler.exe.release.option.optimization.level" valueType="enumerated"/>
-<option id="gnu.c.compiler.exe.release.option.debugging.level.196312407" 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.651758583" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-</tool>
-<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.release.1053697725" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.release"/>
-<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.release.1429491948" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.release">
-<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1219853338" 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.906591910" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.release">
-<inputType id="cdt.managedbuild.tool.gnu.assembler.input.473322245" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-</tool>
-</toolChain>
-</folderInfo>
-</configuration>
-</storageModule>
-<storageModule moduleId="scannerConfiguration">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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.config.gnu.exe.release.789362958;cdt.managedbuild.config.gnu.exe.release.789362958.;cdt.managedbuild.tool.gnu.c.compiler.exe.release.1823035346;cdt.managedbuild.tool.gnu.c.compiler.input.651758583">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.release.789362958;cdt.managedbuild.config.gnu.exe.release.789362958.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.release.699180961;cdt.managedbuild.tool.gnu.cpp.compiler.input.1255098767">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.869647399;cdt.managedbuild.config.gnu.exe.debug.869647399.;cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.1688420106;cdt.managedbuild.tool.gnu.cpp.compiler.input.560719263">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-<scannerConfigBuildInfo instanceId="cdt.managedbuild.config.gnu.exe.debug.869647399;cdt.managedbuild.config.gnu.exe.debug.869647399.;cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1756238392;cdt.managedbuild.tool.gnu.c.compiler.input.504420008">
-<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="-f ${project_name}_scd.mk" command="make" 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>
-<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>
-</storageModule>
-<storageModule moduleId="org.eclipse.cdt.core.language.mapping"/>
-<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-<storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/>
-</cconfiguration>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<project id="shredder.cdt.managedbuild.target.gnu.exe.1370758506" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
-</storageModule>
-</cproject>

+ 0 - 82
tools/shredder/.project

@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>shredder</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>-j4</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:/shredder/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>
-			<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>

File diff ditekan karena terlalu besar
+ 0 - 8
tools/shredder/build/Makefile


+ 0 - 14
tools/shredder/build/gen.cfg.py

@@ -1,14 +0,0 @@
-sourcePaths = walkDir("../../../src")
-sourceFiles = ["../src/Main.cpp"]
-
-includePaths = ["./"]
-includePaths.extend(list(walkDir("../../../src")))
-includePaths.extend(["../../../extern/include", "../../../extern/include/bullet", "/usr/include/python2.6"])
-
-executableName = "shredder"
-
-compiler = "g++"
-
-compilerFlags = "-DDEBUG_ENABLED=1 -DPLATFORM_LINUX -DREVISION=\\\"`svnversion -c ../..`\\\" -c -pedantic-errors -pedantic -ansi -Wall -Wextra -W -Wno-long-long -pipe -g3 -pg -fsingle-precision-constant"
-
-linkerFlags = "-rdynamic -pg -L../../../extern/lib-x86-64-linux -Wl,-Bstatic -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath -lGLEW -lGLU -Wl,-Bdynamic -lGL -ljpeg -lSDL -lpng -lpython2.6 -lboost_system -lboost_python -lboost_filesystem -lboost_thread"

+ 0 - 251
tools/shredder/src/Main.cpp

@@ -1,251 +0,0 @@
-#include <iostream>
-#include <GL/glew.h>
-#include "MeshData.h"
-#include "Collision.h"
-#include "App.h"
-#include "Shredder.h"
-#include "Camera.h"
-#include "Input.h"
-#include "MainRenderer.h"
-#include "RendererInitializer.h"
-#include "SceneGraph.h"
-#include "anki/gl/GlException.h"
-
-
-struct TempMesh
-{
-	Vec<Vec3> vertCoords;
-	Vec<MeshData::Triangle> tris;
-	Vec<Vec2> texCoords;
-	//Vec<MeshData::VertexWeight> vertWeights;
-};
-
-
-void cutMesh(const Plane& plane, const TempMesh& in, TempMesh& fMesh, TempMesh& bMesh)
-{
-	for(uint i = 0; i < in.tris.size(); i++)
-	{
-		const MeshData::Triangle& tri = in.tris[i];
-		float testA = plane.test(in.vertCoords[tri.vertIds[0]]);
-		float testB = plane.test(in.vertCoords[tri.vertIds[1]]);
-		float testC = plane.test(in.vertCoords[tri.vertIds[2]]);
-
-		if(testA < 0.0 && testB < 0.0 && testC < 0.0)
-		{
-
-		}
-		else if(testA >= 0.0 && testB >= 0.0 && testC >= 0.0)
-		{
-
-		}
-	}
-}
-
-
-//==============================================================================
-//                                                                             =
-//==============================================================================
-void shredMesh(const char* filename, float octreeMinSize)
-{
-	MeshData md(filename);
-
-		//
-		// Get min max
-		//
-		const Vec<Vec3>& vc = md.getVertCoords();
-		Vec3 min(vc[0]), max(vc[0]);
-		for(uint i = 1; i < vc.size(); i++)
-		{
-			for(uint j = 0; j < 3; j++)
-			{
-				if(vc[i][j] < min[j])
-				{
-					min[j] = vc[i][j];
-				}
-
-				if(vc[i][j] > max[j])
-				{
-					max[j] = vc[i][j];
-				}
-			}
-		}
-		std::cout << "min(" << min << "), max(" << max << ")" << std::endl;
-
-		//
-		// Calc planes
-		//
-		Vec<Plane> planes;
-		// Planes in x
-		for(float dist = floor(min.x / octreeMinSize) * octreeMinSize; dist < max.x; dist += octreeMinSize)
-		{
-			planes.push_back(Plane(Vec3(1, 0, 0), dist));
-		}
-		std::cout << "Planes num: " << planes.size() << std::endl;
-
-		//
-		//
-		//
-		//Vec<TempMesh> meshes;
-
-		/*for(Vec<Plane>::iterator plane = planes.begin(); plane != planes.end(); ++plane)
-		{
-			for(uint i = 0; i < md.getTris().size(); i++)
-			{
-				const MeshData::Triangle& tri = md.getTris()[i];
-				float testA = plane->test(md.getVertCoords()[tri.vertIds[0]]);
-				float testB = plane->test(md.getVertCoords()[tri.vertIds[1]]);
-				float testC = plane->test(md.getVertCoords()[tri.vertIds[2]]);
-
-				TempMesh* backMesh;
-
-				if(testA < 0.0 && testB < 0.0 && testC < 0.0)
-				{
-
-				}
-				else if(testA >= 0.0 && testB >= 0.0 && testC >= 0.0)
-				{
-
-				}
-			}
-			float dist0 = plane.getDistance();
-			float db;
-			float s =
-		}*/
-}
-
-
-//==============================================================================
-// initEngine                                                                  =
-//==============================================================================
-void initEngine(int argc, char** argv)
-{
-	new App(argc, argv);
-	app->initWindow();
-
-	glClearColor(0.1, 0.1, 0.1, 1.0);
-	glClearDepth(1.0);
-	glClearStencil(0);
-	glDepthFunc(GL_LEQUAL);
-	glCullFace(GL_BACK);
-	glEnable(GL_CULL_FACE);
-	glDisable(GL_LIGHTING);
-	glDisable(GL_TEXTURE_2D);
-	GlStateMachineSingleton::get().enable(GL_BLEND, lse)eton::get().setBlendingEnabled(false);
-	glDisable(GL_STENCIL_TEST);
-	glPolygonMode(GL_FRONT, GL_FILL);
-	glDepthMask(true);
-	glDepthFunc(GL_LESS);
-	glViewport(0, 0, app->getWindowWidth(), app->getWindowHeight());
-
-	Camera* cam = new Camera(float(app->getWindowWidth()) / app->getWindowHeight() * toRad(60.0), toRad(60.0), 0.5, 200.0);
-	cam->moveLocalY(3.0);
-	cam->moveLocalZ(5.7);
-	cam->moveLocalX(-0.3);
-	app->setActiveCam(cam);
-}
-
-
-//==============================================================================
-// main                                                                        =
-//==============================================================================
-int main(int argc, char** argv)
-{
-	try
-	{
-		initEngine(argc, argv);
-		Shredder shredder("/home/godlike/src/anki/maps/sponza/walls.mesh", 1.0);
-
-		while(true)
-		{
-			// Input
-			app->getInput().handleEvents();
-			float dist = 0.2;
-			float ang = toRad(3.0);
-			SceneNode* mover = app->getActiveCam();
-			if(app->getInput().keys[SDL_SCANCODE_A])
-			{
-				mover->moveLocalX(-dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_D])
-			{
-				mover->moveLocalX(dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_LSHIFT])
-			{
-				mover->moveLocalY(dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_SPACE])
-			{
-				mover->moveLocalY(-dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_W])
-			{
-				mover->moveLocalZ(-dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_S])
-			{
-				mover->moveLocalZ(dist);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_Q])
-			{
-				mover->rotateLocalZ(ang);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_E])
-			{
-				mover->rotateLocalZ(-ang);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_UP])
-			{
-				mover->rotateLocalX(ang);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_DOWN])
-			{
-				mover->rotateLocalX(-ang);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_LEFT])
-			{
-				mover->rotateLocalY(ang);
-			}
-			if(app->getInput().keys[SDL_SCANCODE_RIGHT])
-			{
-				mover->rotateLocalY(-ang);
-			}
-
-			mover->getLocalTransform().rotation.reorthogonalize();
-
-			// Update
-			app->getSceneGraph().updateAllControllers();
-			app->getSceneGraph().updateAllWorldStuff();
-
-			// Render
-			glClear(GL_COLOR_BUFFER_BIT);
-			glColor3fv(&Vec3(1.0)[0]);
-			//glPolygonMode(GL_FRONT, GL_LINE);
-
-			// Draw
-			glMatrixMode(GL_PROJECTION);
-			Mat4 projMat = app->getActiveCam()->getProjectionMatrix().getTransposed();
-			glLoadMatrixf(&projMat[0]);
-			glMatrixMode(GL_MODELVIEW);
-			Mat4 viewMat = app->getActiveCam()->getViewMatrix().getTransposed();
-			glLoadMatrixf(&viewMat[0]);
-
-			glEnableClientState(GL_VERTEX_ARRAY);
-			glVertexPointer(3, GL_FLOAT, 0, &(shredder.getOriginalMesh().getVertCoords()[0]));
-			glNormalPointer(GL_FLOAT, 0, &(shredder.getOriginalMesh().getVertNormals()[0]));
-			glDrawElements(GL_QUADS, shredder.getOriginalMesh().getVertIndeces().size(), GL_UNSIGNED_SHORT,
-			               &shredder.getOriginalMesh().getVertIndeces()[0]);
-			glDisableClientState(GL_VERTEX_ARRAY);
-
-			app->swapBuffers();
-			app->waitForNextFrame();
-			ON_GL_FAIL_THROW_EXCEPTION();
-		}
-	}
-	catch(std::exception& e)
-	{
-		std::cerr << "Error: " << e.what() << std::endl;
-		return 1;
-	}
-	return 0;
-}

+ 0 - 24
tools/shredder/src/Shredder.h

@@ -1,24 +0,0 @@
-#ifndef SHREDDER_H
-#define SHREDDER_H
-
-#include "MeshData.h"
-
-
-class Shredder
-{
-	public:
-		Shredder(const char* filename, float octreeMinSize);
-
-		const MeshData& getOriginalMesh() const {return originalMesh;}
-
-	private:
-		MeshData originalMesh;
-};
-
-
-inline Shredder::Shredder(const char* filename, float octreeMinSize):
-	originalMesh(filename)
-{}
-
-
-#endif

+ 100 - 78
tools/texture/ankitexture.py

@@ -173,9 +173,14 @@ def parse_commandline():
 			action = "store_true", default = False, 
 			help = "assume the texture is normal")
 
+	parser.add_option("-c", "--convert-path", dest = "convert_path", 
+			type = "string", default = "/usr/bin/convert", 
+			help = "The directory where convert tool is " \
+			"located. Stupid etcpack cannot get it from PATH")
+
 	(options, args) = parser.parse_args()
 
-	if not options.inp or not options.out:
+	if not options.inp or not options.out or not options.convert_path:
 		parser.error("argument is missing")
 
 	if options.type == "2D":
@@ -190,12 +195,12 @@ def parse_commandline():
 		parser.error("Unrecognized type: " + options.type)
 
 	return (options.inp.split(":"), options.out, options.fast,
-			typ, options.normal)
+			typ, options.normal, options.convert_path)
 
-def get_internal_format_and_size(in_file):
+def identify_image(in_file):
 	""" Return the size of the input image and the internal format """
 
-	internal_format = CF_NONE
+	color_format = CF_NONE
 	width = 0
 	height = 0
 
@@ -204,73 +209,80 @@ def get_internal_format_and_size(in_file):
 
 	stdout_str = proc.stdout.read()
 
+	# Make sure the colorspace is what we want
 	reg = re.search(r"Colorspace: (.*)", stdout_str)
-	if not reg:
-		raise Exception("Cannot extract colorspace")
-
-	print("-- Colorspace: %s" % reg.group(1))
-	if reg.group(1) == "RGB":
-		internal_format = CF_RGB8
-	elif reg.group(1) == "RGBA":
-		internal_format = CF_RGBA8
-	else:
-		raise Exception("Unrecognized color format")
+	if not reg or reg.group(1) != "RGB":
+		raise Exception("Something is wrong with the colorspace")
 
+	# Get the size of the iamge
 	reg = re.search(r"Geometry: ([0-9]*)x([0-9]*)\+", stdout_str)
 
 	if not reg:
 		raise Exception("Cannot extract size")
+	
+	# Identify the color space
+	if not re.search(r"red: 8-bit", stdout_str) \
+			or not re.search(r"green: 8-bit", stdout_str) \
+			or not re.search(r"blue: 8-bit", stdout_str):
+		raise Exception("Incorrect channel depths")
+
+	if re.search(r"alpha: 8-bit", stdout_str):
+		color_format = CF_RGBA8
+		color_format_str = "RGBA"
+	else:
+		color_format = CF_RGB8
+		color_format_str = "RGB"
 
-	print("-- width: %s, height: %s" % (reg.group(1), reg.group(2)))
-
-	return (internal_format, int(reg.group(1)), int(reg.group(2)))
+	# print some stuff and return
+	print("-- width: %s, height: %s color format: %s" % \
+			(reg.group(1), reg.group(2), color_format_str))
+	return (color_format, int(reg.group(1)), int(reg.group(2)))
 
-def create_mipmaps(in_file, tmp_dir, orig_size, internal_format):
+def create_mipmaps(in_file, tmp_dir, width_, height_, color_format):
 	""" Create a number of images for all mipmaps """
 
 	print("-- Generate mipmaps")
 
-	size = orig_size
+	width = width_
+	height = height_
 
 	mips_fnames = []
 
-	while size >= 4:
-		size_str = "%dx%d" % (size, size)
+	while width >= 4 and height >= 4:
+		size_str = "%dx%d" % (width, height)
 		out_file_str = os.path.join(tmp_dir, get_base_fname(in_file)) \
-				+ "." + str(size)
+				+ "." + size_str
 
-		print("  -- %s.(tga & ppm)" % out_file_str)
+		print("  -- %s.tga" % out_file_str)
 
 		mips_fnames.append(out_file_str)
 
 		args = ["convert", in_file, "-resize", size_str, "-alpha"]
 
-		if internal_format == CF_RGB8:
+		if color_format == CF_RGB8:
 			args.append("deactivate")
 		else:
 			args.append("activate")
 
-		# ppm
-		args_ppm = copy.deepcopy(args)
-		args_ppm.append(out_file_str + ".ppm")
-		subprocess.check_call(args_ppm)
-
-		# png
-		args_tga = copy.deepcopy(args)
-		args_tga.append(out_file_str + ".tga")
-		subprocess.check_call(args_tga)
+		args.append(out_file_str + ".tga")
+		subprocess.check_call(args)
 
-		size = size / 2
+		width = width / 2
+		height = height / 2
 
 	return mips_fnames
 
-def create_etc_images(mips_fnames, tmp_dir, fast, internal_format):
+def create_etc_images(mips_fnames, tmp_dir, fast, color_format, convert_path):
 	""" Create the etc files """
 
 	print("-- Creating ETC images")
 
+	# Copy the convert tool to the working dir so that etcpack will see it
+	shutil.copy2(convert_path, \
+			os.path.join(tmp_dir, os.path.basename(convert_path)))
+
 	for fname in mips_fnames:
-		fname = fname + ".ppm"
+		fname = fname + ".tga"
 
 		print("  -- %s" % fname)
 
@@ -281,14 +293,14 @@ def create_etc_images(mips_fnames, tmp_dir, fast, internal_format):
 			args.append("fast")
 
 		args.append("-f")
-		if internal_format == CF_RGB8:
+		if color_format == CF_RGB8:
 			args.append("RGB")
 		else:
 			args.append("RGBA")
 
-		subprocess.check_call(args, stdout = subprocess.PIPE)
+		subprocess.check_call(args, stdout = subprocess.PIPE, cwd = tmp_dir)
 
-def create_dds_images(mips_fnames, tmp_dir, fast, internal_format, \
+def create_dds_images(mips_fnames, tmp_dir, fast, color_format, \
 		normal):
 	""" Create the dds files """
 
@@ -312,12 +324,13 @@ def create_dds_images(mips_fnames, tmp_dir, fast, internal_format, \
 		if fast:
 			args.append("-fast")
 
-		if internal_format == CF_RGB8:
+		if color_format == CF_RGB8:
 			if not normal:
 				args.append("-bc1")
 			else:
 				args.append("-bc1n")
-		elif internal_format == CF_RGBA8:
+		elif color_format == CF_RGBA8:
+			args.append("-alpha")
 			if not normal:
 				args.append("-bc3")
 			else:
@@ -328,9 +341,11 @@ def create_dds_images(mips_fnames, tmp_dir, fast, internal_format, \
 
 		subprocess.check_call(args, stdout = subprocess.PIPE)
 
-def write_raw(tex_file, fname, width, height, internal_format):
+def write_raw(tex_file, fname, width, height, color_format):
 	""" Append raw data to the AnKi texture file """
 
+	print("  -- Appending %s" % fname)
+
 	# Read and check the header
 	uncompressed_tga_header = struct.pack("BBBBBBBBBBBB", \
 			0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0)
@@ -349,8 +364,8 @@ def write_raw(tex_file, fname, width, height, internal_format):
 	img_height = header6[3] * 256 + header6[2]
 	img_bpp = header6[4];
 
-	if (internal_format != CF_RGB8 or img_bpp != 24) \
-			and (internal_format != CF_RGBA8 or img_bpp != 32):
+	if (color_format != CF_RGB8 or img_bpp != 24) \
+			and (color_format != CF_RGBA8 or img_bpp != 32):
 		raise Exception("Unexpected bpp")
 		
 	if img_width != width or img_height != height:
@@ -358,7 +373,7 @@ def write_raw(tex_file, fname, width, height, internal_format):
 
 	# Read the data
 	data_size = width * height
-	if internal_format == CF_RGB8:
+	if color_format == CF_RGB8:
 		data_size *= 3
 	else:
 		data_size *= 4
@@ -378,7 +393,7 @@ def write_raw(tex_file, fname, width, height, internal_format):
 	# Write data to tex_file
 	tex_file.write(data)
 
-def write_s3tc(out_file, fname, width, height, internal_format):
+def write_s3tc(out_file, fname, width, height, color_format):
 	""" Append s3tc data to the AnKi texture file """
 
 	# Read header
@@ -390,28 +405,30 @@ def write_s3tc(out_file, fname, width, height, internal_format):
 	if dds_header.dwWidth != width or dds_header.dwHeight != height:
 		raise Exception("Incorrect width")
 
-	if internal_format == CF_RGB8 \
+	if color_format == CF_RGB8 \
 			and dds_header.dwFourCC != "DXT1":
 		raise Exception("Incorrect format. Expecting DXT1")
 
-	if internal_format == CF_RGBA8 \
+	if color_format == CF_RGBA8 \
 			and dds_header.dwFourCC != "DXT5":
 		raise Exception("Incorrect format. Expecting DXT5")
 
 	# Read and write the data
-	if internal_format == CF_RGB8:
+	if color_format == CF_RGB8:
 		block_size = 8
 	else:
 		block_size = 16
 
-	data_size = ((width + 3) / 4) * ((height + 3) / 4) * block_size
+	data_size = (width / 4) * (height / 4) * block_size
 
 	data = in_file.read(data_size)
 	out_file.write(data)
 
-def write_etc(out_file, fname, width, height, internal_format):
+def write_etc(out_file, fname, width, height, color_format):
 	""" Append etc2 data to the AnKi texture file """
 	
+	print("  -- Appending %s" % fname)
+
 	# Read header
 	in_file = open(fname, "rb")
 
@@ -429,38 +446,37 @@ def write_etc(out_file, fname, width, height, internal_format):
 	data = in_file.read(data_size)
 	out_file.write(data)
 
-def convert(in_files, out, fast, typ, normal, tmp_dir):
+def convert(in_files, out, fast, typ, normal, tmp_dir, convert_path):
 	""" This is the function that does all the work """
 
 	# Invoke app named "identify" to get internal format and width and height
-	(internal_format, width, height) = get_internal_format_and_size(in_files[0])
+	(color_format, width, height) = identify_image(in_files[0])
 
-	if width != height:
-		raise Exception("Only square images are accepted")
+	if not is_power2(width) or not is_power2(height):
+		raise Exception("Image width and height should power of 2")
 
-	if not is_power2(width):
-		raise Exception("Image should power of 2")
-
-	if internal_format == CF_RGBA8 and normal:
+	if color_format == CF_RGBA8 and normal:
 		raise Exception("RGBA image and normal does not make much sense")
 
 	for i in range(1, len(in_files)):
-		(internal_format_2, width_2, height_2) = \
-				get_internal_format_and_size(in_files[i])
+		(color_format_2, width_2, height_2) = \
+				identify_image(in_files[i])
 
 		if width != width_2 or height != height_2 \
-				or internal_format != internal_format_2:
+				or color_format != color_format_2:
 			raise Exception("Images are not same size and color space")
 
 	# Create images
 	for in_file in in_files:
-		mips_fnames = create_mipmaps(in_file, tmp_dir, width, internal_format)
+		mips_fnames = create_mipmaps(in_file, tmp_dir, width, height, \
+				color_format)
 
 		# Create etc images
-		create_etc_images(mips_fnames, tmp_dir, fast, internal_format)
+		create_etc_images(mips_fnames, tmp_dir, fast, color_format, \
+				convert_path)
 
 		# Create dds images
-		create_dds_images(mips_fnames, tmp_dir, fast, internal_format, normal)
+		create_dds_images(mips_fnames, tmp_dir, fast, color_format, normal)
 
 	# Open file
 	fname = out
@@ -476,7 +492,7 @@ def convert(in_files, out, fast, typ, normal, tmp_dir):
 			height,
 			len(in_files),
 			typ,
-			internal_format,
+			color_format,
 			DC_RAW | DC_S3TC | DC_ETC2,
 			normal,
 			len(mips_fnames))
@@ -496,35 +512,38 @@ def convert(in_files, out, fast, typ, normal, tmp_dir):
 	for compression in range(0, 3):
 		# For each image
 		for in_file in in_files:
-			size = width
+			tmp_width = width
+			tmp_height = height
 
 			# For each level
-			while size >= 4:
+			while tmp_width >= 4 and tmp_height >= 4:
+				size_str = "%dx%d" % (tmp_width, tmp_height)
 				in_base_fname = os.path.join(tmp_dir, get_base_fname(in_file)) \
-					+ "." + str(size)
+						+ "." + size_str
 
 				# Write RAW
 				if compression == 0:
-					write_raw(tex_file, in_base_fname + ".tga", size, size, \
-							internal_format)
+					write_raw(tex_file, in_base_fname + ".tga", \
+							tmp_width, tmp_height, color_format)
 
 				# Write S3TC
 				if compression == 1:
-					write_s3tc(tex_file, in_base_fname + ".dds", size, size, \
-							internal_format)
+					write_s3tc(tex_file, in_base_fname + ".dds", \
+							tmp_width, tmp_height, color_format)
 
 				# Write ETC
 				if compression == 2:
-					write_etc(tex_file, in_base_fname + ".pkm", size, size, \
-							internal_format)
+					write_etc(tex_file, in_base_fname + ".pkm", \
+							tmp_width, tmp_height, color_format)
 				
-				size = size / 2
+				tmp_width = tmp_width / 2
+				tmp_height = tmp_height / 2
 
 def main():
 	""" The main """
 
 	# Parse cmd line args
-	(in_files, out, fast, typ, normal) = parse_commandline();
+	(in_files, out, fast, typ, normal, convert_path) = parse_commandline();
 
 	if typ == TT_CUBE and len(in_files) != 6:
 		raise Exception("Not enough images for cube generation")
@@ -535,12 +554,15 @@ def main():
 	if typ == TT_2D and len(in_files) != 1:
 		raise Exception("Only one image for 2D textures needed")
 
+	if not os.path.isfile(convert_path):
+		raise Exception("Tool convert not found: " + convert_path)
+
 	# Setup the temp dir
 	tmp_dir = tempfile.mkdtemp("_ankitex")
 
 	# Do the work
 	try:
-		convert(in_files, out, fast, typ, normal, tmp_dir)
+		convert(in_files, out, fast, typ, normal, tmp_dir, convert_path)
 	finally:
 		shutil.rmtree(tmp_dir)
 		

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini