2020-10-21 11:43:18 +08:00
|
|
|
#include<hgl/graph/VKRenderTarget.h>
|
2020-10-19 22:24:51 +08:00
|
|
|
#include<hgl/graph/InlineGeometry.h>
|
2020-10-15 22:13:15 +08:00
|
|
|
#include"VulkanAppFramework.h"
|
|
|
|
|
|
|
|
using namespace hgl;
|
|
|
|
using namespace hgl::graph;
|
|
|
|
|
2021-09-27 14:49:31 +08:00
|
|
|
constexpr uint OFFSCREEN_SIZE =256;
|
2020-10-15 22:13:15 +08:00
|
|
|
constexpr uint SCREEN_WIDTH =1024;
|
|
|
|
constexpr uint SCREEN_HEIGHT =(SCREEN_WIDTH/16)*9;
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
class TestApp:public CameraAppFramework
|
2020-10-17 22:13:08 +08:00
|
|
|
{
|
|
|
|
struct RenderObject
|
|
|
|
{
|
|
|
|
Camera cam;
|
|
|
|
|
2021-09-27 14:49:31 +08:00
|
|
|
MaterialInstance * material_instance =nullptr;
|
2022-10-14 17:52:35 +08:00
|
|
|
DeviceBuffer * ubo_camera_info =nullptr;
|
2020-10-17 22:13:08 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct:public RenderObject
|
|
|
|
{
|
2020-10-21 12:47:06 +08:00
|
|
|
RenderTarget * render_taget =nullptr;
|
2021-09-27 14:49:31 +08:00
|
|
|
RenderCmdBuffer * command_buffer =nullptr;
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2020-10-21 12:47:06 +08:00
|
|
|
Pipeline * pipeline =nullptr;
|
2022-06-24 21:06:38 +08:00
|
|
|
Renderable *renderable =nullptr;
|
2020-10-27 22:43:24 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
bool Submit()
|
|
|
|
{
|
|
|
|
if(!render_taget->Submit(command_buffer))
|
|
|
|
return(false);
|
|
|
|
if(!render_taget->WaitQueue())
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
return(true);
|
|
|
|
}
|
2020-10-17 22:13:08 +08:00
|
|
|
}os;
|
2021-11-30 19:33:01 +08:00
|
|
|
|
2020-10-17 22:13:08 +08:00
|
|
|
struct:public RenderObject
|
|
|
|
{
|
2020-10-21 18:24:00 +08:00
|
|
|
Sampler * sampler =nullptr;
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2020-10-21 12:47:06 +08:00
|
|
|
Pipeline * pipeline =nullptr;
|
2022-06-24 21:06:38 +08:00
|
|
|
Renderable *renderable =nullptr;
|
2020-10-19 22:24:51 +08:00
|
|
|
|
2020-10-21 12:52:32 +08:00
|
|
|
SceneNode scene_root;
|
2021-11-30 19:33:01 +08:00
|
|
|
RenderList * render_list =nullptr;
|
2020-10-19 22:24:51 +08:00
|
|
|
}cube;
|
2020-10-15 22:13:15 +08:00
|
|
|
|
|
|
|
public:
|
|
|
|
|
2020-10-18 18:37:46 +08:00
|
|
|
~TestApp()
|
|
|
|
{
|
2021-09-27 14:49:31 +08:00
|
|
|
SAFE_CLEAR(cube.render_list);
|
|
|
|
SAFE_CLEAR(os.render_taget);
|
2020-10-18 18:37:46 +08:00
|
|
|
}
|
|
|
|
|
2020-10-17 22:13:08 +08:00
|
|
|
bool InitUBO(RenderObject *ro,const VkExtent2D &extent)
|
|
|
|
{
|
|
|
|
ro->cam.width=extent.width;
|
|
|
|
ro->cam.height=extent.height;
|
|
|
|
|
2022-03-09 20:33:26 +08:00
|
|
|
ro->cam.RefreshCameraInfo();
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2021-05-13 17:34:40 +08:00
|
|
|
ro->ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&ro->cam.info);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2021-05-13 17:34:40 +08:00
|
|
|
if(!ro->ubo_camera_info)
|
2020-10-17 22:13:08 +08:00
|
|
|
return(false);
|
2021-09-27 14:49:31 +08:00
|
|
|
|
2022-03-11 19:13:20 +08:00
|
|
|
BindCameraUBO(ro->material_instance);
|
2021-09-27 14:49:31 +08:00
|
|
|
|
2020-10-17 22:13:08 +08:00
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool InitOffscreen()
|
2020-10-15 22:13:15 +08:00
|
|
|
{
|
2021-06-24 19:25:43 +08:00
|
|
|
FramebufferInfo fbi(UPF_RGBA8,OFFSCREEN_SIZE,OFFSCREEN_SIZE);
|
2020-10-27 22:43:24 +08:00
|
|
|
|
2023-03-18 17:58:57 +08:00
|
|
|
os.render_taget=device->CreateRT(&fbi);
|
2020-10-17 22:13:08 +08:00
|
|
|
if(!os.render_taget)return(false);
|
2020-10-27 22:43:24 +08:00
|
|
|
|
2020-10-28 12:30:44 +08:00
|
|
|
os.command_buffer=device->CreateRenderCommandBuffer();
|
2020-10-27 22:43:24 +08:00
|
|
|
if(!os.command_buffer)return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
|
|
|
os.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
|
|
|
|
if(!os.material_instance)return(false);
|
|
|
|
|
2021-09-27 14:49:31 +08:00
|
|
|
os.pipeline=os.render_taget->GetRenderPass()->CreatePipeline(os.material_instance,InlinePipeline::Solid2D,Prim::Fan);
|
2020-10-17 22:13:08 +08:00
|
|
|
if(!os.pipeline)return(false);
|
|
|
|
|
|
|
|
if(!InitUBO(&os,os.render_taget->GetExtent()))
|
|
|
|
return(false);
|
|
|
|
|
|
|
|
{
|
2022-06-24 21:36:24 +08:00
|
|
|
using namespace inline_geometry;
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
CircleCreateInfo cci;
|
|
|
|
|
2021-09-27 14:49:31 +08:00
|
|
|
cci.center=Vector2f(OFFSCREEN_SIZE*0.5,OFFSCREEN_SIZE*0.5);
|
|
|
|
cci.radius=Vector2f(OFFSCREEN_SIZE*0.45,OFFSCREEN_SIZE*0.45);
|
2020-10-19 22:24:51 +08:00
|
|
|
cci.field_count=32;
|
|
|
|
cci.has_color=true;
|
2021-09-27 14:49:31 +08:00
|
|
|
cci.center_color=Vector4f(1,1,1,1);
|
|
|
|
cci.border_color=Vector4f(1,1,1,0);
|
2020-10-19 22:24:51 +08:00
|
|
|
|
2022-10-11 19:16:06 +08:00
|
|
|
Primitive *primitive=CreateCircle(db,os.material_instance->GetVIL(),&cci);
|
2022-06-24 18:00:22 +08:00
|
|
|
if(!primitive)return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2022-06-24 21:06:38 +08:00
|
|
|
os.renderable=db->CreateRenderable(primitive,os.material_instance,os.pipeline);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2022-06-24 21:06:38 +08:00
|
|
|
if(!os.renderable)return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
}
|
|
|
|
|
2022-06-24 21:06:38 +08:00
|
|
|
VulkanApplicationFramework::BuildCommandBuffer(os.command_buffer,os.render_taget,os.renderable);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2020-10-27 22:43:24 +08:00
|
|
|
os.Submit();
|
2020-10-17 22:13:08 +08:00
|
|
|
|
|
|
|
return(true);
|
2020-10-15 22:13:15 +08:00
|
|
|
}
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
bool InitCube()
|
2020-10-15 22:13:15 +08:00
|
|
|
{
|
2021-09-27 14:49:31 +08:00
|
|
|
cube.render_list=new RenderList(device);
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
cube.material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureMask3D"));
|
|
|
|
if(!cube.material_instance)return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2021-09-27 14:49:31 +08:00
|
|
|
cube.pipeline=CreatePipeline(cube.material_instance,InlinePipeline::Solid3D,Prim::Triangles);
|
2020-10-19 22:24:51 +08:00
|
|
|
if(!cube.pipeline)return(false);
|
|
|
|
|
|
|
|
cube.sampler=db->CreateSampler();
|
|
|
|
if(!cube.sampler)return(false);
|
2021-09-27 14:49:31 +08:00
|
|
|
|
2023-02-23 13:25:05 +08:00
|
|
|
if(!cube.material_instance->BindImageSampler(DescriptorSetType::Value,"tex",os.render_taget->GetColorTexture(),cube.sampler))
|
2022-03-11 19:13:20 +08:00
|
|
|
return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2022-06-24 21:36:24 +08:00
|
|
|
{
|
|
|
|
using namespace inline_geometry;
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
CubeCreateInfo cci;
|
|
|
|
|
2022-03-11 19:13:20 +08:00
|
|
|
cci.tex_coord=true;
|
|
|
|
|
2022-10-11 19:16:06 +08:00
|
|
|
Primitive *primitive=CreateCube(db,cube.material_instance->GetVIL(),&cci);
|
2022-06-24 18:00:22 +08:00
|
|
|
if(!primitive)return(false);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2022-06-24 21:06:38 +08:00
|
|
|
cube.renderable=db->CreateRenderable(primitive,cube.material_instance,cube.pipeline);
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2022-06-24 21:06:38 +08:00
|
|
|
cube.scene_root.CreateSubNode(cube.renderable);
|
2020-10-17 22:13:08 +08:00
|
|
|
}
|
2021-09-27 14:49:31 +08:00
|
|
|
|
|
|
|
camera->pos=Vector4f(5,5,5,1.0);
|
2020-10-18 19:12:00 +08:00
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
cube.scene_root.RefreshMatrix();
|
2021-09-27 14:49:31 +08:00
|
|
|
cube.render_list->Expend(GetCameraInfo(),&cube.scene_root);
|
2020-10-18 18:37:46 +08:00
|
|
|
|
2020-10-17 22:13:08 +08:00
|
|
|
return(true);
|
2020-10-15 22:13:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Init()
|
|
|
|
{
|
2022-06-24 21:36:24 +08:00
|
|
|
//if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
|
2020-10-15 22:13:15 +08:00
|
|
|
return(false);
|
|
|
|
|
2020-10-18 19:12:00 +08:00
|
|
|
SetClearColor(COLOR::MozillaCharcoal);
|
|
|
|
|
2020-10-17 22:13:08 +08:00
|
|
|
if(!InitOffscreen())
|
|
|
|
return(false);
|
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
if(!InitCube())
|
2020-10-15 22:13:15 +08:00
|
|
|
return(false);
|
|
|
|
|
|
|
|
return(true);
|
2020-10-19 22:24:51 +08:00
|
|
|
}
|
2020-10-17 22:13:08 +08:00
|
|
|
|
2020-10-19 22:24:51 +08:00
|
|
|
void BuildCommandBuffer(uint32 index)
|
2020-10-17 22:13:08 +08:00
|
|
|
{
|
2021-09-27 14:49:31 +08:00
|
|
|
cube.scene_root.RefreshMatrix();
|
|
|
|
cube.render_list->Expend(GetCameraInfo(),&cube.scene_root);
|
|
|
|
|
|
|
|
VulkanApplicationFramework::BuildCommandBuffer(index,cube.render_list);
|
2020-10-15 22:13:15 +08:00
|
|
|
}
|
2020-10-19 22:24:51 +08:00
|
|
|
};//class TestApp:public CameraAppFramework
|
2020-10-15 22:13:15 +08:00
|
|
|
|
|
|
|
int main(int,char **)
|
|
|
|
{
|
2020-10-17 22:13:08 +08:00
|
|
|
TestApp app;
|
2020-10-15 22:13:15 +08:00
|
|
|
|
|
|
|
if(!app.Init())
|
|
|
|
return(-1);
|
|
|
|
|
|
|
|
while(app.Run());
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|