diff options
Diffstat (limited to '3rdparty/bgfx/examples/03-raymarch/raymarch.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/03-raymarch/raymarch.cpp | 269 |
1 files changed, 147 insertions, 122 deletions
diff --git a/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp b/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp index df07fc7ea42..60a4664546e 100644 --- a/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp +++ b/3rdparty/bgfx/examples/03-raymarch/raymarch.cpp @@ -102,138 +102,163 @@ void renderScreenSpaceQuad(uint32_t _view, bgfx::ProgramHandle _program, float _ } } -int _main_(int _argc, char** _argv) +class ExampleRaymarch : public entry::AppI { - Args args(_argc, _argv); - - uint32_t width = 1280; - uint32_t height = 720; - uint32_t debug = BGFX_DEBUG_TEXT; - uint32_t reset = BGFX_RESET_VSYNC; - - bgfx::init(args.m_type, args.m_pciId); - 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 - ); - - // Setup root path for binary shaders. Shader binaries are different - // for each renderer. - switch (bgfx::getRendererType() ) + void init(int _argc, char** _argv) BX_OVERRIDE { - default: - break; - - case bgfx::RendererType::OpenGL: - case bgfx::RendererType::OpenGLES: - s_oglNdc = true; - break; + Args args(_argc, _argv); + + m_width = 1280; + m_height = 720; + m_debug = BGFX_DEBUG_TEXT; + m_reset = BGFX_RESET_VSYNC; + + bgfx::init(args.m_type, args.m_pciId); + 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 + ); + + // Setup root path for binary shaders. Shader binaries are different + // for each renderer. + switch (bgfx::getRendererType() ) + { + default: + break; + + case bgfx::RendererType::OpenGL: + case bgfx::RendererType::OpenGLES: + s_oglNdc = true; + break; + } + + // Create vertex stream declaration. + PosColorTexCoord0Vertex::init(); + + u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); + u_lightDirTime = bgfx::createUniform("u_lightDirTime", bgfx::UniformType::Vec4); + + // Create program from shaders. + m_program = loadProgram("vs_raymarching", "fs_raymarching"); + + m_timeOffset = bx::getHPCounter(); } - // Create vertex stream declaration. - PosColorTexCoord0Vertex::init(); + int shutdown() BX_OVERRIDE + { + // Cleanup. + bgfx::destroyProgram(m_program); - bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); - bgfx::UniformHandle u_lightDirTime = bgfx::createUniform("u_lightDirTime", bgfx::UniformType::Vec4); + bgfx::destroyUniform(u_mtx); + bgfx::destroyUniform(u_lightDirTime); - // Create program from shaders. - bgfx::ProgramHandle raymarching = loadProgram("vs_raymarching", "fs_raymarching"); + // Shutdown bgfx. + bgfx::shutdown(); - int64_t timeOffset = bx::getHPCounter(); + return 0; + } - while (!entry::processEvents(width, height, debug, reset) ) + bool update() BX_OVERRIDE { - // Set view 0 default viewport. - bgfx::setViewRect(0, 0, 0, width, height); - - // Set view 1 default viewport. - bgfx::setViewRect(1, 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 viewZ 0. - bgfx::touch(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; - - // Use debug font to print information about this example. - bgfx::dbgTextClear(); - bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/03-raymarch"); - bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Updating shader uniforms."); - 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, -15.0f }; - - float view[16]; - float proj[16]; - bx::mtxLookAt(view, eye, at); - mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f); - - // Set view and projection matrix for view 1. - bgfx::setViewTransform(0, view, proj); - - float ortho[16]; - bx::mtxOrtho(ortho, 0.0f, 1280.0f, 720.0f, 0.0f, 0.0f, 100.0f); - - // Set view and projection matrix for view 0. - bgfx::setViewTransform(1, NULL, ortho); - - float time = (float)( (bx::getHPCounter()-timeOffset)/double(bx::getHPFrequency() ) ); - - float vp[16]; - bx::mtxMul(vp, view, proj); - - float mtx[16]; - bx::mtxRotateXY(mtx - , time - , time*0.37f - ); - - float mtxInv[16]; - bx::mtxInverse(mtxInv, mtx); - float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f }; - float lightDirModelN[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; - bx::vec3Norm(lightDirModelN, lightDirModel); - float lightDirTime[4]; - bx::vec4MulMtx(lightDirTime, lightDirModelN, mtxInv); - lightDirTime[3] = time; - bgfx::setUniform(u_lightDirTime, lightDirTime); - - float mvp[16]; - bx::mtxMul(mvp, mtx, vp); - - float invMvp[16]; - bx::mtxInverse(invMvp, mvp); - bgfx::setUniform(u_mtx, invMvp); - - renderScreenSpaceQuad(1, raymarching, 0.0f, 0.0f, 1280.0f, 720.0f); - - // Advance to next frame. Rendering thread will be kicked to - // process submitted rendering primitives. - bgfx::frame(); + 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); + + // Set view 1 default viewport. + bgfx::setViewRect(1, 0, 0, m_width, m_height); + + // This dummy draw call is here to make sure that view 0 is cleared + // if no other draw calls are submitted to viewZ 0. + bgfx::touch(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; + + // Use debug font to print information about this example. + bgfx::dbgTextClear(); + bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/03-raymarch"); + bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Updating shader uniforms."); + 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, -15.0f }; + + float view[16]; + float proj[16]; + bx::mtxLookAt(view, eye, at); + mtxProj(proj, 60.0f, float(m_width)/float(m_height), 0.1f, 100.0f); + + // Set view and projection matrix for view 1. + bgfx::setViewTransform(0, view, proj); + + float ortho[16]; + bx::mtxOrtho(ortho, 0.0f, 1280.0f, 720.0f, 0.0f, 0.0f, 100.0f); + + // Set view and projection matrix for view 0. + bgfx::setViewTransform(1, NULL, ortho); + + float time = (float)( (bx::getHPCounter()-m_timeOffset)/double(bx::getHPFrequency() ) ); + + float vp[16]; + bx::mtxMul(vp, view, proj); + + float mtx[16]; + bx::mtxRotateXY(mtx + , time + , time*0.37f + ); + + float mtxInv[16]; + bx::mtxInverse(mtxInv, mtx); + float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f }; + float lightDirModelN[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; + bx::vec3Norm(lightDirModelN, lightDirModel); + float lightDirTime[4]; + bx::vec4MulMtx(lightDirTime, lightDirModelN, mtxInv); + lightDirTime[3] = time; + bgfx::setUniform(u_lightDirTime, lightDirTime); + + float mvp[16]; + bx::mtxMul(mvp, mtx, vp); + + float invMvp[16]; + bx::mtxInverse(invMvp, mvp); + bgfx::setUniform(u_mtx, invMvp); + + renderScreenSpaceQuad(1, m_program, 0.0f, 0.0f, 1280.0f, 720.0f); + + // Advance to next frame. Rendering thread will be kicked to + // process submitted rendering primitives. + bgfx::frame(); + + return true; + } + + return false; } - // Cleanup. - bgfx::destroyProgram(raymarching); + uint32_t m_width; + uint32_t m_height; + uint32_t m_debug; + uint32_t m_reset; - bgfx::destroyUniform(u_mtx); - bgfx::destroyUniform(u_lightDirTime); - - // Shutdown bgfx. - bgfx::shutdown(); + int64_t m_timeOffset; + bgfx::UniformHandle u_mtx; + bgfx::UniformHandle u_lightDirTime; + bgfx::ProgramHandle m_program; +}; - return 0; -} +ENTRY_IMPLEMENT_MAIN(ExampleRaymarch); |