diff --git a/include/ICameraSceneNode.h b/include/ICameraSceneNode.h index feb3cefc..101c756f 100644 --- a/include/ICameraSceneNode.h +++ b/include/ICameraSceneNode.h @@ -121,19 +121,23 @@ namespace scene virtual f32 getFOV() const =0; //! Sets the value of the near clipping plane. (default: 1.0f) - /** \param zn: New z near value. */ + /** Also changes projection matrix and resets IsOrthogonal flag. + \param zn: New z near value. */ virtual void setNearValue(f32 zn) =0; //! Sets the value of the far clipping plane (default: 2000.0f) - /** \param zf: New z far value. */ + /** Also changes projection matrix and resets IsOrthogonal flag. + \param zf: New z far value. */ virtual void setFarValue(f32 zf) =0; //! Sets the aspect ratio (default: 4.0f / 3.0f) - /** \param aspect: New aspect ratio. */ + /** Also changes projection matrix and resets IsOrthogonal flag. + \param aspect: New aspect ratio. */ virtual void setAspectRatio(f32 aspect) =0; //! Sets the field of view (Default: PI / 2.5f) - /** \param fovy: New field of view in radians. */ + /** Also changes projection matrix and resets IsOrthogonal flag. + \param fovy: New field of view in radians. */ virtual void setFOV(f32 fovy) =0; //! Get the view frustum. @@ -165,7 +169,10 @@ namespace scene @see getTargetAndRotationBinding() */ virtual void bindTargetAndRotation(bool bound) =0; - //! Updates the matrices without uploading them to the driver + //! Updates the view matrix and frustum without uploading the matrix to the driver. + /** You need this when you want an up-to-date camera view matrix & frustum before the render() call. + Usually you should call updateAbsolutePosition() before calling this. + Despite it's function name, the projection matrix is not touched. */ virtual void updateMatrices() = 0; //! Queries if the camera scene node's rotation and its target position are bound together. diff --git a/source/Irrlicht/CCameraSceneNode.cpp b/source/Irrlicht/CCameraSceneNode.cpp index 600a1c5c..3c97ee55 100644 --- a/source/Irrlicht/CCameraSceneNode.cpp +++ b/source/Irrlicht/CCameraSceneNode.cpp @@ -252,6 +252,7 @@ void CCameraSceneNode::OnRegisterSceneNode() //! render void CCameraSceneNode::render() { + updateAbsolutePosition(); // depending on that call in onAnimate is risky (might not be in SceneManager or it or it's parent might be invisible and still should render) updateMatrices(); video::IVideoDriver* driver = SceneManager->getVideoDriver(); diff --git a/source/Irrlicht/CSceneNodeAnimatorCameraFPS.cpp b/source/Irrlicht/CSceneNodeAnimatorCameraFPS.cpp index ce18bfdf..8d9d4afe 100644 --- a/source/Irrlicht/CSceneNodeAnimatorCameraFPS.cpp +++ b/source/Irrlicht/CSceneNodeAnimatorCameraFPS.cpp @@ -110,7 +110,6 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs) if (firstUpdate) { - camera->updateAbsolutePosition(); if (CursorControl ) { CursorControl->setPosition(0.5f, 0.5f); @@ -144,6 +143,7 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs) LastAnimationTime = timeMs; // Update rotation + camera->updateAbsolutePosition(); core::vector3df target = (camera->getTarget() - camera->getAbsolutePosition()); core::vector3df relativeRotation = target.getHorizontalAngle();