diff --git a/tools/bin/geometryc.exe b/tools/bin/geometryc.exe index 9fd2c87e1..56279363d 100644 Binary files a/tools/bin/geometryc.exe and b/tools/bin/geometryc.exe differ diff --git a/tools/geometryc/geometryc.cpp b/tools/geometryc/geometryc.cpp index f5b7849e0..8d90605bb 100644 --- a/tools/geometryc/geometryc.cpp +++ b/tools/geometryc/geometryc.cpp @@ -1,22 +1,22 @@ -/* - * Copyright 2011-2012 Branimir Karadzic. All rights reserved. - * License: http://www.opensource.org/licenses/BSD-2-Clause - */ - -#include -#include "../../src/vertexdecl.h" - -#include -#include -#include -#include -#include +/* + * Copyright 2011-2012 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include +#include "../../src/vertexdecl.h" + +#include +#include +#include +#include +#include namespace std { namespace tr1 {} using namespace tr1; } // namespace std -#include - -#include - -#if 0 +#include + +#include + +#if 0 # define BX_TRACE(_format, ...) \ do { \ printf(BX_FILE_LINE_LITERAL "BGFX " _format "\n", ##__VA_ARGS__); \ @@ -38,30 +38,30 @@ namespace std { namespace tr1 {} using namespace tr1; } // namespace std bx::debugBreak(); \ } \ } while(0) -#endif // 0 +#endif // 0 -#define EXPECT(_condition) \ - do { \ +#define EXPECT(_condition) \ + do { \ if (!(_condition) ) \ { \ - printf("Error parsing at:\n" BX_FILE_LINE_LITERAL "\nExpected: " #_condition "\n"); \ - exit(EXIT_FAILURE); \ - } \ - } while(0) - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tokenizecmd.h" -#include "bounds.h" -#include "math.h" - + printf("Error parsing at:\n" BX_FILE_LINE_LITERAL "\nExpected: " #_condition "\n"); \ + exit(EXIT_FAILURE); \ + } \ + } while(0) + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "tokenizecmd.h" +#include "bounds.h" +#include "math.h" + struct Vector3 { float x; @@ -69,8 +69,8 @@ struct Vector3 float z; }; -typedef std::vector Vector3Array; - +typedef std::vector Vector3Array; + struct Index3 { int32_t m_position; @@ -79,43 +79,43 @@ struct Index3 int32_t m_vertexIndex; }; -typedef std::unordered_map Index3Map; - -struct Triangle -{ - uint64_t m_index[3]; -}; - -typedef std::vector TriangleArray; - -struct Group -{ - uint32_t m_startTriangle; - uint32_t m_numTriangles; - std::string m_name; - std::string m_material; -}; - -typedef std::vector GroupArray; - -struct Primitive -{ - uint32_t m_startVertex; - uint32_t m_startIndex; - uint32_t m_numVertices; - uint32_t m_numIndices; - std::string m_name; -}; - -typedef std::vector PrimitiveArray; - -static uint32_t s_obbSteps = 17; - -#define BGFX_CHUNK_MAGIC_GEO BX_MAKEFOURCC('G', 'E', 'O', 0x0) -#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x0) -#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0) -#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0) - +typedef std::unordered_map Index3Map; + +struct Triangle +{ + uint64_t m_index[3]; +}; + +typedef std::vector TriangleArray; + +struct Group +{ + uint32_t m_startTriangle; + uint32_t m_numTriangles; + std::string m_name; + std::string m_material; +}; + +typedef std::vector GroupArray; + +struct Primitive +{ + uint32_t m_startVertex; + uint32_t m_startIndex; + uint32_t m_numVertices; + uint32_t m_numIndices; + std::string m_name; +}; + +typedef std::vector PrimitiveArray; + +static uint32_t s_obbSteps = 17; + +#define BGFX_CHUNK_MAGIC_GEO BX_MAKEFOURCC('G', 'E', 'O', 0x0) +#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0) +#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0) + long int fsize(FILE* _file) { long int pos = ftell(_file); @@ -234,61 +234,61 @@ void calcTangents(void* _vertices, uint16_t _numVertices, bgfx::VertexDecl _decl void writeBounds(bx::WriterI* _writer, const void* _vertices, uint32_t _numVertices, uint32_t _stride) { - Sphere maxSphere; - calcMaxBoundingSphere(maxSphere, _vertices, _numVertices, _stride); - - Sphere minSphere; - calcMinBoundingSphere(minSphere, _vertices, _numVertices, _stride); - - if (minSphere.m_radius > maxSphere.m_radius) - { - bx::write(_writer, maxSphere); - } - else - { - bx::write(_writer, minSphere); - } - + Sphere maxSphere; + calcMaxBoundingSphere(maxSphere, _vertices, _numVertices, _stride); + + Sphere minSphere; + calcMinBoundingSphere(minSphere, _vertices, _numVertices, _stride); + + if (minSphere.m_radius > maxSphere.m_radius) + { + bx::write(_writer, maxSphere); + } + else + { + bx::write(_writer, minSphere); + } + Aabb aabb; - calcAabb(aabb, _vertices, _numVertices, _stride); - bx::write(_writer, aabb); - - Obb obb; - calcObb(obb, _vertices, _numVertices, _stride, s_obbSteps); - bx::write(_writer, obb); + calcAabb(aabb, _vertices, _numVertices, _stride); + bx::write(_writer, aabb); + + Obb obb; + calcObb(obb, _vertices, _numVertices, _stride, s_obbSteps); + bx::write(_writer, obb); } void write(bx::WriterI* _writer, const uint8_t* _vertices, uint32_t _numVertices, const bgfx::VertexDecl& _decl, const uint16_t* _indices, uint32_t _numIndices, const std::string& _material, const PrimitiveArray& _primitives) { uint32_t stride = _decl.getStride(); - bx::write(_writer, BGFX_CHUNK_MAGIC_VB); - writeBounds(_writer, _vertices, _numVertices, stride); - - bx::write(_writer, _decl); - bx::write(_writer, uint16_t(_numVertices) ); - bx::write(_writer, _vertices, _numVertices*stride); - - bx::write(_writer, BGFX_CHUNK_MAGIC_IB); - bx::write(_writer, _numIndices); - bx::write(_writer, _indices, _numIndices*2); - - bx::write(_writer, BGFX_CHUNK_MAGIC_PRI); - uint16_t nameLen = uint16_t(_material.size() ); - bx::write(_writer, nameLen); - bx::write(_writer, _material.c_str(), nameLen); - bx::write(_writer, uint16_t(_primitives.size() ) ); - for (PrimitiveArray::const_iterator primIt = _primitives.begin(); primIt != _primitives.end(); ++primIt) - { - const Primitive& prim = *primIt; - nameLen = uint16_t(prim.m_name.size() ); - bx::write(_writer, nameLen); - bx::write(_writer, prim.m_name.c_str(), nameLen); - bx::write(_writer, prim.m_startIndex); - bx::write(_writer, prim.m_numIndices); - bx::write(_writer, prim.m_startVertex); - bx::write(_writer, prim.m_numVertices); - writeBounds(_writer, &_vertices[prim.m_startVertex*stride], prim.m_numVertices, stride); - } + bx::write(_writer, BGFX_CHUNK_MAGIC_VB); + writeBounds(_writer, _vertices, _numVertices, stride); + + bx::write(_writer, _decl); + bx::write(_writer, uint16_t(_numVertices) ); + bx::write(_writer, _vertices, _numVertices*stride); + + bx::write(_writer, BGFX_CHUNK_MAGIC_IB); + bx::write(_writer, _numIndices); + bx::write(_writer, _indices, _numIndices*2); + + bx::write(_writer, BGFX_CHUNK_MAGIC_PRI); + uint16_t nameLen = uint16_t(_material.size() ); + bx::write(_writer, nameLen); + bx::write(_writer, _material.c_str(), nameLen); + bx::write(_writer, uint16_t(_primitives.size() ) ); + for (PrimitiveArray::const_iterator primIt = _primitives.begin(); primIt != _primitives.end(); ++primIt) + { + const Primitive& prim = *primIt; + nameLen = uint16_t(prim.m_name.size() ); + bx::write(_writer, nameLen); + bx::write(_writer, prim.m_name.c_str(), nameLen); + bx::write(_writer, prim.m_startIndex); + bx::write(_writer, prim.m_numIndices); + bx::write(_writer, prim.m_startVertex); + bx::write(_writer, prim.m_numVertices); + writeBounds(_writer, &_vertices[prim.m_startVertex*stride], prim.m_numVertices, stride); + } } void help(const char* _error = NULL) @@ -343,75 +343,75 @@ inline uint32_t rgbaToAbgr(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a) ; } -int main(int _argc, const char* _argv[]) -{ - bx::CommandLine cmdLine(_argc, _argv); - - const char* filePath = cmdLine.findOption('f'); - if (NULL == filePath) - { - help("Input file name must be specified."); - return EXIT_FAILURE; - } - - const char* outFilePath = cmdLine.findOption('o'); - if (NULL == outFilePath) - { - help("Output file name must be specified."); - return EXIT_FAILURE; - } - - float scale = 1.0f; - const char* scaleArg = cmdLine.findOption('s', "scale"); - if (NULL != scaleArg) - { - scale = (float)atof(scaleArg); - } - - cmdLine.hasArg(s_obbSteps, '\0', "obb"); - s_obbSteps = bx::uint32_min(bx::uint32_max(s_obbSteps, 1), 90); - - uint32_t packNormal = 0; - cmdLine.hasArg(packNormal, '\0', "packnormal"); - - uint32_t packUv = 0; - cmdLine.hasArg(packNormal, '\0', "packuv"); - - bool ccw = cmdLine.hasArg("ccw"); - bool flipV = cmdLine.hasArg("flipv"); - bool hasTangent = cmdLine.hasArg("tangent"); - - FILE* file = fopen(filePath, "r"); - if (NULL == file) - { - printf("Unable to open input file '%s'.", filePath); - exit(EXIT_FAILURE); - } - - int64_t parseElapsed = -bx::getHPCounter(); - int64_t triReorderElapsed = 0; - - uint32_t size = (uint32_t)fsize(file); - char* data = new char[size+1]; - size = (uint32_t)fread(data, 1, size, file); - data[size] = '\0'; - fclose(file); - - // https://en.wikipedia.org/wiki/Wavefront_.obj_file - - Vector3Array positions; - Vector3Array normals; - Vector3Array texcoords; - Index3Map indexMap; - TriangleArray triangles; - GroupArray groups; - - uint32_t num = 0; - - Group group; - group.m_startTriangle = 0; - group.m_numTriangles = 0; - +int main(int _argc, const char* _argv[]) +{ + bx::CommandLine cmdLine(_argc, _argv); + + const char* filePath = cmdLine.findOption('f'); + if (NULL == filePath) + { + help("Input file name must be specified."); + return EXIT_FAILURE; + } + + const char* outFilePath = cmdLine.findOption('o'); + if (NULL == outFilePath) + { + help("Output file name must be specified."); + return EXIT_FAILURE; + } + + float scale = 1.0f; + const char* scaleArg = cmdLine.findOption('s', "scale"); + if (NULL != scaleArg) + { + scale = (float)atof(scaleArg); + } + + cmdLine.hasArg(s_obbSteps, '\0', "obb"); + s_obbSteps = bx::uint32_min(bx::uint32_max(s_obbSteps, 1), 90); + + uint32_t packNormal = 0; + cmdLine.hasArg(packNormal, '\0', "packnormal"); + + uint32_t packUv = 0; + cmdLine.hasArg(packNormal, '\0', "packuv"); + + bool ccw = cmdLine.hasArg("ccw"); + bool flipV = cmdLine.hasArg("flipv"); + bool hasTangent = cmdLine.hasArg("tangent"); + + FILE* file = fopen(filePath, "r"); + if (NULL == file) + { + printf("Unable to open input file '%s'.", filePath); + exit(EXIT_FAILURE); + } + + int64_t parseElapsed = -bx::getHPCounter(); + int64_t triReorderElapsed = 0; + + uint32_t size = (uint32_t)fsize(file); + char* data = new char[size+1]; + size = (uint32_t)fread(data, 1, size, file); + data[size] = '\0'; + fclose(file); + + // https://en.wikipedia.org/wiki/Wavefront_.obj_file + + Vector3Array positions; + Vector3Array normals; + Vector3Array texcoords; + Index3Map indexMap; + TriangleArray triangles; + GroupArray groups; + + uint32_t num = 0; + + Group group; + group.m_startTriangle = 0; + group.m_numTriangles = 0; + char commandLine[2048]; uint32_t len = sizeof(commandLine); int argc; @@ -467,6 +467,7 @@ int main(int _argc, const char* _argv[]) if (!result.second) { Index3& oldIndex = result.first->second; + BX_UNUSED(oldIndex); BX_CHECK(oldIndex.m_position == index.m_position && oldIndex.m_texcoord == index.m_texcoord && oldIndex.m_normal == index.m_normal