ULRE/example/Gizmo/GizmoResource.cpp

332 lines
8.8 KiB
C++
Raw Normal View History

2024-07-14 23:49:05 +08:00
#include<hgl/graph/VKMaterialInstance.h>
2024-06-26 01:51:13 +08:00
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneNode.h>
2024-07-14 23:49:05 +08:00
#include"GizmoResource.h"
2024-06-26 01:51:13 +08:00
VK_NAMESPACE_BEGIN
bool InitGizmoMoveStaticMesh();
void ClearGizmoMoveStaticMesh();
2024-07-30 23:54:25 +08:00
bool InitGizmoScaleStaticMesh();
void ClearGizmoScaleStaticMesh();
bool InitGizmoRotateStaticMesh();
void ClearGizmoRotateStaticMesh();
2024-06-26 01:51:13 +08:00
namespace
{
2024-07-28 23:34:04 +08:00
static RenderResource * gizmo_rr=nullptr;
struct GizmoResource
{
Material * mtl;
MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)];
Pipeline * pipeline;
VertexDataManager * vdm;
PrimitiveCreater * prim_creater;
};
static GizmoResource gizmo_line{};
static GizmoResource gizmo_triangle{};
struct GizmoRenderable
{
Primitive *prim;
Renderable *renderable[size_t(GizmoColor::RANGE_SIZE)];
};
GizmoRenderable gizmo_rederable[size_t(GizmoShape::RANGE_SIZE)]{};
void InitGizmoRenderable(const GizmoShape &gs,Primitive *prim,Pipeline *p)
{
if(!prim)
return;
GizmoRenderable *gr=gizmo_rederable+size_t(gs);
gr->prim=prim;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
gr->renderable[i]=CreateRenderable(prim,gizmo_triangle.mi[i],p);
}
2024-07-10 01:14:54 +08:00
bool InitMI(GizmoResource *gr)
{
if(!gr||!gr->mtl)
2024-06-26 01:51:13 +08:00
return(false);
Color4f color;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
{
color=GetColor4f(gizmo_color[i],1.0);
2024-07-10 01:14:54 +08:00
gr->mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color);
if(!gr->mi[i])
2024-06-26 01:51:13 +08:00
return(false);
}
return(true);
}
bool InitGizmoResource2D(VulkanDevice *device)
2024-07-10 01:14:54 +08:00
{
if(!gizmo_rr)
return(false);
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
RenderPass *render_pass=device->GetRenderPass();
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"VertexLuminance3D",PrimitiveType::Lines);
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.local_to_world=true;
2024-07-10 01:14:54 +08:00
cfg.position_format=VAT_VEC3;
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(&cfg);
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
if(!mci)
return(false);
2024-06-26 01:51:13 +08:00
2024-07-14 23:49:05 +08:00
gizmo_line.mtl=gizmo_rr->CreateMaterial(mci);
if(!gizmo_line.mtl)
2024-07-10 01:14:54 +08:00
return(false);
gizmo_line.mtl->Update();
2024-07-10 01:14:54 +08:00
}
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
{
gizmo_line.pipeline=render_pass->CreatePipeline(gizmo_line.mtl,InlinePipeline::Solid3D,PrimitiveType::Lines);
2024-06-26 01:51:13 +08:00
2024-07-14 23:49:05 +08:00
if(!gizmo_line.pipeline)
2024-07-10 01:14:54 +08:00
return(false);
}
2024-06-26 01:51:13 +08:00
2024-07-14 23:49:05 +08:00
if(!InitMI(&gizmo_line))
2024-06-26 01:51:13 +08:00
return(false);
2024-07-10 01:14:54 +08:00
{
2024-07-14 23:49:05 +08:00
gizmo_line.vdm=new VertexDataManager(device,gizmo_line.mtl->GetDefaultVIL());
2024-06-26 01:51:13 +08:00
2024-07-14 23:49:05 +08:00
if(!gizmo_line.vdm)
2024-07-10 01:14:54 +08:00
return(false);
2024-06-26 01:51:13 +08:00
if(!gizmo_line.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
2024-07-10 01:14:54 +08:00
return(false);
}
2024-06-26 01:51:13 +08:00
2024-07-10 01:14:54 +08:00
{
}
return(true);
2024-06-26 01:51:13 +08:00
}
bool InitGizmoResource3D(VulkanDevice *device)
2024-06-26 01:51:13 +08:00
{
2024-07-10 01:14:54 +08:00
if(!gizmo_rr)
2024-06-26 01:51:13 +08:00
return(false);
2024-07-10 01:14:54 +08:00
RenderPass *render_pass=device->GetRenderPass();
2024-06-26 01:51:13 +08:00
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"Gizmo3D",PrimitiveType::Triangles);
2024-07-10 01:14:54 +08:00
cfg.local_to_world=true;
cfg.material_instance=true;
mtl::MaterialCreateInfo *mci=CreateMaterialGizmo3D(&cfg);
2024-07-10 01:14:54 +08:00
if(!mci)
return(false);
2024-07-14 23:49:05 +08:00
gizmo_triangle.mtl=gizmo_rr->CreateMaterial(mci);
if(!gizmo_triangle.mtl)
2024-07-10 01:14:54 +08:00
return(false);
gizmo_triangle.mtl->Update();
}
{
gizmo_triangle.pipeline=render_pass->CreatePipeline(gizmo_triangle.mtl,InlinePipeline::Solid3D,PrimitiveType::Triangles);
2024-07-14 23:49:05 +08:00
if(!gizmo_triangle.pipeline)
2024-07-10 01:14:54 +08:00
return(false);
}
2024-06-26 01:51:13 +08:00
2024-07-14 23:49:05 +08:00
if(!InitMI(&gizmo_triangle))
2024-07-10 01:14:54 +08:00
return(false);
{
2024-07-14 23:49:05 +08:00
gizmo_triangle.vdm=new VertexDataManager(device,gizmo_triangle.mtl->GetDefaultVIL());
2024-07-14 23:49:05 +08:00
if(!gizmo_triangle.vdm)
2024-07-10 01:14:54 +08:00
return(false);
2024-07-28 23:34:04 +08:00
if(!gizmo_triangle.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
2024-07-10 01:14:54 +08:00
return(false);
}
{
2024-07-14 23:49:05 +08:00
gizmo_triangle.prim_creater=new PrimitiveCreater(gizmo_triangle.vdm);
2024-07-14 23:49:05 +08:00
if(!gizmo_triangle.prim_creater)
2024-07-10 01:14:54 +08:00
return(false);
}
{
2024-07-10 01:14:54 +08:00
using namespace inline_geometry;
{
2024-08-30 00:38:40 +08:00
InitGizmoRenderable(GizmoShape::Square,CreatePlaneSqaure(gizmo_triangle.prim_creater),gizmo_triangle.pipeline);
2024-07-10 01:14:54 +08:00
}
{
CircleCreateInfo cci;
cci.center=Vector2f(0,0);
cci.radius=Vector2f(0.5,0.5);
cci.field_count=16;
cci.has_center=false;
InitGizmoRenderable(GizmoShape::Circle,CreateCircle3DByIndexTriangles(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
2024-07-10 01:14:54 +08:00
{
CubeCreateInfo cci;
cci.normal=true;
cci.tangent=false;
cci.tex_coord=false;
2024-07-28 23:34:04 +08:00
InitGizmoRenderable(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
2024-07-10 01:14:54 +08:00
}
{
2024-07-31 00:11:24 +08:00
InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,16),gizmo_triangle.pipeline);
2024-07-10 01:14:54 +08:00
}
{
ConeCreateInfo cci;
cci.radius =GIZMO_CONE_RADIUS; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
2024-07-30 23:54:25 +08:00
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=3; //圆锥高度分割数
2024-07-10 01:14:54 +08:00
2024-07-28 23:34:04 +08:00
InitGizmoRenderable(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
2024-07-10 01:14:54 +08:00
}
{
struct CylinderCreateInfo cci;
cci.halfExtend =1; //圆柱一半高度
2024-07-30 23:54:25 +08:00
cci.numberSlices=16; //圆柱底部分割数
2024-07-10 01:14:54 +08:00
cci.radius =1; //圆柱半径
2024-07-28 23:34:04 +08:00
InitGizmoRenderable(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
2024-07-10 01:14:54 +08:00
}
2024-07-30 23:54:25 +08:00
{
struct TorusCreateInfo tci;
tci.innerRadius=0.975;
tci.outerRadius=1.0;
tci.numberSlices=64;
2024-07-31 00:11:24 +08:00
tci.numberStacks=8;
2024-07-30 23:54:25 +08:00
InitGizmoRenderable(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci),gizmo_triangle.pipeline);
}
2024-07-10 01:14:54 +08:00
ENUM_CLASS_FOR(GizmoShape,int,i)
{
2024-07-28 23:34:04 +08:00
if(!gizmo_rederable[i].prim)
2024-07-10 01:14:54 +08:00
return(false);
}
}
2024-07-10 01:14:54 +08:00
return(true);
}
2024-07-10 01:14:54 +08:00
}//namespace
bool InitGizmoResource(RenderResource *rr)
2024-07-10 01:14:54 +08:00
{
if(!rr)
return(false);
2024-07-10 01:14:54 +08:00
if(gizmo_rr)
return(false);
gizmo_rr=rr;
VulkanDevice *device=gizmo_rr->GetDevice();
2024-07-10 01:14:54 +08:00
if(!InitGizmoResource3D(device))
return(false);
if(!InitGizmoResource2D(device))
return(false);
InitGizmoMoveStaticMesh();
2024-07-30 23:54:25 +08:00
InitGizmoScaleStaticMesh();
InitGizmoRotateStaticMesh();
2024-06-26 01:51:13 +08:00
return(true);
}
2024-07-01 23:31:18 +08:00
void FreeGizmoResource()
{
2024-07-30 23:54:25 +08:00
ClearGizmoRotateStaticMesh();
ClearGizmoScaleStaticMesh();
ClearGizmoMoveStaticMesh();
2024-07-28 23:34:04 +08:00
for(GizmoRenderable &gr:gizmo_rederable)
{
SAFE_CLEAR(gr.prim)
SAFE_CLEAR_OBJECT_ARRAY(gr.renderable)
}
2024-07-14 23:49:05 +08:00
SAFE_CLEAR(gizmo_triangle.prim_creater);
SAFE_CLEAR(gizmo_triangle.vdm);
SAFE_CLEAR(gizmo_line.prim_creater);
SAFE_CLEAR(gizmo_line.vdm);
2024-07-01 23:31:18 +08:00
}
2024-07-28 23:34:04 +08:00
Renderable *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color)
{
if(!gizmo_rr)
return(nullptr);
RANGE_CHECK_RETURN_NULLPTR(shape)
RANGE_CHECK_RETURN_NULLPTR(color)
return gizmo_rederable[size_t(shape)].renderable[size_t(color)];
}
StaticMesh *CreateGizmoStaticMesh(SceneNode *root_node)
{
if(!root_node)
return(nullptr);
if(root_node->IsEmpty())
return(nullptr);
return(new StaticMesh(root_node));
2024-07-28 23:34:04 +08:00
}
2024-07-30 23:54:25 +08:00
VK_NAMESPACE_END