1
0

Merging r6140 through r6144 from trunk to ogl-es branch.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/branches/ogl-es@6145 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien
2020-11-02 22:26:23 +00:00
parent 8b9947f9f6
commit 8557a1f7e6
8 changed files with 74 additions and 21 deletions

View File

@@ -9,7 +9,6 @@
#include "ICursorControl.h"
#include "ICameraSceneNode.h"
#include "ISceneNodeAnimatorCollisionResponse.h"
#include "os.h"
namespace irr
{
@@ -20,11 +19,21 @@ namespace scene
CSceneNodeAnimatorCameraFPS::CSceneNodeAnimatorCameraFPS(gui::ICursorControl* cursorControl,
f32 rotateSpeed, f32 moveSpeed, f32 jumpSpeed,
SKeyMap* keyMapArray, u32 keyMapSize, bool noVerticalMovement, bool invertY, float rotateSpeedKeyboard)
: CursorControl(cursorControl), MaxVerticalAngle(88.0f), NoVerticalMovement(noVerticalMovement),
MoveSpeed(moveSpeed), RotateSpeedKeyboard(rotateSpeedKeyboard), RotateSpeed(rotateSpeed),
: CursorControl(cursorControl),
// On X11 we get events even when mouse is not inside the Irrlicht window, on Windows we don't.
// It might be possible to add grabbing on Windows as well in which case this has to be somewhat changed.
// TODO: I don't know about OSX, but in theory it should be like old Irrlicht 1.8 behavior whatever that was there.
#ifdef _IRR_COMPILE_WITH_X11_DEVICE_
GrabMouse(false),
#else
GrabMouse(true),
#endif
MaxVerticalAngle(88.0f), NoVerticalMovement(noVerticalMovement),
MoveSpeed(moveSpeed),
RotateSpeedKeyboard(rotateSpeedKeyboard), RotateSpeed(rotateSpeed),
JumpSpeed(jumpSpeed),
MouseYDirection(invertY ? -1.0f : 1.0f),
LastAnimationTime(0), firstUpdate(true), firstInput(true)
LastAnimationTime(0), HadMouseEvent(false), firstUpdate(true), firstInput(true)
{
#ifdef _DEBUG
setDebugName("CCameraSceneNodeAnimatorFPS");
@@ -80,6 +89,9 @@ bool CSceneNodeAnimatorCameraFPS::OnEvent(const SEvent& evt)
}
}
break;
case EET_MOUSE_INPUT_EVENT:
HadMouseEvent = true;
return true;
case EET_MOUSE_INPUT_EVENT:
if ( evt.MouseInput.Event == EMIE_MOUSE_ENTER_CANVAS && CursorControl)
@@ -103,8 +115,6 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
if (!node || node->getType() != ESNT_CAMERA)
return;
timeMs = os::Timer::getRealTime(); // User input is always in real-time
ICameraSceneNode* camera = static_cast<ICameraSceneNode*>(node);
if (firstUpdate)
@@ -138,9 +148,6 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
if(smgr && smgr->getActiveCamera() != camera)
return;
if ( CursorControl )
CursorPos = CursorControl->getRelativePosition();
// get time
f32 timeDiff = (f32) ( timeMs - LastAnimationTime );
LastAnimationTime = timeMs;
@@ -153,6 +160,9 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
{
bool reset = false;
if ( HadMouseEvent || GrabMouse)
CursorPos = CursorControl->getRelativePosition();
if (CursorPos != CenterCursor)
{
relativeRotation.Y -= (CenterCursor.X - CursorPos.X) * RotateSpeed;
@@ -161,12 +171,8 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
reset = true;
}
if ( !reset )
if ( GrabMouse && !reset)
{
// TODO: not sure if this case is still needed. Might be it was only something
// that was necessary when someone tried to use mouse-events in the past.
// But not too expensive, test on all platforms before removing.
// Special case, mouse is whipped outside of window before it can update.
video::IVideoDriver* driver = smgr->getVideoDriver();
core::vector2d<u32> mousepos(u32(CursorPos.X), u32(CursorPos.Y));
@@ -183,6 +189,7 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
CursorPos = CenterCursor;
}
}
HadMouseEvent = false;
// keyboard rotation
if (CursorKeys[EKA_ROTATE_LEFT])