port auto_instance to new WorkObject/RenderFramework

This commit is contained in:
hyzboy 2025-03-13 23:41:51 +08:00
parent eee00f3c8c
commit 68089e13bc

View File

@ -1,11 +1,10 @@
// 该范例主要演示使用RenderList系统绘制多个三角形并利用RenderList进行排序以及自动合并进行Instance渲染 // 该范例主要演示使用RenderList系统绘制多个三角形并利用RenderList进行排序以及自动合并进行Instance渲染
#include"VulkanAppFramework.h" #include<hgl/WorkManager.h>
#include<hgl/math/Math.h> #include<hgl/math/Math.h>
#include<hgl/graph/PrimitiveCreater.h> #include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKVertexInputConfig.h> #include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h> #include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/RenderList.h>
using namespace hgl; using namespace hgl;
using namespace hgl::graph; using namespace hgl::graph;
@ -31,8 +30,10 @@ constexpr uint8 color_data[VERTEX_COUNT][4]=
{0,0,255,255} {0,0,255,255}
}; };
class TestApp:public VulkanApplicationFramework class TestApp:public WorkObject
{ {
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
private: private:
SceneNode render_root; SceneNode render_root;
@ -48,7 +49,7 @@ private:
bool InitMaterial() bool InitMaterial()
{ {
{ {
mtl::Material2DCreateConfig cfg(device->GetDeviceAttribute(),"VertexColor2D",Prim::Triangles); mtl::Material2DCreateConfig cfg(GetDeviceAttribute(),"VertexColor2D",Prim::Triangles);
cfg.coordinate_system=CoordinateSystem2D::NDC; cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=true; cfg.local_to_world=true;
@ -73,14 +74,11 @@ private:
bool InitVBO() bool InitVBO()
{ {
PrimitiveCreater rpc(device,material_instance->GetVIL()); render_obj=CreateRenderable("Triangle",VERTEX_COUNT,material_instance,pipeline,
{
rpc.Init("Triangle",VERTEX_COUNT); {VAN::Position, VF_V2F, position_data},
{VAN::Color, VF_V4UN8, color_data }
if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data))return(false); });
if(!rpc.WriteVAB(VAN::Color, VF_V4UN8, color_data ))return(false);
render_obj=db->CreateRenderable(&rpc,material_instance,pipeline);
if(!render_obj) if(!render_obj)
return(false); return(false);
@ -90,7 +88,7 @@ private:
for(uint i=0;i<TRIANGLE_NUMBER;i++) for(uint i=0;i<TRIANGLE_NUMBER;i++)
{ {
rad=deg2rad<double>((360/TRIANGLE_NUMBER)*i); //这里一定要加<float>或<float>否则结果用int保存会出现问题 rad=deg2rad<double>((360.0f/double(TRIANGLE_NUMBER))*i); //这里一定要加<float>或<float>否则结果用int保存会出现问题
mat=rotate(rad,Vector3f(0,0,1)); mat=rotate(rad,Vector3f(0,0,1));
render_root.Add(new SceneNode(mat,render_obj)); render_root.Add(new SceneNode(mat,render_obj));
@ -110,33 +108,28 @@ public:
SAFE_CLEAR(render_list); SAFE_CLEAR(render_list);
} }
bool Init(uint w,uint h) TestApp(RenderFramework *rf):WorkObject(rf,rf->GetSwapchainRenderTarget())
{ {
if(!VulkanApplicationFramework::Init(w,h)) render_list=rf->CreateRenderList();
return(false);
render_list=new RenderList(device);
if(!InitMaterial()) if(!InitMaterial())
return(false); return;
if(!InitVBO()) if(!InitVBO())
return(false); return;
BuildCommandBuffer(render_list);
return(true);
} }
void Resize(uint w,uint h)override void Render(double delta_time,graph::RenderCmdBuffer *cmd)override
{ {
VulkanApplicationFramework::Resize(w,h); cmd->SetClearColor(0,clear_color);
BuildCommandBuffer(render_list); cmd->BeginRenderPass();
render_list->Render(cmd);
cmd->EndRenderPass();
} }
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public WorkObject
int main(int,char **) int os_main(int,os_char **)
{ {
return RunApp<TestApp>(SCREEN_WIDTH,SCREEN_HEIGHT); return RunFramework<TestApp>(OS_TEXT("AutoInstance"),1024,1024);
} }