迁移Gizmo3DMove成功可绘制,但是退出崩溃。疑似重复delete

This commit is contained in:
hyzboy 2025-06-15 23:25:08 +08:00
parent e9c3961aa5
commit dd2ee57954
5 changed files with 99 additions and 120 deletions

View File

@ -31,13 +31,13 @@ enum class GizmoShape:uint
ENUM_CLASS_RANGE(Square,Torus) ENUM_CLASS_RANGE(Square,Torus)
}; };
bool InitGizmoResource(RenderResource *); bool InitGizmoResource(RenderFramework *);
void FreeGizmoResource(); void FreeGizmoResource();
Mesh *GetGizmoMesh(const GizmoShape &shape,const GizmoColor &color); Mesh *GetGizmoMesh(const GizmoShape &shape,const GizmoColor &color);
Mesh *GetGizmoMoveMesh(); SceneNode *GetGizmoMoveNode();
Mesh *GetGizmoScaleMesh(); //SceneNode *GetGizmoScaleMesh();
Mesh *GetGizmoRotateMesh(); //SceneNode *GetGizmoRotateMesh();
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -25,25 +25,28 @@
#include<hgl/graph/SceneNode.h> #include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKRenderResource.h> #include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h> #include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
namespace namespace
{ {
static Mesh *sm_gizmo_move=nullptr;
static SceneNode *sn_gizmo_move=nullptr;
}//namespace }//namespace
Mesh *GetGizmoMoveMesh() SceneNode *GetGizmoMoveNode()
{ {
return sm_gizmo_move; return sn_gizmo_move;
} }
void ClearGizmoMoveMesh() void ClearGizmoMoveNode()
{ {
SAFE_CLEAR(sm_gizmo_move); SAFE_CLEAR(sn_gizmo_move);
} }
bool InitGizmoMoveMesh() bool InitGizmoMoveNode(RenderFramework *render_framework)
{ {
Mesh *sphere=GetGizmoMesh(GizmoShape::Sphere,GizmoColor::White); Mesh *sphere=GetGizmoMesh(GizmoShape::Sphere,GizmoColor::White);
Mesh *cylinder[3] Mesh *cylinder[3]
@ -83,9 +86,9 @@ bool InitGizmoMoveMesh()
} }
{ {
SceneNode *root_node=new SceneNode(); sn_gizmo_move=new SceneNode();
root_node->Add(new SceneNode(sphere)); sn_gizmo_move->AttachComponent(render_framework->CreateComponent<MeshComponent>(sphere));
{ {
Transform tm; Transform tm;
@ -97,53 +100,50 @@ bool InitGizmoMoveMesh()
{ {
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET); tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
root_node->Add(new SceneNode(tm,cylinder[2])); //Z 向上圆柱 render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[2]); //Z 向上圆柱
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET); tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
root_node->Add(new SceneNode(tm,cone[2])); //Z 向上圆锥 render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[2]); //Z 向上圆锥
tm.SetScale(circle_scale); tm.SetScale(circle_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
root_node->Add(new SceneNode(tm,circle[2])); render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,circle[2]);
} }
{ {
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90); tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0); tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
root_node->Add(new SceneNode(tm,cylinder[0])); //X 向右圆柱 render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[0]); //X 向右圆柱
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0); tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
root_node->Add(new SceneNode(tm,cone[0])); //X 向右圆锥 render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[0]); //X 向右圆锥
tm.SetScale(circle_scale); tm.SetScale(circle_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET); tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
root_node->Add(new SceneNode(tm,circle[0])); render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,circle[0]);
} }
{ {
tm.SetScale(cylinder_scale); tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90); tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0); tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[1]); //Y 向前圆柱
root_node->Add(new SceneNode(tm,cylinder[1])); //Y 向前圆柱
tm.SetScale(one_scale); tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0); tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
root_node->Add(new SceneNode(tm,cone[1])); //Y 向前圆锥 render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[1]); //Y 向前圆锥
tm.SetScale(circle_scale); tm.SetScale(circle_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET); tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
root_node->Add(new SceneNode(tm,circle[1])); render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,circle[1]);
} }
} }
sm_gizmo_move=CreateGizmoMesh(root_node);
} }
if(!sm_gizmo_move) if(!sn_gizmo_move)
return(false); return(false);
return(true); return(true);

View File

@ -9,22 +9,24 @@
#include<hgl/color/Color.h> #include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h> #include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneNode.h> #include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderFramework.h>
#include"GizmoResource.h" #include"GizmoResource.h"
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
bool InitGizmoMoveMesh(); bool InitGizmoMoveNode(RenderFramework *);
void ClearGizmoMoveMesh(); void ClearGizmoMoveNode();
bool InitGizmoScaleMesh(); //bool InitGizmoScaleMesh();
void ClearGizmoScaleMesh(); //void ClearGizmoScaleMesh();
//
bool InitGizmoRotateMesh(); //bool InitGizmoRotateMesh();
void ClearGizmoRotateMesh(); //void ClearGizmoRotateMesh();
namespace namespace
{ {
static RenderResource * gizmo_rr=nullptr; static RenderFramework *render_framework=nullptr;
static RenderResource * gizmo_rr=nullptr;
struct GizmoResource struct GizmoResource
{ {
@ -80,12 +82,14 @@ namespace
return(true); return(true);
} }
bool InitGizmoResource2D(VulkanDevice *device) bool InitGizmoResource2D()
{ {
if(!gizmo_rr) if(!gizmo_rr)
return(false); return(false);
RenderPass *render_pass=device->GetRenderPass(); VulkanDevice *device=render_framework->GetDevice();
VulkanDevAttr *dev_attr=device->GetDevAttr();
RenderPass *render_pass=render_framework->GetDefaultRenderPass();
{ {
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines); mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
@ -93,7 +97,7 @@ namespace
cfg.local_to_world=true; cfg.local_to_world=true;
cfg.position_format=VAT_VEC3; cfg.position_format=VAT_VEC3;
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(&cfg); mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(dev_attr,&cfg);
if(!mci) if(!mci)
return(false); return(false);
@ -106,7 +110,7 @@ namespace
} }
{ {
gizmo_line.pipeline=render_pass->CreatePipeline(gizmo_line.mtl,InlinePipeline::Solid3D,PrimitiveType::Lines); gizmo_line.pipeline=render_pass->CreatePipeline(gizmo_line.mtl,InlinePipeline::Solid3D);
if(!gizmo_line.pipeline) if(!gizmo_line.pipeline)
return(false); return(false);
@ -133,25 +137,27 @@ namespace
return(true); return(true);
} }
bool InitGizmoResource3D(VulkanDevice *device) bool InitGizmoResource3D()
{ {
if(!gizmo_rr) if(!gizmo_rr)
return(false); return(false);
RenderPass *render_pass=device->GetRenderPass(); VulkanDevice *device=render_framework->GetDevice();
VulkanDevAttr *dev_attr=device->GetDevAttr();
RenderPass *render_pass=render_framework->GetDefaultRenderPass();
{ {
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"Gizmo3D",PrimitiveType::Triangles); mtl::Material3DCreateConfig cfg(PrimitiveType::Triangles);
cfg.local_to_world=true; cfg.local_to_world=true;
cfg.material_instance=true; cfg.material_instance=true;
mtl::MaterialCreateInfo *mci=CreateMaterialGizmo3D(&cfg); mtl::MaterialCreateInfo *mci=CreateGizmo3D(dev_attr,&cfg);
if(!mci) if(!mci)
return(false); return(false);
gizmo_triangle.mtl=gizmo_rr->CreateMaterial(mci); gizmo_triangle.mtl=gizmo_rr->CreateMaterial("GizmoTriangle",mci);
if(!gizmo_triangle.mtl) if(!gizmo_triangle.mtl)
return(false); return(false);
@ -159,7 +165,7 @@ namespace
} }
{ {
gizmo_triangle.pipeline=render_pass->CreatePipeline(gizmo_triangle.mtl,InlinePipeline::Solid3D,PrimitiveType::Triangles); gizmo_triangle.pipeline=render_pass->CreatePipeline(gizmo_triangle.mtl,InlinePipeline::Solid3D);
if(!gizmo_triangle.pipeline) if(!gizmo_triangle.pipeline)
return(false); return(false);
} }
@ -261,25 +267,24 @@ namespace
} }
}//namespace }//namespace
bool InitGizmoResource(RenderResource *rr) bool InitGizmoResource(RenderFramework *rf)
{ {
if(!rr) if(!rf)
return(false); return(false);
if(gizmo_rr) render_framework=rf;
gizmo_rr=render_framework->GetRenderResource();
VulkanDevice *device=render_framework->GetDevice();
if(!InitGizmoResource3D())
return(false); return(false);
gizmo_rr=rr; if(!InitGizmoResource2D())
VulkanDevice *device=gizmo_rr->GetDevice();
if(!InitGizmoResource3D(device))
return(false); return(false);
if(!InitGizmoResource2D(device)) InitGizmoMoveNode(rf);
return(false);
InitGizmoMoveMesh();
//InitGizmoScaleMesh(); //InitGizmoScaleMesh();
//InitGizmoRotateMesh(); //InitGizmoRotateMesh();
@ -290,7 +295,7 @@ void FreeGizmoResource()
{ {
//ClearGizmoRotateMesh(); //ClearGizmoRotateMesh();
//ClearGizmoScaleMesh(); //ClearGizmoScaleMesh();
ClearGizmoMoveMesh(); ClearGizmoMoveNode();
for(GizmoMesh &gr:gizmo_mesh) for(GizmoMesh &gr:gizmo_mesh)
{ {
@ -316,15 +321,4 @@ Mesh *GetGizmoMesh(const GizmoShape &shape,const GizmoColor &color)
return gizmo_mesh[size_t(shape)].mesh[size_t(color)]; return gizmo_mesh[size_t(shape)].mesh[size_t(color)];
} }
Mesh *CreateGizmoMesh(SceneNode *root_node)
{
if(!root_node)
return(nullptr);
if(root_node->IsEmpty())
return(nullptr);
return(new StaticMesh(root_node));
}
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -38,6 +38,4 @@ constexpr const float GIZMO_TWO_AXIS_OFFSET =5.0F;
Mesh *GetGizmoMesh(const GizmoShape &gs,const GizmoColor &); Mesh *GetGizmoMesh(const GizmoShape &gs,const GizmoColor &);
MeshComponent *CreateGizmoMeshComponent(SceneNode *);
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -1,4 +1,4 @@
#include"VulkanAppFramework.h" #include<hgl/WorkManager.h>
#include"Gizmo.h" #include"Gizmo.h"
#include<hgl/graph/Ray.h> #include<hgl/graph/Ray.h>
@ -52,94 +52,81 @@ const Vector3f GizmoPosition(0,0,0);
// } // }
//};//class BillboardSceneNode:public SceneNode //};//class BillboardSceneNode:public SceneNode
class TestApp:public SceneAppFramework class TestApp:public WorkObject
{ {
SceneNode root; SceneNode *sm_move=nullptr;
//StaticMesh *sm_rotate=nullptr;
StaticMesh *sm_move=nullptr; //StaticMesh *sm_scale=nullptr;
StaticMesh *sm_rotate=nullptr;
StaticMesh *sm_scale=nullptr;
private: private:
bool InitGizmo() bool InitGizmo()
{ {
if(!InitGizmoResource(db)) if(!InitGizmoResource(GetRenderFramework()))
return(false); return(false);
sm_move =GetGizmoMoveStaticMesh(); sm_move =GetGizmoMoveNode();
sm_rotate =GetGizmoRotateStaticMesh(); //sm_rotate =GetGizmoRotateStaticMesh();
sm_scale =GetGizmoScaleStaticMesh(); //sm_scale =GetGizmoScaleStaticMesh();
return(true); return(true);
} }
void InitGizmoSceneTree() void InitGizmoSceneTree()
{ {
camera_control->Refresh(); SceneNode *root=GetSceneRoot();
CameraInfo *ci=camera_control->GetCameraInfo();
root.Clear(); root->Add(sm_move);
//root.Add(Duplication(sm_rotate->GetScene()));
//root.Add(Duplication(sm_move->GetScene()));
root.Add(Duplication(sm_rotate->GetScene()));
//root.CreateSubNode(sm_scale->GetScene()); //root.CreateSubNode(sm_scale->GetScene());
root.RefreshMatrix();
render_list->SetCamera(ci);
render_list->Expend(&root);
} }
public: public:
bool Init(uint w,uint h) bool Init() override
{ {
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitGizmo()) if(!InitGizmo())
return(false); return(false);
InitGizmoSceneTree(); InitGizmoSceneTree();
camera->pos=Vector3f(32,32,32); CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0)); camera_control->SetTarget(Vector3f(0,0,0));
return(true); return(true);
} }
using WorkObject::WorkObject;
~TestApp() ~TestApp()
{ {
FreeGizmoResource(); FreeGizmoResource();
} }
void BuildCommandBuffer(uint32 index) override //void BuildCommandBuffer(uint32 index) override
{ //{
camera_control->Refresh(); // camera_control->Refresh();
//
// const CameraInfo *ci=camera_control->GetCameraInfo();
// const ViewportInfo *vi=GetViewportInfo();
const CameraInfo *ci=camera_control->GetCameraInfo(); // const float screen_height=vi->GetViewportHeight();
const ViewportInfo *vi=GetViewportInfo();
const float screen_height=vi->GetViewportHeight(); // const Vector4f pos=ci->Project(GizmoPosition);
const Vector4f pos=ci->Project(GizmoPosition); // //{
// // Transform tm;
//{ // // tm.SetScale(pos.w*16.0f/screen_height);
// Transform tm;
// tm.SetScale(pos.w*16.0f/screen_height); // // root.SetLocalTransform(tm);
// //}
//}
};//class TestApp:public WorkObject
// root.SetLocalTransform(tm); int os_main(int,os_char **)
//}
root.RefreshMatrix();
render_list->UpdateLocalToWorld();
SceneAppFramework::BuildCommandBuffer(index);
}
};//class TestApp:public SceneAppFramework
int main(int,char **)
{ {
return RunApp<TestApp>(1024,1024); return RunFramework<TestApp>(OS_TEXT("Gizmo"),1280,720);
} }