diff options
Diffstat (limited to '3rdparty/bgfx/examples/26-occlusion/occlusion.cpp')
-rw-r--r-- | 3rdparty/bgfx/examples/26-occlusion/occlusion.cpp | 269 |
1 files changed, 155 insertions, 114 deletions
diff --git a/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp b/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp index 634aaa6cc9a..d2c43c903b9 100644 --- a/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp +++ b/3rdparty/bgfx/examples/26-occlusion/occlusion.cpp @@ -6,6 +6,10 @@ #include "common.h" #include "bgfx_utils.h" #include "camera.h" +#include "imgui/imgui.h" + +namespace +{ #define CUBES_DIM 10 @@ -60,17 +64,23 @@ static const uint16_t s_cubeIndices[36] = class ExampleOcclusion : public entry::AppI { - void init(int _argc, char** _argv) BX_OVERRIDE +public: + ExampleOcclusion(const char* _name, const char* _description) + : entry::AppI(_name, _description) + { + } + + void init(int32_t _argc, const char* const* _argv, uint32_t _width, uint32_t _height) override { Args args(_argc, _argv); - uint32_t width = 1280; - uint32_t height = 720; - m_debug = BGFX_DEBUG_TEXT; + m_width = _width; + m_height = _height; + m_debug = BGFX_DEBUG_NONE; m_reset = BGFX_RESET_VSYNC; bgfx::init(args.m_type, args.m_pciId); - bgfx::reset(width, height, m_reset); + bgfx::reset(m_width, m_height, m_reset); // Enable debug text. bgfx::setDebug(m_debug); @@ -109,9 +119,15 @@ class ExampleOcclusion : public entry::AppI // Create program from shaders. m_program = loadProgram("vs_cubes", "fs_cubes"); - for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii) + const bgfx::Caps* caps = bgfx::getCaps(); + m_occlusionQuerySupported = !!(caps->supported & BGFX_CAPS_OCCLUSION_QUERY); + + if (m_occlusionQuerySupported) { - m_occlusionQueries[ii] = bgfx::createOcclusionQuery(); + for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii) + { + m_occlusionQueries[ii] = bgfx::createOcclusionQuery(); + } } cameraCreate(); @@ -121,21 +137,28 @@ class ExampleOcclusion : public entry::AppI cameraSetHorizontalAngle(bx::toRad(-45.0f) ); m_timeOffset = bx::getHPCounter(); + + imguiCreate(); } - virtual int shutdown() BX_OVERRIDE + virtual int shutdown() override { + imguiDestroy(); + // Cleanup. cameraDestroy(); - for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii) + if (m_occlusionQuerySupported) { - bgfx::destroyOcclusionQuery(m_occlusionQueries[ii]); + for (uint32_t ii = 0; ii < BX_COUNTOF(m_occlusionQueries); ++ii) + { + bgfx::destroy(m_occlusionQueries[ii]); + } } - bgfx::destroyIndexBuffer(m_ibh); - bgfx::destroyVertexBuffer(m_vbh); - bgfx::destroyProgram(m_program); + bgfx::destroy(m_ibh); + bgfx::destroy(m_vbh); + bgfx::destroy(m_program); // Shutdown bgfx. bgfx::shutdown(); @@ -143,122 +166,133 @@ class ExampleOcclusion : public entry::AppI return 0; } - bool update() BX_OVERRIDE + bool update() override { - if (!entry::processWindowEvents(m_state, m_debug, m_reset) ) + if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) { - 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; - const float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) ); - const float deltaTime = float(frameTime/freq); - - // Use debug font to print information about this example. - bgfx::dbgTextClear(); - bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/26-occlusion"); - bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Using occlusion query for conditional rendering."); - bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); - - uint32_t width = m_state.m_width; - uint32_t height = m_state.m_height; - - // Update camera. - float view[16]; - cameraUpdate(deltaTime, m_state.m_mouse); - cameraGetViewMtx(view); - - // Set view and projection matrix for view 0. - const bgfx::HMD* hmd = bgfx::getHMD(); - if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING) ) - { - float viewHead[16]; - float eye[3] = {}; - bx::mtxQuatTranslationHMD(viewHead, hmd->eye[0].rotation, eye); + imguiBeginFrame(m_mouseState.m_mx + , m_mouseState.m_my + , (m_mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) + | (m_mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) + | (m_mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) + , m_mouseState.m_mz + , uint16_t(m_width) + , uint16_t(m_height) + ); - float tmp[16]; - bx::mtxMul(tmp, view, viewHead); + showExampleDialog(this + , !m_occlusionQuerySupported + ? "Occlusion query is not supported." + : NULL + ); - bgfx::setViewTransform(0, tmp, hmd->eye[0].projection); - bgfx::setViewRect(0, 0, 0, hmd->width, hmd->height); + imguiEndFrame(); - bgfx::setViewTransform(1, tmp, hmd->eye[1].projection); - bgfx::setViewRect(1, 0, 0, hmd->width, hmd->height); - } - else + if (m_occlusionQuerySupported) { - float proj[16]; - bx::mtxProj(proj, 90.0f, float(width)/float(height), 0.1f, 10000.0f, bgfx::getCaps()->homogeneousDepth); + 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 float time = (float)( (now-m_timeOffset)/double(bx::getHPFrequency() ) ); + const float deltaTime = float(frameTime/freq); + + // Update camera. + float view[16]; + cameraUpdate(deltaTime, m_state.m_mouse); + cameraGetViewMtx(view); + + // Set view and projection matrix for view 0. + const bgfx::HMD* hmd = bgfx::getHMD(); + if (NULL != hmd && 0 != (hmd->flags & BGFX_HMD_RENDERING) ) + { + float viewHead[16]; + float eye[3] = {}; + bx::mtxQuatTranslationHMD(viewHead, hmd->eye[0].rotation, eye); - bgfx::setViewTransform(0, view, proj); - bgfx::setViewRect(0, 0, 0, uint16_t(width), uint16_t(height) ); + float tmp[16]; + bx::mtxMul(tmp, view, viewHead); - bgfx::setViewTransform(1, view, proj); - bgfx::setViewRect(1, 0, 0, uint16_t(width), uint16_t(height) ); + bgfx::setViewTransform(0, tmp, hmd->eye[0].projection); + bgfx::setViewRect(0, 0, 0, hmd->width, hmd->height); - float at[3] = { 0.0f, 0.0f, 0.0f }; - float eye[3] = { 17.5f, 10.0f, -17.5f }; - bx::mtxLookAt(view, eye, at); + bgfx::setViewTransform(1, tmp, hmd->eye[1].projection); + bgfx::setViewRect(1, 0, 0, hmd->width, hmd->height); + } + else + { + float proj[16]; + bx::mtxProj(proj, 90.0f, float(m_width)/float(m_height), 0.1f, 10000.0f, bgfx::getCaps()->homogeneousDepth); - bgfx::setViewTransform(2, view, proj); - bgfx::setViewRect(2, 10, uint16_t(height - height/4 - 10), uint16_t(width/4), uint16_t(height/4) ); - } + bgfx::setViewTransform(0, view, proj); + bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height) ); - bgfx::touch(0); - bgfx::touch(2); + bgfx::setViewTransform(1, view, proj); + bgfx::setViewRect(1, 0, 0, uint16_t(m_width), uint16_t(m_height) ); - uint8_t img[CUBES_DIM*CUBES_DIM*2]; + float at[3] = { 0.0f, 0.0f, 0.0f }; + float eye[3] = { 17.5f, 10.0f, -17.5f }; + bx::mtxLookAt(view, eye, at); - for (uint32_t yy = 0; yy < CUBES_DIM; ++yy) - { - for (uint32_t xx = 0; xx < CUBES_DIM; ++xx) + bgfx::setViewTransform(2, view, proj); + bgfx::setViewRect(2, 10, uint16_t(m_height - m_height/4 - 10), uint16_t(m_width/4), uint16_t(m_height/4) ); + } + + bgfx::touch(0); + bgfx::touch(2); + + uint8_t img[CUBES_DIM*CUBES_DIM*2]; + + for (uint32_t yy = 0; yy < CUBES_DIM; ++yy) { - float mtx[16]; - bx::mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f); - mtx[12] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(xx)*3.0f; - mtx[13] = 0.0f; - mtx[14] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(yy)*3.0f; - - bgfx::OcclusionQueryHandle occlusionQuery = m_occlusionQueries[yy*CUBES_DIM+xx]; - - bgfx::setTransform(mtx); - bgfx::setVertexBuffer(m_vbh); - bgfx::setIndexBuffer(m_ibh); - bgfx::setCondition(occlusionQuery, true); - bgfx::setState(BGFX_STATE_DEFAULT); - bgfx::submit(0, m_program); - - bgfx::setTransform(mtx); - bgfx::setVertexBuffer(m_vbh); - bgfx::setIndexBuffer(m_ibh); - bgfx::setState(0 - | BGFX_STATE_DEPTH_TEST_LEQUAL - | BGFX_STATE_CULL_CW - ); - bgfx::submit(1, m_program, occlusionQuery); - - bgfx::setTransform(mtx); - bgfx::setVertexBuffer(m_vbh); - bgfx::setIndexBuffer(m_ibh); - bgfx::setCondition(occlusionQuery, true); - bgfx::setState(BGFX_STATE_DEFAULT); - bgfx::submit(2, m_program); - - img[(yy*CUBES_DIM+xx)*2+0] = " \xfex"[bgfx::getResult(occlusionQuery)]; - img[(yy*CUBES_DIM+xx)*2+1] = 0xf; + for (uint32_t xx = 0; xx < CUBES_DIM; ++xx) + { + float mtx[16]; + bx::mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f); + mtx[12] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(xx)*3.0f; + mtx[13] = 0.0f; + mtx[14] = -(CUBES_DIM-1) * 3.0f / 2.0f + float(yy)*3.0f; + + bgfx::OcclusionQueryHandle occlusionQuery = m_occlusionQueries[yy*CUBES_DIM+xx]; + + bgfx::setTransform(mtx); + bgfx::setVertexBuffer(0, m_vbh); + bgfx::setIndexBuffer(m_ibh); + bgfx::setCondition(occlusionQuery, true); + bgfx::setState(BGFX_STATE_DEFAULT); + bgfx::submit(0, m_program); + + bgfx::setTransform(mtx); + bgfx::setVertexBuffer(0, m_vbh); + bgfx::setIndexBuffer(m_ibh); + bgfx::setState(0 + | BGFX_STATE_DEPTH_TEST_LEQUAL + | BGFX_STATE_CULL_CW + ); + bgfx::submit(1, m_program, occlusionQuery); + + bgfx::setTransform(mtx); + bgfx::setVertexBuffer(0, m_vbh); + bgfx::setIndexBuffer(m_ibh); + bgfx::setCondition(occlusionQuery, true); + bgfx::setState(BGFX_STATE_DEFAULT); + bgfx::submit(2, m_program); + + img[(yy*CUBES_DIM+xx)*2+0] = " \xfex"[bgfx::getResult(occlusionQuery)]; + img[(yy*CUBES_DIM+xx)*2+1] = 0xf; + } } - } - for (uint16_t xx = 0; xx < CUBES_DIM; ++xx) - { - bgfx::dbgTextImage(5 + xx*2, 5, 1, CUBES_DIM, img + xx*2, CUBES_DIM*2); - } + for (uint16_t xx = 0; xx < CUBES_DIM; ++xx) + { + bgfx::dbgTextImage(5 + xx*2, 5, 1, CUBES_DIM, img + xx*2, CUBES_DIM*2); + } - int32_t numPixels = 0; - bgfx::getResult(m_occlusionQueries[0], &numPixels); - bgfx::dbgTextPrintf(5, 5 + CUBES_DIM + 1, 0xf, "%d", numPixels); + int32_t numPixels = 0; + bgfx::getResult(m_occlusionQueries[0], &numPixels); + bgfx::dbgTextPrintf(5, 5 + CUBES_DIM + 1, 0xf, "%d", numPixels); + } // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. @@ -270,17 +304,24 @@ class ExampleOcclusion : public entry::AppI return false; } - uint32_t m_reset; + entry::MouseState m_mouseState; + + uint32_t m_width; + uint32_t m_height; uint32_t m_debug; + uint32_t m_reset; bgfx::VertexBufferHandle m_vbh; bgfx::IndexBufferHandle m_ibh; bgfx::ProgramHandle m_program; int64_t m_timeOffset; + bool m_occlusionQuerySupported; bgfx::OcclusionQueryHandle m_occlusionQueries[CUBES_DIM*CUBES_DIM]; entry::WindowState m_state; }; -ENTRY_IMPLEMENT_MAIN(ExampleOcclusion); +} // namespace + +ENTRY_IMPLEMENT_MAIN(ExampleOcclusion, "26-occlusion", "Using occlusion query for conditional rendering."); |