迁移Gizmo3DMove成功可绘制,但是退出崩溃。疑似重复delete
This commit is contained in:
parent
e9c3961aa5
commit
dd2ee57954
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user