diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp index 8f16c4325..ffc2fe20f 100644 --- a/examples/16-shadowmaps/shadowmaps.cpp +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -16,6 +16,7 @@ #include #include "entry/entry.h" #include "camera.h" +#include "bgfx_utils.h" #include "imgui/imgui.h" namespace bgfx @@ -759,183 +760,35 @@ struct ClearValues uint8_t m_clearStencil; }; -struct Aabb +struct Mesh : public ::Mesh { - 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() + void load(const char* _filePath, bool _ramcopy = false) { - reset(); + bx::FileReaderI* reader = entry::getFileReader(); + if (bx::open(reader, _filePath)) + { + ::Mesh::load(reader, _ramcopy); + bx::close(reader); + } } - void reset() - { - m_vbh.idx = bgfx::kInvalidHandle; - m_ibh.idx = bgfx::kInvalidHandle; - 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 load(const void* _vertices, uint32_t _numVertices, const bgfx::VertexLayout _layout, const uint16_t* _indices, uint32_t _numIndices) { Group group; const bgfx::Memory* mem; uint32_t size; - size = _numVertices*_layout.getStride(); + size = _numVertices * _layout.getStride(); mem = bgfx::makeRef(_vertices, size); group.m_vbh = bgfx::createVertexBuffer(mem, _layout); - size = _numIndices*2; + size = _numIndices * 2; mem = bgfx::makeRef(_indices, size); group.m_ibh = bgfx::createIndexBuffer(mem); m_groups.push_back(group); } - void load(const char* _filePath) - { -#define BGFX_CHUNK_MAGIC_VB BX_MAKEFOURCC('V', 'B', ' ', 0x1) -#define BGFX_CHUNK_MAGIC_IB BX_MAKEFOURCC('I', 'B', ' ', 0x0) -#define BGFX_CHUNK_MAGIC_PRI BX_MAKEFOURCC('P', 'R', 'I', 0x0) - - bx::FileReaderI* reader = entry::getFileReader(); - bx::open(reader, _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); - - bgfx::read(reader, m_layout); - uint16_t stride = m_layout.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_layout); - } - 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, bx::seek(reader) ); - break; - } - } - - bx::close(reader); - } - - void unload() - { - for (GroupArray::const_iterator it = m_groups.begin(), itEnd = m_groups.end(); it != itEnd; ++it) - { - const Group& group = *it; - bgfx::destroy(group.m_vbh); - - if (bgfx::kInvalidHandle != group.m_ibh.idx) - { - bgfx::destroy(group.m_ibh); - } - } - m_groups.clear(); - } - void submit(uint8_t _viewId, float* _mtx, bgfx::ProgramHandle _program, const RenderState& _renderState, bool _submitShadowMaps = false) { bgfx::TextureHandle texture = BGFX_INVALID_HANDLE; @@ -966,7 +819,7 @@ struct Mesh { for (uint8_t ii = 0; ii < ShadowMapRenderTargets::Count; ++ii) { - bgfx::setTexture(4 + ii, s_shadowMap[ii], bgfx::getTexture(s_rtShadowMap[ii]) ); + bgfx::setTexture(4 + ii, s_shadowMap[ii], bgfx::getTexture(s_rtShadowMap[ii])); } } @@ -978,12 +831,9 @@ struct Mesh bgfx::submit(_viewId, _program); } } - - bgfx::VertexLayout m_layout; - typedef std::vector GroupArray; - GroupArray m_groups; }; + struct PosColorTexCoord0Vertex { float m_x;