2019-12-12 17:32:41 +01:00
|
|
|
// Copyright (C) 2002-2012 Nikolaus Gebhardt
|
|
|
|
// This file is part of the "Irrlicht Engine".
|
|
|
|
// For conditions of distribution and use, see copyright notice in irrlicht.h
|
|
|
|
|
|
|
|
#ifndef __C_CAMERA_SCENE_NODE_H_INCLUDED__
|
|
|
|
#define __C_CAMERA_SCENE_NODE_H_INCLUDED__
|
|
|
|
|
|
|
|
#include "ICameraSceneNode.h"
|
|
|
|
#include "SViewFrustum.h"
|
|
|
|
|
|
|
|
namespace irr
|
|
|
|
{
|
|
|
|
namespace scene
|
|
|
|
{
|
|
|
|
|
|
|
|
class CCameraSceneNode : public ICameraSceneNode
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
//! constructor
|
|
|
|
CCameraSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id,
|
|
|
|
const core::vector3df& position = core::vector3df(0,0,0),
|
|
|
|
const core::vector3df& lookat = core::vector3df(0,0,100));
|
|
|
|
|
|
|
|
//! Sets the projection matrix of the camera.
|
|
|
|
/** The core::matrix4 class has some methods
|
|
|
|
to build a projection matrix. e.g: core::matrix4::buildProjectionMatrixPerspectiveFovLH.
|
|
|
|
Note that the matrix will only stay as set by this method until one of
|
|
|
|
the following Methods are called: setNearValue, setFarValue, setAspectRatio, setFOV.
|
|
|
|
\param projection The new projection matrix of the camera.
|
|
|
|
\param isOrthogonal Set this to true if the matrix is an orthogonal one (e.g.
|
|
|
|
from matrix4::buildProjectionMatrixOrthoLH(). */
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setProjectionMatrix(const core::matrix4& projection, bool isOrthogonal = false) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the current projection matrix of the camera
|
|
|
|
//! \return Returns the current projection matrix of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::matrix4& getProjectionMatrix() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the current view matrix of the camera
|
|
|
|
//! \return Returns the current view matrix of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::matrix4& getViewMatrix() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets a custom view matrix affector.
|
|
|
|
/** \param affector: The affector matrix. */
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setViewMatrixAffector(const core::matrix4& affector) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the custom view matrix affector.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::matrix4& getViewMatrixAffector() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! It is possible to send mouse and key events to the camera. Most cameras
|
|
|
|
//! may ignore this input, but camera scene nodes which are created for
|
|
|
|
//! example with scene::ISceneManager::addMayaCameraSceneNode or
|
|
|
|
//! scene::ISceneManager::addMeshViewerCameraSceneNode, may want to get this input
|
|
|
|
//! for changing their position, look at target or whatever.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual bool OnEvent(const SEvent& event) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the look at target of the camera
|
|
|
|
/** If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
|
|
|
then calling this will also change the camera's scene node rotation to match the target.
|
|
|
|
\param pos: Look at target of the camera. */
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setTarget(const core::vector3df& pos) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the rotation of the node.
|
|
|
|
/** This only modifies the relative rotation of the node.
|
|
|
|
If the camera's target and rotation are bound ( @see bindTargetAndRotation() )
|
|
|
|
then calling this will also change the camera's target to match the rotation.
|
|
|
|
\param rotation New rotation of the node in degrees. */
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setRotation(const core::vector3df& rotation) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the current look at target of the camera
|
|
|
|
/** \return The current look at target of the camera */
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::vector3df& getTarget() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the up vector of the camera.
|
|
|
|
//! \param pos: New upvector of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setUpVector(const core::vector3df& pos) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the up vector of the camera.
|
|
|
|
//! \return Returns the up vector of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::vector3df& getUpVector() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets distance from the camera to the near plane.
|
|
|
|
//! \return Value of the near plane of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual f32 getNearValue() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the distance from the camera to the far plane.
|
|
|
|
//! \return Value of the far plane of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual f32 getFarValue() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Get the aspect ratio of the camera.
|
|
|
|
//! \return The aspect ratio of the camera.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual f32 getAspectRatio() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Gets the field of view of the camera.
|
|
|
|
//! \return Field of view of the camera
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual f32 getFOV() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the value of the near clipping plane. (default: 1.0f)
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setNearValue(f32 zn) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the value of the far clipping plane (default: 2000.0f)
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setFarValue(f32 zf) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the aspect ratio (default: 4.0f / 3.0f)
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setAspectRatio(f32 aspect) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Sets the field of view (Default: PI / 3.5f)
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setFOV(f32 fovy) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! PreRender event
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void OnRegisterSceneNode() IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Render
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void render() IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Update
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void updateMatrices() IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Returns the axis aligned bounding box of this node
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const core::aabbox3d<f32>& getBoundingBox() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Returns the view area.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual const SViewFrustum* getViewFrustum() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Disables or enables the camera to get key or mouse inputs.
|
|
|
|
//! If this is set to true, the camera will respond to key inputs
|
|
|
|
//! otherwise not.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void setInputReceiverEnabled(bool enabled) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Returns if the input receiver of the camera is currently enabled.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual bool isInputReceiverEnabled() const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Writes attributes of the scene node.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Reads attributes of the scene node.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Returns type of the scene node
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual ESCENE_NODE_TYPE getType() const IRR_OVERRIDE { return ESNT_CAMERA; }
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Binds the camera scene node's rotation to its target position and vice versa, or unbinds them.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual void bindTargetAndRotation(bool bound) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Queries if the camera scene node's rotation and its target position are bound together.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual bool getTargetAndRotationBinding(void) const IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
//! Creates a clone of this scene node and its children.
|
2021-08-27 14:55:10 +02:00
|
|
|
virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0) IRR_OVERRIDE;
|
2019-12-12 17:32:41 +01:00
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
|
|
void recalculateProjectionMatrix();
|
|
|
|
void recalculateViewArea();
|
|
|
|
|
|
|
|
core::aabbox3d<f32> BoundingBox;
|
|
|
|
|
|
|
|
core::vector3df Target;
|
|
|
|
core::vector3df UpVector;
|
|
|
|
|
|
|
|
f32 Fovy; // Field of view, in radians.
|
|
|
|
f32 Aspect; // Aspect ratio.
|
|
|
|
f32 ZNear; // value of the near view-plane.
|
|
|
|
f32 ZFar; // Z-value of the far view-plane.
|
|
|
|
|
|
|
|
SViewFrustum ViewArea;
|
|
|
|
core::matrix4 Affector;
|
|
|
|
|
|
|
|
bool InputReceiverEnabled;
|
|
|
|
bool TargetAndRotationAreBound;
|
|
|
|
|
|
|
|
bool HasD3DStyleProjectionMatrix; // true: projection from 0 to w; false: -w to w
|
|
|
|
};
|
|
|
|
|
|
|
|
} // end namespace
|
|
|
|
} // end namespace
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|