optimized SceneNode class.

This commit is contained in:
hyzboy 2024-10-06 02:30:59 +08:00
parent 9450d92784
commit 4614562929
8 changed files with 35 additions and 176 deletions

View File

@ -2,7 +2,6 @@
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
@ -94,7 +93,7 @@ private:
rad=deg2rad<double>((360/TRIANGLE_NUMBER)*i); //这里一定要加<float>或<float>否则结果用int保存会出现问题
mat=rotate(rad,Vector3f(0,0,1));
render_root.CreateSubNode(mat,render_obj);
render_root.Add(new SceneNode(mat,render_obj));
}
render_root.RefreshMatrix();
@ -111,9 +110,9 @@ public:
SAFE_CLEAR(render_list);
}
bool Init()
bool Init(uint w,uint h)
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
if(!VulkanApplicationFramework::Init(w,h))
return(false);
render_list=new RenderList(device);
@ -139,12 +138,5 @@ public:
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
return RunApp<TestApp>(SCREEN_WIDTH,SCREEN_HEIGHT);
}

View File

@ -1,10 +1,7 @@
// 该范例主要演示使用NDC坐标系直接绘制一个渐变色的三角形
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/math/HalfFloat.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
@ -125,9 +122,9 @@ private:
public:
bool Init()
bool Init(uint w,uint h)
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
if(!VulkanApplicationFramework::Init(w,h))
return(false);
InitVIL();
@ -157,12 +154,5 @@ public:
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
return RunApp<TestApp>(SCREEN_WIDTH,SCREEN_HEIGHT);
}

View File

@ -1,9 +1,6 @@
// 该范例主要演示使用2D坐系统直接绘制一个渐变色的三角形,使用UBO传递Viewport信息
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
@ -132,5 +129,5 @@ public:
int main(int,char **)
{
RunApp<TestApp>(1280,720);
return RunApp<TestApp>(1280,720);
}

View File

@ -63,7 +63,7 @@ bool InitGizmoRotateStaticMesh()
white_torus->GetTransform().AddTransform(rotate_white_torus_tfc);
root_node->AddSubNode(white_torus);
root_node->Add(white_torus);
}
sm_gizmo_rotate=CreateGizmoStaticMesh(root_node);

View File

@ -1,7 +1,6 @@
#pragma once
#include<hgl/graph/RenderNode.h>
#include<hgl/graph/VKVABList.h>
#include<hgl/type/SortedSets.h>
#include<hgl/graph/VKIndirectCommandBuffer.h>
VK_NAMESPACE_BEGIN

View File

@ -10,7 +10,7 @@ namespace hgl
namespace graph
{
using SceneNodeID =uint64;
using SceneNodeName =AnsiIDName;
using SceneNodeName =UTF16IDName;
/**
* <br>
@ -30,7 +30,7 @@ namespace hgl
Renderable *render_obj=nullptr; ///<可渲染实例
public:
protected:
ObjectList<SceneNode> SubNode; ///<子节点
@ -39,16 +39,18 @@ namespace hgl
const SceneNodeID & GetNodeID ()const { return NodeID; } ///<取得节点ID
const SceneNodeName & GetNodeName ()const { return NodeName; } ///<取得节点名称
private:
const ObjectList<SceneNode> &GetSubNode()const { return SubNode; } ///<取得子节点列表
public:
SceneNode()=default;
SceneNode(SceneNode *);
SceneNode(const SceneNode &)=delete;
SceneNode(const SceneNode *)=delete;
SceneNode(const SceneOrient &so ):SceneOrient(so) {}
SceneNode( Renderable *ri ) {render_obj=ri;}
SceneNode(const Matrix4f &mat ):SceneOrient(mat) {}
SceneNode(const Matrix4f &mat, Renderable *ri ):SceneOrient(mat) {render_obj=ri;}
friend SceneNode *CreateSceneNode(const SceneNodeName &);
public:
virtual ~SceneNode()=default;
@ -75,7 +77,7 @@ namespace hgl
Renderable *GetRenderable(){return render_obj;}
void SetRenderable(Renderable *);
SceneNode *AddSubNode(SceneNode *sn)
SceneNode *Add(SceneNode *sn)
{
if(!sn)
return(nullptr);
@ -84,67 +86,6 @@ namespace hgl
return sn;
}
SceneNode *CreateSubNode()
{
SceneNode *sn=new SceneNode();
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode(Renderable *ri)
{
if(!ri)
return(nullptr);
SceneNode *sn=new SceneNode(ri);
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode(const Matrix4f &mat)
{
SceneNode *sn=new SceneNode(mat);
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode(const Matrix4f &mat,Renderable *ri)
{
if(!ri)
return(nullptr);
SceneNode *sn=new SceneNode(mat,ri);
SubNode.Add(sn);
return sn;
}
SceneNode *CreateSubNode(SceneNode *node)
{
if(!node)
return(nullptr);
SceneNode *sn=new SceneNode(node);
SubNode.Add(sn);
return node;
}
SceneNode *CreateSubNode(const Matrix4f &mat,SceneNode *node)
{
if(!node)
return(nullptr);
SceneNode *sn=new SceneNode(mat);
sn->CreateSubNode(node);
SubNode.Add(sn);
return sn;
}
public: //坐标相关方法
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒
@ -157,7 +98,7 @@ namespace hgl
// virtual const AABB & GetWorldBoundingBox ()const{return WorldBoundingBox;} ///<取得世界坐标绑定盒
};//class SceneNode
SceneNode *CreateSceneNode(const SceneNodeName &);
SceneNode *Duplication(const SceneNode *); ///<复制一个场景节点
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_SCENE_NODE_INCLUDE

View File

@ -1,12 +1,10 @@
#include<hgl/graph/RenderList.h>
#include<hgl/graph/MaterialRenderList.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VK.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VertexAttribDataAccess.h>
#include<hgl/graph/VKMaterialParameters.h>
#include<hgl/graph/VKMaterial.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/util/sort/Sort.h>
namespace hgl
{
@ -43,7 +41,7 @@ namespace hgl
++renderable_count;
}
for(SceneNode *sub:sn->SubNode)
for(SceneNode *sub:sn->GetSubNode())
ExpendNode(sub);
return(true);

View File

@ -4,22 +4,21 @@ namespace hgl
{
namespace graph
{
SceneNode::SceneNode(SceneNode *node):SceneOrient(*node)
SceneNode *Duplication(SceneNode *src_node)
{
if(!node)
return;
if(!src_node)
return nullptr;
BoundingBox=node->BoundingBox;
LocalBoundingBox=node->LocalBoundingBox;
SceneNode *node=new SceneNode(*(SceneOrient *)src_node);
render_obj=node->render_obj;
node->SetRenderable(src_node->GetRenderable());
for(SceneNode *sn:node->SubNode)
for(SceneNode *sn:src_node->GetSubNode())
{
SceneNode *new_sn=new SceneNode(sn);
SubNode.Add(new_sn);
node->Add(Duplication(sn));
}
return node;
}
void SceneNode::SetRenderable(Renderable *ri)
@ -89,62 +88,5 @@ namespace hgl
LocalBoundingBox=local;
}
///**
//* 从当前节点展开输出到一个渲染列表
//* @param rl 渲染列表
//* @param func 过滤函数
//* @param func_data 过滤函数用辅助数据
//* @return 成功与否
//*/
//bool SceneNode::ExpendToList(RenderList *rl,FilterSceneNodeFunc func,void *func_data)
//{
// if(!rl)return(false);
// if(func)
// if(!func(this,func_data))
// return(false);
// {
// int count=renderable_instances.GetCount();
// if(count>0)
// rl->Add(this);
// }
// {
// int count=SubNode.GetCount();
// SceneNode **sub=SubNode.GetData();
// for(int i=0;i<count;i++)
// {
// (*sub)->ExpendToList(rl,func,func_data); //展开子节点
// ++sub;
// }
// }
// return(true);
//}
///**
//* 从当前节点展开输出到一个渲染列表
//* @param rl 渲染列表
//* @param cam 摄像机
//* @param comp_func 渲染列表远近比较函数
//*/
//bool SceneNode::ExpendToList(RenderList *rl,Camera *cam,RenderListCompFunc comp_func)
//{
// if(!rl||!cam)return(false);
// if(!ExpendToList(rl))
// return(false);
// if(comp_func)
// {
// }
// return(true);
//}
}//namespace graph
}//namespace hgl