Updated to support Newly SceneOrient,compiled all OK! but Non test..next step is test samples.

This commit is contained in:
hyzboy 2024-08-27 01:27:53 +08:00
parent 410b94a127
commit a9526ce956
14 changed files with 154 additions and 139 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 529ad6b4037865b871f3406fa528ef1ec80d56a8 Subproject commit 45e02b7c7206ac459692d693c1b840f8378906d3

View File

@ -150,7 +150,7 @@ public:
//} //}
root.RefreshTransform(); root.RefreshTransform();
render_list->UpdateTransform(); render_list->UpdateLocalToWorld();
SceneAppFramework::BuildCommandBuffer(index); SceneAppFramework::BuildCommandBuffer(index);
} }

View File

@ -95,6 +95,6 @@ public:
void Render(RenderCmdBuffer *); void Render(RenderCmdBuffer *);
void UpdateTransform(); //刷新所有对象的LocalToWorld矩阵 void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
};//class MaterialRenderList };//class MaterialRenderList
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -32,10 +32,10 @@ public:
it->value->Render(rcb); it->value->Render(rcb);
} }
void UpdateTransform() void UpdateLocalToWorld()
{ {
for(auto *it:data_list) for(auto *it:data_list)
it->value->UpdateTransform(); it->value->UpdateLocalToWorld();
} }
};//class MaterialRenderMap };//class MaterialRenderMap
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -39,7 +39,7 @@ namespace hgl
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象 virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual void UpdateTransform(); ///<更新所有对象的变换数据 virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
virtual void Clear(); ///<彻底清理 virtual void Clear(); ///<彻底清理
};//class RenderList };//class RenderList

View File

@ -15,7 +15,7 @@ namespace hgl
{ {
SceneNode *scene_node; SceneNode *scene_node;
uint32 l2w_transform_version; uint32 l2w_version;
uint32 l2w_index; uint32 l2w_index;
Vector3f world_position; Vector3f world_position;

View File

@ -32,8 +32,8 @@ namespace hgl
SceneNode()=default; SceneNode()=default;
SceneNode(SceneNode *); SceneNode(SceneNode *);
SceneNode( Renderable *ri ) {render_obj=ri;} SceneNode( Renderable *ri ) {render_obj=ri;}
SceneNode(const Transform &tf ):SceneOrient(tf) {} SceneNode(const Matrix4f &mat ):SceneOrient(mat) {}
SceneNode(const Transform &tf, Renderable *ri ):SceneOrient(tf) {render_obj=ri;} SceneNode(const Matrix4f &mat, Renderable *ri ):SceneOrient(mat) {render_obj=ri;}
virtual ~SceneNode()=default; virtual ~SceneNode()=default;
@ -128,7 +128,7 @@ namespace hgl
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒 virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒
virtual bool RefreshTransform (const Transform &tf=IdentityTransform) override; ///<刷新世界变换 virtual void RefreshMatrix () override; ///<刷新世界变换
virtual void RefreshBoundingBox (); ///<刷新绑定盒 virtual void RefreshBoundingBox (); ///<刷新绑定盒
virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒 virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒

View File

@ -7,53 +7,135 @@ namespace hgl
{ {
namespace graph 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 ///场景定位类 class SceneOrient ///场景定位类
{ {
protected: protected:
Matrix4f parent_matrix;
bool parent_matrix_dirty;
Matrix4f local_matrix; SceneMatrix scene_matrix;
bool local_matrix_dirty;
TransformManager transform_manager; Vector3f WorldPosition;
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 &);
public: public:
SceneOrient(); SceneOrient()=default;
SceneOrient(const SceneOrient &); SceneOrient(const SceneOrient &);
SceneOrient(const Matrix4f &); SceneOrient(const Matrix4f &);
virtual ~SceneOrient()=default; virtual ~SceneOrient()=default;
void SetLocalMatrix(const Matrix4f &); ///<设置本地矩阵 void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵
void SetParentMatrix (const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵
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;}
public: 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 };//class SceneOrient
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl

View File

@ -113,7 +113,7 @@ void MaterialRenderList::Add(SceneNode *sn)
rn.scene_node =sn; rn.scene_node =sn;
rn.l2w_transform_version=sn->GetWorldTransform().GetVersion(); rn.l2w_version=sn->GetLocalToWorldMatrixVersion();
rn.l2w_index=0; rn.l2w_index=0;
rn.world_position =sn->GetWorldPosition(); rn.world_position =sn->GetWorldPosition();
@ -141,7 +141,7 @@ void MaterialRenderList::End()
assign_buffer->WriteNode(rn_list); assign_buffer->WriteNode(rn_list);
} }
void MaterialRenderList::UpdateTransform() void MaterialRenderList::UpdateLocalToWorld()
{ {
if(!assign_buffer) if(!assign_buffer)
return; return;
@ -154,13 +154,14 @@ void MaterialRenderList::UpdateTransform()
int first=-1,last=-1; int first=-1,last=-1;
int update_count=0; int update_count=0;
uint32 l2w_version=0;
RenderNode *rn=rn_list.GetData(); RenderNode *rn=rn_list.GetData();
for(int i=0;i<node_count;i++) for(int i=0;i<node_count;i++)
{ {
Transform &tf=rn->scene_node->GetWorldTransform(); l2w_version=rn->scene_node->GetLocalToWorldMatrixVersion();
if(rn->l2w_transform_version!=tf.GetVersion()) //版本不对,需要更新 if(rn->l2w_version!=l2w_version) //版本不对,需要更新
{ {
if(first==-1) if(first==-1)
{ {
@ -169,7 +170,7 @@ void MaterialRenderList::UpdateTransform()
last=rn->l2w_index; last=rn->l2w_index;
rn->l2w_transform_version=tf.GetVersion(); rn->l2w_version=l2w_version;
rn_update_l2w_list.Add(rn); rn_update_l2w_list.Add(rn);
@ -181,7 +182,7 @@ void MaterialRenderList::UpdateTransform()
if(update_count>0) if(update_count>0)
{ {
assign_buffer->UpdateTransform(rn_update_l2w_list,first,last); assign_buffer->UpdateLocalToWorld(rn_update_l2w_list,first,last);
rn_update_l2w_list.Clear(); rn_update_l2w_list.Clear();
} }
} }

View File

@ -73,7 +73,7 @@ void RenderAssignBuffer::StatL2W(const RenderNodeList &rn_list)
for(uint i=0;i<rn_list.GetCount();i++) for(uint i=0;i<rn_list.GetCount();i++)
{ {
*l2wp=rn->scene_node->GetWorldTransform().GetMatrix(); *l2wp=rn->scene_node->GetLocalToWorldMatrix();
++l2wp; ++l2wp;
++rn; ++rn;
} }
@ -81,7 +81,7 @@ void RenderAssignBuffer::StatL2W(const RenderNodeList &rn_list)
l2w_buffer->Unmap(); l2w_buffer->Unmap();
} }
void RenderAssignBuffer::UpdateTransform(const RenderNodePointerList &rnp_list,const int first,const int last) void RenderAssignBuffer::UpdateLocalToWorld(const RenderNodePointerList &rnp_list,const int first,const int last)
{ {
if(!l2w_buffer) if(!l2w_buffer)
return; return;
@ -97,7 +97,7 @@ void RenderAssignBuffer::UpdateTransform(const RenderNodePointerList &rnp_list,c
for(uint i=0;i<count;i++) for(uint i=0;i<count;i++)
{ {
l2wp[(*rn)->l2w_index-first]=(*rn)->scene_node->GetWorldTransform().GetMatrix(); l2wp[(*rn)->l2w_index-first]=(*rn)->scene_node->GetLocalToWorldMatrix();
++rn; ++rn;
} }

View File

@ -92,6 +92,6 @@ public:
void WriteNode(const RenderNodeList &); void WriteNode(const RenderNodeList &);
void UpdateTransform(const RenderNodePointerList &,const int first,const int last); void UpdateLocalToWorld(const RenderNodePointerList &,const int first,const int last);
};//struct RenderAssignBuffer };//struct RenderAssignBuffer
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -78,12 +78,12 @@ namespace hgl
mrl_map.Clear(); mrl_map.Clear();
} }
void RenderList::UpdateTransform() void RenderList::UpdateLocalToWorld()
{ {
if(renderable_count<=0) if(renderable_count<=0)
return; return;
mrl_map.UpdateTransform(); mrl_map.UpdateLocalToWorld();
} }
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl

View File

@ -40,18 +40,14 @@ namespace hgl
} }
/** /**
* *
* @param parent_transform
*/ */
bool SceneNode::RefreshTransform(const Transform &parent_transform) void SceneNode::RefreshMatrix()
{ {
if(!parent_transform.IsLastVersion()) if (scene_matrix.IsNewestVersion())
return(false); return;
if(!parent_transform.IsIdentity()) const Matrix2f &l2w=scene_matrix.GetLocalToWorldMatrix();
SceneOrient::RefreshTransform(parent_transform);
else
SetWorldTransform(LocalTransform);
const int count=SubNode.GetCount(); const int count=SubNode.GetCount();
@ -59,13 +55,11 @@ namespace hgl
for(int i=0;i<count;i++) for(int i=0;i<count;i++)
{ {
if(!(*sub)->RefreshTransform(WorldTransform)) (*sub)->SetParentMatrix(l2w);
return(false); (*sub)->RefreshMatrix();
sub++; sub++;
} }
return(true);
} }
/** /**

View File

@ -3,92 +3,30 @@ namespace hgl
{ {
namespace graph namespace graph
{ {
SceneOrient::SceneOrient()
{
parent_matrix=Identity4f;
local_matrix=Identity4f;
SetWorldMatrix(Identity4f);
parent_matrix_dirty=false;
local_matrix_dirty=false;
transform_version=transform_manager.GetCurrentVersion();
}
SceneOrient::SceneOrient(const SceneOrient &so) SceneOrient::SceneOrient(const SceneOrient &so)
{ {
#define SO_COPY(value) value=so.value; scene_matrix=so.scene_matrix;
WorldPosition=so.WorldPosition;
SO_COPY(parent_matrix)
SO_COPY(parent_matrix_dirty)
SO_COPY(local_matrix)
SO_COPY(local_matrix_dirty)
SO_COPY(transform_manager)
SO_COPY(transform_version)
SO_COPY(local_to_world_matrix)
SO_COPY(inverse_local_to_world_matrix)
SO_COPY(inverse_transpose_local_to_world_matrix)
#undef SO_COPY
} }
SceneOrient::SceneOrient(const Matrix4f &mat):SceneOrient() SceneOrient::SceneOrient(const Matrix4f &mat):SceneOrient()
{ {
SetLocalMatrix(mat); scene_matrix.SetLocalMatrix(mat);
WorldPosition=TransformPosition(mat,ZeroVector3f);
} }
void SceneOrient::SetLocalMatrix(const Matrix4f &mat) void SceneOrient::RefreshMatrix()
{ {
if(IsNearlyEqual(local_matrix,mat)) if (scene_matrix.IsNewestVersion())
{
//是最新版本,证明没有更新,那不用刷新了
return; return;
}
local_matrix=mat; const Matrix4f &l2w=scene_matrix.GetNewestVersionData();
}
void SceneOrient::SetWorldMatrix(const Matrix4f &wm) WorldPosition=TransformPosition(l2w,ZeroVector3f);
{
local_to_world_matrix =wm;
inverse_local_to_world_matrix =inverse(local_to_world_matrix);
inverse_transpose_local_to_world_matrix=transpose(inverse_local_to_world_matrix);
}
/**
*
* @param parent_matrix LocalToWorld变换矩阵
*/
bool SceneOrient::RefreshMatrix(const Matrix4f &pm)
{
if(hgl_cmp(pm,parent_matrix)==0) //如果上一级到这一级没变自然是可以用memcmp比较的
return(true);
parent_matrix=pm;
Matrix4f tm;
transform_manager.GetMatrix(tm);
SetWorldMatrix(parent_matrix*local_matrix*tm);
//if(IsIdentityMatrix(LocalMatrix))
//{
// SetWorldMatrix(parent_matrix);
// return(true);
//}
//
//if(IsIdentityMatrix(parent_matrix))
//{
// SetWorldMatrix(LocalMatrix);
//}
//else
//{
// SetWorldMatrix(parent_matrix*LocalMatrix);
//}
return(true);
} }
}//namespace graph }//namespace graph
}//namespace hgl }//namespace hgl