1/****************************************************************************************
2
3 Copyright (C) 2015 Autodesk, Inc.
4 All rights reserved.
5
6 Use of this software is subject to the terms of the Autodesk license agreement
7 provided at the time of installation or download, or which otherwise accompanies
8 this software in either electronic or hard copy form.
9
10****************************************************************************************/
11
12//! \file fbxmanipulators.h
13#ifndef _FBXSDK_UTILS_MANIPULATORS_H_
14#define _FBXSDK_UTILS_MANIPULATORS_H_
15
16#include <fbxsdk/fbxsdk_def.h>
17
18#include <fbxsdk/core/fbxobject.h>
19#include <fbxsdk/core/math/fbxvector2.h>
20#include <fbxsdk/core/math/fbxvector4.h>
21#include <fbxsdk/scene/geometry/fbxcamera.h>
22
23#include <fbxsdk/fbxsdk_nsbegin.h>
24
25class FbxCameraManipulationState;
26
27/** This class can be used to provide basic camera manipulation in any program using this library.
28 * \nosubgrouping
29 */
30class FBXSDK_DLL FbxCameraManipulator : public FbxObject
31{
32 FBXSDK_OBJECT_DECLARE(FbxCameraManipulator, FbxObject);
33
34public:
35 //! All possible manipulation actions that can be performed on a camera using this manipulator.
36 enum EAction
37 {
38 eNone, //!< No action.
39 eOrbit, //!< Orbiting camera around LootAt/Interest position.
40 eDolly, //!< Moving camera closer or away from its LookAt/Intest position.
41 ePan, //!< Panning camera up, down and sideways.
42 eFreePan //!< Panning and dollying all at once.
43 };
44
45 /** Begin manipulation of the camera.
46 * \param pAction The action performed for this manipulation scope.
47 * \param pX Begin horizontal position of the manipulation, in pixels.
48 * \param pY Begin vertical position of the manipulation, in pixels. */
49 void Begin(EAction pAction, float pX, float pY);
50
51 /** Notify manipulation of latest input.
52 * \param pTimeDelta Elapsed time since the last notify. Only used if Smoothing is enabled.
53 * \param pX Horizontal position of the manipulation, in pixels.
54 * \param pY Vertical position of the manipulation, in pixels.
55 * \param pScale Scaling value of the manipulation. Only used by eFreePan action. */
56 void Notify(float pX, float pY, float pScale=0);
57
58 //! End current manipulation.
59 void End();
60
61 /** Update the camera position. This must be called periodically in order for the camera to update its position.
62 * \param pTimeDelta Elapsed time since the last update. If Smooth is disabled, you can leave this value to zero.
63 * \remark Begin, Notify and End will not change the current camera position. */
64 void Update(const FbxTime& pTimeDelta=FBXSDK_TIME_ZERO);
65
66 /** Do a complete manipulation action in a single operation. This is the equivalent of calling Begin, Notify and End successively.
67 * \param pAction The action performed for this manipulation scope.
68 * \param pX Horizontal position of the manipulation, in pixels.
69 * \param pY Vertical position of the manipulation, in pixels.
70 * \param pScale Scaling value of the manipulation. Only used by eFreePan action. */
71 void Action(EAction pAction, float pX, float pY, float pScale=0);
72
73 /** Retrieve current manipulation action.
74 * \return The action currently performed by the camera manipulator. */
75 EAction GetCurrentAction() const;
76
77 /** Change camera position and LookAt node to frame all objects.
78 * \param pTime Time to use to evaluate mesh deformations. Leave at default value to cancel mesh evaluation. */
79 void FrameAll(const FbxTime& pTime=FBXSDK_TIME_INFINITE);
80
81 /** Change camera position and LookAt to frame all selected objects.
82 * \param pTime Time to use to evaluate mesh deformations. Leave at default value to cancel mesh evaluation. */
83 void FrameSelected(const FbxTime& pTime=FBXSDK_TIME_INFINITE);
84
85 /** Change camera position and LookAt to frame the selected position on screen. The LookAt will be placed
86 * at first closest intersecting geometry, and the distance between camera and LookAt will be preserved.
87 * \param pX The horizontal screen coordinate.
88 * \param pY The vertical screen coordinate.
89 * \param pCulling If \c true, only test triangles that are front-facing, otherwise test both sides.
90 * \param pTime Time to use to evaluate mesh deformations. Leave at default value to cancel mesh evaluation. */
91 void FrameScreenPosition(float pX, float pY, bool pCulling=false, const FbxTime& pTime=FBXSDK_TIME_INFINITE);
92
93 /** The camera controlled by the manipulator. */
94 FbxPropertyT<FbxReference> Camera;
95
96 /** Width of the camera viewport, in pixels. This is used to accurately calculate to movement speed.
97 * \remark If this property is not correctly set, movements will be erronous. */
98 FbxPropertyT<FbxFloat> ViewportWidth;
99
100 /** Height of the camera viewport, in pixels. This is used to accurately calculate to movement speed.
101 * \remark If this property is not correctly set, movements will be erronous. */
102 FbxPropertyT<FbxFloat> ViewportHeight;
103
104 /** Camera manipulations will be smooth if enabled. True by default. */
105 FbxPropertyT<FbxBool> Smooth;
106
107 /** Camera manipulations smoothing speed. Higher speed will stabilize the camera more quickly. Default is 10.0 */
108 FbxPropertyT<FbxDouble> SmoothSpeed;
109
110 /** Invert the camera horizontal manipulation direction if set to true. False by default. */
111 FbxPropertyT<FbxBool> InvertX;
112
113 /** Invert the camera vertical manipulation direction if set to true. False by default. */
114 FbxPropertyT<FbxBool> InvertY;
115
116 /** Restore the camera transform upon destruction of the manipulator. */
117 FbxPropertyT<FbxBool> Restore;
118
119/*****************************************************************************************************************************
120** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
121*****************************************************************************************************************************/
122#ifndef DOXYGEN_SHOULD_SKIP_THIS
123protected:
124 virtual void Construct(const FbxObject* pFrom);
125 virtual void Destruct(bool pRecursive);
126 virtual void ConstructProperties(bool pForceSet);
127 virtual bool ConnectNotify(const FbxConnectEvent& pEvent);
128 virtual bool PropertyNotify(EPropertyNotifyType pType, FbxProperty& pProperty);
129
130private:
131 void Reset();
132 FbxCamera* GetCamera() const;
133 FbxNode* GetCameraNode() const;
134 FbxNode* GetCameraLookAtNode() const;
135 FbxNode* GetCameraTargetUpNode() const;
136 FbxVector4 GetCameraPosition() const;
137 void SetCameraPosition(const FbxVector4& pPosition);
138 FbxVector4 GetCameraRotation() const;
139 void SetCameraRotation(const FbxVector4& pRotation);
140 FbxVector4 GetCameraLookAtPosition() const;
141 void SetCameraLookAtPosition(const FbxVector4& pPosition);
142 FbxVector4 GetCameraTargetUpPosition() const;
143 void SetCameraTargetUpPosition(const FbxVector4& pPosition);
144 FbxAMatrix GetCameraRotationMatrix() const;
145 void SetCameraRotationMatrix(const FbxAMatrix& pRM);
146
147 double ComputeRotationAxis(FbxVector4& pFront, FbxVector4& pUp, FbxVector4& pRight, const FbxVector4& pEye, const FbxVector4& pLookAt, const FbxVector4& pUpVector) const;
148 void ComputeRotationMatrix(FbxAMatrix& pRM, const FbxVector4& pEye, const FbxVector4& pLookAt, const FbxVector4& pUpVector);
149 void UpdateCameraRotation();
150
151 bool FrameObjects(bool pSelected, const FbxTime& pTime);
152 FbxVector4 ComputePositionToFitBBoxInFrustum(const FbxVector4& pBBoxMin, const FbxVector4& pBBoxMax, const FbxVector4& pBBoxCenter, const FbxVector4& pCameraPosition, const FbxAMatrix& pCameraRM, const FbxTime& pTime);
153
154 EAction mCurrentAction;
155 FbxFloat mBeginMouse[3], mLastMouse[3];
156 FbxVector4 mBeginPosition, mBeginAxis[3];
157 FbxBool mBeginFlipped;
158
159 FbxDouble mDestOrthoZoom;
160 FbxVector4 mDestPosition, mDestLookAt, mDestTargetUp;
161 FbxAMatrix mDestRotation;
162
163 FbxVector4 mInitialPosition, mInitialRotation, mInitialLookAt;
164#endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
165};
166
167#include <fbxsdk/fbxsdk_nsend.h>
168
169#endif /* _FBXSDK_UTILS_MANIPULATORS_H_ */
170