diff options
Diffstat (limited to '3rdparty/bgfx/examples/06-bump/bump.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/06-bump/bump.cpp | 461 |
1 files changed, 244 insertions, 217 deletions
diff --git a/3rdparty/bgfx/examples/06-bump/bump.cpp b/3rdparty/bgfx/examples/06-bump/bump.cpp index e5c4a521876..1cbf74592de 100644 --- a/3rdparty/bgfx/examples/06-bump/bump.cpp +++ b/3rdparty/bgfx/examples/06-bump/bump.cpp @@ -103,259 +103,286 @@ static const uint16_t s_cubeIndices[36] = 21, 23, 22, }; -int _main_(int /*_argc*/, char** /*_argv*/) +class Bump : public entry::AppI { - uint32_t width = 1280; - uint32_t height = 720; - uint32_t debug = BGFX_DEBUG_TEXT; - uint32_t reset = BGFX_RESET_VSYNC; - - bgfx::init(); - bgfx::reset(width, height, reset); - - // Enable debug text. - bgfx::setDebug(debug); - - // Set view 0 clear state. - bgfx::setViewClear(0 - , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH - , 0x303030ff - , 1.0f - , 0 - ); - - // Get renderer capabilities info. - const bgfx::Caps* caps = bgfx::getCaps(); - bool instancingSupported = 0 != (caps->supported & BGFX_CAPS_INSTANCING); - - // Create vertex stream declaration. - PosNormalTangentTexcoordVertex::init(); - - calcTangents(s_cubeVertices - , BX_COUNTOF(s_cubeVertices) - , PosNormalTangentTexcoordVertex::ms_decl - , s_cubeIndices - , BX_COUNTOF(s_cubeIndices) - ); - - // Create static vertex buffer. - bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer( - bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ) - , PosNormalTangentTexcoordVertex::ms_decl - ); + void init(int /*_argc*/, char** /*_argv*/) BX_OVERRIDE + { + m_width = 1280; + m_height = 720; + m_debug = BGFX_DEBUG_TEXT; + m_reset = BGFX_RESET_VSYNC; + + bgfx::init(); + bgfx::reset(m_width, m_height, m_reset); + + // Enable debug text. + bgfx::setDebug(m_debug); + + // Set view 0 clear state. + bgfx::setViewClear(0 + , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH + , 0x303030ff + , 1.0f + , 0 + ); + + // Get renderer capabilities info. + const bgfx::Caps* caps = bgfx::getCaps(); + m_instancingSupported = 0 != (caps->supported & BGFX_CAPS_INSTANCING); + + // Create vertex stream declaration. + PosNormalTangentTexcoordVertex::init(); + + calcTangents(s_cubeVertices + , BX_COUNTOF(s_cubeVertices) + , PosNormalTangentTexcoordVertex::ms_decl + , s_cubeIndices + , BX_COUNTOF(s_cubeIndices) + ); + + // Create static vertex buffer. + m_vbh = bgfx::createVertexBuffer( + bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ) + , PosNormalTangentTexcoordVertex::ms_decl + ); + + // Create static index buffer. + m_ibh = bgfx::createIndexBuffer(bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) ); + + // Create texture sampler uniforms. + s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1); + s_texNormal = bgfx::createUniform("s_texNormal", bgfx::UniformType::Int1); + + m_numLights = 4; + u_lightPosRadius = bgfx::createUniform("u_lightPosRadius", bgfx::UniformType::Vec4, m_numLights); + u_lightRgbInnerR = bgfx::createUniform("u_lightRgbInnerR", bgfx::UniformType::Vec4, m_numLights); + + // Create program from shaders. + m_program = loadProgram(m_instancingSupported ? "vs_bump_instanced" : "vs_bump", "fs_bump"); + + // Load diffuse texture. + m_textureColor = loadTexture("fieldstone-rgba.dds"); + + // Load normal texture. + m_textureNormal = loadTexture("fieldstone-n.dds"); + + m_timeOffset = bx::getHPCounter(); + } - // Create static index buffer. - bgfx::IndexBufferHandle ibh = bgfx::createIndexBuffer(bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) ); + virtual int shutdown() BX_OVERRIDE + { + // Cleanup. + bgfx::destroyIndexBuffer(m_ibh); + bgfx::destroyVertexBuffer(m_vbh); + bgfx::destroyProgram(m_program); + bgfx::destroyTexture(m_textureColor); + bgfx::destroyTexture(m_textureNormal); + bgfx::destroyUniform(s_texColor); + bgfx::destroyUniform(s_texNormal); + bgfx::destroyUniform(u_lightPosRadius); + bgfx::destroyUniform(u_lightRgbInnerR); + + // Shutdown bgfx. + bgfx::shutdown(); + + return 0; + } - // Create texture sampler uniforms. - bgfx::UniformHandle u_texColor = bgfx::createUniform("u_texColor", bgfx::UniformType::Uniform1iv); - bgfx::UniformHandle u_texNormal = bgfx::createUniform("u_texNormal", bgfx::UniformType::Uniform1iv); + bool update() BX_OVERRIDE + { + if (!entry::processEvents(m_width, m_height, m_debug, m_reset) ) + { + // Set view 0 default viewport. + bgfx::setViewRect(0, 0, 0, m_width, m_height); - uint16_t numLights = 4; - bgfx::UniformHandle u_lightPosRadius = bgfx::createUniform("u_lightPosRadius", bgfx::UniformType::Uniform4fv, numLights); - bgfx::UniformHandle u_lightRgbInnerR = bgfx::createUniform("u_lightRgbInnerR", bgfx::UniformType::Uniform4fv, numLights); + // This dummy draw call is here to make sure that view 0 is cleared + // if no other draw calls are submitted to view 0. + bgfx::touch(0); - // Create program from shaders. - bgfx::ProgramHandle program = loadProgram(instancingSupported ? "vs_bump_instanced" : "vs_bump", "fs_bump"); + int64_t now = bx::getHPCounter(); + static int64_t last = now; + const int64_t frameTime = now - last; + last = now; + const double freq = double(bx::getHPFrequency() ); + const double toMs = 1000.0/freq; - // Load diffuse texture. - bgfx::TextureHandle textureColor = loadTexture("fieldstone-rgba.dds"); + float time = (float)( (now-m_timeOffset)/freq); - // Load normal texture. - bgfx::TextureHandle textureNormal = loadTexture("fieldstone-n.dds"); + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/06-bump"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Loading textures."); + bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); - int64_t timeOffset = bx::getHPCounter(); + float at[3] = { 0.0f, 0.0f, 0.0f }; + float eye[3] = { 0.0f, 0.0f, -7.0f }; - while (!entry::processEvents(width, height, debug, reset) ) - { - // Set view 0 default viewport. - bgfx::setViewRect(0, 0, 0, width, height); - - // This dummy draw call is here to make sure that view 0 is cleared - // if no other draw calls are submitted to view 0. - bgfx::submit(0); - - int64_t now = bx::getHPCounter(); - static int64_t last = now; - const int64_t frameTime = now - last; - last = now; - const double freq = double(bx::getHPFrequency() ); - const double toMs = 1000.0/freq; - - float time = (float)( (now-timeOffset)/freq); - - // Use debug font to print information about this example. - bgfx::dbgTextClear(); - bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/06-bump"); - bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Loading textures."); - bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); - - float at[3] = { 0.0f, 0.0f, 0.0f }; - float eye[3] = { 0.0f, 0.0f, -7.0f }; - - // Set view and projection matrix for view 0. - const bgfx::HMD* hmd = bgfx::getHMD(); - if (NULL != hmd) - { - float view[16]; - bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); + // Set view and projection matrix for view 0. + const bgfx::HMD* hmd = bgfx::getHMD(); + if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING) ) + { + float view[16]; + bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); - float proj[16]; - bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f); + float proj[16]; + bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f); - bgfx::setViewTransform(0, view, proj); + bgfx::setViewTransform(0, view, proj); - // Set view 0 default viewport. - // - // Use HMD's width/height since HMD's internal frame buffer size - // might be much larger than window size. - bgfx::setViewRect(0, 0, 0, hmd->width, hmd->height); - } - else - { - float view[16]; - bx::mtxLookAt(view, eye, at); + // Set view 0 default viewport. + // + // Use HMD's width/height since HMD's internal frame buffer size + // might be much larger than window size. + bgfx::setViewRect(0, 0, 0, hmd->width, hmd->height); + } + else + { + float view[16]; + bx::mtxLookAt(view, eye, at); - float proj[16]; - bx::mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f); - bgfx::setViewTransform(0, view, proj); + float proj[16]; + bx::mtxProj(proj, 60.0f, float(m_width)/float(m_height), 0.1f, 100.0f); + bgfx::setViewTransform(0, view, proj); - // Set view 0 default viewport. - bgfx::setViewRect(0, 0, 0, width, height); - } + // Set view 0 default viewport. + bgfx::setViewRect(0, 0, 0, m_width, m_height); + } - float lightPosRadius[4][4]; - for (uint32_t ii = 0; ii < numLights; ++ii) - { - lightPosRadius[ii][0] = sinf( (time*(0.1f + ii*0.17f) + ii*bx::piHalf*1.37f ) )*3.0f; - lightPosRadius[ii][1] = cosf( (time*(0.2f + ii*0.29f) + ii*bx::piHalf*1.49f ) )*3.0f; - lightPosRadius[ii][2] = -2.5f; - lightPosRadius[ii][3] = 3.0f; - } + float lightPosRadius[4][4]; + for (uint32_t ii = 0; ii < m_numLights; ++ii) + { + lightPosRadius[ii][0] = sinf( (time*(0.1f + ii*0.17f) + ii*bx::piHalf*1.37f ) )*3.0f; + lightPosRadius[ii][1] = cosf( (time*(0.2f + ii*0.29f) + ii*bx::piHalf*1.49f ) )*3.0f; + lightPosRadius[ii][2] = -2.5f; + lightPosRadius[ii][3] = 3.0f; + } - bgfx::setUniform(u_lightPosRadius, lightPosRadius, numLights); + bgfx::setUniform(u_lightPosRadius, lightPosRadius, m_numLights); - float lightRgbInnerR[4][4] = - { - { 1.0f, 0.7f, 0.2f, 0.8f }, - { 0.7f, 0.2f, 1.0f, 0.8f }, - { 0.2f, 1.0f, 0.7f, 0.8f }, - { 1.0f, 0.4f, 0.2f, 0.8f }, - }; + float lightRgbInnerR[4][4] = + { + { 1.0f, 0.7f, 0.2f, 0.8f }, + { 0.7f, 0.2f, 1.0f, 0.8f }, + { 0.2f, 1.0f, 0.7f, 0.8f }, + { 1.0f, 0.4f, 0.2f, 0.8f }, + }; - bgfx::setUniform(u_lightRgbInnerR, lightRgbInnerR, numLights); + bgfx::setUniform(u_lightRgbInnerR, lightRgbInnerR, m_numLights); - const uint16_t instanceStride = 64; - const uint16_t numInstances = 3; + const uint16_t instanceStride = 64; + const uint16_t numInstances = 3; - if (instancingSupported) - { - // Write instance data for 3x3 cubes. - for (uint32_t yy = 0; yy < 3; ++yy) + if (m_instancingSupported) { - const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(numInstances, instanceStride); - if (NULL != idb) + // Write instance data for 3x3 cubes. + for (uint32_t yy = 0; yy < 3; ++yy) + { + const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(numInstances, instanceStride); + if (NULL != idb) + { + uint8_t* data = idb->data; + + for (uint32_t xx = 0; xx < 3; ++xx) + { + float* mtx = (float*)data; + bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f); + mtx[12] = -3.0f + float(xx)*3.0f; + mtx[13] = -3.0f + float(yy)*3.0f; + mtx[14] = 0.0f; + + data += instanceStride; + } + + // Set instance data buffer. + bgfx::setInstanceDataBuffer(idb, numInstances); + + // Set vertex and index buffer. + bgfx::setVertexBuffer(m_vbh); + bgfx::setIndexBuffer(m_ibh); + + // Bind textures. + bgfx::setTexture(0, s_texColor, m_textureColor); + bgfx::setTexture(1, s_texNormal, m_textureNormal); + + // Set render states. + bgfx::setState(0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_MSAA + ); + + // Submit primitive for rendering to view 0. + bgfx::submit(0, m_program); + } + } + } + else + { + for (uint32_t yy = 0; yy < 3; ++yy) { - uint8_t* data = idb->data; - for (uint32_t xx = 0; xx < 3; ++xx) { - float* mtx = (float*)data; + float mtx[16]; bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f); mtx[12] = -3.0f + float(xx)*3.0f; mtx[13] = -3.0f + float(yy)*3.0f; mtx[14] = 0.0f; - data += instanceStride; - } - - // Set instance data buffer. - bgfx::setInstanceDataBuffer(idb, numInstances); + // Set transform for draw call. + bgfx::setTransform(mtx); - // Set vertex and fragment shaders. - bgfx::setProgram(program); + // Set vertex and index buffer. + bgfx::setVertexBuffer(m_vbh); + bgfx::setIndexBuffer(m_ibh); - // Set vertex and index buffer. - bgfx::setVertexBuffer(vbh); - bgfx::setIndexBuffer(ibh); + // Bind textures. + bgfx::setTexture(0, s_texColor, m_textureColor); + bgfx::setTexture(1, s_texNormal, m_textureNormal); - // Bind textures. - bgfx::setTexture(0, u_texColor, textureColor); - bgfx::setTexture(1, u_texNormal, textureNormal); + // Set render states. + bgfx::setState(0 + | BGFX_STATE_RGB_WRITE + | BGFX_STATE_ALPHA_WRITE + | BGFX_STATE_DEPTH_WRITE + | BGFX_STATE_DEPTH_TEST_LESS + | BGFX_STATE_MSAA + ); - // Set render states. - bgfx::setState(0 - | BGFX_STATE_RGB_WRITE - | BGFX_STATE_ALPHA_WRITE - | BGFX_STATE_DEPTH_WRITE - | BGFX_STATE_DEPTH_TEST_LESS - | BGFX_STATE_MSAA - ); - - // Submit primitive for rendering to view 0. - bgfx::submit(0); - } - } - } - else - { - for (uint32_t yy = 0; yy < 3; ++yy) - { - for (uint32_t xx = 0; xx < 3; ++xx) - { - float mtx[16]; - bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f); - mtx[12] = -3.0f + float(xx)*3.0f; - mtx[13] = -3.0f + float(yy)*3.0f; - mtx[14] = 0.0f; - - // Set transform for draw call. - bgfx::setTransform(mtx); - - // Set vertex and fragment shaders. - bgfx::setProgram(program); - - // Set vertex and index buffer. - bgfx::setVertexBuffer(vbh); - bgfx::setIndexBuffer(ibh); - - // Bind textures. - bgfx::setTexture(0, u_texColor, textureColor); - bgfx::setTexture(1, u_texNormal, textureNormal); - - // Set render states. - bgfx::setState(0 - | BGFX_STATE_RGB_WRITE - | BGFX_STATE_ALPHA_WRITE - | BGFX_STATE_DEPTH_WRITE - | BGFX_STATE_DEPTH_TEST_LESS - | BGFX_STATE_MSAA - ); - - // Submit primitive for rendering to view 0. - bgfx::submit(0); + // Submit primitive for rendering to view 0. + bgfx::submit(0, m_program); + } } } + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + + return true; } - // Advance to next frame. Rendering thread will be kicked to - // process submitted rendering primitives. - bgfx::frame(); + return false; } - // Cleanup. - bgfx::destroyIndexBuffer(ibh); - bgfx::destroyVertexBuffer(vbh); - bgfx::destroyProgram(program); - bgfx::destroyTexture(textureColor); - bgfx::destroyTexture(textureNormal); - bgfx::destroyUniform(u_texColor); - bgfx::destroyUniform(u_texNormal); - bgfx::destroyUniform(u_lightPosRadius); - bgfx::destroyUniform(u_lightRgbInnerR); - - // Shutdown bgfx. - bgfx::shutdown(); - - return 0; -} + bgfx::VertexBufferHandle m_vbh; + bgfx::IndexBufferHandle m_ibh; + bgfx::UniformHandle s_texColor; + bgfx::UniformHandle s_texNormal; + bgfx::UniformHandle u_lightPosRadius; + bgfx::UniformHandle u_lightRgbInnerR; + bgfx::ProgramHandle m_program; + bgfx::TextureHandle m_textureColor; + bgfx::TextureHandle m_textureNormal; + uint16_t m_numLights; + bool m_instancingSupported; + + uint32_t m_width; + uint32_t m_height; + uint32_t m_debug; + uint32_t m_reset; + int64_t m_timeOffset; +}; + +ENTRY_IMPLEMENT_MAIN(Bump); |