SceneNode增加GetEventDispatcher接口

This commit is contained in:
2025-07-18 01:12:19 +08:00
parent d4643b7427
commit f013d8327d
4 changed files with 20 additions and 13 deletions

View File

@@ -27,6 +27,7 @@
#include<hgl/graph/InlineGeometry.h> #include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/RenderFramework.h> #include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h> #include<hgl/component/MeshComponent.h>
#include<hgl/io/event/MouseEvent.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
@@ -35,7 +36,7 @@ namespace
/** /**
* 移动 Gizmo 节点 * 移动 Gizmo 节点
*/ */
class GizmoMoveNode:public SceneNode class GizmoMoveNode:public SceneNode,io::MouseEvent
{ {
struct GizmoMoveAxis struct GizmoMoveAxis
{ {
@@ -51,6 +52,11 @@ namespace
using SceneNode::SceneNode; using SceneNode::SceneNode;
io::EventDispatcher *GetEventDispatcher() override
{
return this; // GizmoMoveNode 处理鼠标事件
}
SceneNode *CreateNode()const override SceneNode *CreateNode()const override
{ {
return(new GizmoMoveNode); return(new GizmoMoveNode);
@@ -69,7 +75,7 @@ namespace
return new_gmn; return new_gmn;
} }
bool Init(RenderFramework *render_framework) bool CreateGizmoGeometry(RenderFramework *render_framework)
{ {
ComponentDataPtr SpherePtr =GetGizmoMeshCDP(GizmoShape::Sphere); ComponentDataPtr SpherePtr =GetGizmoMeshCDP(GizmoShape::Sphere);
ComponentDataPtr CylinderPtr=GetGizmoMeshCDP(GizmoShape::Cylinder); ComponentDataPtr CylinderPtr=GetGizmoMeshCDP(GizmoShape::Cylinder);
@@ -191,7 +197,7 @@ bool InitGizmoMoveNode(RenderFramework *render_framework)
sn_gizmo_move=new GizmoMoveNode; sn_gizmo_move=new GizmoMoveNode;
if(!sn_gizmo_move->Init(render_framework)) if(!sn_gizmo_move->CreateGizmoGeometry(render_framework))
{ {
delete sn_gizmo_move; delete sn_gizmo_move;
sn_gizmo_move=nullptr; sn_gizmo_move=nullptr;

View File

@@ -6,7 +6,6 @@
#include<hgl/graph/mtl/MaterialLibrary.h> #include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/Renderer.h> #include<hgl/graph/Renderer.h>
#include<hgl/graph/Scene.h> #include<hgl/graph/Scene.h>
#include<hgl/io/event/WindowEvent.h>
#include<hgl/Time.h> #include<hgl/Time.h>
//#include<iostream> //#include<iostream>
@@ -22,7 +21,7 @@ namespace hgl
* *
* WorkObject被定义为工作对象所有的渲染控制都需要被写在WorkObject的Render函数下。 * WorkObject被定义为工作对象所有的渲染控制都需要被写在WorkObject的Render函数下。
*/ */
class WorkObject:public TickObject,public io::WindowEvent class WorkObject:public TickObject
{ {
graph::RenderFramework *render_framework=nullptr; graph::RenderFramework *render_framework=nullptr;

View File

@@ -6,6 +6,11 @@
#include<hgl/graph/AABB.h> #include<hgl/graph/AABB.h>
#include<hgl/component/Component.h> #include<hgl/component/Component.h>
namespace hgl::io
{
class EventDispatcher; // 前向声明事件分发器
}//
namespace hgl::graph namespace hgl::graph
{ {
using SceneNodeID =int64; using SceneNodeID =int64;
@@ -54,7 +59,7 @@ namespace hgl::graph
SceneNode(const SceneNode &)=delete; SceneNode(const SceneNode &)=delete;
SceneNode(const SceneNode *)=delete; SceneNode(const SceneNode *)=delete;
using SceneOrient::SceneOrient; ///<继承构造函数 using SceneOrient::SceneOrient; ///<继承构造函数
virtual ~SceneNode(); virtual ~SceneNode();
public: public:
@@ -122,6 +127,10 @@ namespace hgl::graph
return sn; return sn;
} }
public: //事件相关
virtual io::EventDispatcher *GetEventDispatcher(){return nullptr;} ///<取得事件分发器(如果返回nullptr,则表示该节点不支持事件分发)
public: //坐标相关方法 public: //坐标相关方法
virtual void SetBoundingBox (const AABB &bb){bounding_box=bb;} ///<设置绑定盒 virtual void SetBoundingBox (const AABB &bb){bounding_box=bb;} ///<设置绑定盒

View File

@@ -23,11 +23,6 @@ namespace hgl
{ {
if(!rf) if(!rf)
{ {
if(render_framework)
{
render_framework->RemoveChildDispatcher(this);
}
render_framework=nullptr; render_framework=nullptr;
db=nullptr; db=nullptr;
} }
@@ -42,8 +37,6 @@ namespace hgl
db=rf->GetRenderResource(); db=rf->GetRenderResource();
scene=rf->GetDefaultScene(); scene=rf->GetDefaultScene();
renderer=rf->GetDefaultRenderer(); renderer=rf->GetDefaultRenderer();
render_framework->AddChildDispatcher(this);
} }
void WorkObject::Render(double delta_time) void WorkObject::Render(double delta_time)