summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bgfx/examples/common/camera.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/bgfx/examples/common/camera.cpp')
-rw-r--r--3rdparty/bgfx/examples/common/camera.cpp65
1 files changed, 34 insertions, 31 deletions
diff --git a/3rdparty/bgfx/examples/common/camera.cpp b/3rdparty/bgfx/examples/common/camera.cpp
index 2cd5a38d369..3c154aac128 100644
--- a/3rdparty/bgfx/examples/common/camera.cpp
+++ b/3rdparty/bgfx/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 float 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);
}