diff --git a/examples/14-shadowvolumes/shadowvolumes.cpp b/examples/14-shadowvolumes/shadowvolumes.cpp index 89d0d6e4c..865b058dc 100644 --- a/examples/14-shadowvolumes/shadowvolumes.cpp +++ b/examples/14-shadowvolumes/shadowvolumes.cpp @@ -2027,7 +2027,7 @@ public: s_uniforms.m_time = time; // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); // Set view and projection matrix for view 0. { diff --git a/examples/16-shadowmaps/shadowmaps.cpp b/examples/16-shadowmaps/shadowmaps.cpp index b9bdfe1d1..bad776a26 100644 --- a/examples/16-shadowmaps/shadowmaps.cpp +++ b/examples/16-shadowmaps/shadowmaps.cpp @@ -2047,7 +2047,7 @@ public: const float deltaTime = float(frameTime/freq); // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); // Update view mtx. cameraGetViewMtx(m_viewState.m_view); diff --git a/examples/21-deferred/deferred.cpp b/examples/21-deferred/deferred.cpp index 8d87051d7..44acbd7f5 100644 --- a/examples/21-deferred/deferred.cpp +++ b/examples/21-deferred/deferred.cpp @@ -416,14 +416,14 @@ public: if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) { 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) - ); + , 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) + ); showExampleDialog(this); @@ -437,17 +437,14 @@ public: float time = (float)( (now-m_timeOffset)/freq); ImGui::SetNextWindowPos( - ImVec2(m_width - m_width / 5.0f - 10.0f, 10.0f) + ImVec2(m_width - m_width / 5.0f - 10.0f, 10.0f) , ImGuiCond_FirstUseEver - ); + ); ImGui::SetNextWindowSize( - ImVec2(m_width / 5.0f, m_height / 3.0f) + ImVec2(m_width / 5.0f, m_height / 3.0f) , ImGuiCond_FirstUseEver - ); - ImGui::Begin("Settings" - , NULL - , 0 - ); + ); + ImGui::Begin("Settings", NULL, 0); ImGui::SliderInt("Num lights", &m_numLights, 1, 2048); ImGui::Checkbox("Show G-Buffer.", &m_showGBuffer); @@ -573,7 +570,7 @@ public: } // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/24-nbody/nbody.cpp b/examples/24-nbody/nbody.cpp index 0fb4565cf..c271074ee 100644 --- a/examples/24-nbody/nbody.cpp +++ b/examples/24-nbody/nbody.cpp @@ -368,7 +368,7 @@ public: bx::swap(m_prevPositionBuffer0, m_prevPositionBuffer1); // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/26-occlusion/occlusion.cpp b/examples/26-occlusion/occlusion.cpp index 794d2dcf5..782a97c5b 100644 --- a/examples/26-occlusion/occlusion.cpp +++ b/examples/26-occlusion/occlusion.cpp @@ -203,8 +203,9 @@ public: const float deltaTime = float(frameTime/freq); // Update camera. + cameraUpdate(deltaTime, m_state.m_mouse, ImGui::MouseOverArea() ); + float view[16]; - cameraUpdate(deltaTime, m_state.m_mouse); cameraGetViewMtx(view); // Set view and projection matrix for view 0. diff --git a/examples/27-terrain/terrain.cpp b/examples/27-terrain/terrain.cpp index dcf6fbae1..bcdaf16d7 100644 --- a/examples/27-terrain/terrain.cpp +++ b/examples/27-terrain/terrain.cpp @@ -432,11 +432,11 @@ ExampleTerrain(const char* _name, const char* _description, const char* _url) ImGui::End(); imguiEndFrame(); + // Update camera. + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); + if (!ImGui::MouseOverArea() ) { - // Update camera. - cameraUpdate(deltaTime, m_mouseState); - if (!!m_mouseState.m_buttons[entry::MouseButton::Left]) { mousePickTerrain(); diff --git a/examples/29-debugdraw/debugdraw.cpp b/examples/29-debugdraw/debugdraw.cpp index acab99223..ccb33862d 100644 --- a/examples/29-debugdraw/debugdraw.cpp +++ b/examples/29-debugdraw/debugdraw.cpp @@ -904,7 +904,7 @@ public: const float deltaTime = float(frameTime/freq); // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/31-rsm/reflectiveshadowmap.cpp b/examples/31-rsm/reflectiveshadowmap.cpp index ad1061fe7..8796503f8 100644 --- a/examples/31-rsm/reflectiveshadowmap.cpp +++ b/examples/31-rsm/reflectiveshadowmap.cpp @@ -451,7 +451,7 @@ public: const float deltaTime = float(frameTime/freq); // Update camera - cameraUpdate(deltaTime*0.15f, m_mouseState); + cameraUpdate(deltaTime*0.15f, m_mouseState, ImGui::MouseOverArea() ); // Set up matrices for gbuffer float view[16]; diff --git a/examples/32-particles/particles.cpp b/examples/32-particles/particles.cpp index 0a1eddb12..c06e60497 100644 --- a/examples/32-particles/particles.cpp +++ b/examples/32-particles/particles.cpp @@ -333,7 +333,7 @@ public: const double freq = double(bx::getHPFrequency() ); const float deltaTime = float(frameTime/freq); - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/36-sky/sky.cpp b/examples/36-sky/sky.cpp index aad7bc276..277f58d9a 100644 --- a/examples/36-sky/sky.cpp +++ b/examples/36-sky/sky.cpp @@ -565,11 +565,8 @@ namespace imguiEndFrame(); - if (!ImGui::MouseOverArea()) - { - // Update camera. - cameraUpdate(deltaTime, m_mouseState); - } + // Update camera. + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); // Set view 0 default viewport. bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(m_height)); diff --git a/examples/38-bloom/bloom.cpp b/examples/38-bloom/bloom.cpp index b52ed73e2..389b5174b 100644 --- a/examples/38-bloom/bloom.cpp +++ b/examples/38-bloom/bloom.cpp @@ -435,7 +435,7 @@ public: ImGui::End(); // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/39-assao/assao.cpp b/examples/39-assao/assao.cpp index 2282b0a81..2fc841a6f 100644 --- a/examples/39-assao/assao.cpp +++ b/examples/39-assao/assao.cpp @@ -471,7 +471,7 @@ namespace } // Update camera - cameraUpdate(deltaTime*0.15f, m_mouseState); + cameraUpdate(deltaTime*0.15f, m_mouseState, ImGui::MouseOverArea() ); // Set up matrices for gbuffer cameraGetViewMtx(m_view); diff --git a/examples/40-svt/svt.cpp b/examples/40-svt/svt.cpp index ab2978421..63be6ed74 100644 --- a/examples/40-svt/svt.cpp +++ b/examples/40-svt/svt.cpp @@ -261,7 +261,7 @@ public: ImGui::End(); // Update camera. - cameraUpdate(deltaTime, m_mouseState); + cameraUpdate(deltaTime, m_mouseState, ImGui::MouseOverArea() ); float view[16]; cameraGetViewMtx(view); diff --git a/examples/41-tess/tess.cpp b/examples/41-tess/tess.cpp index 52a49c502..ab764a5c0 100644 --- a/examples/41-tess/tess.cpp +++ b/examples/41-tess/tess.cpp @@ -511,11 +511,8 @@ namespace ImGui::End(); - if (!ImGui::MouseOverArea() ) - { - // Update camera. - cameraUpdate(deltaTime*0.01f, m_mouseState); - } + // Update camera. + cameraUpdate(deltaTime*0.01f, m_mouseState, ImGui::MouseOverArea() ); bgfx::touch(0); bgfx::touch(1); diff --git a/examples/common/camera.cpp b/examples/common/camera.cpp index 2cd5a38d3..122b5f52a 100644 --- a/examples/common/camera.cpp +++ b/examples/common/camera.cpp @@ -79,13 +79,14 @@ struct Camera { int32_t m_mx; int32_t m_my; + int32_t m_mz; }; Camera() { reset(); entry::MouseState mouseState; - update(0.0f, mouseState); + update(0.0f, mouseState, true); cmdAdd("move", cmdMove); inputAddBindings("camBindings", s_camBindings); @@ -100,8 +101,10 @@ struct Camera { m_mouseNow.m_mx = 0; m_mouseNow.m_my = 0; + m_mouseNow.m_mz = 0; m_mouseLast.m_mx = 0; m_mouseLast.m_my = 0; + m_mouseLast.m_mz = 0; m_eye.x = 0.0f; m_eye.y = 0.0f; m_eye.z = -35.0f; @@ -126,8 +129,19 @@ struct Camera m_keys |= _down ? _key : 0; } - void update(float _deltaTime, const entry::MouseState& _mouseState) + void update(float _deltaTime, const entry::MouseState& _mouseState, bool _reset) { + if (_reset) + { + m_mouseLast.m_mx = _mouseState.m_mx; + m_mouseLast.m_my = _mouseState.m_my; + m_mouseLast.m_mz = _mouseState.m_mz; + m_mouseNow = m_mouseLast; + m_mouseDown = false; + + return; + } + if (!m_mouseDown) { m_mouseLast.m_mx = _mouseState.m_mx; @@ -142,10 +156,15 @@ struct Camera m_mouseNow.m_my = _mouseState.m_my; } + m_mouseLast.m_mz = m_mouseNow.m_mz; + m_mouseNow.m_mz = _mouseState.m_mz; + + const int32_t deltaZ = float(m_mouseNow.m_mz - m_mouseLast.m_mz); + if (m_mouseDown) { - int32_t deltaX = m_mouseNow.m_mx - m_mouseLast.m_mx; - int32_t deltaY = m_mouseNow.m_my - m_mouseLast.m_my; + const int32_t deltaX = m_mouseNow.m_mx - m_mouseLast.m_mx; + const int32_t deltaY = m_mouseNow.m_my - m_mouseLast.m_my; m_horizontalAngle += m_mouseSpeed * float(deltaX); m_verticalAngle -= m_mouseSpeed * float(deltaY); @@ -174,63 +193,47 @@ struct Camera const bx::Vec3 right = { bx::sin(m_horizontalAngle - bx::kPiHalf), - 0, + 0.0f, bx::cos(m_horizontalAngle - bx::kPiHalf), }; const bx::Vec3 up = bx::cross(right, direction); + m_eye = bx::mad(direction, deltaZ * _deltaTime * m_moveSpeed, m_eye); + if (m_keys & CAMERA_KEY_FORWARD) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(direction, _deltaTime * m_moveSpeed); - - m_eye = bx::add(pos, tmp); + m_eye = bx::mad(direction, _deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_FORWARD, false); } if (m_keys & CAMERA_KEY_BACKWARD) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(direction, _deltaTime * m_moveSpeed); - - m_eye = bx::sub(pos, tmp); + m_eye = bx::mad(direction, -_deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_BACKWARD, false); } if (m_keys & CAMERA_KEY_LEFT) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(right, _deltaTime * m_moveSpeed); - - m_eye = bx::add(pos, tmp); + m_eye = bx::mad(right, _deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_LEFT, false); } if (m_keys & CAMERA_KEY_RIGHT) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(right, _deltaTime * m_moveSpeed); - - m_eye = bx::sub(pos, tmp); + m_eye = bx::mad(right, -_deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_RIGHT, false); } if (m_keys & CAMERA_KEY_UP) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(up, _deltaTime * m_moveSpeed); - - m_eye = bx::add(pos, tmp); + m_eye = bx::mad(up, _deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_UP, false); } if (m_keys & CAMERA_KEY_DOWN) { - const bx::Vec3 pos = m_eye; - const bx::Vec3 tmp = bx::mul(up, _deltaTime * m_moveSpeed); - - m_eye = bx::sub(pos, tmp); + m_eye = bx::mad(up, -_deltaTime * m_moveSpeed, m_eye); setKeyState(CAMERA_KEY_DOWN, false); } @@ -323,7 +326,7 @@ bx::Vec3 cameraGetAt() return s_camera->m_at; } -void cameraUpdate(float _deltaTime, const entry::MouseState& _mouseState) +void cameraUpdate(float _deltaTime, const entry::MouseState& _mouseState, bool _reset) { - s_camera->update(_deltaTime, _mouseState); + s_camera->update(_deltaTime, _mouseState, _reset); } diff --git a/examples/common/camera.h b/examples/common/camera.h index 451546448..5aa92326b 100644 --- a/examples/common/camera.h +++ b/examples/common/camera.h @@ -43,6 +43,6 @@ bx::Vec3 cameraGetPosition(); bx::Vec3 cameraGetAt(); /// -void cameraUpdate(float _deltaTime, const entry::MouseState& _mouseState); +void cameraUpdate(float _deltaTime, const entry::MouseState& _mouseState, bool _reset = false); #endif // CAMERA_H_HEADER_GUARD