diff --git a/3rdparty/forsyth-too/forsythtriangleorderoptimizer.cpp b/3rdparty/forsyth-too/forsythtriangleorderoptimizer.cpp index 12c34831d..70d5fd48b 100644 --- a/3rdparty/forsyth-too/forsythtriangleorderoptimizer.cpp +++ b/3rdparty/forsyth-too/forsythtriangleorderoptimizer.cpp @@ -99,7 +99,7 @@ namespace Forsyth } - const uint kMaxVertexCacheSize = 64; + const int kMaxVertexCacheSize = 64; const uint kMaxPrecomputedVertexValenceScores = 64; float s_vertexCacheScores[kMaxVertexCacheSize+1][kMaxVertexCacheSize]; float s_vertexValenceScores[kMaxPrecomputedVertexValenceScores]; diff --git a/README.md b/README.md index 57bdecdf4..c1cc9fba4 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ Updating shader uniforms. ![example-03-raymarch](https://github.com/bkaradzic/bgfx/raw/master/examples/03-raymarch/screenshot.png) ### 04-mesh -Loading OpenCTM meshes. +Loading meshes. ![example-04-mesh](https://github.com/bkaradzic/bgfx/raw/master/examples/04-mesh/screenshot.png) diff --git a/examples/04-mesh/mesh.cpp b/examples/04-mesh/mesh.cpp index 513d82133..f35d09552 100644 --- a/examples/04-mesh/mesh.cpp +++ b/examples/04-mesh/mesh.cpp @@ -12,6 +12,8 @@ #include #include + +#include #include void fatalCb(bgfx::Fatal::Enum _code, const char* _str) @@ -87,167 +89,165 @@ static bgfx::ProgramHandle loadProgram(const char* _vsName, const char* _fsName) return program; } -struct Aabb -{ - float m_min[3]; - float m_max[3]; -}; - -struct Obb -{ - float m_mtx[16]; -}; - -struct Sphere -{ - float m_center[3]; - float m_radius; -}; - -struct Primitive -{ - uint32_t m_startIndex; - uint32_t m_numIndices; - uint32_t m_startVertex; - uint32_t m_numVertices; - - Sphere m_sphere; - Aabb m_aabb; - Obb m_obb; -}; - -typedef std::vector PrimitiveArray; - -struct Group -{ - Group() - { - reset(); - } - - void reset() - { - m_vbh.idx = bgfx::invalidHandle; - m_ibh.idx = bgfx::invalidHandle; - m_prims.clear(); - } - - bgfx::VertexBufferHandle m_vbh; - bgfx::IndexBufferHandle m_ibh; - Sphere m_sphere; - Aabb m_aabb; - Obb m_obb; - PrimitiveArray m_prims; -}; +struct Aabb +{ + float m_min[3]; + float m_max[3]; +}; + +struct Obb +{ + float m_mtx[16]; +}; + +struct Sphere +{ + float m_center[3]; + float m_radius; +}; + +struct Primitive +{ + uint32_t m_startIndex; + uint32_t m_numIndices; + uint32_t m_startVertex; + uint32_t m_numVertices; + + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; +}; + +typedef std::vector PrimitiveArray; + +struct Group +{ + Group() + { + reset(); + } + + void reset() + { + m_vbh.idx = bgfx::invalidHandle; + m_ibh.idx = bgfx::invalidHandle; + m_prims.clear(); + } + + bgfx::VertexBufferHandle m_vbh; + bgfx::IndexBufferHandle m_ibh; + Sphere m_sphere; + Aabb m_aabb; + Obb m_obb; + PrimitiveArray m_prims; +}; struct Mesh { - void Mesh::load(const char* _filePath) - { -#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) - - bx::CrtFileReader reader; - reader.open(_filePath); - - Group group; - - uint32_t chunk; - while (4 == bx::read(&reader, chunk) ) - { - switch (chunk) - { - case BGFX_CHUNK_MAGIC_VB: - { - bx::read(&reader, group.m_sphere); - bx::read(&reader, group.m_aabb); - bx::read(&reader, group.m_obb); - - bx::read(&reader, m_decl); - uint16_t stride = m_decl.getStride(); - - uint16_t numVertices; - bx::read(&reader, numVertices); - const bgfx::Memory* mem = bgfx::alloc(numVertices*stride); - bx::read(&reader, mem->data, mem->size); - - group.m_vbh = bgfx::createVertexBuffer(mem, m_decl); - } - break; - - case BGFX_CHUNK_MAGIC_IB: - { - uint32_t numIndices; - bx::read(&reader, numIndices); - const bgfx::Memory* mem = bgfx::alloc(numIndices*2); - bx::read(&reader, mem->data, mem->size); - group.m_ibh = bgfx::createIndexBuffer(mem); - } - break; - - case BGFX_CHUNK_MAGIC_PRI: - { - uint16_t len; - bx::read(&reader, len); - - std::string material; - material.resize(len); - bx::read(&reader, const_cast(material.c_str() ), len); - - uint32_t type = m_decl.has(bgfx::Attrib::TexCoord0) ? 0 : 1; - - uint16_t num; - bx::read(&reader, num); - - for (uint32_t ii = 0; ii < num; ++ii) - { - bx::read(&reader, len); - - std::string name; - name.resize(len); - bx::read(&reader, const_cast(name.c_str() ), len); - - Primitive prim; - bx::read(&reader, prim.m_startIndex); - bx::read(&reader, prim.m_numIndices); - bx::read(&reader, prim.m_startVertex); - bx::read(&reader, prim.m_numVertices); - bx::read(&reader, prim.m_sphere); - bx::read(&reader, prim.m_aabb); - bx::read(&reader, prim.m_obb); - - group.m_prims.push_back(prim); - } - - m_groups.push_back(group); - group.reset(); - } - break; - - default: - DBG("%08x at %d", chunk, reader.seek() ); - break; - } - } - - reader.close(); - } - - void Mesh::unload() - { - for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) - { - const Group& group = *it; - bgfx::destroyVertexBuffer(group.m_vbh); - - if (bgfx::invalidHandle != group.m_ibh.idx) - { - bgfx::destroyIndexBuffer(group.m_ibh); - } - } - m_groups.clear(); - } + void load(const char* _filePath) + { +#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) + + bx::CrtFileReader reader; + reader.open(_filePath); + + Group group; + + uint32_t chunk; + while (4 == bx::read(&reader, chunk) ) + { + switch (chunk) + { + case BGFX_CHUNK_MAGIC_VB: + { + bx::read(&reader, group.m_sphere); + bx::read(&reader, group.m_aabb); + bx::read(&reader, group.m_obb); + + bx::read(&reader, m_decl); + uint16_t stride = m_decl.getStride(); + + uint16_t numVertices; + bx::read(&reader, numVertices); + const bgfx::Memory* mem = bgfx::alloc(numVertices*stride); + bx::read(&reader, mem->data, mem->size); + + group.m_vbh = bgfx::createVertexBuffer(mem, m_decl); + } + break; + + case BGFX_CHUNK_MAGIC_IB: + { + uint32_t numIndices; + bx::read(&reader, numIndices); + const bgfx::Memory* mem = bgfx::alloc(numIndices*2); + bx::read(&reader, mem->data, mem->size); + group.m_ibh = bgfx::createIndexBuffer(mem); + } + break; + + case BGFX_CHUNK_MAGIC_PRI: + { + uint16_t len; + bx::read(&reader, len); + + std::string material; + material.resize(len); + bx::read(&reader, const_cast(material.c_str() ), len); + + uint16_t num; + bx::read(&reader, num); + + for (uint32_t ii = 0; ii < num; ++ii) + { + bx::read(&reader, len); + + std::string name; + name.resize(len); + bx::read(&reader, const_cast(name.c_str() ), len); + + Primitive prim; + bx::read(&reader, prim.m_startIndex); + bx::read(&reader, prim.m_numIndices); + bx::read(&reader, prim.m_startVertex); + bx::read(&reader, prim.m_numVertices); + bx::read(&reader, prim.m_sphere); + bx::read(&reader, prim.m_aabb); + bx::read(&reader, prim.m_obb); + + group.m_prims.push_back(prim); + } + + m_groups.push_back(group); + group.reset(); + } + break; + + default: + DBG("%08x at %d", chunk, reader.seek() ); + break; + } + } + + reader.close(); + } + + void unload() + { + for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) + { + const Group& group = *it; + bgfx::destroyVertexBuffer(group.m_vbh); + + if (bgfx::invalidHandle != group.m_ibh.idx) + { + bgfx::destroyIndexBuffer(group.m_ibh); + } + } + m_groups.clear(); + } void submit(bgfx::ProgramHandle _program, float* _mtx) { @@ -272,9 +272,9 @@ struct Mesh } } - bgfx::VertexDecl m_decl; - typedef std::vector GroupArray; - GroupArray m_groups; + bgfx::VertexDecl m_decl; + typedef std::vector GroupArray; + GroupArray m_groups; }; int _main_(int _argc, char** _argv)