Updated to support Newly SceneOrient,compiled all OK! but Non test..next step is test samples.
This commit is contained in:
@@ -95,6 +95,6 @@ public:
|
||||
|
||||
void Render(RenderCmdBuffer *);
|
||||
|
||||
void UpdateTransform(); //刷新所有对象的LocalToWorld矩阵
|
||||
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
|
||||
};//class MaterialRenderList
|
||||
VK_NAMESPACE_END
|
||||
|
@@ -32,10 +32,10 @@ public:
|
||||
it->value->Render(rcb);
|
||||
}
|
||||
|
||||
void UpdateTransform()
|
||||
void UpdateLocalToWorld()
|
||||
{
|
||||
for(auto *it:data_list)
|
||||
it->value->UpdateTransform();
|
||||
it->value->UpdateLocalToWorld();
|
||||
}
|
||||
};//class MaterialRenderMap
|
||||
VK_NAMESPACE_END
|
||||
|
@@ -39,7 +39,7 @@ namespace hgl
|
||||
|
||||
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
|
||||
|
||||
virtual void UpdateTransform(); ///<更新所有对象的变换数据
|
||||
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
|
||||
|
||||
virtual void Clear(); ///<彻底清理
|
||||
};//class RenderList
|
||||
|
@@ -15,7 +15,7 @@ namespace hgl
|
||||
{
|
||||
SceneNode *scene_node;
|
||||
|
||||
uint32 l2w_transform_version;
|
||||
uint32 l2w_version;
|
||||
uint32 l2w_index;
|
||||
|
||||
Vector3f world_position;
|
||||
|
@@ -32,8 +32,8 @@ namespace hgl
|
||||
SceneNode()=default;
|
||||
SceneNode(SceneNode *);
|
||||
SceneNode( Renderable *ri ) {render_obj=ri;}
|
||||
SceneNode(const Transform &tf ):SceneOrient(tf) {}
|
||||
SceneNode(const Transform &tf, Renderable *ri ):SceneOrient(tf) {render_obj=ri;}
|
||||
SceneNode(const Matrix4f &mat ):SceneOrient(mat) {}
|
||||
SceneNode(const Matrix4f &mat, Renderable *ri ):SceneOrient(mat) {render_obj=ri;}
|
||||
|
||||
virtual ~SceneNode()=default;
|
||||
|
||||
@@ -128,7 +128,7 @@ namespace hgl
|
||||
|
||||
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒
|
||||
|
||||
virtual bool RefreshTransform (const Transform &tf=IdentityTransform) override; ///<刷新世界变换
|
||||
virtual void RefreshMatrix () override; ///<刷新世界变换
|
||||
virtual void RefreshBoundingBox (); ///<刷新绑定盒
|
||||
|
||||
virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒
|
||||
|
@@ -7,53 +7,135 @@ namespace hgl
|
||||
{
|
||||
namespace graph
|
||||
{
|
||||
class SceneMatrix :public VersionData<Matrix4f>
|
||||
{
|
||||
protected:
|
||||
|
||||
Matrix4f parent_matrix;
|
||||
Matrix4f local_matrix;
|
||||
TransformManager transform_manager;
|
||||
Matrix4f transform_matrix;
|
||||
|
||||
protected:
|
||||
|
||||
Matrix4f inverse_local_to_world_matrix; ///<世界到本地矩阵
|
||||
Matrix4f inverse_transpose_local_to_world_matrix; ///<世界到本地矩阵的转置矩阵
|
||||
|
||||
void MakeNewestData(Matrix4f &local_to_world_matrix) override ///<生成最新的数据(需要派生类重载)
|
||||
{
|
||||
transform_manager.GetMatrix(transform_matrix);
|
||||
|
||||
local_to_world_matrix=parent_matrix*local_matrix*transform_matrix;
|
||||
|
||||
inverse_local_to_world_matrix =inverse(local_to_world_matrix);
|
||||
inverse_transpose_local_to_world_matrix=transpose(inverse_local_to_world_matrix);
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
TransformManager &GetTransform() { return transform_manager; } ///<取得变换管理器
|
||||
|
||||
public:
|
||||
|
||||
SceneMatrix():VersionData(Identity4f)
|
||||
{
|
||||
parent_matrix=Identity4f;
|
||||
local_matrix=Identity4f;
|
||||
transform_matrix=Identity4f;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
SceneMatrix(const Matrix4f &mat):VersionData(Identity4f)
|
||||
{
|
||||
SetLocalMatrix(mat);
|
||||
}
|
||||
|
||||
void SetLocalMatrix(const Matrix4f &mat)
|
||||
{
|
||||
if (IsNearlyEqual(local_matrix,mat))
|
||||
return;
|
||||
|
||||
local_matrix=mat;
|
||||
UpdateVersion();
|
||||
}
|
||||
|
||||
void SetParentMatrix(const Matrix4f &pm)
|
||||
{
|
||||
if (IsNearlyEqual(parent_matrix,pm))
|
||||
return;
|
||||
|
||||
parent_matrix=pm;
|
||||
UpdateVersion();
|
||||
}
|
||||
};//class SceneMatrix
|
||||
|
||||
/**
|
||||
* 方向定位数据基类
|
||||
* 方向定位数据基类<br>
|
||||
* 用于描述一个物体在3D空间中的位置、旋转、缩放等信息。<br>
|
||||
* 构成说明:<br>
|
||||
* <ul> *
|
||||
* <li>LocalMatrix 一般用于描述当前节点相对上一级的变换矩阵</li>
|
||||
* <li>LocalToWorldMatrix 最终用于描述当前节点相对于世界的变换矩阵,在渲染时使用</li>
|
||||
*
|
||||
* <li>transform_manager 用于管理当前节点所有的变换情况,如果本节点不存在额外变换,数量为0。</li>
|
||||
* </ul>
|
||||
*
|
||||
* LocalToWorldMatrix=ParnetMatrix * LocalMatrix * TraansformMatrix<br>
|
||||
*/
|
||||
class SceneOrient ///场景定位类
|
||||
{
|
||||
protected:
|
||||
|
||||
Matrix4f parent_matrix;
|
||||
bool parent_matrix_dirty;
|
||||
|
||||
Matrix4f local_matrix;
|
||||
bool local_matrix_dirty;
|
||||
SceneMatrix scene_matrix;
|
||||
|
||||
TransformManager transform_manager;
|
||||
uint32 transform_version;
|
||||
|
||||
uint32 local_to_world_matrix_version;
|
||||
|
||||
// LocalToWorld = ParentMatrix * LocalMatrix * TransformMatrix
|
||||
|
||||
Matrix4f local_to_world_matrix; ///<本地到世界矩阵
|
||||
Matrix4f inverse_local_to_world_matrix; ///<世界到本地矩阵
|
||||
Matrix4f inverse_transpose_local_to_world_matrix; ///<世界到本地矩阵的转置矩阵
|
||||
|
||||
virtual void SetWorldMatrix(const Matrix4f &);
|
||||
Vector3f WorldPosition;
|
||||
|
||||
public:
|
||||
|
||||
SceneOrient();
|
||||
SceneOrient()=default;
|
||||
SceneOrient(const SceneOrient &);
|
||||
SceneOrient(const Matrix4f &);
|
||||
virtual ~SceneOrient()=default;
|
||||
|
||||
void SetLocalMatrix(const Matrix4f &); ///<设置本地矩阵
|
||||
|
||||
public:
|
||||
const Matrix4f & GetLocalMatrix ()const{return local_matrix;}
|
||||
|
||||
TransformManager & GetTransform () {return transform_manager;} ///<取得变换管理器
|
||||
|
||||
const Matrix4f & GetLocalToWorldMatrix ()const{return local_to_world_matrix;}
|
||||
const Matrix4f & GetInverseLocalToWorldMatrix ()const{return inverse_local_to_world_matrix;}
|
||||
const Matrix4f & GetInverseTransposeLocalToWorldMatrix ()const{return inverse_transpose_local_to_world_matrix;}
|
||||
void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵
|
||||
void SetParentMatrix (const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵
|
||||
|
||||
public:
|
||||
|
||||
virtual bool RefreshMatrix (const Matrix4f &); ///<刷新到世界空间变换
|
||||
const uint32 GetLocalToWorldMatrixVersion()const { return scene_matrix.GetNewestVersion(); } ///<取得版本号
|
||||
|
||||
const Vector3f & GetWorldPosition() const { return WorldPosition; } ///<取得世界坐标
|
||||
const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵
|
||||
|
||||
TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器
|
||||
|
||||
const Matrix4f & GetLocalToWorldMatrix () {return scene_matrix.GetLocalToWorldMatrix();} ///<取得本地到世界矩阵
|
||||
const Matrix4f & GetInverseLocalToWorldMatrix () {return scene_matrix.GetInverseLocalToWorldMatrix();}
|
||||
const Matrix4f & GetInverseTransposeLocalToWorldMatrix () {return scene_matrix.GetInverseTransposeLocalToWorldMatrix();}
|
||||
|
||||
public:
|
||||
|
||||
virtual void RefreshMatrix();
|
||||
};//class SceneOrient
|
||||
}//namespace graph
|
||||
}//namespace hgl
|
||||
|
Reference in New Issue
Block a user