Used Transform instead of Matrix4f in SceneOrient, MaterialRenderList/RenderAssignBuffer supports updating the L2WMatrix of only the changed objects

This commit is contained in:
2024-08-04 22:35:31 +08:00
parent 3768507169
commit 5213651054
14 changed files with 196 additions and 81 deletions

View File

@@ -4,7 +4,6 @@
//#include<hgl/type/List.h>
#include<hgl/math/Math.h>
#include<hgl/graph/VK.h>
//#include<hgl/graph/Transform.h>
namespace hgl
{
namespace graph
@@ -12,54 +11,48 @@ namespace hgl
/**
* 方向定位数据基类
*/
class SceneOrient ///场景定位类
class SceneOrient ///场景定位类
{
protected:
//ObjectList<Transform> TransformList;
Vector3f Position; ///<坐标
Vector3f Direction; ///<方向
Vector3f Position; ///<坐标
Vector3f Direction; ///<方向
Transform LocalTransform; ///<当前变换(指相对上一级的变换)
Transform WorldTransform; ///<当前到世界变换
bool IdentityLocalMatrix; ///<是否为空矩阵
protected:
Matrix4f LocalMatrix; ///<当前矩阵(指相对上一级的变换矩阵)
Matrix4f LocalToWorldMatrix; ///<当前到世界矩阵
Matrix4f InverseLocalMatrix; ///<反向当前矩阵
Matrix4f InverseLocalToWorldMatrix; ///<反向当前到世界矩阵
void SetWorldTransform (const Transform &); ///<设定当前节点到世界矩阵
public:
SceneOrient();
SceneOrient(const SceneOrient &);
SceneOrient(const Matrix4f &mat);
SceneOrient(const Transform &);
virtual ~SceneOrient()=default;
void SetPosition (const Vector3f &pos){Position=pos;}
void SetDirection (const Vector3f &dir){Direction=dir;}
const Vector3f & GetLocalPosition ()const{return Position;}
const Vector3f & GetLocalDirection ()const{return Direction;}
const Vector3f & GetWorldPosition ()const{return TransformPosition(LocalToWorldMatrix,Position);}
const Vector3f & GetWorldDirection ()const{return TransformDirection(LocalToWorldMatrix,Direction);}
const Vector3f & GetLocalPosition ()const {return Position;}
const Vector3f & GetLocalDirection ()const {return Direction;}
const Vector3f GetWorldPosition () {return WorldTransform.TransformPosition(Position);}
const Vector3f GetWorldDirection () {return WorldTransform.TransformDirection(Direction);}
public:
const bool IsIdentityLocalMatrix ()const{return IdentityLocalMatrix;} ///<是否为空矩阵(相对上一级没变化)
void SetLocalTransform (const Transform &); ///<设定当前节点矩阵
Matrix4f & SetLocalMatrix (const Matrix4f &); ///<设定当前节点矩阵
Matrix4f & SetLocalToWorldMatrix (const Matrix4f &); ///<设定当前节点到世界矩阵
const Matrix4f & GetLocalMatrix ()const {return LocalMatrix;}
const Matrix4f & GetLocalToWorldMatrix ()const {return LocalToWorldMatrix;}
const Matrix4f & GetInverseLocalMatrix ()const {return InverseLocalMatrix;}
const Matrix4f & GetInverseLocalToWorldMatrix()const {return InverseLocalToWorldMatrix;}
const Transform & GetLocalTransform ()const {return LocalTransform;} ///<取得当前节点矩阵
const Transform & GetWorldTransform ()const {return WorldTransform;} ///<取得当前节点到世界矩阵
Transform & GetLocalTransform () {LocalTransform.UpdateMatrix();return LocalTransform;} ///<取得当前节点矩阵
Transform & GetWorldTransform () {WorldTransform.UpdateMatrix();return WorldTransform;} ///<取得当前节点到世界矩阵
public:
virtual void RefreshLocalToWorldMatrix (const Matrix4f *); ///<刷新到世界空间矩阵
virtual bool RefreshTransform (const Transform &); ///<刷新到世界空间变换
};//class SceneOrient
}//namespace graph
}//namespace hgl