ULRE/inc/hgl/graph/SceneOrient.h

178 lines
7.1 KiB
C
Raw Normal View History

2019-05-21 21:28:33 +08:00
#ifndef HGL_GRAPH_SCENE_ORIENT_INCLUDE
#define HGL_GRAPH_SCENE_ORIENT_INCLUDE
#include<hgl/graph/VK.h>
2024-08-25 04:03:57 +08:00
#include<hgl/math/Transform.h>
2019-05-21 21:28:33 +08:00
namespace hgl
{
namespace graph
{
2024-08-31 00:04:20 +08:00
/**
* <br>
*
* 3D空间中的位置<br>
* :<br>
* <ul>
* <li>LocalMatrix </li>
* <li>LocalToWorldMatrix 使</li>
*
* <li>transform_manager 0</li>
* </ul>
*
* LocalToWorldMatrix=ParnetMatrix * LocalMatrix * TraansformMatrix<br>
*/
class SceneMatrix :public VersionData<Matrix4f>
2019-05-21 21:28:33 +08:00
{
protected:
2024-08-25 04:03:57 +08:00
Matrix4f parent_matrix;
2024-08-25 04:03:57 +08:00
Matrix4f local_matrix;
2024-08-24 03:08:14 +08:00
TransformManager transform_manager;
Matrix4f transform_matrix;
2024-08-31 00:04:20 +08:00
Vector3f OriginWorldPosition; //原始世界坐标
Vector3f FinalWorldPosition; //最终世界坐标
protected:
2024-08-25 04:03:57 +08:00
Matrix4f inverse_local_to_world_matrix; ///<世界到本地矩阵
Matrix4f inverse_transpose_local_to_world_matrix; ///<世界到本地矩阵的转置矩阵
2019-05-21 21:28:33 +08:00
void MakeNewestData(Matrix4f &local_to_world_matrix) override ///<生成最新的数据(需要派生类重载)
{
2024-08-31 00:04:20 +08:00
local_to_world_matrix=parent_matrix*local_matrix;
OriginWorldPosition=TransformPosition(local_to_world_matrix,ZeroVector3f);
2024-08-31 00:04:20 +08:00
if(transform_manager.IsEmpty())
{
FinalWorldPosition=OriginWorldPosition;
}
else
{
transform_manager.GetMatrix(transform_matrix,OriginWorldPosition);
local_to_world_matrix*=transform_matrix;
FinalWorldPosition=TransformPosition(local_to_world_matrix,ZeroVector3f);
}
inverse_local_to_world_matrix =inverse(local_to_world_matrix);
inverse_transpose_local_to_world_matrix=transpose(inverse_local_to_world_matrix);
}
public:
void Clear()
{
parent_matrix=Identity4f;
local_matrix=Identity4f;
transform_matrix=Identity4f;
UpdateVersion();
}
const Matrix4f &GetLocalMatrix()const{return local_matrix;} ///<取得本地矩阵
const Matrix4f &GetLocalToWorldMatrix(){return GetNewestVersionData();} ///<取得本地到世界矩阵
const Matrix4f &GetInverseLocalToWorldMatrix(){UpdateNewestData();return inverse_local_to_world_matrix;} ///<取得世界到本地矩阵
const Matrix4f &GetInverseTransposeLocalToWorldMatrix() ///<取得世界到本地矩阵的转置矩阵
{
UpdateNewestData();
return inverse_transpose_local_to_world_matrix;
}
2019-05-21 21:28:33 +08:00
2024-08-31 00:04:20 +08:00
TransformManager &GetTransform(){return transform_manager;} ///<取得变换管理器
const Vector3f &GetWorldPosition()const{return FinalWorldPosition;} ///<取得世界坐标
2019-05-21 21:28:33 +08:00
public:
SceneMatrix():VersionData(Identity4f)
{
Clear();
}
SceneMatrix(SceneMatrix &so):VersionData(so.GetLocalToWorldMatrix())
{
parent_matrix=so.parent_matrix;
local_matrix=so.local_matrix;
transform_manager=so.transform_manager;
transform_matrix=so.transform_matrix;
inverse_local_to_world_matrix=so.inverse_local_to_world_matrix;
inverse_transpose_local_to_world_matrix=so.inverse_transpose_local_to_world_matrix;
UpdateVersion();
}
SceneMatrix(const Matrix4f &mat):VersionData(Identity4f)
{
SetLocalMatrix(mat);
UpdateVersion();
}
void SetLocalMatrix(const Matrix4f &mat)
{
//if (IsNearlyEqual(local_matrix,mat))
if(!hgl_cmp(local_matrix,mat))
return;
local_matrix=mat;
UpdateVersion();
}
void SetParentMatrix(const Matrix4f &pm)
{
//if (IsNearlyEqual(parent_matrix,pm))
if(!hgl_cmp(parent_matrix,pm))
return;
parent_matrix=pm;
UpdateVersion();
}
};//class SceneMatrix
/**
* <br>
*/
class SceneOrient ///场景定位类
{
protected:
SceneMatrix scene_matrix;
public:
SceneOrient()=default;
2024-07-31 00:11:04 +08:00
SceneOrient(const SceneOrient &);
2024-08-24 03:08:14 +08:00
SceneOrient(const Matrix4f &);
2019-05-21 21:28:33 +08:00
virtual ~SceneOrient()=default;
virtual void Clear()
{
scene_matrix.Clear();
}
void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵
void SetParentMatrix (const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵
public:
2024-08-31 00:04:20 +08:00
const uint32 GetLocalToWorldMatrixVersion()const {return scene_matrix.GetNewestVersion();} ///<取得版本号
2024-08-25 04:03:57 +08:00
2024-08-31 00:04:20 +08:00
const Vector3f & GetWorldPosition() const {return scene_matrix.GetWorldPosition();} ///<取得世界坐标
const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵
TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器
2019-05-21 21:28:33 +08:00
const Matrix4f & GetLocalToWorldMatrix () {return scene_matrix.GetLocalToWorldMatrix();} ///<取得本地到世界矩阵
const Matrix4f & GetInverseLocalToWorldMatrix () {return scene_matrix.GetInverseLocalToWorldMatrix();}
const Matrix4f & GetInverseTransposeLocalToWorldMatrix () {return scene_matrix.GetInverseTransposeLocalToWorldMatrix();}
2019-05-21 21:28:33 +08:00
public:
virtual void RefreshMatrix();
2019-05-21 21:28:33 +08:00
};//class SceneOrient
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_SCENE_ORIENT_INCLUDE