175 lines
5.3 KiB
C++
175 lines
5.3 KiB
C++
#ifndef CGIZMO_H
|
|
#define CGIZMO_H
|
|
|
|
#include <Common/Flags.h>
|
|
#include <Math/CPlane.h>
|
|
#include <Math/CQuaternion.h>
|
|
#include <Math/CVector3f.h>
|
|
#include <Math/ETransformSpace.h>
|
|
#include <Core/Render/CCamera.h>
|
|
#include <Core/Render/IRenderable.h>
|
|
#include <Core/Resource/Model/CModel.h>
|
|
#include <Core/Resource/TResPtr.h>
|
|
|
|
#define CGIZMO_TRANSLATE_X 0
|
|
#define CGIZMO_TRANSLATE_Y 1
|
|
#define CGIZMO_TRANSLATE_Z 2
|
|
#define CGIZMO_TRANSLATE_LINES_XY 3
|
|
#define CGIZMO_TRANSLATE_LINES_XZ 4
|
|
#define CGIZMO_TRANSLATE_LINES_YZ 5
|
|
#define CGIZMO_TRANSLATE_POLY_XY 6
|
|
#define CGIZMO_TRANSLATE_POLY_XZ 7
|
|
#define CGIZMO_TRANSLATE_POLY_YZ 8
|
|
#define CGIZMO_TRANSLATE_NUM 9
|
|
#define CGIZMO_ROTATE_OUTLINE 0
|
|
#define CGIZMO_ROTATE_X 1
|
|
#define CGIZMO_ROTATE_Y 2
|
|
#define CGIZMO_ROTATE_Z 3
|
|
#define CGIZMO_ROTATE_XYZ 4
|
|
#define CGIZMO_ROTATE_NUM 5
|
|
#define CGIZMO_SCALE_X 0
|
|
#define CGIZMO_SCALE_Y 1
|
|
#define CGIZMO_SCALE_Z 2
|
|
#define CGIZMO_SCALE_LINES_XY 3
|
|
#define CGIZMO_SCALE_LINES_XZ 4
|
|
#define CGIZMO_SCALE_LINES_YZ 5
|
|
#define CGIZMO_SCALE_POLY_XY 6
|
|
#define CGIZMO_SCALE_POLY_XZ 7
|
|
#define CGIZMO_SCALE_POLY_YZ 8
|
|
#define CGIZMO_SCALE_XYZ 9
|
|
#define CGIZMO_SCALE_NUM 10
|
|
|
|
class CGizmo : public IRenderable
|
|
{
|
|
public:
|
|
enum EGizmoMode
|
|
{
|
|
eTranslate, eRotate, eScale, eOff
|
|
};
|
|
|
|
enum EGizmoAxis
|
|
{
|
|
eNone = 0x0,
|
|
eX = 0x1,
|
|
eY = 0x2,
|
|
eZ = 0x4,
|
|
eXY = eX | eY,
|
|
eXZ = eX | eZ,
|
|
eYZ = eY | eZ,
|
|
eXYZ = eX | eY | eZ
|
|
};
|
|
DECLARE_FLAGS(EGizmoAxis, FGizmoAxes)
|
|
|
|
private:
|
|
EGizmoMode mMode;
|
|
FGizmoAxes mSelectedAxes;
|
|
ETransformSpace mTransformSpace;
|
|
CQuaternion mBillboardRotation;
|
|
float mGizmoSize;
|
|
float mCameraDist;
|
|
bool mIsTransforming;
|
|
bool mHasTransformed;
|
|
CVector2f mWrapOffset;
|
|
bool mEnableCursorWrap;
|
|
|
|
// Transform
|
|
CTransform4f mTransform;
|
|
CTransform4f mBillboardTransform;
|
|
CTransform4f mScaledTransform;
|
|
CVector3f mPosition;
|
|
CQuaternion mRotation;
|
|
CQuaternion mLocalRotation;
|
|
CVector3f mScale;
|
|
bool mFlipScaleX;
|
|
bool mFlipScaleY;
|
|
bool mFlipScaleZ;
|
|
|
|
// Delta transform
|
|
CVector3f mDeltaTranslation;
|
|
CVector3f mTotalTranslation;
|
|
CQuaternion mDeltaRotation;
|
|
CQuaternion mCurrentRotation;
|
|
CVector3f mTotalRotation; // This is a CVector3f because this value displays on the UI and a quat would cause rollover
|
|
CVector3f mDeltaScale;
|
|
CVector3f mTotalScale;
|
|
|
|
// Transform helpers
|
|
CPlane mTranslatePlane;
|
|
CVector3f mTranslateOffset;
|
|
float mRotateOffset;
|
|
float mScaleOffset;
|
|
bool mSetOffset;
|
|
CVector3f mHitPoint;
|
|
CVector3f mMoveDir;
|
|
|
|
// Model parts
|
|
struct SModelPart
|
|
{
|
|
FGizmoAxes ModelAxes;
|
|
bool EnableRayCast;
|
|
bool IsBillboard;
|
|
TResPtr<CModel> pModel;
|
|
|
|
SModelPart() {}
|
|
SModelPart(FGizmoAxes Axes, bool RayCastOn, bool Billboard, TResPtr<CModel> _pModel) :
|
|
ModelAxes(Axes), EnableRayCast(RayCastOn), IsBillboard(Billboard), pModel(_pModel) {}
|
|
};
|
|
SModelPart *mpCurrentParts;
|
|
u32 mNumCurrentParts;
|
|
|
|
// Static
|
|
static bool smModelsLoaded;
|
|
static SModelPart smTranslateModels[CGIZMO_TRANSLATE_NUM];
|
|
static SModelPart smRotateModels[CGIZMO_ROTATE_NUM];
|
|
static SModelPart smScaleModels[CGIZMO_SCALE_NUM];
|
|
|
|
public:
|
|
CGizmo();
|
|
~CGizmo();
|
|
|
|
void AddToRenderer(CRenderer *pRenderer, const SViewInfo& rkViewInfo);
|
|
void Draw(FRenderOptions Options, int ComponentIndex, ERenderCommand Command, const SViewInfo& rkViewInfo);
|
|
|
|
void IncrementSize();
|
|
void DecrementSize();
|
|
void UpdateForCamera(const CCamera& rkCamera);
|
|
bool CheckSelectedAxes(const CRay& rkRay);
|
|
u32 NumSelectedAxes();
|
|
void ResetSelectedAxes();
|
|
void StartTransform();
|
|
bool TransformFromInput(const CRay& rkRay, CCamera& rkCamera);
|
|
void EndTransform();
|
|
|
|
// Accessors
|
|
inline EGizmoMode Mode() const { return mMode; }
|
|
inline ETransformSpace TransformSpace() const { return mTransformSpace; }
|
|
inline CVector3f Position() const { return mPosition; }
|
|
inline CVector3f DeltaTranslation() const { return mDeltaTranslation; }
|
|
inline CVector3f TotalTranslation() const { return mTotalTranslation; }
|
|
inline CQuaternion Rotation() const { return mRotation; }
|
|
inline CQuaternion DeltaRotation() const { return mDeltaRotation; }
|
|
inline CVector3f TotalRotation() const { return mTotalRotation; }
|
|
inline CVector3f Scale() const { return mScale; }
|
|
inline CVector3f DeltaScale() const { return mDeltaScale; }
|
|
inline CVector3f TotalScale() const { return mTotalScale; }
|
|
inline bool IsTransforming() const { return mIsTransforming; }
|
|
inline bool HasTransformed() const { return mHasTransformed; }
|
|
|
|
inline void SetPosition(const CVector3f& rkPosition) { mPosition = rkPosition; }
|
|
inline void EnableCursorWrap(bool Enable) { mEnableCursorWrap = Enable; }
|
|
void SetMode(EGizmoMode mode);
|
|
void SetTransformSpace(ETransformSpace Space);
|
|
void SetLocalRotation(const CQuaternion& rkOrientation);
|
|
|
|
// Protected
|
|
protected:
|
|
void UpdateTransform();
|
|
void WrapCursor();
|
|
|
|
// Private Static
|
|
private:
|
|
static void LoadModels();
|
|
};
|
|
|
|
#endif // CGIZMO_H
|