Merged geometryc.

This commit is contained in:
bkaradzic 2012-12-31 18:57:23 -08:00
commit fea9652882
2 changed files with 197 additions and 196 deletions

Binary file not shown.

View file

@ -1,22 +1,22 @@
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include <bgfx.h>
#include "../../src/vertexdecl.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include <bgfx.h>
#include "../../src/vertexdecl.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
namespace std { namespace tr1 {} using namespace tr1; } // namespace std
#include <unordered_map>
#include <forsythtriangleorderoptimizer.h>
#if 0
#include <unordered_map>
#include <forsythtriangleorderoptimizer.h>
#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 <bx/bx.h>
#include <bx/debug.h>
#include <bx/countof.h>
#include <bx/commandline.h>
#include <bx/timer.h>
#include <bx/readerwriter.h>
#include <bx/hash.h>
#include <bx/uint32_t.h>
#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 <bx/bx.h>
#include <bx/debug.h>
#include <bx/countof.h>
#include <bx/commandline.h>
#include <bx/timer.h>
#include <bx/readerwriter.h>
#include <bx/hash.h>
#include <bx/uint32_t.h>
#include "tokenizecmd.h"
#include "bounds.h"
#include "math.h"
struct Vector3
{
float x;
@ -69,8 +69,8 @@ struct Vector3
float z;
};
typedef std::vector<Vector3> Vector3Array;
typedef std::vector<Vector3> Vector3Array;
struct Index3
{
int32_t m_position;
@ -79,43 +79,43 @@ struct Index3
int32_t m_vertexIndex;
};
typedef std::unordered_map<uint64_t, Index3> Index3Map;
struct Triangle
{
uint64_t m_index[3];
};
typedef std::vector<Triangle> TriangleArray;
struct Group
{
uint32_t m_startTriangle;
uint32_t m_numTriangles;
std::string m_name;
std::string m_material;
};
typedef std::vector<Group> 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<Primitive> 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<uint64_t, Index3> Index3Map;
struct Triangle
{
uint64_t m_index[3];
};
typedef std::vector<Triangle> TriangleArray;
struct Group
{
uint32_t m_startTriangle;
uint32_t m_numTriangles;
std::string m_name;
std::string m_material;
};
typedef std::vector<Group> 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<Primitive> 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