diff --git a/code/B3DImporter.cpp b/code/B3DImporter.cpp index 0d89fa90a..059659080 100644 --- a/code/B3DImporter.cpp +++ b/code/B3DImporter.cpp @@ -247,7 +247,7 @@ void B3DImporter::ReadBRUS(){ //Textures for( int i=0;i=0 && texid<_textures.size() ){ + if( !i && texid>=0 && texid<(int)_textures.size() ){ //just use tex 0 for now const Texture &tex=_textures[texid]; aiString texname( tex.name ); diff --git a/code/StandardShapes.cpp b/code/StandardShapes.cpp index c914e73af..ceb0d22c7 100644 --- a/code/StandardShapes.cpp +++ b/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" @@ -46,11 +50,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 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(n0); + positions.push_back(n2); # define ADD_PENTAGON(n0,n1,n2,n3,n4) \ if (polygons) \ @@ -84,9 +88,10 @@ namespace Assimp { // ------------------------------------------------------------------------------------------------ +// Fast subdivision for a mesh whose verts have a magnitude of 1 void Subdivide(std::vector& 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(); unsigned int origSize = (unsigned int)positions.size(); @@ -102,23 +107,25 @@ void Subdivide(std::vector& positions) 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 - 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& positions, 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(); switch (numIndices) { - case 1: + case 1: out->mPrimitiveTypes = aiPrimitiveType_POINT; break; case 2: @@ -149,6 +156,7 @@ aiMesh* StandardShapes::MakeMesh(const std::vector& positions, } // ------------------------------------------------------------------------------------------------ +// Construct a mesh with a specific shape (callback) aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)( std::vector&)) { @@ -158,6 +166,7 @@ aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)( } // ------------------------------------------------------------------------------------------------ +// Construct a mesh with a specific shape (callback) aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)( std::vector&, 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)( unsigned int,std::vector&)) { @@ -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& positions) { positions.reserve(positions.size()+60); @@ -224,6 +235,7 @@ unsigned int StandardShapes::MakeIcosahedron(std::vector& positions) } // ------------------------------------------------------------------------------------------------ +// Build a dodecahedron with points.magnitude == 1 unsigned int StandardShapes::MakeDodecahedron(std::vector& positions, bool polygons /*= false*/) { @@ -271,6 +283,7 @@ unsigned int StandardShapes::MakeDodecahedron(std::vector& positions } // ------------------------------------------------------------------------------------------------ +// Build an octahedron with points.magnitude == 1 unsigned int StandardShapes::MakeOctahedron(std::vector& positions) { positions.reserve(positions.size()+24); @@ -295,6 +308,7 @@ unsigned int StandardShapes::MakeOctahedron(std::vector& positions) } // ------------------------------------------------------------------------------------------------ +// Build a tetrahedron with points.magnitude == 1 unsigned int StandardShapes::MakeTetrahedron(std::vector& positions) { positions.reserve(positions.size()+9); @@ -315,6 +329,7 @@ unsigned int StandardShapes::MakeTetrahedron(std::vector& positions) } // ------------------------------------------------------------------------------------------------ +// Build a hexahedron with points.magnitude == 1 unsigned int StandardShapes::MakeHexahedron(std::vector& positions, bool polygons /*= false*/) { @@ -345,6 +360,7 @@ unsigned int StandardShapes::MakeHexahedron(std::vector& positions, #undef ADD_PENTAGON // ------------------------------------------------------------------------------------------------ +// Create a subdivision sphere void StandardShapes::MakeSphere(unsigned int tess, std::vector& positions) { @@ -362,27 +378,30 @@ void StandardShapes::MakeSphere(unsigned int tess, } // ------------------------------------------------------------------------------------------------ +// Build a cone void StandardShapes::MakeCone(float height,float radius1, float radius2,unsigned int tess, std::vector& 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) return; + size_t old = positions.size(); + // No negative radii - radius1 = fabs(radius1); - radius2 = fabs(radius2); + radius1 = ::fabs(radius1); + radius2 = ::fabs(radius2); float halfHeight = height / 2; - // radius1 is always the smaller one + // radius1 is always the smaller one if (radius2 > radius1) { std::swap(radius2,radius1); halfHeight = -halfHeight; } + else old = 0xffffffff; // Use a large epsilon to check whether the cone is pointy 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 // if the cone is closed 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 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 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 v4 = aiVector3D (s2 * radius1, -halfHeight, t2 * radius1 ); positions.push_back(v1); - positions.push_back(v3); positions.push_back(v2); - positions.push_back(v4); positions.push_back(v3); + positions.push_back(v4); positions.push_back(v1); + positions.push_back(v3); if (!bOpen) { // generate the end 'cap' 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(0.f, halfHeight, 0.f)); + if (radius1) { // generate the other end 'cap' 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(0.f, -halfHeight, 0.f)); + } } s = s2; t = t2; 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& 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 diff --git a/code/StandardShapes.h b/code/StandardShapes.h index bb397f603..70936149c 100644 --- a/code/StandardShapes.h +++ b/code/StandardShapes.h @@ -153,9 +153,9 @@ public: * * |-----| <- radius 1 * - * __x__ <- ] - * / \ | height - * / \ | + * __x__ <- ] ^ + * / \ | height | + * / \ | Y * / \ | * / \ | * /______x______\ <- ] <- end cap @@ -180,16 +180,14 @@ public: // ---------------------------------------------------------------- /** @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 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 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& positions); }; diff --git a/code/qnan.h b/code/qnan.h index a8f3c5c1a..3d3e7630d 100644 --- a/code/qnan.h +++ b/code/qnan.h @@ -3,6 +3,17 @@ #if (!defined 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 @@ -23,19 +34,7 @@ AI_FORCE_INLINE bool is_not_qnan(float in) // they're treated like normal values. 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 diff --git a/test/models/NFF/NFF/cone.nff b/test/models/NFF/NFF/cone.nff index 84be503a2..35e6750b7 100644 --- a/test/models/NFF/NFF/cone.nff +++ b/test/models/NFF/NFF/cone.nff @@ -1,6 +1,6 @@ #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 diff --git a/workspaces/vc8/assimp.sln b/workspaces/vc8/assimp.sln index 70b1b0938..9c7569c4f 100644 --- a/workspaces/vc8/assimp.sln +++ b/workspaces/vc8/assimp.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 9.00 # 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 Debug.AspNetCompiler.Debug = "True" 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} EndProjectSection 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 Debug.AspNetCompiler.Debug = "True" Release.AspNetCompiler.Debug = "False" EndProjectSection 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 Debug.AspNetCompiler.Debug = "True" 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} EndProjectSection 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 GlobalSection(SolutionConfigurationPlatforms) = preSolution debug|Win32 = debug|Win32 @@ -45,8 +39,8 @@ Global release|x64 = release|x64 release-dll|Win32 = release-dll|Win32 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|x64 = release-st|x64 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|x64.ActiveCfg = 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.Build.0 = release-st|Win32 {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|x64.ActiveCfg = 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.Build.0 = release-st|Win32 {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|x64.ActiveCfg = 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.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.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 GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE