2019-05-21 21:28:33 +08:00
|
|
|
|
#include<hgl/graph/SceneNode.h>
|
2022-06-24 21:06:38 +08:00
|
|
|
|
#include<hgl/graph/VKRenderable.h>
|
2019-05-21 21:28:33 +08:00
|
|
|
|
namespace hgl
|
|
|
|
|
{
|
|
|
|
|
namespace graph
|
|
|
|
|
{
|
2022-06-24 21:06:38 +08:00
|
|
|
|
void SceneNode::SetRenderable(Renderable *ri)
|
2021-06-15 19:02:51 +08:00
|
|
|
|
{
|
|
|
|
|
render_obj=ri;
|
|
|
|
|
|
|
|
|
|
if(render_obj)
|
|
|
|
|
{
|
|
|
|
|
SetBoundingBox(render_obj->GetBoundingBox());
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-09-28 15:02:57 +08:00
|
|
|
|
BoundingBox.SetZero();
|
2021-06-15 19:02:51 +08:00
|
|
|
|
|
2024-04-26 01:17:30 +08:00
|
|
|
|
//WorldBoundingBox=
|
|
|
|
|
LocalBoundingBox=BoundingBox;
|
2021-06-15 19:02:51 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-21 21:28:33 +08:00
|
|
|
|
/**
|
|
|
|
|
* 刷新矩阵
|
2019-05-25 14:52:24 +08:00
|
|
|
|
* @param root_matrix 根矩阵
|
2019-05-21 21:28:33 +08:00
|
|
|
|
*/
|
|
|
|
|
void SceneNode::RefreshMatrix(const Matrix4f *root_matrix)
|
|
|
|
|
{
|
|
|
|
|
if(root_matrix)
|
|
|
|
|
RefreshLocalToWorldMatrix(root_matrix);
|
|
|
|
|
else
|
2019-05-25 14:52:24 +08:00
|
|
|
|
SetLocalToWorldMatrix(LocalMatrix);
|
2019-05-21 21:28:33 +08:00
|
|
|
|
|
|
|
|
|
const int count=SubNode.GetCount();
|
|
|
|
|
|
|
|
|
|
SceneNode **sub=SubNode.GetData();
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<count;i++)
|
|
|
|
|
{
|
|
|
|
|
(*sub)->RefreshMatrix(&LocalToWorldMatrix);
|
|
|
|
|
|
|
|
|
|
sub++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 刷新绑定盒
|
|
|
|
|
*/
|
|
|
|
|
void SceneNode::RefreshBoundingBox()
|
|
|
|
|
{
|
|
|
|
|
int count=SubNode.GetCount();
|
|
|
|
|
SceneNode **sub=SubNode.GetData();
|
|
|
|
|
|
2019-05-25 14:52:24 +08:00
|
|
|
|
AABB local,world;
|
2019-05-21 21:28:33 +08:00
|
|
|
|
|
2019-05-26 00:20:40 +08:00
|
|
|
|
(*sub)->RefreshBoundingBox();
|
|
|
|
|
local=(*sub)->GetLocalBoundingBox();
|
|
|
|
|
|
|
|
|
|
++sub;
|
|
|
|
|
for(int i=1;i<count;i++)
|
2019-05-21 21:28:33 +08:00
|
|
|
|
{
|
|
|
|
|
(*sub)->RefreshBoundingBox();
|
|
|
|
|
|
2019-05-26 00:20:40 +08:00
|
|
|
|
local.Enclose((*sub)->GetLocalBoundingBox());
|
2019-05-21 21:28:33 +08:00
|
|
|
|
|
2019-05-26 00:20:40 +08:00
|
|
|
|
++sub;
|
2019-05-21 21:28:33 +08:00
|
|
|
|
}
|
2019-05-25 14:52:24 +08:00
|
|
|
|
|
2019-05-26 00:20:40 +08:00
|
|
|
|
LocalBoundingBox=local;
|
2019-05-21 21:28:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2021-04-30 18:56:20 +08:00
|
|
|
|
///**
|
|
|
|
|
//* 从当前节点展开输出到一个渲染列表
|
|
|
|
|
//* @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);
|
|
|
|
|
//}
|
2019-05-21 21:28:33 +08:00
|
|
|
|
}//namespace graph
|
|
|
|
|
}//namespace hgl
|