Bläddra i källkod

FIX: NFF face winding bug (actually it was in StandardShapes.cpp).
FIX: StandardShapes::MakeCone() - face order was incorrect in 50% of all cases.
Implemented StandardShapes::MakeCircle().
Fixed a compiler warning in B3DImporter.cpp.
Modified cone.nff - one texture isn't found, that's ok. The mapping should be better visible now.


git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@299 67173fc5-114c-0410-ac8e-9d2fd5bffc1f

aramis_acg 16 år sedan
förälder
incheckning
6557c28ef7
6 ändrade filer med 117 tillägg och 93 borttagningar
  1. 1 1
      code/B3DImporter.cpp
  2. 79 30
      code/StandardShapes.cpp
  3. 7 9
      code/StandardShapes.h
  4. 12 13
      code/qnan.h
  5. 1 1
      test/models/NFF/NFF/cone.nff
  6. 17 39
      workspaces/vc8/assimp.sln

+ 1 - 1
code/B3DImporter.cpp

@@ -247,7 +247,7 @@ void B3DImporter::ReadBRUS(){
 		//Textures
 		//Textures
 		for( int i=0;i<n_texs;++i ){
 		for( int i=0;i<n_texs;++i ){
 			int texid=ReadInt();
 			int texid=ReadInt();
-			if( !i && texid>=0 && texid<_textures.size() ){
+			if( !i && texid>=0 && texid<(int)_textures.size() ){
 				//just use tex 0 for now
 				//just use tex 0 for now
 				const Texture &tex=_textures[texid];
 				const Texture &tex=_textures[texid];
 				aiString texname( tex.name );
 				aiString texname( tex.name );

+ 79 - 30
code/StandardShapes.cpp

@@ -38,7 +38,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 */
 */
 
 
-/** @file Implementation of the StandardShapes class
+/** @file   StandardShapes.cpp
+ *  @brief  Implementation of the StandardShapes class
+ *
+ *  The primitive geometry data comes from 
+ *  http://geometrictools.com/Documentation/PlatonicSolids.pdf.
  */
  */
 
 
 #include "AssimpPCH.h"
 #include "AssimpPCH.h"
@@ -46,11 +50,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 namespace Assimp	{
 namespace Assimp	{
 
 
-	// note - flip the face order
-#define ADD_TRIANGLE(n0,n1,n2) \
-	positions.push_back(n2); \
+	
+# define ADD_TRIANGLE(n0,n1,n2) \
+	positions.push_back(n0); \
 	positions.push_back(n1); \
 	positions.push_back(n1); \
-	positions.push_back(n0);
+	positions.push_back(n2);
 
 
 #	define ADD_PENTAGON(n0,n1,n2,n3,n4) \
 #	define ADD_PENTAGON(n0,n1,n2,n3,n4) \
 	if (polygons) \
 	if (polygons) \
@@ -84,9 +88,10 @@ namespace Assimp	{
 
 
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Fast subdivision for a mesh whose verts have a magnitude of 1
 void Subdivide(std::vector<aiVector3D>& positions)
 void Subdivide(std::vector<aiVector3D>& positions)
 {
 {
-	// assume this to be constant - input must be a Platonic primitive!
+	// assume this to be constant - (fixme: must be 1.0? I think so)
 	const float fl1 = positions[0].Length();
 	const float fl1 = positions[0].Length();
 
 
 	unsigned int origSize = (unsigned int)positions.size();
 	unsigned int origSize = (unsigned int)positions.size();
@@ -102,23 +107,25 @@ void Subdivide(std::vector<aiVector3D>& positions)
 		aiVector3D v3 = aiVector3D(b.x+c.x, b.y+c.y, b.z+c.z).Normalize()*fl1;
 		aiVector3D v3 = aiVector3D(b.x+c.x, b.y+c.y, b.z+c.z).Normalize()*fl1;
 
 
 		tv0 = v1; tv1 = v3; tv2 = v2; // overwrite the original
 		tv0 = v1; tv1 = v3; tv2 = v2; // overwrite the original
-		ADD_TRIANGLE(v2, v1, a);
-		ADD_TRIANGLE(v3, v2, c);
-		ADD_TRIANGLE(v1, v3, b);
+		ADD_TRIANGLE(v1, v2, a);
+		ADD_TRIANGLE(v2, v3, c);
+		ADD_TRIANGLE(v3, v1, b);
 	}
 	}
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Construct a mesh from given vertex positions
 aiMesh* StandardShapes::MakeMesh(const std::vector<aiVector3D>& positions,
 aiMesh* StandardShapes::MakeMesh(const std::vector<aiVector3D>& positions,
 	unsigned int numIndices)
 	unsigned int numIndices)
 {
 {
-	if (positions.size() & numIndices || positions.empty() || !numIndices)return NULL;
+	if (positions.size() & numIndices || positions.empty() || !numIndices)
+		return NULL;
 
 
-	// Determine which kinds of primitives the mesh will consist of
+	// Determine which kinds of primitives the mesh consists of
 	aiMesh* out = new aiMesh();
 	aiMesh* out = new aiMesh();
 	switch (numIndices)
 	switch (numIndices)
 	{
 	{
-	case 1:
+	case 1: 
 		out->mPrimitiveTypes = aiPrimitiveType_POINT;
 		out->mPrimitiveTypes = aiPrimitiveType_POINT;
 		break;
 		break;
 	case 2:
 	case 2:
@@ -149,6 +156,7 @@ aiMesh* StandardShapes::MakeMesh(const std::vector<aiVector3D>& positions,
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Construct a mesh with a specific shape (callback)
 aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 	std::vector<aiVector3D>&))
 	std::vector<aiVector3D>&))
 {
 {
@@ -158,6 +166,7 @@ aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Construct a mesh with a specific shape (callback)
 aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 	std::vector<aiVector3D>&, bool))
 	std::vector<aiVector3D>&, bool))
 {
 {
@@ -167,6 +176,7 @@ aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Construct a mesh with a specific shape (callback)
 aiMesh* StandardShapes::MakeMesh (unsigned int num,  void (*GenerateFunc)(
 aiMesh* StandardShapes::MakeMesh (unsigned int num,  void (*GenerateFunc)(
 	unsigned int,std::vector<aiVector3D>&))
 	unsigned int,std::vector<aiVector3D>&))
 {
 {
@@ -176,6 +186,7 @@ aiMesh* StandardShapes::MakeMesh (unsigned int num,  void (*GenerateFunc)(
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build an incosahedron with points.magnitude == 1
 unsigned int StandardShapes::MakeIcosahedron(std::vector<aiVector3D>& positions)
 unsigned int StandardShapes::MakeIcosahedron(std::vector<aiVector3D>& positions)
 {
 {
 	positions.reserve(positions.size()+60);
 	positions.reserve(positions.size()+60);
@@ -224,6 +235,7 @@ unsigned int StandardShapes::MakeIcosahedron(std::vector<aiVector3D>& positions)
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build a dodecahedron with points.magnitude == 1
 unsigned int StandardShapes::MakeDodecahedron(std::vector<aiVector3D>& positions,
 unsigned int StandardShapes::MakeDodecahedron(std::vector<aiVector3D>& positions,
 	bool polygons /*= false*/)
 	bool polygons /*= false*/)
 {
 {
@@ -271,6 +283,7 @@ unsigned int StandardShapes::MakeDodecahedron(std::vector<aiVector3D>& positions
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build an octahedron with points.magnitude == 1
 unsigned int StandardShapes::MakeOctahedron(std::vector<aiVector3D>& positions)
 unsigned int StandardShapes::MakeOctahedron(std::vector<aiVector3D>& positions)
 {
 {
 	positions.reserve(positions.size()+24);
 	positions.reserve(positions.size()+24);
@@ -295,6 +308,7 @@ unsigned int StandardShapes::MakeOctahedron(std::vector<aiVector3D>& positions)
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build a tetrahedron with points.magnitude == 1
 unsigned int StandardShapes::MakeTetrahedron(std::vector<aiVector3D>& positions)
 unsigned int StandardShapes::MakeTetrahedron(std::vector<aiVector3D>& positions)
 {
 {
 	positions.reserve(positions.size()+9);
 	positions.reserve(positions.size()+9);
@@ -315,6 +329,7 @@ unsigned int StandardShapes::MakeTetrahedron(std::vector<aiVector3D>& positions)
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build a hexahedron with points.magnitude == 1
 unsigned int StandardShapes::MakeHexahedron(std::vector<aiVector3D>& positions,
 unsigned int StandardShapes::MakeHexahedron(std::vector<aiVector3D>& positions,
 	bool polygons /*= false*/)
 	bool polygons /*= false*/)
 {
 {
@@ -345,6 +360,7 @@ unsigned int StandardShapes::MakeHexahedron(std::vector<aiVector3D>& positions,
 #undef ADD_PENTAGON
 #undef ADD_PENTAGON
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Create a subdivision sphere
 void StandardShapes::MakeSphere(unsigned int	tess,
 void StandardShapes::MakeSphere(unsigned int	tess,
 	std::vector<aiVector3D>& positions)
 	std::vector<aiVector3D>& positions)
 {
 {
@@ -362,27 +378,30 @@ void StandardShapes::MakeSphere(unsigned int	tess,
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
+// Build a cone
 void StandardShapes::MakeCone(float height,float radius1,
 void StandardShapes::MakeCone(float height,float radius1,
 	float radius2,unsigned int tess, 
 	float radius2,unsigned int tess, 
 	std::vector<aiVector3D>& positions,bool bOpen /*= false */)
 	std::vector<aiVector3D>& positions,bool bOpen /*= false */)
 {
 {
-	// Sorry, a cone with less than 3 segments makes 
-	// ABSOLUTELY NO SENSE
+	// Sorry, a cone with less than 3 segments makes ABSOLUTELY NO SENSE
 	if (tess < 3 || !height)
 	if (tess < 3 || !height)
 		return;
 		return;
 
 
+	size_t old = positions.size();
+
 	// No negative radii
 	// No negative radii
-	radius1 = fabs(radius1);
-	radius2 = fabs(radius2);
+	radius1 = ::fabs(radius1);
+	radius2 = ::fabs(radius2);
 
 
 	float halfHeight = height / 2;
 	float halfHeight = height / 2;
 
 
-	// radius1 is always the smaller one
+	// radius1 is always the smaller one 
 	if (radius2 > radius1)
 	if (radius2 > radius1)
 	{
 	{
 		std::swap(radius2,radius1);
 		std::swap(radius2,radius1);
 		halfHeight = -halfHeight;
 		halfHeight = -halfHeight;
 	}
 	}
+	else old = 0xffffffff;
 
 
 	// Use a large epsilon to check whether the cone is pointy
 	// Use a large epsilon to check whether the cone is pointy
 	if (radius1 < (radius2-radius1)*10e-3f)radius1 = 0.f;
 	if (radius1 < (radius2-radius1)*10e-3f)radius1 = 0.f;
@@ -390,7 +409,7 @@ void StandardShapes::MakeCone(float height,float radius1,
 	// We will need 3*2 verts per segment + 3*2 verts per segment
 	// We will need 3*2 verts per segment + 3*2 verts per segment
 	// if the cone is closed
 	// if the cone is closed
 	const unsigned int mem = tess*6 + (!bOpen ? tess*3 * (radius1 ? 2 : 1) : 0);
 	const unsigned int mem = tess*6 + (!bOpen ? tess*3 * (radius1 ? 2 : 1) : 0);
-	positions.reserve(mem);
+	positions.reserve(positions.size () + mem);
 
 
 	// Now construct all segments
 	// Now construct all segments
 	const float angle_delta = (float)AI_MATH_TWO_PI / tess;
 	const float angle_delta = (float)AI_MATH_TWO_PI / tess;
@@ -405,49 +424,79 @@ void StandardShapes::MakeCone(float height,float radius1,
 		const aiVector3D v2 = aiVector3D (s * radius2,  halfHeight, t * radius2 );
 		const aiVector3D v2 = aiVector3D (s * radius2,  halfHeight, t * radius2 );
 
 
 		const float next = angle + angle_delta;
 		const float next = angle + angle_delta;
-		float s2 = cos(next);
-		float t2 = sin(next);
+		float s2 = ::cos(next);
+		float t2 = ::sin(next);
 
 
 		const aiVector3D v3 = aiVector3D (s2 * radius2,  halfHeight, t2 * radius2 );
 		const aiVector3D v3 = aiVector3D (s2 * radius2,  halfHeight, t2 * radius2 );
 		const aiVector3D v4 = aiVector3D (s2 * radius1, -halfHeight, t2 * radius1 );
 		const aiVector3D v4 = aiVector3D (s2 * radius1, -halfHeight, t2 * radius1 );
 
 
 		positions.push_back(v1);
 		positions.push_back(v1);
-		positions.push_back(v3);
 		positions.push_back(v2);
 		positions.push_back(v2);
-		positions.push_back(v4);
 		positions.push_back(v3);
 		positions.push_back(v3);
+		positions.push_back(v4);
 		positions.push_back(v1);
 		positions.push_back(v1);
+		positions.push_back(v3);
 
 
 		if (!bOpen)
 		if (!bOpen)
 		{
 		{
 			// generate the end 'cap'
 			// generate the end 'cap'
 			positions.push_back(aiVector3D(s * radius2,  halfHeight, t * radius2 ));
 			positions.push_back(aiVector3D(s * radius2,  halfHeight, t * radius2 ));
-			positions.push_back(aiVector3D(0.f, halfHeight, 0.f));
 			positions.push_back(aiVector3D(s2 * radius2,  halfHeight, t2 * radius2 ));
 			positions.push_back(aiVector3D(s2 * radius2,  halfHeight, t2 * radius2 ));
+			positions.push_back(aiVector3D(0.f, halfHeight, 0.f));
+			
 
 
 			if (radius1)
 			if (radius1)
 			{
 			{
 				// generate the other end 'cap'
 				// generate the other end 'cap'
 				positions.push_back(aiVector3D(s * radius1,  -halfHeight, t * radius1 ));
 				positions.push_back(aiVector3D(s * radius1,  -halfHeight, t * radius1 ));
-				positions.push_back(aiVector3D(0.f, -halfHeight, 0.f));
 				positions.push_back(aiVector3D(s2 * radius1,  -halfHeight, t2 * radius1 ));
 				positions.push_back(aiVector3D(s2 * radius1,  -halfHeight, t2 * radius1 ));
+				positions.push_back(aiVector3D(0.f, -halfHeight, 0.f));
+				
 			}
 			}
 		}
 		}
 		s = s2;
 		s = s2;
 		t = t2;
 		t = t2;
 		angle = next;
 		angle = next;
 	}
 	}
+
+	// Need to flip face order?
+	if (0xffffffff != old )
+	{
+		for (size_t s = old; s < positions.size();s += 3)
+			std::swap(positions[s],positions[s+1]);
+	}
 }
 }
 
 
 // ------------------------------------------------------------------------------------------------
 // ------------------------------------------------------------------------------------------------
-void StandardShapes::MakeCircle(
-	const aiVector3D&	center, 
-	const aiVector3D&	normal, 
-	float				radius,
-	unsigned int		tess,
+// Build a circle
+void StandardShapes::MakeCircle(float radius, unsigned int tess,
 	std::vector<aiVector3D>& positions)
 	std::vector<aiVector3D>& positions)
 {
 {
-	// todo
+	// Sorry, a circle with less than 3 segments makes ABSOLUTELY NO SENSE
+	if (tess < 3 || !radius)
+		return;
+
+	radius = ::fabs(radius);
+
+	// We will need 3 vertices per segment 
+	positions.reserve(positions.size()+tess*3);
+
+	const float angle_delta = (float)AI_MATH_TWO_PI / tess;
+	const float angle_max   = (float)AI_MATH_TWO_PI;
+
+	float s = 1.f; // cos(angle == 0);
+	float t = 0.f; // sin(angle == 0);
+
+	for (float angle = 0.f; angle < angle_max;  )
+	{
+		positions.push_back(aiVector3D(s * radius,0.f,t * radius));
+		angle += angle_delta;
+		s = ::cos(angle);
+		t = ::sin(angle);
+		positions.push_back(aiVector3D(s * radius,0.f,t * radius));
+
+		positions.push_back(aiVector3D(0.f,0.f,0.f));
+	}
 }
 }
 
 
 } // ! Assimp
 } // ! Assimp

+ 7 - 9
code/StandardShapes.h

@@ -153,9 +153,9 @@ public:
 	 *
 	 *
 	 *       |-----|       <- radius 1
 	 *       |-----|       <- radius 1
 	 *
 	 *
-	 *        __x__        <- ]
-	 *       /     \          | height
-	 *      /       \         | 
+	 *        __x__        <- ]               ^
+	 *       /     \          | height        |
+	 *      /       \         |               Y                 
 	 *     /         \        |
 	 *     /         \        |
 	 *    /	          \       |
 	 *    /	          \       |
 	 *   /______x______\   <- ] <- end cap
 	 *   /______x______\   <- ] <- end cap
@@ -180,16 +180,14 @@ public:
 	// ----------------------------------------------------------------
 	// ----------------------------------------------------------------
 	/** @brief Generates a flat circle
 	/** @brief Generates a flat circle
 	 *
 	 *
-	 *  @param center Center point of the circle
+	 *  The circle is constructed in the planed formed by the x,z
+	 *  axes of the cartesian coordinate system.
+	 *  
 	 *  @param radius Radius of the circle
 	 *  @param radius Radius of the circle
-	 *  @param normal Normal vector of the circle.
-	 *    This is also the normal vector of all triangles generated by
-	 *    this function.
 	 *  @param tess Number of segments.
 	 *  @param tess Number of segments.
 	 *  @param positions Receives output triangles.
 	 *  @param positions Receives output triangles.
 	 */
 	 */
-	static void MakeCircle(const aiVector3D& center, const aiVector3D& normal, 
-		float radius, unsigned int tess,
+	static void MakeCircle(float radius, unsigned int tess,
 		std::vector<aiVector3D>& positions);
 		std::vector<aiVector3D>& positions);
 	
 	
 };
 };

+ 12 - 13
code/qnan.h

@@ -3,6 +3,17 @@
 #if (!defined AI_QNAN_H_INCLUDED)
 #if (!defined AI_QNAN_H_INCLUDED)
 #define AI_QNAN_H_INCLUDED
 #define AI_QNAN_H_INCLUDED
 
 
+// Data structure for a 32 Bit IEEE 754 floating-point number
+union _IEEESingle
+{
+	float Float;
+	struct
+	{
+		uint32_t Frac : 23;
+		uint32_t Exp  : 8;
+		uint32_t Sign : 1;
+	} IEEE;
+} ;
 
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // check whether a float is NaN
 // check whether a float is NaN
@@ -23,19 +34,7 @@ AI_FORCE_INLINE bool is_not_qnan(float in)
 // they're treated like normal values.
 // they're treated like normal values.
 AI_FORCE_INLINE bool is_special_float(float in)
 AI_FORCE_INLINE bool is_special_float(float in)
 {
 {
-	union IEEESingle
-	{
-		float Float;
-		struct
-		{
-			uint32_t Frac : 23;
-			uint32_t Exp  : 8;
-			uint32_t Sign : 1;
-		} IEEE;
-	} f;
-
-	f.Float = in;
-	return (f.IEEE.Exp == (1u << 8)-1);
+	return (((_IEEESingle*)&in)->IEEE.Exp == (1u << 8)-1);
 }
 }
 
 
 #endif // !! AI_QNAN_H_INCLUDED
 #endif // !! AI_QNAN_H_INCLUDED

+ 1 - 1
test/models/NFF/NFF/cone.nff

@@ -1,6 +1,6 @@
 
 
 #red
 #red
-f 1.0 0.0 0.0 0.5 45.2776 0 1 ./../../LWO/LWo2/MappingModes/EarthCylindric.jpg
+f 1.0 0.0 0.0 0.5 45.2776 0 1 cantfindme.png
 
 
 
 
 tess 4
 tess 4

+ 17 - 39
workspaces/vc8/assimp.sln

@@ -1,7 +1,7 @@
 
 
 Microsoft Visual Studio Solution File, Format Version 9.00
 Microsoft Visual Studio Solution File, Format Version 9.00
 # Visual Studio 2005
 # Visual Studio 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AssimpView", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimpview", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
 	ProjectSection(WebsiteProperties) = preProject
 	ProjectSection(WebsiteProperties) = preProject
 		Debug.AspNetCompiler.Debug = "True"
 		Debug.AspNetCompiler.Debug = "True"
 		Release.AspNetCompiler.Debug = "False"
 		Release.AspNetCompiler.Debug = "False"
@@ -10,13 +10,13 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AssimpView", "assimp_view.v
 		{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
 		{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
 	EndProjectSection
 	EndProjectSection
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
 	ProjectSection(WebsiteProperties) = preProject
 	ProjectSection(WebsiteProperties) = preProject
 		Debug.AspNetCompiler.Debug = "True"
 		Debug.AspNetCompiler.Debug = "True"
 		Release.AspNetCompiler.Debug = "False"
 		Release.AspNetCompiler.Debug = "False"
 	EndProjectSection
 	EndProjectSection
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest", "UnitTest.vcproj", "{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit", "UnitTest.vcproj", "{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}"
 	ProjectSection(WebsiteProperties) = preProject
 	ProjectSection(WebsiteProperties) = preProject
 		Debug.AspNetCompiler.Debug = "True"
 		Debug.AspNetCompiler.Debug = "True"
 		Release.AspNetCompiler.Debug = "False"
 		Release.AspNetCompiler.Debug = "False"
@@ -25,12 +25,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest", "UnitTest.vcproj
 		{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
 		{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
 	EndProjectSection
 	EndProjectSection
 EndProject
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jAssimp_NOT_WORKING", "jAssimp.vcproj", "{FE78BFBA-4BA5-457D-8602-B800D498102D}"
-	ProjectSection(WebsiteProperties) = preProject
-		Debug.AspNetCompiler.Debug = "True"
-		Release.AspNetCompiler.Debug = "False"
-	EndProjectSection
-EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		debug|Win32 = debug|Win32
 		debug|Win32 = debug|Win32
@@ -45,8 +39,8 @@ Global
 		release|x64 = release|x64
 		release|x64 = release|x64
 		release-dll|Win32 = release-dll|Win32
 		release-dll|Win32 = release-dll|Win32
 		release-dll|x64 = release-dll|x64
 		release-dll|x64 = release-dll|x64
-		release-noboost|Win32 = release-noboost|Win32
-		release-noboost|x64 = release-noboost|x64
+		release-noboost-st|Win32 = release-noboost-st|Win32
+		release-noboost-st|x64 = release-noboost-st|x64
 		release-st|Win32 = release-st|Win32
 		release-st|Win32 = release-st|Win32
 		release-st|x64 = release-st|x64
 		release-st|x64 = release-st|x64
 	EndGlobalSection
 	EndGlobalSection
@@ -75,10 +69,10 @@ Global
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.Build.0 = release-dll|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.Build.0 = release-dll|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.ActiveCfg = release-dll|x64
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.ActiveCfg = release-dll|x64
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.Build.0 = release-dll|x64
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.Build.0 = release-dll|x64
-		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost|Win32.ActiveCfg = release-noboost-st|Win32
-		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost|Win32.Build.0 = release-noboost-st|Win32
-		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost|x64.ActiveCfg = release-noboost-st|x64
-		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost|x64.Build.0 = release-noboost-st|x64
+		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
+		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
+		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
+		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.ActiveCfg = release-st|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.ActiveCfg = release-st|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.Build.0 = release-st|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.Build.0 = release-st|Win32
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.ActiveCfg = release-st|x64
 		{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.ActiveCfg = release-st|x64
@@ -107,10 +101,10 @@ Global
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.Build.0 = release-dll|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.Build.0 = release-dll|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.ActiveCfg = release-dll|x64
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.ActiveCfg = release-dll|x64
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.Build.0 = release-dll|x64
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.Build.0 = release-dll|x64
-		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost|Win32.ActiveCfg = release-noboost-st|Win32
-		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost|Win32.Build.0 = release-noboost-st|Win32
-		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost|x64.ActiveCfg = release-noboost-st|x64
-		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost|x64.Build.0 = release-noboost-st|x64
+		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
+		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
+		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
+		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.ActiveCfg = release-st|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.ActiveCfg = release-st|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.Build.0 = release-st|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.Build.0 = release-st|Win32
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|x64.ActiveCfg = release-st|x64
 		{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|x64.ActiveCfg = release-st|x64
@@ -139,30 +133,14 @@ Global
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.Build.0 = release-dll|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.Build.0 = release-dll|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.ActiveCfg = release-dll|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.ActiveCfg = release-dll|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.Build.0 = release-dll|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.Build.0 = release-dll|x64
-		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost|Win32.ActiveCfg = release-noboost-st|Win32
-		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost|Win32.Build.0 = release-noboost-st|Win32
-		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost|x64.ActiveCfg = release-noboost-st|x64
-		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost|x64.Build.0 = release-noboost-st|x64
+		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
+		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
+		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
+		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.ActiveCfg = release-st|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.ActiveCfg = release-st|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.Build.0 = release-st|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.Build.0 = release-st|Win32
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.ActiveCfg = release-st|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.ActiveCfg = release-st|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.Build.0 = release-st|x64
 		{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.Build.0 = release-st|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug|Win32.ActiveCfg = debug|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug|x64.ActiveCfg = debug|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-dll|Win32.ActiveCfg = debug|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-dll|x64.ActiveCfg = debug|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-noboost-st|Win32.ActiveCfg = debug -noboost|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-noboost-st|x64.ActiveCfg = debug -noboost|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-st|Win32.ActiveCfg = debug-st|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.debug-st|x64.ActiveCfg = debug-st|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release|Win32.ActiveCfg = release|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release|x64.ActiveCfg = release|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-dll|Win32.ActiveCfg = release|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-dll|x64.ActiveCfg = release|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-noboost|Win32.ActiveCfg = release -noboost|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-noboost|x64.ActiveCfg = release -noboost|x64
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-st|Win32.ActiveCfg = release-st|Win32
-		{FE78BFBA-4BA5-457D-8602-B800D498102D}.release-st|x64.ActiveCfg = release-st|x64
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE