迁移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)
};
bool InitGizmoResource(RenderResource *);
bool InitGizmoResource(RenderFramework *);
void FreeGizmoResource();
Mesh *GetGizmoMesh(const GizmoShape &shape,const GizmoColor &color);
Mesh *GetGizmoMoveMesh();
Mesh *GetGizmoScaleMesh();
Mesh *GetGizmoRotateMesh();
SceneNode *GetGizmoMoveNode();
//SceneNode *GetGizmoScaleMesh();
//SceneNode *GetGizmoRotateMesh();
VK_NAMESPACE_END

View File

@ -25,25 +25,28 @@
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
VK_NAMESPACE_BEGIN
namespace
{
static Mesh *sm_gizmo_move=nullptr;
static SceneNode *sn_gizmo_move=nullptr;
}//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 *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;
@ -97,53 +100,50 @@ bool InitGizmoMoveMesh()
{
tm.SetScale(cylinder_scale);
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.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.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.SetRotation(AxisVector::Y,90);
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.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.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.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
root_node->Add(new SceneNode(tm,cylinder[1])); //Y 向前圆柱
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[1]); //Y 向前圆柱
tm.SetScale(one_scale);
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.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(true);

View File

@ -9,22 +9,24 @@
#include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderFramework.h>
#include"GizmoResource.h"
VK_NAMESPACE_BEGIN
bool InitGizmoMoveMesh();
void ClearGizmoMoveMesh();
bool InitGizmoMoveNode(RenderFramework *);
void ClearGizmoMoveNode();
bool InitGizmoScaleMesh();
void ClearGizmoScaleMesh();
bool InitGizmoRotateMesh();
void ClearGizmoRotateMesh();
//bool InitGizmoScaleMesh();
//void ClearGizmoScaleMesh();
//
//bool InitGizmoRotateMesh();
//void ClearGizmoRotateMesh();
namespace
{
static RenderResource * gizmo_rr=nullptr;
static RenderFramework *render_framework=nullptr;
static RenderResource * gizmo_rr=nullptr;
struct GizmoResource
{
@ -80,12 +82,14 @@ namespace
return(true);
}
bool InitGizmoResource2D(VulkanDevice *device)
bool InitGizmoResource2D()
{
if(!gizmo_rr)
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);
@ -93,7 +97,7 @@ namespace
cfg.local_to_world=true;
cfg.position_format=VAT_VEC3;
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(&cfg);
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(dev_attr,&cfg);
if(!mci)
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)
return(false);
@ -133,25 +137,27 @@ namespace
return(true);
}
bool InitGizmoResource3D(VulkanDevice *device)
bool InitGizmoResource3D()
{
if(!gizmo_rr)
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.material_instance=true;
mtl::MaterialCreateInfo *mci=CreateMaterialGizmo3D(&cfg);
mtl::MaterialCreateInfo *mci=CreateGizmo3D(dev_attr,&cfg);
if(!mci)
return(false);
gizmo_triangle.mtl=gizmo_rr->CreateMaterial(mci);
gizmo_triangle.mtl=gizmo_rr->CreateMaterial("GizmoTriangle",mci);
if(!gizmo_triangle.mtl)
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)
return(false);
}
@ -261,25 +267,24 @@ namespace
}
}//namespace
bool InitGizmoResource(RenderResource *rr)
bool InitGizmoResource(RenderFramework *rf)
{
if(!rr)
if(!rf)
return(false);
if(gizmo_rr)
render_framework=rf;
gizmo_rr=render_framework->GetRenderResource();
VulkanDevice *device=render_framework->GetDevice();
if(!InitGizmoResource3D())
return(false);
gizmo_rr=rr;
VulkanDevice *device=gizmo_rr->GetDevice();
if(!InitGizmoResource3D(device))
if(!InitGizmoResource2D())
return(false);
if(!InitGizmoResource2D(device))
return(false);
InitGizmoMoveMesh();
InitGizmoMoveNode(rf);
//InitGizmoScaleMesh();
//InitGizmoRotateMesh();
@ -290,7 +295,7 @@ void FreeGizmoResource()
{
//ClearGizmoRotateMesh();
//ClearGizmoScaleMesh();
ClearGizmoMoveMesh();
ClearGizmoMoveNode();
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)];
}
Mesh *CreateGizmoMesh(SceneNode *root_node)
{
if(!root_node)
return(nullptr);
if(root_node->IsEmpty())
return(nullptr);
return(new StaticMesh(root_node));
}
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 &);
MeshComponent *CreateGizmoMeshComponent(SceneNode *);
VK_NAMESPACE_END

View File

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