int _main_(int _argc, char** _argv) { 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 views clear state. bgfx::setViewClear(0 , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH , 0x303030ff , 1.0f , 0 ); // Imgui. imguiCreate(); // Uniforms. s_uniforms.init(); // Vertex declarations. PosColorTexCoord0Vertex::init(); LightProbe lightProbes[LightProbe::Count]; lightProbes[LightProbe::Wells ].load("wells"); lightProbes[LightProbe::Uffizi].load("uffizi"); lightProbes[LightProbe::Pisa ].load("pisa"); lightProbes[LightProbe::Ennis ].load("ennis"); lightProbes[LightProbe::Grace ].load("grace"); LightProbe::Enum currentLightProbe = LightProbe::Wells; bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); bgfx::UniformHandle u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4); bgfx::UniformHandle u_flags = bgfx::createUniform("u_flags", bgfx::UniformType::Vec4); bgfx::UniformHandle u_camPos = bgfx::createUniform("u_camPos", bgfx::UniformType::Vec4); bgfx::UniformHandle s_texCube = bgfx::createUniform("s_texCube", bgfx::UniformType::Int1); bgfx::UniformHandle s_texCubeIrr = bgfx::createUniform("s_texCubeIrr", bgfx::UniformType::Int1); bgfx::ProgramHandle programMesh = loadProgram("vs_ibl_mesh", "fs_ibl_mesh"); bgfx::ProgramHandle programSky = loadProgram("vs_ibl_skybox", "fs_ibl_skybox"); Mesh* meshBunny; meshBunny = meshLoad("meshes/bunny.bin"); struct Settings { float m_speed; float m_glossiness; float m_exposure; float m_diffspec; float m_rgbDiff[3]; float m_rgbSpec[3]; bool m_diffuse; bool m_specular; bool m_diffuseIbl; bool m_specularIbl; bool m_showDiffColorWheel; bool m_showSpecColorWheel; ImguiCubemap::Enum m_crossCubemapPreview; }; Settings settings; settings.m_speed = 0.37f; settings.m_glossiness = 1.0f; settings.m_exposure = 0.0f; settings.m_diffspec = 0.65f; settings.m_rgbDiff[0] = 0.2f; settings.m_rgbDiff[1] = 0.2f; settings.m_rgbDiff[2] = 0.2f; settings.m_rgbSpec[0] = 1.0f; settings.m_rgbSpec[1] = 1.0f; settings.m_rgbSpec[2] = 1.0f; settings.m_diffuse = true; settings.m_specular = true; settings.m_diffuseIbl = true; settings.m_specularIbl = true; settings.m_showDiffColorWheel = true; settings.m_showSpecColorWheel = false; settings.m_crossCubemapPreview = ImguiCubemap::Cross; float time = 0.0f; int32_t leftScrollArea = 0; entry::MouseState mouseState; while (!entry::processEvents(width, height, debug, reset, &mouseState) ) { imguiBeginFrame(mouseState.m_mx , mouseState.m_my , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) | (mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) , mouseState.m_mz , width , height ); static int32_t rightScrollArea = 0; imguiBeginScrollArea("Settings", width - 256 - 10, 10, 256, 540, &rightScrollArea); imguiLabel("Shade:"); imguiSeparator(); imguiBool("Diffuse", settings.m_diffuse); imguiBool("Specular", settings.m_specular); imguiBool("IBL Diffuse", settings.m_diffuseIbl); imguiBool("IBL Specular", settings.m_specularIbl); imguiSeparatorLine(); imguiSlider("Speed", settings.m_speed, 0.0f, 1.0f, 0.01f); imguiSeparatorLine(); imguiSeparator(); imguiSlider("Exposure", settings.m_exposure, -8.0f, 8.0f, 0.01f); imguiSeparator(); imguiLabel("Environment:"); currentLightProbe = LightProbe::Enum(imguiChoose(currentLightProbe , "Wells" , "Uffizi" , "Pisa" , "Ennis" , "Grace" ) ); static float lod = 0.0f; if (imguiCube(lightProbes[currentLightProbe].m_tex, lod, settings.m_crossCubemapPreview, true) ) { settings.m_crossCubemapPreview = ImguiCubemap::Enum( (settings.m_crossCubemapPreview+1) % ImguiCubemap::Count); } imguiSlider("Texture LOD", lod, 0.0f, 10.1f, 0.1f); imguiEndScrollArea(); imguiBeginScrollArea("Settings", 10, 70, 256, 576, &leftScrollArea); imguiLabel("Material properties:"); imguiSeparator(); imguiSlider("Diffuse - Specular", settings.m_diffspec, 0.0f, 1.0f, 0.01f); imguiSlider("Glossiness" , settings.m_glossiness, 0.0f, 1.0f, 0.01f); imguiSeparator(); imguiColorWheel("Diffuse color:", &settings.m_rgbDiff[0], settings.m_showDiffColorWheel); imguiSeparator(); imguiColorWheel("Specular color:", &settings.m_rgbSpec[0], settings.m_showSpecColorWheel); imguiSeparator(); imguiLabel("Predefined materials:"); imguiSeparator(); if (imguiButton("Gold") ) { settings.m_glossiness = 0.8f; settings.m_diffspec = 1.0f; settings.m_rgbDiff[0] = 0.0f; settings.m_rgbDiff[1] = 0.0f; settings.m_rgbDiff[2] = 0.0f; settings.m_rgbSpec[0] = 1.0f; settings.m_rgbSpec[1] = 0.86f; settings.m_rgbSpec[2] = 0.58f; } if (imguiButton("Copper") ) { settings.m_glossiness = 0.67f; settings.m_diffspec = 1.0f; settings.m_rgbDiff[0] = 0.0f; settings.m_rgbDiff[1] = 0.0f; settings.m_rgbDiff[2] = 0.0f; settings.m_rgbSpec[0] = 0.98f; settings.m_rgbSpec[1] = 0.82f; settings.m_rgbSpec[2] = 0.76f; } if (imguiButton("Titanium") ) { settings.m_glossiness = 0.57f; settings.m_diffspec = 1.0f; settings.m_rgbDiff[0] = 0.0f; settings.m_rgbDiff[1] = 0.0f; settings.m_rgbDiff[2] = 0.0f; settings.m_rgbSpec[0] = 0.76f; settings.m_rgbSpec[1] = 0.73f; settings.m_rgbSpec[2] = 0.71f; } if (imguiButton("Steel") ) { settings.m_glossiness = 0.82f; settings.m_diffspec = 1.0f; settings.m_rgbDiff[0] = 0.0f; settings.m_rgbDiff[1] = 0.0f; settings.m_rgbDiff[2] = 0.0f; settings.m_rgbSpec[0] = 0.77f; settings.m_rgbSpec[1] = 0.78f; settings.m_rgbSpec[2] = 0.77f; } imguiEndScrollArea(); imguiEndFrame(); s_uniforms.m_glossiness = settings.m_glossiness; s_uniforms.m_exposure = settings.m_exposure; s_uniforms.m_diffspec = settings.m_diffspec; s_uniforms.m_flags[0] = float(settings.m_diffuse); s_uniforms.m_flags[1] = float(settings.m_specular); s_uniforms.m_flags[2] = float(settings.m_diffuseIbl); s_uniforms.m_flags[3] = float(settings.m_specularIbl); memcpy(s_uniforms.m_rgbDiff, settings.m_rgbDiff, 3*sizeof(float) ); memcpy(s_uniforms.m_rgbSpec, settings.m_rgbSpec, 3*sizeof(float) ); s_uniforms.submitPerFrameUniforms(); 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; time += (float)(frameTime*settings.m_speed/freq); s_uniforms.m_camPosTime[3] = time; // Use debug font to print information about this example. bgfx::dbgTextClear(); bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/18-ibl"); bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Image based lightning."); 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, -3.0f }; bx::mtxRotateXY(s_uniforms.m_mtx , 0.0f , time ); float view[16]; float proj[16]; bx::mtxIdentity(view); bx::mtxOrtho(proj, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); bgfx::setViewTransform(0, view, proj); bx::mtxLookAt(view, eye, at); memcpy(s_uniforms.m_camPosTime, eye, 3*sizeof(float) ); bx::mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f); bgfx::setViewTransform(1, view, proj); bgfx::setViewRect(0, 0, 0, width, height); bgfx::setViewRect(1, 0, 0, width, height); // View 0. bgfx::setTexture(0, s_texCube, lightProbes[currentLightProbe].m_tex); bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); screenSpaceQuad( (float)width, (float)height, true); s_uniforms.submitPerDrawUniforms(); bgfx::submit(0, programSky); // View 1. float mtx[16]; bx::mtxSRT(mtx , 1.0f , 1.0f , 1.0f , 0.0f , bx::pi+time , 0.0f , 0.0f , -1.0f , 0.0f ); bgfx::setTexture(0, s_texCube, lightProbes[currentLightProbe].m_tex); bgfx::setTexture(1, s_texCubeIrr, lightProbes[currentLightProbe].m_texIrr); meshSubmit(meshBunny, 1, programMesh, mtx); // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. bgfx::frame(); } meshUnload(meshBunny); // Cleanup. bgfx::destroyProgram(programMesh); bgfx::destroyProgram(programSky); bgfx::destroyUniform(u_camPos); bgfx::destroyUniform(u_flags); bgfx::destroyUniform(u_params); bgfx::destroyUniform(u_mtx); bgfx::destroyUniform(s_texCube); bgfx::destroyUniform(s_texCubeIrr); for (uint8_t ii = 0; ii < LightProbe::Count; ++ii) { lightProbes[ii].destroy(); } s_uniforms.destroy(); imguiDestroy(); // Shutdown bgfx. bgfx::shutdown(); return 0; }
int _main_(int, char**) { uint32_t width = 800, height = 600; uint32_t debug = BGFX_DEBUG_TEXT | BGFX_DEBUG_STATS; uint32_t reset = BGFX_RESET_VSYNC | BGFX_RESET_MSAA_X8; bool showStats = true; bgfx::init(); bgfx::reset(width, height, reset); bgfx::setDebug(debug); size_t sz = 0; void* fontdata = nullptr; if(loadfile("assets/font/droidsans.ttf", fontdata, sz)) imguiCreate(fontdata, sz); else imguiCreate(); free(fontdata); entry::MouseState mouseState; float rgb[3] = {0.3f, 0.3f, 0.3f}; bool colorwheelActivated = false; int32_t scrollArea = 0; while(!entry::processEvents(width, height, debug, reset, &mouseState)) { auto encodeColor = [&rgb]()->uint32_t{ return uint32_t(rgb[0]*255)<<24|uint32_t(rgb[1]*255)<<16|uint32_t(rgb[2]*255)<<8|0xff; }; bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, encodeColor(), 1.0f, 0); bgfx::setViewRect(0, 0, 0, width, height); bgfx::submit(0, BGFX_INVALID_HANDLE); bgfx::dbgTextPrintf(0, 1, 0x4f, "hello world"); bgfx::dbgTextPrintf(0, 2, 0x5f, "simple bgfx program"); imguiBeginFrame(mouseState.m_mx, mouseState.m_my, (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) , 0 , width , height); imguiBeginScrollArea("Test", width-350, 50, 330, 500, &scrollArea); imguiSeparatorLine(); imguiLabel("foobar"); if(imguiButton("say hi")) fprintf(stdout, "hi there\n"); imguiBool("show stats", showStats); uint32_t newDebug = BGFX_DEBUG_TEXT | (showStats ? BGFX_DEBUG_STATS : 0); if(newDebug != debug) { debug = newDebug; bgfx::setDebug(debug); } imguiColorWheel("bg color", rgb, colorwheelActivated); ImGui::ColorEdit3("bg color", rgb); imguiSeparatorLine(); if(imguiButton("quit")) break; imguiEndScrollArea(); imguiEndFrame(); bgfx::frame(); } imguiDestroy(); bgfx::shutdown(); return 0; }
int _main_(int _argc, char** _argv) { Args args(_argc, _argv); uint32_t width = 1280; uint32_t height = 720; uint32_t debug = BGFX_DEBUG_TEXT; uint32_t reset = 0 | BGFX_RESET_VSYNC | BGFX_RESET_MSAA_X16 ; bgfx::init(args.m_type, args.m_pciId); bgfx::reset(width, height, reset); // Enable debug text. bgfx::setDebug(debug); // Set views clear state. bgfx::setViewClear(0 , BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH , 0x303030ff , 1.0f , 0 ); // Imgui. imguiCreate(); // Uniforms. Uniforms uniforms; uniforms.init(); // Vertex declarations. PosColorTexCoord0Vertex::init(); LightProbe lightProbes[LightProbe::Count]; lightProbes[LightProbe::Bolonga].load("bolonga"); lightProbes[LightProbe::Kyoto ].load("kyoto"); LightProbe::Enum currentLightProbe = LightProbe::Bolonga; bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4); bgfx::UniformHandle u_params = bgfx::createUniform("u_params", bgfx::UniformType::Vec4); bgfx::UniformHandle u_flags = bgfx::createUniform("u_flags", bgfx::UniformType::Vec4); bgfx::UniformHandle u_camPos = bgfx::createUniform("u_camPos", bgfx::UniformType::Vec4); bgfx::UniformHandle s_texCube = bgfx::createUniform("s_texCube", bgfx::UniformType::Int1); bgfx::UniformHandle s_texCubeIrr = bgfx::createUniform("s_texCubeIrr", bgfx::UniformType::Int1); bgfx::ProgramHandle programMesh = loadProgram("vs_ibl_mesh", "fs_ibl_mesh"); bgfx::ProgramHandle programSky = loadProgram("vs_ibl_skybox", "fs_ibl_skybox"); Mesh* meshBunny; meshBunny = meshLoad("meshes/bunny.bin"); Mesh* meshOrb; meshOrb = meshLoad("meshes/orb.bin"); Camera camera; Mouse mouse; struct Settings { Settings() { m_envRotCurr = 0.0f; m_envRotDest = 0.0f; m_lightDir[0] = -0.8f; m_lightDir[1] = 0.2f; m_lightDir[2] = -0.5f; m_lightCol[0] = 1.0f; m_lightCol[1] = 1.0f; m_lightCol[2] = 1.0f; m_glossiness = 0.7f; m_exposure = 0.0f; m_bgType = 3.0f; m_radianceSlider = 2.0f; m_reflectivity = 0.85f; m_rgbDiff[0] = 1.0f; m_rgbDiff[1] = 1.0f; m_rgbDiff[2] = 1.0f; m_rgbSpec[0] = 1.0f; m_rgbSpec[1] = 1.0f; m_rgbSpec[2] = 1.0f; m_lod = 0.0f; m_doDiffuse = false; m_doSpecular = false; m_doDiffuseIbl = true; m_doSpecularIbl = true; m_showLightColorWheel = true; m_showDiffColorWheel = true; m_showSpecColorWheel = true; m_metalOrSpec = 0; m_meshSelection = 0; m_crossCubemapPreview = ImguiCubemap::Latlong; } float m_envRotCurr; float m_envRotDest; float m_lightDir[3]; float m_lightCol[3]; float m_glossiness; float m_exposure; float m_radianceSlider; float m_bgType; float m_reflectivity; float m_rgbDiff[3]; float m_rgbSpec[3]; float m_lod; bool m_doDiffuse; bool m_doSpecular; bool m_doDiffuseIbl; bool m_doSpecularIbl; bool m_showLightColorWheel; bool m_showDiffColorWheel; bool m_showSpecColorWheel; uint8_t m_metalOrSpec; uint8_t m_meshSelection; ImguiCubemap::Enum m_crossCubemapPreview; }; Settings settings; int32_t leftScrollArea = 0; entry::MouseState mouseState; while (!entry::processEvents(width, height, debug, reset, &mouseState) ) { imguiBeginFrame(mouseState.m_mx , mouseState.m_my , (mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) | (mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) | (mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) , mouseState.m_mz , uint16_t(width) , uint16_t(height) ); static int32_t rightScrollArea = 0; imguiBeginScrollArea("", width - 256 - 10, 10, 256, 700, &rightScrollArea); imguiLabel("Environment light:"); imguiIndent(); imguiBool("IBL Diffuse", settings.m_doDiffuseIbl); imguiBool("IBL Specular", settings.m_doSpecularIbl); currentLightProbe = LightProbe::Enum(imguiTabs( uint8_t(currentLightProbe) , true , ImguiAlign::LeftIndented , 16 , 2 , 2 , "Bolonga" , "Kyoto" ) ); if (imguiCube(lightProbes[currentLightProbe].m_tex, settings.m_lod, settings.m_crossCubemapPreview, true) ) { settings.m_crossCubemapPreview = ImguiCubemap::Enum( (settings.m_crossCubemapPreview+1) % ImguiCubemap::Count); } imguiSlider("Texture LOD", settings.m_lod, 0.0f, 10.1f, 0.1f); imguiUnindent(); imguiSeparator(8); imguiLabel("Directional light:"); imguiIndent(); imguiBool("Diffuse", settings.m_doDiffuse); imguiBool("Specular", settings.m_doSpecular); const bool doDirectLighting = settings.m_doDiffuse || settings.m_doSpecular; imguiSlider("Light direction X", settings.m_lightDir[0], -1.0f, 1.0f, 0.1f, doDirectLighting); imguiSlider("Light direction Y", settings.m_lightDir[1], -1.0f, 1.0f, 0.1f, doDirectLighting); imguiSlider("Light direction Z", settings.m_lightDir[2], -1.0f, 1.0f, 0.1f, doDirectLighting); imguiColorWheel("Color:", settings.m_lightCol, settings.m_showLightColorWheel, 0.6f, doDirectLighting); imguiUnindent(); imguiSeparator(8); imguiLabel("Background:"); imguiIndent(); { int32_t selection; if (0.0f == settings.m_bgType) { selection = UINT8_C(0); } else if (7.0f == settings.m_bgType) { selection = UINT8_C(2); } else { selection = UINT8_C(1); } selection = imguiTabs( uint8_t(selection) , true , ImguiAlign::LeftIndented , 16 , 2 , 3 , "Skybox" , "Radiance" , "Irradiance" ); if (0 == selection) { settings.m_bgType = 0.0f; } else if (2 == selection) { settings.m_bgType = 7.0f; } else { settings.m_bgType = settings.m_radianceSlider; } const bool isRadiance = (selection == 1); imguiSlider("Mip level", settings.m_radianceSlider, 1.0f, 6.0f, 0.1f, isRadiance); } imguiUnindent(); imguiSeparator(8); imguiLabel("Post processing:"); imguiIndent(); imguiSlider("Exposure", settings.m_exposure, -4.0f, 4.0f, 0.1f); imguiUnindent(); imguiSeparator(); imguiEndScrollArea(); imguiBeginScrollArea("", 10, 70, 256, 636, &leftScrollArea); imguiLabel("Mesh:"); imguiIndent(); settings.m_meshSelection = uint8_t(imguiChoose(settings.m_meshSelection, "Bunny", "Orbs") ); imguiUnindent(); const bool isBunny = (0 == settings.m_meshSelection); if (!isBunny) { settings.m_metalOrSpec = 0; } imguiSeparator(4); imguiLabel("Workflow:"); imguiIndent(); if (imguiCheck("Metalness", 0 == settings.m_metalOrSpec, isBunny) ) { settings.m_metalOrSpec = 0; } if (imguiCheck("Specular", 1 == settings.m_metalOrSpec, isBunny) ) { settings.m_metalOrSpec = 1; } imguiUnindent(); imguiSeparator(4); imguiLabel("Material:"); imguiIndent(); imguiSlider("Glossiness", settings.m_glossiness, 0.0f, 1.0f, 0.01f, isBunny); imguiSlider(0 == settings.m_metalOrSpec ? "Metalness" : "Diffuse - Specular", settings.m_reflectivity, 0.0f, 1.0f, 0.01f, isBunny); imguiUnindent(); imguiColorWheel("Diffuse:", &settings.m_rgbDiff[0], settings.m_showDiffColorWheel, 0.7f); imguiSeparator(); imguiColorWheel("Specular:", &settings.m_rgbSpec[0], settings.m_showSpecColorWheel, 0.7f, (1 == settings.m_metalOrSpec) && isBunny); imguiEndScrollArea(); imguiEndFrame(); uniforms.m_glossiness = settings.m_glossiness; uniforms.m_reflectivity = settings.m_reflectivity; uniforms.m_exposure = settings.m_exposure; uniforms.m_bgType = settings.m_bgType; uniforms.m_metalOrSpec = float(settings.m_metalOrSpec); uniforms.m_doDiffuse = float(settings.m_doDiffuse); uniforms.m_doSpecular = float(settings.m_doSpecular); uniforms.m_doDiffuseIbl = float(settings.m_doDiffuseIbl); uniforms.m_doSpecularIbl = float(settings.m_doSpecularIbl); bx::memCopy(uniforms.m_rgbDiff, settings.m_rgbDiff, 3*sizeof(float) ); bx::memCopy(uniforms.m_rgbSpec, settings.m_rgbSpec, 3*sizeof(float) ); bx::memCopy(uniforms.m_lightDir, settings.m_lightDir, 3*sizeof(float) ); bx::memCopy(uniforms.m_lightCol, settings.m_lightCol, 3*sizeof(float) ); 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 deltaTimeSec = float(double(frameTime)/freq); // Use debug font to print information about this example. bgfx::dbgTextClear(); bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/18-ibl"); bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Image-based lighting."); bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs); // Camera. const bool mouseOverGui = imguiMouseOverArea(); mouse.update(float(mouseState.m_mx), float(mouseState.m_my), mouseState.m_mz, width, height); if (!mouseOverGui) { if (mouseState.m_buttons[entry::MouseButton::Left]) { camera.orbit(mouse.m_dx, mouse.m_dy); } else if (mouseState.m_buttons[entry::MouseButton::Right]) { camera.dolly(mouse.m_dx + mouse.m_dy); } else if (mouseState.m_buttons[entry::MouseButton::Middle]) { settings.m_envRotDest += mouse.m_dx*2.0f; } else if (0 != mouse.m_scroll) { camera.dolly(float(mouse.m_scroll)*0.05f); } } camera.update(deltaTimeSec); bx::memCopy(uniforms.m_cameraPos, camera.m_pos.curr, 3*sizeof(float) ); // View Transform 0. float view[16]; float proj[16]; bx::mtxIdentity(view); bx::mtxOrtho(proj, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 100.0f); bgfx::setViewTransform(0, view, proj); // View Transform 1. camera.mtxLookAt(view); bx::mtxProj(proj, 45.0f, float(width)/float(height), 0.1f, 100.0f, bgfx::getCaps()->homogeneousDepth); bgfx::setViewTransform(1, view, proj); // View rect. bgfx::setViewRect(0, 0, 0, uint16_t(width), uint16_t(height) ); bgfx::setViewRect(1, 0, 0, uint16_t(width), uint16_t(height) ); // Env rotation. const float amount = bx::fmin(deltaTimeSec/0.12f, 1.0f); settings.m_envRotCurr = bx::flerp(settings.m_envRotCurr, settings.m_envRotDest, amount); // Env mtx. float mtxEnvView[16]; camera.envViewMtx(mtxEnvView); float mtxEnvRot[16]; bx::mtxRotateY(mtxEnvRot, settings.m_envRotCurr); bx::mtxMul(uniforms.m_mtx, mtxEnvView, mtxEnvRot); // Used for Skybox. // Submit view 0. bgfx::setTexture(0, s_texCube, lightProbes[currentLightProbe].m_tex); bgfx::setTexture(1, s_texCubeIrr, lightProbes[currentLightProbe].m_texIrr); bgfx::setState(BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE); screenSpaceQuad( (float)width, (float)height, true); uniforms.submit(); bgfx::submit(0, programSky); // Submit view 1. bx::memCopy(uniforms.m_mtx, mtxEnvRot, 16*sizeof(float)); // Used for IBL. if (0 == settings.m_meshSelection) { // Submit bunny. float mtx[16]; bx::mtxSRT(mtx, 1.0f, 1.0f, 1.0f, 0.0f, bx::pi, 0.0f, 0.0f, -0.80f, 0.0f); bgfx::setTexture(0, s_texCube, lightProbes[currentLightProbe].m_tex); bgfx::setTexture(1, s_texCubeIrr, lightProbes[currentLightProbe].m_texIrr); uniforms.submit(); meshSubmit(meshBunny, 1, programMesh, mtx); } else { // Submit orbs. for (float yy = 0, yend = 5.0f; yy < yend; yy+=1.0f) { for (float xx = 0, xend = 5.0f; xx < xend; xx+=1.0f) { const float scale = 1.2f; const float spacing = 2.2f; const float yAdj = -0.8f; float mtx[16]; bx::mtxSRT(mtx , scale/xend , scale/xend , scale/xend , 0.0f , 0.0f , 0.0f , 0.0f + (xx/xend)*spacing - (1.0f + (scale-1.0f)*0.5f - 1.0f/xend) , yAdj/yend + (yy/yend)*spacing - (1.0f + (scale-1.0f)*0.5f - 1.0f/yend) , 0.0f ); uniforms.m_glossiness = xx*(1.0f/xend); uniforms.m_reflectivity = (yend-yy)*(1.0f/yend); uniforms.m_metalOrSpec = 0.0f; uniforms.submit(); bgfx::setTexture(0, s_texCube, lightProbes[currentLightProbe].m_tex); bgfx::setTexture(1, s_texCubeIrr, lightProbes[currentLightProbe].m_texIrr); meshSubmit(meshOrb, 1, programMesh, mtx); } } } // Advance to next frame. Rendering thread will be kicked to // process submitted rendering primitives. bgfx::frame(); } meshUnload(meshBunny); meshUnload(meshOrb); // Cleanup. bgfx::destroyProgram(programMesh); bgfx::destroyProgram(programSky); bgfx::destroyUniform(u_camPos); bgfx::destroyUniform(u_flags); bgfx::destroyUniform(u_params); bgfx::destroyUniform(u_mtx); bgfx::destroyUniform(s_texCube); bgfx::destroyUniform(s_texCubeIrr); for (uint8_t ii = 0; ii < LightProbe::Count; ++ii) { lightProbes[ii].destroy(); } uniforms.destroy(); imguiDestroy(); // Shutdown bgfx. bgfx::shutdown(); return 0; }