116 Commits

Author SHA1 Message Date
d577642533 RenderFramework关联default_scene事件传递 2025-07-27 16:47:12 +08:00
510168e912 CreateComponentInfo代码排版 2025-07-27 16:46:35 +08:00
a27150c9d2 CreateComponentInfo::parent_node改名为owner_node 2025-07-27 13:26:43 +08:00
a165227292 删除SceneNode::bounding_box属性 2025-07-27 07:55:51 +08:00
8c7ed92b14 WorldBoundingBox改为OBB 2025-07-27 07:42:24 +08:00
69ed5eb859 Scene::GetEventDispatcher()改为返回引用而非指针 2025-07-27 07:41:48 +08:00
729ad1e39a SceneNode释构时清除Parent 2025-07-24 02:44:23 +08:00
85020572bc 在SceneNode中增加main_scene数据,每个添加到当前场景的SceneNode,都会同步Scene数据。 2025-07-24 01:28:16 +08:00
f013d8327d SceneNode增加GetEventDispatcher接口 2025-07-18 01:12:19 +08:00
d4643b7427 重新命名EventDispatcher的添加/解决函数 2025-07-17 02:26:00 +08:00
124fd9701f 独立CreateComponentInfo.h 2025-07-15 22:47:27 +08:00
f47a6985fb 改动CAMERA控制事件输入流水线 2025-07-10 00:46:04 +08:00
bab476ff94 RenderDoc版BoundingBox截帧 2025-07-09 21:33:30 +08:00
55f31e5250 新的绑定盒截图 2025-07-09 21:26:34 +08:00
ca2c62fbc0 测试渲染绑定盒正常 2025-07-09 21:26:10 +08:00
b0fd716af9 改用遍历Component法创建BoundingBox 2025-07-09 21:18:11 +08:00
51e043f07d 新的PrimitiveComponent::GetWorldOBBMatrix函数,进一步减少中间计算步骤,直接出OBBMATRIX 2025-07-09 00:45:03 +08:00
c99157e0e5 更改使用OBB取绑定盒 2025-07-09 00:07:18 +08:00
6772ccd4ac 画torus包围盒正确 2025-07-08 23:47:22 +08:00
75dd6a6bc3 修正Torus几何体输出AABB包围盒不正确问题 2025-07-08 23:40:30 +08:00
35f5be16c3 进一步规范PrimitiveComponent/MeshComponent中获取绑定盒的函数名称,并正确渲染OBB。不过没处理旋转。 2025-07-08 13:46:35 +08:00
2ab8528e86 在PrimitiveComponent/MeshComponent实现GetBoundingBox函数 2025-07-08 01:30:02 +08:00
13f4332af1 改进RenderBoundBox范例 2025-07-07 01:28:22 +08:00
e021f30877 Shader生成准备增加WorldPosition 2025-07-07 01:27:25 +08:00
79d86686e8 增加新的RenderBoundBox.cpp测试用例,未完成,但当前版本可渲染。 2025-07-06 18:14:00 +08:00
c12b333337 RenderFramework/WorkObject增加CreateVDM函数 2025-07-06 18:13:22 +08:00
b6167e9f0b VulkanDevice增加IsSupport(IndexType)函数 2025-07-06 18:12:55 +08:00
5cec598a02 BoundingBoxCreateInfo改成构造函数 2025-07-06 15:12:02 +08:00
b8fefea165 RenderFramework增加CreateMaterial和新的CreateMaterialInstance调用封装 2025-07-06 15:11:41 +08:00
6b233e6ed4 增加内嵌PureColor3D材质 2025-07-06 15:10:57 +08:00
63e44d7363 修复gizmo用错材质的问题 2025-07-06 13:29:48 +08:00
d6afed4e8d Gizmo改成使用OverrideMaterial设置颜色 2025-07-06 12:48:02 +08:00
397dffaf50 重载MeshComponent::Duplication 2025-07-06 12:46:10 +08:00
033820c91d MeshComponent增加OverrideMaterial的设计,还未测试。下一步使用Gizmo3DMove来测试override material 2025-07-06 12:09:11 +08:00
2b135b1d24 优化代码、排版、重命名 2025-07-04 11:12:55 +08:00
e87838289a GizmoMoveNode重载Duplication,复制内部需要使用的变量 2025-07-03 10:43:05 +08:00
c7c4a09afa 英文语法修改Registry->Register 2025-07-03 10:16:34 +08:00
7dc7e2b0d7 InputEvent改名为EventDispatch 2025-06-27 03:12:53 +08:00
fee0b8fb7b InputEvent相关函数、变量改名 2025-06-27 02:58:39 +08:00
11385c7b9e layout codes. 2025-06-27 02:46:46 +08:00
f82217763c WorkManager 改从io::WindowEvent派生,SwapchainWorkManager则相应的不再从io::WindowEvent派生 2025-06-27 01:52:15 +08:00
7da6205caf SceneNode构造函数改为新的定义方法 2025-06-27 01:51:28 +08:00
1af89ca37b 创建GizmoMoveNode,在下一版中尝度接收鼠标事件 2025-06-25 02:06:43 +08:00
e2a61e175f 各范例迁移到新的CreateComponent调用 2025-06-25 02:05:57 +08:00
27e5d0bdca Billboard Shader增加可指定正面为顺时针/逆时针 2025-06-25 02:04:36 +08:00
eb2be07ee1 ShaderCreateInfo增加user_data_liost/AddUserData,用于添加自定义数据代码 2025-06-25 02:03:29 +08:00
52509d6f57 建立CreateComponentInfo结构,用于CreateComponent时传递参数 2025-06-25 02:02:51 +08:00
9e74d19220 在SceneNode中添加CreateNode/Duplication/DuplicationChildNodes/DuplicationComponents 2025-06-25 00:10:35 +08:00
f9b6acb56c SceneOrient增加GetSceneMatrix/SetSceneMatrix 2025-06-25 00:09:37 +08:00
c3d9e26cde 增加一些注释说明,部分来自AI 2025-06-24 13:10:42 +08:00
fa7a0fca62 HashCode统一改名为TypeHash 2025-06-24 00:49:18 +08:00
3bcaf0e012 1.ComponentData/Component/ComponentManager增加各种StaticHashCode/GetHashCode.
2.Component增加ChangeData函数
2025-06-24 00:35:35 +08:00
19aee81063 Gizmo资源管理中改为保存MeshComponentData/ComponentDataPtr 2025-06-23 23:53:10 +08:00
5ee42c2ae2 MeshComponentManager::CreateComponent返回值统一改为Component 2025-06-23 23:52:09 +08:00
090f4576e0 增加一些新的COLLISION COMPONENT定义 2025-06-23 18:54:16 +08:00
c69fe080dc 一些无用的代码增加 2025-06-23 02:37:03 +08:00
368056bb96 调整好坐标轴方向以及裁剪面,并增加最简易坐标轴绘制范例 2025-06-18 01:55:53 +08:00
d1a1437e6f 删除废弃不要的范例 2025-06-18 00:38:35 +08:00
15da48eede 部分内置几何体增加BoundingBox数据计算 2025-06-17 01:17:57 +08:00
585fd41966 VKBufferMap::Set改名为Bind,VABMap::SetVAB改名为BindVAB 2025-06-17 00:58:36 +08:00
91b056bacb 定义using SceneNodeList =ObjectList<SceneNode> 2025-06-17 00:42:50 +08:00
7d41722baa ComponentData改用SharedPtr保存,这样在复制Component时,不会对数据产生真正的复制 2025-06-17 00:34:42 +08:00
dd083bb82b 实现了由Component实现的自我复制,而无需关心具体的Component派生类. 2025-06-16 00:28:21 +08:00
a23654c73a 恢复Duplication(SceneNode *),并实现MeshComponent::Duplication...下一步Component::Duplication()改成由基类实现. 2025-06-16 00:02:07 +08:00
dd2ee57954 迁移Gizmo3DMove成功可绘制,但是退出崩溃。疑似重复delete 2025-06-15 23:25:08 +08:00
e9c3961aa5 更新兼容性 2025-06-15 22:59:24 +08:00
dfa0b4033d 迁移CreatePipeline/CreateMaterialInstance/GetPrimitiveCreater到RenderFramework 2025-06-15 22:26:30 +08:00
d384f06ee2 CreatePrimitive/CreateMesh迁移到RenderFramework 2025-06-15 22:03:03 +08:00
93937c0394 CreateComponent函数迁移到RenderFramework 2025-06-15 21:58:07 +08:00
db15096943 重建渲染器时不删除mouse_event,以修正窗口调整大小后mouse_event丢失问题 2025-06-15 21:08:49 +08:00
97040176d6 StaticMeshComponent改为MeshComponent 2025-06-15 17:53:15 +08:00
ec4125776a 准备修复Gizmo 2025-06-15 07:43:13 +08:00
a180970eb6 迁移auto_merge_material_instance,BillboardTest,PlaneGrid3D,RayPicking四个测试范例到新的Component结构 2025-06-15 02:03:38 +08:00
cfda1fceb2 ComponentManager增加自动释放功能 2025-06-15 00:49:23 +08:00
c1420e257d SceneComponent增加了SceneOrient父类,所有SceneComponent增加变换属性 2025-06-14 23:42:50 +08:00
f9675fc1e5 迁移到StaticMeshComponent渲染 2025-06-14 21:05:36 +08:00
92f612f675 改进Component/Manager设计,在WorkObject封装Component相关模板函数,以减化使用部分。当前版本可运行,下一版迁移旧的Renderable渲染到StaticMeshComponent. 2025-06-14 18:47:54 +08:00
edaf5aa3ca 尝试制作StaticMeshComponent 2025-06-14 04:13:49 +08:00
8ee9cdc396 尝试初建StaticMeshComponent 2025-06-14 02:32:15 +08:00
87c150d1bd 准备开始实现StaticMeshComponent 2025-06-12 03:01:50 +08:00
3fd6f98ef7 材质保存来自MaterialCreateInfo传递而来的PrimitiveType信息,并在创建Pipeline时传递.
减少在使用中的第二次手写传递,避免失误。
2025-06-12 00:00:14 +08:00
5935c3140f 黄线也改用V1UN8格式的亮度 2025-06-11 23:22:09 +08:00
f24e4704a1 使用新的prim_line创建方式在RayPicking 2025-06-11 01:17:04 +08:00
709c8be94d 迁移RayPicking范例到新架构上 2025-06-11 01:12:14 +08:00
660d8fff6d RenderResource缓存材质增加HashString以解决同名不同配置冲突问题 2025-06-11 01:11:54 +08:00
0fbe85290b 增加MaterialCreateConfig::ToHashString函数,用于在未来生成区分同一材质不同配置的字串 2025-06-11 01:11:12 +08:00
0c3cc5a320 增加CoordinateSystem2DName和GetCoordinateSystem2DName 2025-06-11 01:10:15 +08:00
3057fc7b6f 传递MouseCoord到WorkObject 2025-06-11 01:05:24 +08:00
73027ffd9a WorkObject增加GetPrimitiveCreater函数,并连带更新BillboardTest/PlaneGrid3D 2025-06-10 23:46:19 +08:00
6635d33461 更新BillboardTest/PlaneGrid3D,支持新的CameraControl::SetPosition/SetTarget,简化初始化设置操作 2025-06-10 23:36:46 +08:00
0170a8d7c6 更新PlaneGrid3D到可运行 2025-06-10 23:11:30 +08:00
b7627f392c RenderFramework接入键盘鼠标控制 2025-06-10 01:34:13 +08:00
3dfb2c65fd 定义UBOInstance,并将ViewportInfo/CameraInfo两个UBO应用迁移到上面 2025-06-09 23:34:31 +08:00
18d391f01e MaterialCreateInfo增加AddUBOStruct封装 2025-06-09 23:01:41 +08:00
784e7f0e0b SBS增加DescriptorSetType数据,未来所有绑定地方使用此参数以避免对不上 2025-06-09 22:52:10 +08:00
b5a5cb16c0 代码排版与补齐未初始化变量 2025-06-09 22:47:54 +08:00
0be9cb3f74 支持新的CameraControl,并实现自动绑定,现BillboardTest已可正常渲染。只是鼠标键盘输入尚未接入 2025-06-07 05:49:07 +08:00
c4720e8cdb WriteMIData数据长度类型调整 2025-06-07 05:45:00 +08:00
272bb4a4b3 IDName定义更新 2025-06-07 05:43:31 +08:00
5b2f2dbb9f 改进命名和注释 2025-06-07 01:39:27 +08:00
304c3a9bf4 为RenderCmdBuffer中的desc_binding增加详细的注释 2025-06-06 23:42:55 +08:00
eeb4492023 增加Camera数据在渲染器中的定义 2025-06-06 23:39:57 +08:00
55204779ba RenderCmdBuffer中记录的DescriptorBinding改为按SetType分类为多个 2025-06-06 23:39:20 +08:00
5e541e2f46 迁移Auto_merge_material_instance.cpp到新架构 2025-06-06 22:20:18 +08:00
2138f9046a RenderResource中的Renderable/RenderableID改名为Mesh/MeshID 2025-06-06 00:28:13 +08:00
a04adb897e draw_triangle_use_UBO迁移到新框架 2025-06-06 00:24:26 +08:00
8436e57ed7 RenderResource中移除static_descriptor/global_descriptor 2025-06-06 00:24:06 +08:00
bc987e7d7b 清除RenderTask/MaterialRenderList多余代码 2025-06-06 00:23:27 +08:00
427340132f VABList数据写入增加越界检查 2025-06-06 00:22:45 +08:00
f762d77b1d [OK] AutoInstance 范例完成迁移并测试成功。新结构下不再需要自己管理RenderList/SceneRoot。接下来请迁移其它范例。 2025-06-04 01:09:05 +08:00
118ee6e570 变量改名 2025-06-04 00:18:32 +08:00
520b7cae9e SceneWorld文件改名为Scene 2025-06-04 00:10:27 +08:00
839e187cb2 临时可运行版本。已将SceneWorld改名为Scene,下一步改文件名。并将default_scene,default_renderer放在RenderFramework中 2025-06-04 00:04:46 +08:00
5c186fdb95 [WIP] Renderer/RenderTask 2025-05-30 00:32:45 +08:00
8f1b891f9e 初步定义RenderTask 2025-05-28 02:27:59 +08:00
75da8cabef 建立最基础的SceneWorldManager 2025-05-22 01:42:16 +08:00
140 changed files with 5049 additions and 3341 deletions

2
CMCore

Submodule CMCore updated: 511dd86c56...0ed44f0531

2
CMUtil

Submodule CMUtil updated: 6173c16bf1...7a72b077e8

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 299 KiB

View File

@@ -12,6 +12,8 @@
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/module/TextureManager.h>
#include<hgl/graph/FirstPersonCameraControl.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@@ -32,10 +34,6 @@ class TestApp:public WorkObject
private:
AutoDelete<RenderList> render_list =nullptr;
SceneNode render_root;
Material * mtl_plane_grid =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * pipeline_plane_grid =nullptr;
@@ -69,7 +67,7 @@ private:
mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color);
if(!mi_plane_grid)return(false);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,PrimitiveType::Lines);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D);
if(!pipeline_plane_grid)return(false);
}
@@ -86,7 +84,7 @@ private:
mi_billboard=CreateMaterialInstance(mtl::inline_material::Billboard2D,&cfg);
if(!mi_billboard)return(false);
pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D,PrimitiveType::Billboard);
pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D);
if(!pipeline_billboard)return(false);
}
@@ -115,27 +113,12 @@ private:
return(true);
}
Mesh *Add(Primitive *r,MaterialInstance *mi,Pipeline *p)
{
Mesh *ri=db->CreateMesh(r,mi,p);
if(!ri)
{
LOG_ERROR(OS_TEXT("Create Mesh failed."));
return(nullptr);
}
render_root.Add(new SceneNode(ri));
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
PrimitiveCreater pc(GetDevice(),mi_plane_grid->GetVIL());
auto pc=GetPrimitiveCreater(mi_plane_grid);
struct PlaneGridCreateInfo pgci;
@@ -145,18 +128,18 @@ private:
pgci.lum=128;
pgci.sub_lum=192;
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
}
{
PrimitiveCreater pc(GetDevice(),mi_billboard->GetVIL());
auto pc=GetPrimitiveCreater(mi_billboard);
pc.Init("Billboard",1);
pc->Init("Billboard",1);
if(!pc.WriteVAB(VAN::Position,VF_V3F,position_data))
if(!pc->WriteVAB(VAN::Position,VF_V3F,position_data))
return(false);
ro_billboard=db->CreateMesh(&pc,mi_billboard,pipeline_billboard);
ro_billboard=db->CreateMesh(pc,mi_billboard,pipeline_billboard);
if(!ro_billboard)
return(false);
@@ -167,16 +150,15 @@ private:
bool InitScene()
{
Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
CreateComponentInfo cci(GetSceneRoot());
render_root.Add(new SceneNode(ro_billboard));
CreateComponent<MeshComponent>(&cci,db->CreateMesh(prim_plane_grid,mi_plane_grid,pipeline_plane_grid));
CreateComponent<MeshComponent>(&cci,ro_billboard);
camera->pos=Vector3f(32,32,32);
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
@@ -190,8 +172,8 @@ public:
SAFE_CLEAR(prim_plane_grid);
}
bool Init()
{
bool Init() override
{
if(!InitPlaneGridMP())
return(false);
@@ -213,5 +195,5 @@ public:
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("AutoInstance"),1024,1024);
return RunFramework<TestApp>(OS_TEXT("Billboard"),1280,720);
}

View File

@@ -11,10 +11,10 @@
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Basic")
endmacro()
CreateProject(00_RenderFrameworkTest rf_test.cpp)
CreateProject(01_draw_triangle_in_NDC draw_triangle_in_NDC.cpp)
CreateProject(02_draw_triangle_use_UBO draw_triangle_use_UBO.cpp)
CreateProject(03_auto_instance auto_instance.cpp)
CreateProject(04_auto_merge_material_instance auto_merge_material_instance.cpp)
CreateProject(01_draw_triangle draw_triangle_use_UBO.cpp)
CreateProject(02_auto_instance auto_instance.cpp)
CreateProject(03_auto_merge_material_instance auto_merge_material_instance.cpp)
CreateProject(05_Billboard BillboardTest.cpp)
CreateProject(04_Billboard BillboardTest.cpp)
CreateProject(05_RenderBoundBox RenderBoundBox.cpp)

View File

@@ -0,0 +1,361 @@
#include<hgl/WorkManager.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/FirstPersonCameraControl.h>
#include<hgl/color/Color.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
constexpr const COLOR TestColor[]=
{
COLOR::MozillaCharcoal,
COLOR::MozillaSand,
COLOR::BlenderAxisRed,
COLOR::BlenderAxisGreen,
COLOR::BlenderAxisBlue,
COLOR::BananaYellow,
COLOR::CherryBlossomPink
};
constexpr const size_t COLOR_COUNT=sizeof(TestColor)/sizeof(COLOR);
class TestApp:public WorkObject
{
private:
struct MaterialData
{
Material * material = nullptr;
const VIL * vil = nullptr;
Pipeline * pipeline = nullptr;
MaterialInstance * mi[COLOR_COUNT]{};
};
MaterialData solid;
MaterialData wire;
VertexDataManager * mesh_vdm=nullptr;
struct RenderMesh
{
Primitive *prim;
Mesh *mesh;
MeshComponentData *data;
ComponentDataPtr cdp;
MeshComponent *component;
public:
~RenderMesh()
{
cdp.unref();
delete mesh;
delete prim;
}
};
RenderMesh *rm_plane=nullptr,
*rm_sphere=nullptr,
*rm_cone=nullptr,
*rm_cylinder=nullptr,
*rm_torus=nullptr,
*rm_box=nullptr;
private:
bool InitMaterialInstance(MaterialData *md)
{
if(!md)
return(false);
Color4f color;
for(size_t i=0;i<COLOR_COUNT;i++)
{
color=GetColor4f(TestColor[i],1.0);
md->mi[i]=CreateMaterialInstance(md->material,nullptr,&color);
if(!md->mi[i])
return(false);
}
md->vil=md->material->GetDefaultVIL();
if(!md->vil)
return(false);
md->pipeline=CreatePipeline(md->material,InlinePipeline::Solid3D);
return md->pipeline;
}
bool InitSolidMDP()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Triangles);
mtl::MaterialCreateInfo *mci=mtl::CreateGizmo3D(GetDevAttr(),&cfg);
if(!mci)
return(false);
solid.material=CreateMaterial("Gizmo3D",mci);
return InitMaterialInstance(&solid);
}
bool InitWireMDP()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
mtl::MaterialCreateInfo *mci=mtl::CreatePureColor3D(GetDevAttr(),&cfg);
if(!mci)
return(false);
wire.material=CreateMaterial("PureColorLine3D",mci);
return InitMaterialInstance(&wire);
}
bool InitVDM()
{
mesh_vdm=CreateVDM(solid.vil,HGL_SIZE_1MB);
if(!mesh_vdm)
return(false);
return true;
}
RenderMesh *CreateRenderMesh(Primitive *prim,MaterialData *md,const int color)
{
if(!prim)
return(nullptr);
Mesh *mesh=graph::CreateMesh(prim,md->mi[color],md->pipeline);
if(!mesh)
return nullptr;
RenderMesh *rm=new RenderMesh;
rm->prim=prim;
rm->mesh=mesh;
rm->data=new MeshComponentData(mesh);
rm->cdp =rm->data;
return rm;
}
bool CreateGeometryMesh()
{
using namespace inline_geometry;
PrimitiveCreater *prim_creater=new PrimitiveCreater(mesh_vdm);
if(!prim_creater)
return(false);
rm_plane=CreateRenderMesh(CreatePlaneSqaure(prim_creater),&solid,0);
//Sphere
rm_sphere=CreateRenderMesh(CreateSphere(prim_creater,64),&solid,1);
//Cone
{
struct ConeCreateInfo cci;
cci.radius =1; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=64; //圆锥底部分割数
cci.numberStacks=4; //圆锥高度分割数
rm_cone=CreateRenderMesh(CreateCone(prim_creater,&cci),&solid,2);
}
//Cyliner
{
struct CylinderCreateInfo cci;
cci.halfExtend =1.25; //圆柱一半高度
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1.25f; //圆柱半径
rm_cylinder=CreateRenderMesh(CreateCylinder(prim_creater,&cci),&solid,3);
}
//Torus
{
struct TorusCreateInfo tci;
tci.innerRadius=1.9;
tci.outerRadius=2.1;
tci.numberSlices=128;
tci.numberStacks=16;
rm_torus=CreateRenderMesh(CreateTorus(prim_creater,&tci),&solid,4);
}
delete prim_creater;
return(true);
}
bool CreateBoundingBoxMesh()
{
using namespace inline_geometry;
auto pc=GetPrimitiveCreater(wire.material);
inline_geometry::BoundingBoxCreateInfo bbci;
rm_box=CreateRenderMesh(CreateBoundingBox(pc,&bbci),&wire,5);
return rm_box;
}
bool InitScene()
{
CreateComponentInfo cci(GetSceneRoot());
{
cci.mat=AxisZRotate(45.0f)*ScaleMatrix(10,10,1);
rm_plane->component=CreateComponent<MeshComponent>(&cci,rm_plane->cdp);
}
{
cci.mat=TranslateMatrix(0,0,0.2)*AxisYRotate(deg2rad(90.0f));
rm_torus->component=CreateComponent<MeshComponent>(&cci,rm_torus->cdp);
rm_torus->component->SetOverrideMaterial(solid.mi[1]);
}
{
cci.mat=TranslateMatrix(0,0,1);
rm_cone->component=CreateComponent<MeshComponent>(&cci,rm_cone->cdp);
rm_cone->component->SetOverrideMaterial(solid.mi[2]);
}
{
cci.mat=TranslateMatrix(5,0,3)*AxisRotate(deg2rad(30),20,30,40);
rm_cylinder->component=CreateComponent<MeshComponent>(&cci,rm_cylinder->cdp);
rm_cylinder->component->SetOverrideMaterial(solid.mi[3]);
}
{
cci.mat=TranslateMatrix(0,0,4);
rm_sphere->component=CreateComponent<MeshComponent>(&cci,rm_sphere->cdp);
rm_sphere->component->SetOverrideMaterial(solid.mi[4]);
}
return(true);
}
bool InitBoundingBoxScene()
{
SceneNode *root=GetSceneRoot();
CreateComponentInfo cci(root);
ArrayList<Matrix4f> box_matrices;
for(Component *c:root->GetComponents())
{
if(c->GetTypeHash()!=MeshComponent::StaticTypeHash())
continue;
MeshComponent *component=(MeshComponent *)c;
Matrix4f mat;
if(component->GetWorldOBBMatrix(mat))
box_matrices.Add(mat);
}
//不可以直接在上面的循环中创建新的Component因为循环本身就要读取Component列表
for(const Matrix4f &mat:box_matrices)
{
cci.mat=mat;
if(!CreateComponent<MeshComponent>(&cci,rm_box->cdp))
return(false);
}
return(true);
}
void SetCamera()
{
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(8,8,8));
camera_control->SetTarget(Vector3f(0,0,0));
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(rm_box)
SAFE_CLEAR(rm_torus)
SAFE_CLEAR(rm_cylinder)
SAFE_CLEAR(rm_cone)
SAFE_CLEAR(rm_sphere)
SAFE_CLEAR(rm_plane)
SAFE_CLEAR(mesh_vdm)
}
bool Init() override
{
if(!InitSolidMDP())
return(false);
if(!InitWireMDP())
return(false);
if(!InitVDM())
return(false);
if(!CreateGeometryMesh())
return(false);
if(!CreateBoundingBoxMesh())
return(false);
if(!InitScene())
return(false);
if(!InitBoundingBoxScene())
return(false);
SetCamera();
return(true);
}
};//class TestApp:public CameraAppFramework
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("Render Bounding Box"),1280,720);
}

View File

@@ -5,6 +5,7 @@
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@@ -29,14 +30,8 @@ constexpr uint8 color_data[VERTEX_COUNT][4]=
class TestApp:public WorkObject
{
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
private:
AutoDelete<RenderList> render_list =nullptr;
SceneNode render_root;
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
@@ -62,7 +57,7 @@ private:
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
@@ -79,20 +74,17 @@ private:
return(false);
double rad;
Matrix4f mat;
CreateComponentInfo cci(GetSceneRoot());
for(uint i=0;i<TRIANGLE_NUMBER;i++)
{
rad=deg2rad<double>((360.0f/double(TRIANGLE_NUMBER))*i); //这里一定要加<float>或<float>否则结果用int保存会出现问题
mat=rotate(rad,Vector3f(0,0,1));
rad=deg2rad<double>((360.0f/double(TRIANGLE_NUMBER))*i); //这里一定要加<double>或<float>否则结果用int保存会出现问题
cci.mat=rotate(rad,Vector3f(0,0,1));
render_root.Add(new SceneNode(mat,render_obj));
CreateComponent<MeshComponent>(&cci,render_obj);
}
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
@@ -102,10 +94,7 @@ public:
bool Init() override
{
render_list=GetRenderFramework()->CreateRenderList();
if(!render_list)
return(false);
GetRenderer()->SetClearColor(Color4f(0.2f,0.2f,0.2f,1.0f));
if(!InitMaterial())
return(false);
@@ -115,15 +104,6 @@ public:
return(true);
}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)override
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
render_list->Render(cmd);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)

View File

@@ -5,6 +5,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/color/Color.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@@ -25,20 +26,12 @@ constexpr double TRI_ROTATE_ANGLE=360.0f/DRAW_OBJECT_COUNT;
class TestApp:public WorkObject
{
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
private:
AutoDelete<RenderList> render_list =nullptr;
SceneNode render_root;
Material * material =nullptr;
struct
{
MaterialInstance * mi;
Mesh * mesh;
Mesh * mesh;
}render_obj[DRAW_OBJECT_COUNT]{};
Pipeline * pipeline =nullptr;
@@ -73,7 +66,7 @@ private:
}
}
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,PrimitiveType::Triangles);
pipeline=CreatePipeline(material,InlinePipeline::Solid2D);
return pipeline;
}
@@ -88,7 +81,7 @@ private:
db->Add(prim);
Matrix4f mat;
CreateComponentInfo cci(GetSceneRoot());
for(uint i=0;i<DRAW_OBJECT_COUNT;i++)
{
@@ -97,15 +90,11 @@ private:
if(!render_obj[i].mesh)
return(false);
mat=rotate(deg2rad<double>(TRI_ROTATE_ANGLE*i),AxisVector::Z);
cci.mat=rotate(deg2rad<double>(TRI_ROTATE_ANGLE*i),AxisVector::Z);
render_root.Add(new SceneNode(mat,render_obj[i].mesh));
CreateComponent<MeshComponent>(&cci,render_obj[i].mesh);
}
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
@@ -115,11 +104,6 @@ public:
bool Init() override
{
render_list=GetRenderFramework()->CreateRenderList();
if(!render_list)
return(false);
if(!InitMaterial())
return(false);
@@ -128,15 +112,6 @@ public:
return(true);
}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)override
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
render_list->Render(cmd);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)

View File

@@ -1,156 +0,0 @@
// 该范例主要演示使用NDC坐标系直接绘制一个渐变色的三角形
#include<hgl/WorkManager.h>
#include<hgl/math/HalfFloat.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
constexpr uint32_t VERTEX_COUNT=3;
constexpr float position_data_float[VERTEX_COUNT*2]=
{
0.0, -0.5,
-0.5, 0.5,
0.5, 0.5
};
#define USE_HALF_FLOAT_POSITION
#ifdef USE_HALF_FLOAT_POSITION
constexpr VkFormat PositionFormat=VF_V2HF;
half_float position_data_hf[VERTEX_COUNT*2];
#define position_data position_data_hf
#else
constexpr VkFormat PositionFormat=VF_V2F;
#define position_data position_data_float
#endif//USE_HALF_FLOAT_POSITION
#define USE_UNORM8_COLOR
#ifdef USE_UNORM8_COLOR
constexpr uint8 color_data[VERTEX_COUNT*4]=
{
255,0,0,255,
0,255,0,255,
0,0,255,255
};
constexpr VkFormat ColorFormat=VF_V4UN8;
#else
constexpr float color_data[VERTEX_COUNT*4]=
{
1,0,0,1,
0,1,0,1,
0,0,1,1
};
constexpr VkFormat ColorFormat=VF_V4F;
#endif//USE_UNORM8_COLOR
class TestApp:public WorkObject
{
private:
Color4f clear_color=Color4f(0.2f,0.2f,0.2f,1.0f);
#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR)
VILConfig vil_config;
#endif
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
void InitVIL()
{
#ifdef USE_HALF_FLOAT_POSITION
vil_config.Add(VAN::Position,PositionFormat);
#endif//USE_HALF_FLOAT_POSITION
#ifdef USE_UNORM8_COLOR
vil_config.Add(VAN::Color,ColorFormat);
#endif//USE_HALF_FLOAT_POSITION
}
bool InitAutoMaterial()
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::NDC,
mtl::WithLocalToWorld::Without);
material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config);
return material_instance;
}
bool InitPipeline()
{
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
#ifdef USE_HALF_FLOAT_POSITION
Float32toFloat16(position_data_hf,position_data_float,VERTEX_COUNT*2);
#endif//USE_HALF_FLOAT_POSITION
render_obj=CreateMesh("Triangle",VERTEX_COUNT,material_instance,pipeline,
{
{VAN::Position,PositionFormat,position_data},
{VAN::Color, ColorFormat, color_data}
});
return(render_obj);
}
public:
using WorkObject::WorkObject;
bool Init() override
{
InitVIL();
if(!InitAutoMaterial())
return(false);
if(!InitPipeline())
return(false);
if(!InitVBO())
return(false);
return(true);
}
void Tick(double)override{}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
cmd->Render(render_obj);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("Draw triangle in NDC space"));
}

View File

@@ -5,6 +5,8 @@
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@@ -35,10 +37,8 @@ class TestApp:public WorkObject
{
private:
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Mesh * mesh_triangle =nullptr;
Pipeline * pipeline =nullptr;
@@ -48,7 +48,7 @@ private:
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::Ortho,
mtl::WithLocalToWorld::Without);
mtl::WithLocalToWorld::With);
VILConfig vil_config;
@@ -66,14 +66,14 @@ private:
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
const auto ext=GetExtent2D();
const auto ext=GetExtent();
for(uint i=0;i<VERTEX_COUNT;i++)
{
@@ -81,12 +81,18 @@ private:
position_data[i][1]=position_data_float[i][1]*ext.height;
}
render_obj=CreateMesh("Triangle",VERTEX_COUNT,material_instance,pipeline,
mesh_triangle=CreateMesh("Triangle",VERTEX_COUNT,material_instance,pipeline,
{
{VAN::Position,POSITION_DATA_FORMAT,position_data},
{VAN::Color, COLOR_DATA_FORMAT, color_data}
});
return(render_obj);
if(!mesh_triangle)
return(false);
CreateComponentInfo cci(GetSceneRoot());
return CreateComponent<MeshComponent>(&cci,mesh_triangle); //创建一个静态网格组件
}
public:
@@ -103,15 +109,6 @@ public:
return(true);
}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)override
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
cmd->Render(render_obj);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)

View File

@@ -1,105 +0,0 @@
#include<hgl/WorkManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
constexpr uint32_t VERTEX_COUNT=3;
constexpr float position_data[VERTEX_COUNT*2]=
{
0.0, -0.5,
-0.5, 0.5,
0.5, 0.5
};
constexpr float color_data[VERTEX_COUNT*4]=
{
1,0,0,1,
0,1,0,1,
0,0,1,1
};
class TestApp:public WorkObject
{
private:
Color4f clear_color =Color4f(0.2f,0.2f,0.2f,1.0f);
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitAutoMaterial()
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::NDC,
mtl::WithLocalToWorld::Without);
material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg); //这个是使用名称创建
return material_instance;
}
bool InitPipeline()
{
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
render_obj=CreateMesh("Triangle",VERTEX_COUNT,material_instance,pipeline,
{
{VAN::Position,VF_V2F,position_data},
{VAN::Color, VF_V4F,color_data}
});
return(render_obj);
}
public:
using WorkObject::WorkObject;
bool Init() override
{
if(!InitAutoMaterial())
return(false);
if(!InitPipeline())
return(false);
if(!InitVBO())
return(false);
return(true);
}
void Tick(double)override{}
void Render(double delta_time,graph::RenderCmdBuffer *cmd)
{
cmd->SetClearColor(0,clear_color);
cmd->BeginRenderPass();
cmd->Render(render_obj);
cmd->EndRenderPass();
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("RenderFramework Test"));
}

View File

@@ -1,30 +0,0 @@
// Blender axis
/**
* 0 1 2 3 4 5 6 7
* 0+---------->>>> X
* 1|
* 2|
* 3| +--+
* 4| +--+
* 5|
* 6V
* 7V
*
* 坐标轴参考Blender设计
*
* 单方向坐标轴长度为8
* 最终箭头长度为2
*
* 负责2D平移的方块尺寸为1位置在3-4
*
*/
/**
* 缩放工具
*/
class GizmoScale
{
public:
};//class GizmoScale

View File

@@ -10,16 +10,15 @@
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Gizmo")
endmacro()
CreateProject(01_PlaneGrid3D PlaneGrid3D.cpp)
CreateProject(02_RayPicking RayPicking.cpp)
CreateProject(03_MetricCellsGrid MetricCellsGrid.cpp)
CreateProject(01_SimplestAxis SimplestAxis.cpp)
CreateProject(02_PlaneGrid3D PlaneGrid3D.cpp)
CreateProject(03_RayPicking RayPicking.cpp)
CreateProject(04_Gizmo3DTest GizmoTest.cpp
Gizmo.h
GizmoResource.h
GizmoResource.cpp
Gizmo3DMove.cpp
Gizmo3DScale.cpp
Gizmo3DRotate.cpp)
#CreateProject(03_BlenderAxis BlenderAxis.cpp)
#Gizmo3DScale.cpp
#Gizmo3DRotate.cpp
)

View File

@@ -1,6 +1,7 @@
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/component/Component.h>
VK_NAMESPACE_BEGIN
@@ -31,13 +32,14 @@ enum class GizmoShape:uint
ENUM_CLASS_RANGE(Square,Torus)
};
bool InitGizmoResource(RenderResource *);
bool InitGizmoResource(RenderFramework *);
void FreeGizmoResource();
Mesh *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color);
MaterialInstance *GetGizmoMI3D(const GizmoColor &);
ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape);
StaticMesh *GetGizmoMoveStaticMesh();
StaticMesh *GetGizmoScaleStaticMesh();
StaticMesh *GetGizmoRotateStaticMesh();
SceneNode *GetGizmoMoveNode();
//SceneNode *GetGizmoScaleMesh();
//SceneNode *GetGizmoRotateMesh();
VK_NAMESPACE_END

View File

@@ -25,127 +25,185 @@
#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>
#include<hgl/io/event/MouseEvent.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_move=nullptr;
}//namespace
StaticMesh *GetGizmoMoveStaticMesh()
{
return sm_gizmo_move;
}
void ClearGizmoMoveStaticMesh()
{
SAFE_CLEAR(sm_gizmo_move);
}
bool InitGizmoMoveStaticMesh()
{
Mesh *sphere=GetGizmoRenderable(GizmoShape::Sphere,GizmoColor::White);
Mesh *cylinder[3]
/**
* 移动 Gizmo 节点
*/
class GizmoMoveNode:public SceneNode,io::MouseEvent
{
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue),
};
Mesh *cone[3]
{
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cone,GizmoColor::Blue),
};
Mesh *circle[3]=
{
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Circle,GizmoColor::Blue)
};
if(!sphere)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cone[i])
return(false);
if(!circle[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
root_node->Add(new SceneNode(sphere));
struct GizmoMoveAxis
{
Transform tm;
MeshComponent *cylinder; //圆柱
MeshComponent *cone; //圆锥
MeshComponent *square; //双轴调节正方形
};
const Vector3f one_scale(1);
const Vector3f circle_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
MeshComponent *sphere=nullptr;
GizmoMoveAxis axis[3]{}; //X,Y,Z 三个轴
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
root_node->Add(new SceneNode(tm,cylinder[2])); //Z 向上圆柱
public:
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
root_node->Add(new SceneNode(tm,cone[2])); //Z 向上圆锥
using SceneNode::SceneNode;
tm.SetScale(circle_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
root_node->Add(new SceneNode(tm,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 向右圆柱
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
root_node->Add(new SceneNode(tm,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]));
}
{
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.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
root_node->Add(new SceneNode(tm,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]));
}
io::EventDispatcher *GetEventDispatcher() override
{
return this; // GizmoMoveNode 处理鼠标事件
}
sm_gizmo_move=CreateGizmoStaticMesh(root_node);
}
SceneNode *CreateNode()const override
{
return(new GizmoMoveNode);
}
if(!sm_gizmo_move)
SceneNode *Duplication()const override
{
GizmoMoveNode *new_gmn=(GizmoMoveNode *)SceneNode::Duplication();
if(!new_gmn)
return(nullptr);
new_gmn->sphere=sphere;
hgl_cpy(new_gmn->axis,axis);
return new_gmn;
}
bool CreateGizmoGeometry(RenderFramework *render_framework)
{
ComponentDataPtr SpherePtr =GetGizmoMeshCDP(GizmoShape::Sphere);
ComponentDataPtr CylinderPtr=GetGizmoMeshCDP(GizmoShape::Cylinder);
ComponentDataPtr ConePtr =GetGizmoMeshCDP(GizmoShape::Cone);
ComponentDataPtr SquarePtr =GetGizmoMeshCDP(GizmoShape::Square);
if(!SpherePtr )return(false);
if(!CylinderPtr )return(false);
if(!ConePtr )return(false);
if(!SquarePtr )return(false);
CreateComponentInfo cci(this);
sphere=render_framework->CreateComponent<MeshComponent>(&cci,SpherePtr); //中心球
sphere->SetOverrideMaterial(GetGizmoMI3D(GizmoColor::White)); //白色
{
Transform tm;
GizmoMoveAxis *gma;
MaterialInstance *mi=nullptr;
const Vector3f one_scale(1);
const Vector3f square_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
{
gma=axis+size_t(AXIS::Z);
mi=GetGizmoMI3D(GizmoColor::Blue);
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //Z 向上圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z 向上圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
}
{
gma=axis+size_t(AXIS::X);
mi=GetGizmoMI3D(GizmoColor::Red);
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //X 向右圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z 向上圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
}
{
gma=axis+size_t(AXIS::Y);
mi=GetGizmoMI3D(GizmoColor::Green);
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
cci.mat=tm;
gma->cylinder=render_framework->CreateComponent<MeshComponent>(&cci,CylinderPtr); //X 向右圆柱
gma->cylinder->SetOverrideMaterial(mi);
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
cci.mat=tm;
gma->cone=render_framework->CreateComponent<MeshComponent>(&cci,ConePtr); //Z 向上圆锥
gma->cone->SetOverrideMaterial(mi);
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm;
gma->square=render_framework->CreateComponent<MeshComponent>(&cci,SquarePtr);
gma->square->SetOverrideMaterial(mi);
}
}
return(true);
}
};//class GizmoMoveNode:public SceneNode
static GizmoMoveNode *sn_gizmo_move=nullptr;
}//namespace
SceneNode *GetGizmoMoveNode()
{
return sn_gizmo_move;
}
void ClearGizmoMoveNode()
{
SAFE_CLEAR(sn_gizmo_move);
}
bool InitGizmoMoveNode(RenderFramework *render_framework)
{
if(sn_gizmo_move)
return(false);
sn_gizmo_move=new GizmoMoveNode;
if(!sn_gizmo_move->CreateGizmoGeometry(render_framework))
{
delete sn_gizmo_move;
sn_gizmo_move=nullptr;
return(false);
}
return(true);
}

View File

@@ -24,11 +24,11 @@ bool InitGizmoRotateStaticMesh()
{
Mesh *torus[4]
{
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Blue),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Blue),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::White),
};
for(auto *r:torus)

View File

@@ -45,26 +45,26 @@ void ClearGizmoScaleStaticMesh()
bool InitGizmoScaleStaticMesh()
{
Mesh *center_cube=GetGizmoRenderable(GizmoShape::Cube,GizmoColor::White);
Mesh *center_cube=GetGizmoMesh(GizmoShape::Cube,GizmoColor::White);
Mesh *cylinder[3]
{
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Blue),
};
Mesh *cube[3]
{
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Blue),
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Blue),
};
Mesh *square[3]=
{
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Blue)
GetGizmoMesh(GizmoShape::Square,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Blue)
};
if(!center_cube)

View File

@@ -9,56 +9,74 @@
#include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
#include"GizmoResource.h"
VK_NAMESPACE_BEGIN
bool InitGizmoMoveStaticMesh();
void ClearGizmoMoveStaticMesh();
bool InitGizmoMoveNode(RenderFramework *);
void ClearGizmoMoveNode();
bool InitGizmoScaleStaticMesh();
void ClearGizmoScaleStaticMesh();
bool InitGizmoRotateStaticMesh();
void ClearGizmoRotateStaticMesh();
//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
{
Material * mtl;
MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)];
Pipeline * pipeline;
VertexDataManager * vdm;
Material * mtl;
MaterialInstance * mi[size_t(GizmoColor::RANGE_SIZE)];
Pipeline * pipeline;
VertexDataManager * vdm;
PrimitiveCreater * prim_creater;
PrimitiveCreater * prim_creater;
};
static GizmoResource gizmo_line{};
static GizmoResource gizmo_triangle{};
struct GizmoRenderable
struct GizmoMesh
{
Primitive *prim;
Mesh *renderable[size_t(GizmoColor::RANGE_SIZE)];
};
GizmoRenderable gizmo_rederable[size_t(GizmoShape::RANGE_SIZE)]{};
Mesh *mesh;
MeshComponentData *mcd;
ComponentDataPtr cdp;
void InitGizmoRenderable(const GizmoShape &gs,Primitive *prim,Pipeline *p)
public:
void Create(Primitive *p)
{
prim=p;
mesh=CreateMesh(prim,gizmo_triangle.mi[0],gizmo_triangle.pipeline);
mcd=new MeshComponentData(mesh);
cdp=mcd;
}
void Clear()
{
SAFE_CLEAR(mesh);
cdp.unref();
SAFE_CLEAR(prim)
}
};//class GizmoMesh
GizmoMesh gizmo_mesh[size_t(GizmoShape::RANGE_SIZE)]{};
void InitGizmoMesh(const GizmoShape &gs,Primitive *prim)
{
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]=CreateMesh(prim,gizmo_triangle.mi[i],p);
gizmo_mesh[size_t(gs)].Create(prim);
}
bool InitMI(GizmoResource *gr)
@@ -73,6 +91,7 @@ namespace
color=GetColor4f(gizmo_color[i],1.0);
gr->mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color);
if(!gr->mi[i])
return(false);
}
@@ -80,26 +99,27 @@ 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(device->GetDevAttr(),"VertexLuminance3D",PrimitiveType::Lines);
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
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);
gizmo_line.mtl=gizmo_rr->CreateMaterial(mci);
gizmo_line.mtl=gizmo_rr->CreateMaterial("GizmoLine",mci);
if(!gizmo_line.mtl)
return(false);
@@ -107,7 +127,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);
@@ -134,25 +154,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);
@@ -160,7 +182,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);
}
@@ -191,7 +213,7 @@ namespace
using namespace inline_geometry;
{
InitGizmoRenderable(GizmoShape::Square,CreatePlaneSqaure(gizmo_triangle.prim_creater),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Square,CreatePlaneSqaure(gizmo_triangle.prim_creater));
}
{
@@ -202,7 +224,7 @@ namespace
cci.field_count=16;
cci.has_center=false;
InitGizmoRenderable(GizmoShape::Circle,CreateCircle3DByIndexTriangles(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Circle,CreateCircle3DByIndexTriangles(gizmo_triangle.prim_creater,&cci));
}
{
@@ -212,11 +234,11 @@ namespace
cci.tangent=false;
cci.tex_coord=false;
InitGizmoRenderable(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci));
}
{
InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,16),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,16));
}
{
@@ -227,7 +249,7 @@ namespace
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=3; //圆锥高度分割数
InitGizmoRenderable(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci));
}
{
@@ -237,7 +259,7 @@ namespace
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1; //圆柱半径
InitGizmoRenderable(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci));
}
{
@@ -248,12 +270,12 @@ namespace
tci.numberSlices=64;
tci.numberStacks=8;
InitGizmoRenderable(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci),gizmo_triangle.pipeline);
InitGizmoMesh(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci));
}
ENUM_CLASS_FOR(GizmoShape,int,i)
{
if(!gizmo_rederable[i].prim)
if(!gizmo_mesh[i].prim)
return(false);
}
}
@@ -262,42 +284,38 @@ 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);
InitGizmoMoveStaticMesh();
InitGizmoScaleStaticMesh();
InitGizmoRotateStaticMesh();
InitGizmoMoveNode(rf);
//InitGizmoScaleMesh();
//InitGizmoRotateMesh();
return(true);
}
void FreeGizmoResource()
{
ClearGizmoRotateStaticMesh();
ClearGizmoScaleStaticMesh();
ClearGizmoMoveStaticMesh();
//ClearGizmoRotateMesh();
//ClearGizmoScaleMesh();
ClearGizmoMoveNode();
for(GizmoRenderable &gr:gizmo_rederable)
{
SAFE_CLEAR(gr.prim)
SAFE_CLEAR_OBJECT_ARRAY(gr.renderable)
}
for(GizmoMesh &gr:gizmo_mesh)
gr.Clear();
SAFE_CLEAR(gizmo_triangle.prim_creater);
SAFE_CLEAR(gizmo_triangle.vdm);
@@ -306,26 +324,21 @@ void FreeGizmoResource()
SAFE_CLEAR(gizmo_line.vdm);
}
Mesh *GetGizmoRenderable(const GizmoShape &shape,const GizmoColor &color)
MaterialInstance *GetGizmoMI3D(const GizmoColor &color)
{
RANGE_CHECK_RETURN_NULLPTR(color)
return gizmo_triangle.mi[size_t(color)];
}
ComponentDataPtr GetGizmoMeshCDP(const GizmoShape &shape)
{
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));
return gizmo_mesh[size_t(shape)].cdp;
}
VK_NAMESPACE_END

View File

@@ -1,4 +1,5 @@
#pragma once
#include"Gizmo.h"
#include<hgl/color/Color.h>
@@ -6,12 +7,12 @@ VK_NAMESPACE_BEGIN
class SceneNode;
class PrimitiveCreater;
class StaticMesh;
class MeshComponent;
constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]=
{
COLOR::MozillaCharcoal,
COLOR::BlanchedAlmond,
COLOR::MozillaCharcoal, ///<黑色
COLOR::AntiqueWhite, ///<白色
COLOR::BlenderAxisRed,
COLOR::BlenderAxisGreen,
@@ -35,8 +36,6 @@ constexpr const float GIZMO_CYLINDER_OFFSET =GIZMO_CYLINDER_HALF_LENGTH+GIZM
constexpr const float GIZMO_TWO_AXIS_OFFSET =5.0F; ///<二轴调节点偏移量(方片或圆)
Mesh *GetGizmoRenderable(const GizmoShape &gs,const GizmoColor &);
StaticMesh *CreateGizmoStaticMesh(SceneNode *);
Mesh *GetGizmoMesh(const GizmoShape &gs,const GizmoColor &);
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->Duplication());
//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);
}

View File

@@ -1,147 +0,0 @@
// Metric Cells Grid
#include"VulkanAppFramework.h"
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
using namespace hgl;
using namespace hgl::graph;
struct MetricCellsGridData
{
Color4f x_color;
Color4f y_color;
Color4f x_axis_color;
Color4f y_axis_color;
Color4f center_color;
Vector2f lum;
Vector2f cell_step;
Vector2f big_cell_step;
Vector2f scale;
float axis_line_width;
float center_radius;
};
constexpr const size_t MCG_SIZE=sizeof(MetricCellsGridData);
constexpr const float PLANE_SIZE=1024;
class TestApp:public SceneAppFramework
{
private:
MetricCellsGridData mcg_data;
Material * material =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane =nullptr;
MaterialInstance * material_instance =nullptr;
private:
bool InitMDP()
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"MetricCellsGrid",PrimitiveType::Fan);
cfg.local_to_world=true;
material=db->LoadMaterial("Std3D/MetricCellsGrid",&cfg);
if(!material)return(false);
{
mcg_data.x_color=Color4f(1,1,1,1);
mcg_data.y_color=Color4f(1,1,1,1);
mcg_data.x_axis_color=GetColor4f(COLOR::BlenderAxisRed, 1.0);
mcg_data.y_axis_color=GetColor4f(COLOR::BlenderAxisGreen, 1.0);
mcg_data.center_color=Color4f(1,1,0,1);
mcg_data.lum =Vector2f(0.1,0.2);
mcg_data.cell_step =Vector2f(8,8);
mcg_data.big_cell_step =Vector2f(32,32);
mcg_data.scale =Vector2f(PLANE_SIZE,PLANE_SIZE);
mcg_data.axis_line_width=1.0;
mcg_data.center_radius =4.0;
}
material_instance=db->CreateMaterialInstance(material,nullptr,&mcg_data);
pipeline=CreatePipeline(material,InlinePipeline::Solid3D,PrimitiveType::Fan);
return pipeline;
}
bool CreateRenderObject()
{
PrimitiveCreater pc(device,material->GetDefaultVIL());
ro_plane=inline_geometry::CreatePlaneSqaure(&pc);
if(ro_plane)
db->Add(ro_plane);
return ro_plane;
}
Mesh *Add(MaterialInstance *mi,const Matrix4f &mat)
{
Mesh *ri=db->CreateMesh(ro_plane,mi,pipeline);
if(!ri)
return(nullptr);
render_root.CreateSubNode(mat,ri);
return ri;
}
bool InitScene()
{
Add(material_instance,scale(PLANE_SIZE,PLANE_SIZE,1));
camera->pos=Vector3f(PLANE_SIZE/4,PLANE_SIZE/2,PLANE_SIZE/4);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
// camera_control->SetReserveDirection(true,true); //反转x,y
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
bool Init(uint width,uint height) override
{
if(!SceneAppFramework::Init(width,height))
return(false);
if(!InitMDP())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1280,720);
}

View File

@@ -1,6 +1,6 @@
// PlaneGrid3D
#include"VulkanAppFramework.h"
#include<hgl/WorkManager.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
@@ -8,11 +8,14 @@
#include<hgl/graph/Camera.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/FirstPersonCameraControl.h>
#include<hgl/color/Color.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
class TestApp:public SceneAppFramework
class TestApp:public WorkObject
{
private:
@@ -26,7 +29,7 @@ private:
bool InitMDP()
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"VertexLuminance3D",PrimitiveType::Lines);
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
cfg.position_format=VAT_VEC2;
@@ -50,7 +53,7 @@ private:
ce=COLOR((int)ce+1);
}
pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D,PrimitiveType::Lines);
pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D);
return pipeline;
}
@@ -67,55 +70,54 @@ private:
pgci.lum=180;
pgci.sub_lum=255;
PrimitiveCreater pc(device,material_instance[0]->GetVIL());
auto pc=GetPrimitiveCreater(material_instance[0]);
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
return prim_plane_grid;
}
Mesh *Add(MaterialInstance *mi,const Matrix4f &mat)
void Add(SceneNode *parent_node,MaterialInstance *mi,const Matrix4f &mat)
{
Mesh *ri=db->CreateMesh(prim_plane_grid,mi,pipeline);
if(!ri)
return(nullptr);
return;
render_root.Add(new SceneNode(mat,ri));
CreateComponentInfo cci(parent_node,mat);
return ri;
CreateComponent<MeshComponent>(&cci,ri);
}
bool InitScene()
{
Add(material_instance[0],Matrix4f(1.0f));
Add(material_instance[1],rotate(HGL_RAD_90,0,1,0));
Add(material_instance[2],rotate(HGL_RAD_90,1,0,0));
SceneNode *scene_root=GetSceneRoot(); //取得缺省场景根节点
camera->pos=Vector3f(32,32,32);
Add(scene_root,material_instance[0],Matrix4f(1.0f));
Add(scene_root,material_instance[1],rotate(HGL_RAD_90,0,1,0));
Add(scene_root,material_instance[2],rotate(HGL_RAD_90,1,0,0));
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
// camera_control->SetReserveDirection(true,true); //反转x,y
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
}
bool Init(uint width,uint height) override
bool Init() override
{
if(!SceneAppFramework::Init(width,height))
return(false);
if(!InitMDP())
return(false);
@@ -129,7 +131,7 @@ public:
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
int os_main(int,os_char **)
{
return RunApp<TestApp>(1280,720);
return RunFramework<TestApp>(OS_TEXT("PlaneGrid3D"),1280,720);
}

View File

@@ -1,6 +1,6 @@
// RayPicking
#include"VulkanAppFramework.h"
#include<hgl/WorkManager.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
@@ -11,6 +11,7 @@
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
@@ -21,12 +22,12 @@ static float position_data[2][3]=
{0,0,0}
};
static float lumiance_data[2]={1,1};
static uint8 lumiance_data[2]={255,255};
static Color4f white_color(1,1,1,1);
static Color4f yellow_color(1,1,0,1);
class TestApp:public SceneAppFramework
class TestApp:public WorkObject
{
Color4f color;
@@ -51,39 +52,37 @@ private:
bool InitMaterialAndPipeline()
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"VertexLuminance2D",PrimitiveType::Lines);
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
{
cfg.mtl_name="VertexLuminance2D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.position_format=VAT_VEC2;
mtl_plane_grid=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_plane_grid)return(false);
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
mi_plane_grid=db->CreateMaterialInstance(mtl_plane_grid,&vil_config,&white_color);
if(!mi_plane_grid)return(false);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D,PrimitiveType::Lines);
pipeline_plane_grid=CreatePipeline(mi_plane_grid,InlinePipeline::Solid3D);
if(!pipeline_plane_grid)return(false);
}
{
cfg.mtl_name="VertexLuminance3D"; //注意必须用不同名字,未来改名材质文件名+cfg hash名
cfg.position_format=VAT_VEC3;
mtl_line=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_line)return(false);
mi_line=db->CreateMaterialInstance(mtl_line,nullptr,&yellow_color);
mi_line=db->CreateMaterialInstance(mtl_line,&vil_config,&yellow_color);
if(!mi_line)return(false);
pipeline_line=CreatePipeline(mtl_line,InlinePipeline::Solid3D,PrimitiveType::Lines);
pipeline_line=CreatePipeline(mi_line,InlinePipeline::Solid3D);
if(!pipeline_line)
return(false);
@@ -92,7 +91,7 @@ private:
return(true);
}
Mesh *Add(Primitive *r,MaterialInstance *mi,Pipeline *p)
Mesh *Add(SceneNode *parent_node,Primitive *r,MaterialInstance *mi,Pipeline *p)
{
Mesh *ri=db->CreateMesh(r,mi,p);
@@ -102,7 +101,9 @@ private:
return(nullptr);
}
render_root.Add(new SceneNode(ri));
CreateComponentInfo cci(parent_node);
CreateComponent<MeshComponent>(&cci,ri);
return ri;
}
@@ -112,7 +113,7 @@ private:
using namespace inline_geometry;
{
PrimitiveCreater pc(device,mi_plane_grid->GetVIL());
auto pc=GetPrimitiveCreater(mi_plane_grid);
struct PlaneGridCreateInfo pgci;
@@ -122,19 +123,15 @@ private:
pgci.lum=128;
pgci.sub_lum=196;
prim_plane_grid=CreatePlaneGrid2D(&pc,&pgci);
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
}
{
PrimitiveCreater pc(device,mtl_line->GetDefaultVIL());
if(!pc.Init("Line",2))
return(false);
if(!pc.WriteVAB(VAN::Position, VF_V3F,position_data))return(false);
if(!pc.WriteVAB(VAN::Luminance,VF_V1F,lumiance_data))return(false);
prim_line=pc.Create();
prim_line=CreatePrimitive("RayLine",2,mi_line->GetVIL(),
{
{VAN::Position, VF_V3F,position_data},
{VAN::Luminance,VF_V1UN8,lumiance_data}
});
prim_line_vab_map=prim_line->GetVABMap(VAN::Position);
}
@@ -144,32 +141,30 @@ private:
bool InitScene()
{
Add(prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
Add(prim_line,mi_line,pipeline_line);
SceneNode *scene_root=GetSceneRoot(); //取得缺省场景根节点
camera->pos=Vector3f(32,32,32);
Add(scene_root,prim_plane_grid,mi_plane_grid,pipeline_plane_grid);
Add(scene_root,prim_line,mi_line,pipeline_line);
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
SAFE_CLEAR(prim_line);
}
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
bool Init() override
{
if(!InitMaterialAndPipeline())
return(false);
@@ -182,23 +177,28 @@ public:
return(true);
}
void BuildCommandBuffer(uint32 index) override
void Tick(double) override
{
const CameraInfo *ci=GetCameraInfo();
const ViewportInfo *vi=GetViewportInfo();
Vector2i mouse_position;
ray.Set(GetMouseCoord(),ci,vi); //设置射线查询的屏幕坐标点
if(!GetMouseCoord(&mouse_position))
return;
CameraControl *camera_control=GetCameraControl();
const CameraInfo *ci=camera_control->GetCameraInfo();
const ViewportInfo *vi=camera_control->GetViewportInfo();
ray.Set(mouse_position,ci,vi); //设置射线查询的屏幕坐标点
const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标
prim_line_vab_map->Write(&pos, //更新VAB上这个点的位置
1); //这里的1代表的数据数量,不是字节数
SceneAppFramework::BuildCommandBuffer(index);
1); //这里的1代表的数据数量,不是字节数
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
int os_main(int,os_char **)
{
return RunApp<TestApp>(1280,720);
return RunFramework<TestApp>(OS_TEXT("RayPicking"),1280,720);
}

View File

@@ -0,0 +1,102 @@
// SimplestAxis
// 直接从0,0,0向三个方向画一条直线用于确认坐标轴方向
#include<hgl/WorkManager.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/FirstPersonCameraControl.h>
#include<hgl/color/Color.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
class TestApp:public WorkObject
{
private:
Material * material =nullptr;
Pipeline * pipeline =nullptr;
Primitive * prim_axis =nullptr;
MaterialInstance * material_instance =nullptr;
private:
bool InitMDP()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor3D,&cfg);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D);
return pipeline;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
auto pc=GetPrimitiveCreater(material_instance);
inline_geometry::AxisCreateInfo aci;
prim_axis=CreateAxis(pc,&aci);
return prim_axis;
}
bool InitScene()
{
Mesh *ri=db->CreateMesh(prim_axis,material_instance,pipeline);
CreateComponentInfo cci(GetSceneRoot());
CreateComponent<MeshComponent>(&cci,ri);
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0));
// camera_control->SetReserveDirection(true,true); //反转x,y
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_axis);
}
bool Init() override
{
if(!InitMDP())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
};//class TestApp:public CameraAppFramework
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("SimplestAxis"),1280,720);
}

View File

@@ -88,7 +88,7 @@ public:
{
CloseShaderCompiler();
win->Unjoin(this);
win->RemoveChildDispatcher(this);
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
@@ -154,7 +154,7 @@ public:
InitCommandBuffer();
win->Join(this);
win->AddChildDispatcher(this);
{
vp_info.Set(w,h);
@@ -346,125 +346,6 @@ public:
}
};//class VulkanApplicationFramework
class CameraKeyboardControl:public KeyboardStateEvent
{
FirstPersonCameraControl *camera;
float move_speed;
public:
CameraKeyboardControl(FirstPersonCameraControl *wc)
{
camera=wc;
move_speed=1.0f;
}
bool OnPressed(const KeyboardButton &kb)override
{
if(!KeyboardStateEvent::OnPressed(kb))
return(false);
if(kb==KeyboardButton::Minus )move_speed*=0.9f;else
if(kb==KeyboardButton::Equals )move_speed*=1.1f;
return(true);
}
void Update()
{
if(HasPressed(KeyboardButton::W ))camera->Forward (move_speed);else
if(HasPressed(KeyboardButton::S ))camera->Backward (move_speed);else
if(HasPressed(KeyboardButton::A ))camera->Left (move_speed);else
if(HasPressed(KeyboardButton::D ))camera->Right (move_speed);else
//if(HasPressed(KeyboardButton::R ))camera->Up (move_speed);else
//if(HasPressed(KeyboardButton::F ))camera->Down (move_speed);else
//if(HasPressed(KeyboardButton::Left ))camera->HoriRotate( move_speed);else
//if(HasPressed(KeyboardButton::Right ))camera->HoriRotate(-move_speed);else
//if(HasPressed(KeyboardButton::Up ))camera->VertRotate( move_speed);else
//if(HasPressed(KeyboardButton::Down ))camera->VertRotate(-move_speed);else
return;
}
};
class CameraMouseControl:public MouseEvent
{
FirstPersonCameraControl *camera;
double cur_time;
double last_time;
Vector2f mouse_pos;
Vector2f mouse_last_pos;
protected:
bool OnPressed(int x,int y,MouseButton) override
{
mouse_last_pos.x=x;
mouse_last_pos.y=y;
last_time=cur_time;
return(true);
}
bool OnWheel(int,int y) override
{
if(y==0)return(false);
camera->Forward(float(y)/10.0f);
return(true);
}
bool OnMove(int x,int y) override
{
mouse_pos.x=x;
mouse_pos.y=y;
bool left=HasPressed(MouseButton::Left);
bool right=HasPressed(MouseButton::Right);
Vector2f pos(x,y);
Vector2f gap=pos-mouse_last_pos;
if(left)
{
gap/=-5.0f;
camera->Rotate(gap);
}
else
if(right)
{
gap/=10.0f;
camera->Move(Vector3f(gap.x,0,gap.y));
}
last_time=cur_time;
mouse_last_pos=Vector2f(x,y);
return(true);
}
public:
CameraMouseControl(FirstPersonCameraControl *wc)
{
camera=wc;
cur_time=0;
last_time=0;
}
const Vector2f &GetMouseCoord()const{return mouse_pos;}
void Update()
{
cur_time=GetPreciseTime();
}
};
class CameraAppFramework:public VulkanApplicationFramework
{
protected:
@@ -522,8 +403,8 @@ public:
ckc=new CameraKeyboardControl(camera_control);
cmc=new CameraMouseControl(camera_control);
win->Join(ckc);
win->Join(cmc);
win->AddChildDispatcher(ckc);
win->AddChildDispatcher(cmc);
RefreshCameraInfo(camera_control->GetCameraInfo(),&vp_info,camera);

View File

@@ -8,7 +8,7 @@ namespace hgl
/**
* 工作管理器管理一个序列的WorkObject<br>
*/
class WorkManager
class WorkManager:public io::WindowEvent
{
protected:
@@ -28,10 +28,13 @@ namespace hgl
WorkManager(graph::RenderFramework *rf)
{
render_framework=rf;
rf->AddChildDispatcher(this);
}
virtual ~WorkManager()
{
render_framework->RemoveChildDispatcher(this);
SAFE_CLEAR(cur_work_object);
}
@@ -41,14 +44,12 @@ namespace hgl
frame_time=1.0f/double(fps);
}
void Tick(WorkObject *wo);
virtual void Render(WorkObject *wo);
void Run(WorkObject *wo);
void Tick (WorkObject *wo);
virtual void Render (WorkObject *wo);
void Run (WorkObject *wo);
};//class WorkManager
class SwapchainWorkManager:public WorkManager,public io::WindowEvent
class SwapchainWorkManager:public WorkManager
{
graph::SwapchainModule *swapchain_module;
@@ -57,14 +58,9 @@ namespace hgl
SwapchainWorkManager(graph::RenderFramework *rf):WorkManager(rf)
{
swapchain_module=rf->GetSwapchainModule();
render_framework->Join(this);
}
~SwapchainWorkManager()
{
render_framework->Unjoin(this);
}
~SwapchainWorkManager()=default;
void Render(WorkObject *wo) override;

View File

@@ -1,8 +1,11 @@
#pragma once
#include<hgl/type/object/TickObject.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/Renderer.h>
#include<hgl/graph/Scene.h>
#include<hgl/Time.h>
//#include<iostream>
@@ -21,17 +24,18 @@ namespace hgl
class WorkObject:public TickObject
{
graph::RenderFramework *render_framework=nullptr;
graph::IRenderTarget *cur_render_target=nullptr;
graph::RenderPass *render_pass=nullptr;
bool destroy_flag=false;
bool renderable=true;
bool render_dirty=true;
protected:
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
//以下数据均取自RenderFramework
graph::RenderResource * db =nullptr; //暂时的,未来会被更好的机制替代
graph::Scene * scene =nullptr; //场景
graph::Renderer * renderer=nullptr; //渲染器
public:
@@ -40,65 +44,84 @@ namespace hgl
graph::VulkanDevAttr * GetDevAttr (){return render_framework->GetDevAttr();}
graph::TextureManager * GetTextureManager (){return render_framework->GetTextureManager();}
const VkExtent2D & GetExtent2D (){return cur_render_target->GetExtent();}
const VkExtent2D & GetExtent (){return renderer->GetExtent();}
graph::Scene * GetScene (){return scene;}
graph::SceneNode * GetSceneRoot (){return scene->GetRootNode();}
graph::Renderer * GetRenderer (){return renderer;}
graph::Camera * GetCamera (){return renderer->GetCamera();}
graph::CameraControl * GetCameraControl (){return render_framework->GetDefaultCameraControl();}
bool GetMouseCoord (Vector2i *mc)const{return render_framework->GetMouseCoord(mc);}
public:
const bool IsDestroy()const{return destroy_flag;}
const bool IsRenderable()const{return renderable;}
const bool IsRenderDirty()const{return render_dirty;}
const bool IsDestroy ()const{return destroy_flag;}
void MarkDestory(){destroy_flag=true;}
void MarkDestory(){destroy_flag=true;}
void SetRenderable(bool r){renderable=r;}
void MarkRenderDirty(){render_dirty=true;}
const bool IsRenderDirty ()const{return render_dirty;}
void MarkRenderDirty(){render_dirty=true;}
public:
WorkObject(graph::RenderFramework *,graph::IRenderTarget *rt=nullptr);
WorkObject(graph::RenderFramework *,graph::Renderer *r=nullptr);
virtual ~WorkObject()=default;
virtual bool Init()=0;
virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt);
virtual void OnRendererChange(graph::RenderFramework *rf,graph::Renderer *r);
virtual void OnResize(const VkExtent2D &){}
virtual void Tick(double){}
virtual void Render(double delta_time,graph::RenderCmdBuffer *cmd)=0;
virtual void Render(double delta_time);
public:
template<typename ...ARGS>
graph::Pipeline *CreatePipeline(ARGS...args)
graph::VertexDataManager *CreateVDM(ARGS...args)
{
return render_pass->CreatePipeline(args...);
return render_framework?render_framework->CreateVDM(args...):nullptr;
}
graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci,const graph::VILConfig *vil_cfg=nullptr)
graph::Material *CreateMaterial(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci)
{
return db->CreateMaterialInstance(mi_name,mci,vil_cfg);
return render_framework?render_framework->CreateMaterial(mi_name,mci):nullptr;
}
graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mtl_name,graph::mtl::MaterialCreateConfig *mtl_cfg,const graph::VILConfig *vil_cfg=nullptr)
{
AutoDelete<graph::mtl::MaterialCreateInfo> mci=graph::mtl::CreateMaterialCreateInfo(GetDevAttr(),mtl_name,mtl_cfg);
#define WO_FUNC_FROM_RENDER_FRAMEWORK(name,return_type) template<typename ...ARGS> return_type name(ARGS...args){return render_framework?render_framework->name(args...):nullptr;}
return db->CreateMaterialInstance(mtl_name,mci,vil_cfg);
}
WO_FUNC_FROM_RENDER_FRAMEWORK(CreatePipeline,graph::Pipeline *)
WO_FUNC_FROM_RENDER_FRAMEWORK(CreateMaterialInstance,graph::MaterialInstance *)
WO_FUNC_FROM_RENDER_FRAMEWORK(GetPrimitiveCreater,SharedPtr<graph::PrimitiveCreater>)
graph::Primitive *CreatePrimitive( const AnsiString &name,
#undef WO_FUNC_FROM_RENDER_FRAMEWORK
graph::Primitive *CreatePrimitive(const AnsiString &name,
const uint32_t vertices_count,
const graph::VIL *vil,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list);
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list)
{
return render_framework?render_framework->CreatePrimitive(name,vertices_count,vil,vad_list):nullptr;
}
graph::Mesh *CreateMesh(const AnsiString &name,
const uint32_t vertices_count,
graph::MaterialInstance *mi,
graph::Pipeline *pipeline,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list);
const uint32_t vertices_count,
graph::MaterialInstance *mi,
graph::Pipeline *pipeline,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list)
{
return render_framework?render_framework->CreateMesh(name,vertices_count,mi,pipeline,vad_list):nullptr;
}
public: //Component 相关
template<typename C,typename ...ARGS>
inline C *CreateComponent(const graph::CreateComponentInfo *cci,ARGS...args)
{
return render_framework?render_framework->CreateComponent<C>(cci,args...):nullptr; //创建组件
}
};//class WorkObject
/**

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include<hgl/type/DataType.h>
#include<hgl/type/SortedSet.h>
@@ -11,27 +11,27 @@
*
* AMD FidelityFX中Component存放于Entity下而我方中与其类似的定义为SceneNode。
* 不管是Entity还是SceneNode它们都提供空间变换以及子节点、Component的管理。
* 而AMD FidelityFX中的Scene类似于我方的SceneWorld,用于储存一个场景世界的根节点及其它世界唯一数据。
* 而AMD FidelityFX中的Scene类似于我方的Scene用于储存一个场景世界的根节点及其它世界唯一数据。
*
* ComponentData是每个Component的数据用于向Component或是其它模块提供数据。
* ComponentManager是Component的管理器用于管理Component的创建、销毁、更新等。
*
* 需要注意的是同AMD FidelityFX一样大部分ComponentManager与SceneWorld基本无关。
* 需要注意的是同AMD FidelityFX一样大部分ComponentManager与Scene基本无关。
* 因为同样的数据可能出现在多个World之中。
* 仅有那些与SceneWorld密切相关的Component它对应的Manager才会出现在SceneWorld比如CameraManager/LightManager。
* 而如StaticMeshComponent之类的纯资源型就会是独立存在的。
* 仅有那些与Scene密切相关的Component它对应的Manager才会出现在Scene中比如CameraManager/LightManager。
* 而如MeshComponent之类的纯资源型就会是独立存在的。
*
* Component是组件的基类所有组件都从这里派生。
*
*
* RenderComponent是可渲染组件的基类所有可渲染组件都从这里派生。它继承于Component。
*
* PrimitiveComponent是图元组件的基类所有图元组件都从这里派生。它继承于RenderComponent。
* SceneComponent是场景组件基类只要是放在场景中的都从它派生
*
* PrimitiveComponent是图元组件的基类所有图元组件都从这里派生。
* 它再度派生出的任何Component都必须是一个有3D空间的几何图元。
* 引擎中的空间、物理、等都由PrimitiveComponent提供数据进行计算。
* RenderComponent是可渲染组件的基类所有可渲染组件都从这里派生。
*
* StaticMeshComponent是静态网格组件它是一个具体的PrimitiveComponent实现。
*
* MeshComponent是静态网格组件它是一个具体的RenderComponent实现。
*/
#define COMPONENT_NAMESPACE hgl::graph
@@ -43,7 +43,34 @@ COMPONENT_NAMESPACE_BEGIN
class ComponentManager;
class SceneNode;
struct ComponentData{};
struct ComponentData
{
public:
ComponentData()=default;
virtual ~ComponentData()=default;
virtual const size_t GetTypeHash()const=0; ///<取得ComponentData的类型哈希值
virtual const size_t GetComponentTypeHash()const=0; ///<取得Component的类型哈希值
virtual const size_t GetManagerTypeHash()const=0; ///<取得ComponentManager的类型哈希值
};//struct ComponentData
#define COMPONENT_DATA_CLASS_BODY(name) static constexpr const size_t StaticTypeHash (){return hgl::GetTypeHash<name##ComponentData>();} \
static constexpr const size_t StaticComponentTypeHash(){return hgl::GetTypeHash<name##Component>();} \
static constexpr const size_t StaticManagerTypeHash (){return hgl::GetTypeHash<name##ComponentManager>();} \
const size_t GetTypeHash ()const override{return StaticTypeHash();} \
const size_t GetComponentTypeHash ()const override{return StaticComponentTypeHash();} \
const size_t GetManagerTypeHash ()const override{return StaticManagerTypeHash();}
using ComponentDataPtr=SharedPtr<ComponentData>;
/**
* 为什么要ComponentData与Component分离
*
* ComponentData是Component的一个数据载体但它也仅仅代表数据。
* 它不参与任何的逻辑、事件、更新、渲染操作而且同一份数据可以被多个Component使用。
* 同时Component也可以在运行时更换ComponentData。
*/
/**
* 基础组件<br>
@@ -51,89 +78,130 @@ struct ComponentData{};
*/
class Component
{
static uint unique_id_count;
uint unique_id;
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentData * Data;
ComponentDataPtr Data;
protected:
friend class ComponentManager;
virtual void OnDetachManager(ComponentManager *cm)
{
if(cm==Manager)
Manager=nullptr;
}
public:
Component()=delete;
Component(SceneNode *sn,ComponentData *cd,ComponentManager *cm)
{
OwnerNode=sn;
Data=cd;
Manager=cm;
}
Component(ComponentDataPtr,ComponentManager *);
virtual ~Component();
virtual ~Component()
{
SAFE_CLEAR(Data);
}
virtual const size_t GetHashCode()const=0;
virtual const size_t GetTypeHash()const=0; ///<取得Component的类型哈希值
virtual const size_t GetDataTypeHash()const=0; ///<取得ComponentData的类型哈希值
virtual const size_t GetManagerTypeHash()const=0; ///<取得ComponentManager的类型哈希值
public:
uint GetUniqueID ()const{return unique_id;}
SceneNode * GetOwnerNode()const{return OwnerNode;}
ComponentManager * GetManager ()const{return Manager;}
ComponentData * GetData ()const{return Data;}
ComponentDataPtr GetData ()const{return Data;}
public:
virtual bool ChangeData(ComponentDataPtr cdp);
public:
virtual Component *Duplication();
//virtual void Update(const double delta_time)=0;
public: //事件
virtual void OnAttach(SceneNode *node){if(node)OwnerNode=node;} ///<附加到节点事件
virtual void OnDetach(SceneNode *){OwnerNode=nullptr;} ///<从节点分离事件
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class Component
#define COMPONENT_CLASS_BODY(name) static name##ComponentManager *GetDefaultManager () {return name##ComponentManager::GetDefaultManager();} \
name##ComponentManager *GetManager ()const {return (name##ComponentManager *)Component::GetManager();} \
static constexpr const size_t StaticTypeHash () {return hgl::GetTypeHash<name##Component>();} \
static constexpr const size_t StaticDataTypeHash () {return hgl::GetTypeHash<name##ComponentData>();} \
static constexpr const size_t StaticManagerTypeHash () {return hgl::GetTypeHash<name##ComponentManager>();} \
const size_t GetTypeHash ()const override{return StaticTypeHash();} \
const size_t GetDataTypeHash ()const override{return StaticDataTypeHash();} \
const size_t GetManagerTypeHash ()const override{return StaticManagerTypeHash();}
using ComponentSet=SortedSet<Component *>;
using ComponentList=ArrayList<Component *>;
class ComponentManager
{
ComponentSet component_set;
public:
protected:
virtual const size_t GetComponentHashCode()const=0;
virtual const size_t GetHashCode()const=0;
virtual ~ComponentManager()=default;
public:
virtual Component * CreateComponent(SceneNode *,ComponentData *)=0;
int GetComponentCount()const{return component_set.GetCount();}
ComponentSet & GetComponents(){return component_set;}
int GetComponents(ArrayList<Component *> &comp_list,SceneNode *);
virtual void UpdateComponents(const double delta_time);
friend class Component; //Component可以直接访问ComponentManager的成员
virtual void AttachComponent(Component *c){if(!c)return;component_set.Add(c);}
virtual void DetachComponent(Component *c){if(!c)return;component_set.Delete(c);}
public:
virtual const size_t GetComponentTypeHash()const=0; ///<取得Component的类型哈希值
virtual const size_t GetDataTypeHash()const=0; ///<取得ComponentData的类型哈希值
virtual const size_t GetTypeHash()const=0; ///<取得ComponentManager的类型哈希值
virtual ~ComponentManager();
public:
virtual Component * CreateComponent(ComponentDataPtr)=0;
const size_t GetComponentCount()const{return component_set.GetCount();}
ComponentSet & GetComponents(){return component_set;}
int GetComponents(ComponentList &comp_list,SceneNode *);
virtual void UpdateComponents(const double delta_time);
public: //事件
virtual void OnFocusLost(){} ///<焦点丢失事件
virtual void OnFocusGained(){} ///<焦点获得事件
};//class ComponentManager
bool RegistryComponentManager(ComponentManager *);
#define COMPONENT_MANAGER_CLASS_BODY(name) static name##ComponentManager * GetDefaultManager () {return GetComponentManager<name##ComponentManager>(true);} \
static constexpr const size_t StaticTypeHash () {return hgl::GetTypeHash<name##ComponentManager>();} \
static constexpr const size_t StaticDataTypeHash () {return hgl::GetTypeHash<name##ComponentData>();} \
static constexpr const size_t StaticComponentTypeHash () {return hgl::GetTypeHash<name##Component>();} \
const size_t GetComponentTypeHash ()const override{return StaticComponentTypeHash();} \
const size_t GetDataTypeHash ()const override{return StaticDataTypeHash();} \
const size_t GetTypeHash ()const override{return StaticTypeHash();}
bool RegisterComponentManager(ComponentManager *);
ComponentManager *GetComponentManager(const size_t hash_code);
template<typename T> inline T *GetComponentManager(bool create_default=true)
{
T *cm=(T *)GetComponentManager(T::StaticHashCode());
T *cm=(T *)GetComponentManager(T::StaticTypeHash());
if(!cm&&create_default)
{
cm=new T;
RegistryComponentManager(cm);
RegisterComponentManager(cm);
}
return cm;

View File

@@ -0,0 +1,46 @@
#pragma once
#include<hgl/math/Matrix.h>
namespace hgl::graph
{
class SceneNode;
struct CreateComponentInfo
{
graph::SceneNode *owner_node; ///<所属节点
graph::Matrix4f mat; ///<变换矩阵
public:
CreateComponentInfo()
{
owner_node=nullptr;
mat=graph::Identity4f;
}
CreateComponentInfo(const CreateComponentInfo &cci)
{
owner_node=cci.owner_node;
mat=cci.mat;
}
CreateComponentInfo(graph::SceneNode *pn,const graph::Matrix4f &m)
{
owner_node=pn;
mat=m;
}
CreateComponentInfo(graph::SceneNode *pn)
{
owner_node=pn;
mat=graph::Identity4f;
}
CreateComponentInfo(const graph::Matrix4f &m)
{
owner_node=nullptr;
mat=m;
}
};//struct CreateComponentInfo
}//namespace hgl::graph

View File

@@ -0,0 +1,171 @@
#pragma once
#include<hgl/component/RenderComponent.h>
#include<hgl/graph/Mesh.h>
//#include<hgl/log/LogInfo.h>
COMPONENT_NAMESPACE_BEGIN
class MeshComponent;
class MeshComponentManager;
struct MeshComponentData:public ComponentData
{
//static uint unique_id_count;
//uint unique_id;
Mesh *mesh;
public:
MeshComponentData()
{
mesh=nullptr;
// unique_id=++unique_id_count;
// LOG_INFO(AnsiString("MeshComponentData():")+AnsiString::numberOf(unique_id));
}
MeshComponentData(Mesh *m)
{
mesh=m;
// unique_id=++unique_id_count;
// LOG_INFO(AnsiString("MeshComponentData(Mesh *):")+AnsiString::numberOf(unique_id));
}
virtual ~MeshComponentData();
COMPONENT_DATA_CLASS_BODY(Mesh)
};//struct MeshComponentData
class MeshComponentManager:public ComponentManager
{
public:
COMPONENT_MANAGER_CLASS_BODY(Mesh)
public:
MeshComponentManager()=default;
Component *CreateComponent(ComponentDataPtr cdp) override;
Component *CreateComponent(Mesh *);
};//class MeshComponentManager
class MeshComponent:public RenderComponent
{
WeakPtr<ComponentData> sm_data;
MaterialInstance* override_material = nullptr; // 新增
public:
COMPONENT_CLASS_BODY(Mesh)
public:
MeshComponent(ComponentDataPtr cdp,MeshComponentManager *cm):RenderComponent(cdp,cm)
{
sm_data=cdp;
}
virtual ~MeshComponent()=default;
virtual Component *Duplication() override
{
MeshComponent *mc=(MeshComponent *)RenderComponent::Duplication();
if(!mc)
return(mc);
mc->override_material=override_material;
return mc;
}
MeshComponentData *GetData() {return dynamic_cast< MeshComponentData *>(sm_data.get());}
const MeshComponentData *GetData()const {return dynamic_cast<const MeshComponentData *>(sm_data.const_get());}
Mesh *GetMesh()const
{
if(!sm_data.valid())
return(nullptr);
const MeshComponentData *mcd=dynamic_cast<const MeshComponentData *>(sm_data.const_get());
if(!mcd)
return(nullptr);
return mcd->mesh;
}
const bool GetLocalAABB(AABB &box) const override
{
Mesh *mesh=GetMesh();
if (!mesh)
return false;
box=mesh->GetBoundingBox();
return true;
}
public:
Pipeline *GetPipeline() const
{
Mesh *mesh=GetMesh();
if (!mesh)
return nullptr;
return mesh->GetPipeline();
}
void SetOverrideMaterial (MaterialInstance* mi){override_material=mi;}
MaterialInstance * GetOverrideMaterial ()const{return override_material;}
void ClearOverrideMaterial (){override_material=nullptr;}
MaterialInstance * GetMaterialInstance () const
{
if (override_material)
return override_material;
Mesh *mesh=GetMesh();
if (!mesh)
return nullptr;
return mesh->GetMaterialInstance();
}
Material *GetMaterial() const
{
if (override_material)
return override_material->GetMaterial();
Mesh *mesh=GetMesh();
if (!mesh)
return nullptr;
return mesh->GetMaterial();
}
const bool CanRender() const override
{
if (!sm_data.valid())
return false;
const MeshComponentData *mcd=GetData();
if (!mcd || !mcd->mesh)
return false;
return true;
}
};//class MeshComponent
COMPONENT_NAMESPACE_END

View File

@@ -1,6 +1,8 @@
#pragma once
#pragma once
#include<hgl/component/RenderComponent.h>
#include<hgl/component/SceneComponent.h>
#include<hgl/graph/AABB.h>
#include<hgl/graph/OBB.h>
COMPONENT_NAMESPACE_BEGIN
@@ -8,13 +10,55 @@ COMPONENT_NAMESPACE_BEGIN
* 图元组件<br>
* 组件中的元素必须是一个可以明确描述的几何体,可以被明确标记尺寸、参与空间、物理计算等。
*/
class PrimitiveComponent:public RenderComponent
class PrimitiveComponent:public SceneComponent
{
public:
PrimitiveComponent(SceneNode *psn,ComponentData *cd,ComponentManager *cm)
:RenderComponent(psn,cd,cm){}
using SceneComponent::SceneComponent;
virtual ~PrimitiveComponent()=default;
virtual const bool GetLocalAABB(AABB &box) const=0;
const bool GetWorldOBB(OBB &box)
{
AABB aabb;
if(!GetLocalAABB(aabb))
return false;
box.Set(GetLocalToWorldMatrix(),aabb);
return true;
}
const bool GetWorldOBBMatrix(Matrix4f &obb_matrix,const float cube_size=1.0f)
{
AABB aabb;
if(!GetLocalAABB(aabb))
return false;
//这两行也是对的
//OBB obb(GetLocalToWorldMatrix(),aabb);
//obb_matrix=obb.GetMatrix(cube_size);
// 1. 计算最终的缩放向量
const Vector3f scale_vector = aabb.GetLength() * cube_size;
// 2. 直接构建局部空间的变换矩阵 (Translate * Scale)
Matrix4f local_aabb_matrix;
local_aabb_matrix[0] = Vector4f(scale_vector.x, 0.0f, 0.0f, 0.0f);
local_aabb_matrix[1] = Vector4f(0.0f, scale_vector.y, 0.0f, 0.0f);
local_aabb_matrix[2] = Vector4f(0.0f, 0.0f, scale_vector.z, 0.0f);
local_aabb_matrix[3] = Vector4f(aabb.GetCenter(), 1.0f);
// 3. 将局部 AABB 矩阵与组件的 LocalToWorld 矩阵相乘,得到最终的世界 OBB 矩阵
obb_matrix = GetLocalToWorldMatrix() * local_aabb_matrix;
return(true);
}
};//class PrimitiveComponent
COMPONENT_NAMESPACE_END

View File

@@ -1,19 +1,20 @@
#pragma once
#include<hgl/component/Component.h>
#include<hgl/component/PrimitiveComponent.h>
COMPONENT_NAMESPACE_BEGIN
/**
* 可渲染组件
*/
class RenderComponent: public Component
class RenderComponent:public PrimitiveComponent
{
public:
RenderComponent(SceneNode *psn,ComponentData *cd,ComponentManager *cm)
:Component(psn,cd,cm){}
using PrimitiveComponent::PrimitiveComponent;
virtual ~RenderComponent()=default;
virtual const bool CanRender()const=0; ///<当前数据是否可以渲染
};//class RenderComponent
COMPONENT_NAMESPACE_END

View File

@@ -0,0 +1,31 @@
#pragma once
#include<hgl/component/Component.h>
#include<hgl/graph/SceneOrient.h>
COMPONENT_NAMESPACE_BEGIN
/**
* 场景组件<br>
* 场景组件中的元素必须是针对场景起作用的,并不一定需要自己绘出来,但也对场景产生影响。比如太阳光、全局风场
*/
class SceneComponent:public Component,public SceneOrient
{
public:
using Component::Component;
virtual ~SceneComponent()=default;
virtual Component *Duplication() override
{
SceneComponent *sc=(SceneComponent *)Component::Duplication();
if(!sc)
return(sc);
sc->SetLocalMatrix(GetLocalMatrix());
return sc;
}
};//class SceneComponent
COMPONENT_NAMESPACE_END

View File

@@ -1,68 +0,0 @@
#pragma once
#include<hgl/component/PrimitiveComponent.h>
#include<hgl/graph/Mesh.h>
COMPONENT_NAMESPACE_BEGIN
struct StaticMeshComponentData:public ComponentData
{
Mesh *renderable;
};//struct StaticMeshComponentData
class StaticMeshComponent;
class StaticMeshComponentManager:public ComponentManager
{
public:
static StaticMeshComponentManager *GetDefaultManager()
{
return GetComponentManager<StaticMeshComponentManager>(true);
}
static constexpr const size_t StaticHashCode (){return hgl::GetTypeHash<StaticMeshComponentManager>();}
static constexpr const size_t StaticComponentHashCode (){return hgl::GetTypeHash<StaticMeshComponent>();}
const size_t GetComponentHashCode ()const override{return StaticMeshComponentManager::StaticComponentHashCode();}
const size_t GetHashCode ()const override{return StaticMeshComponentManager::StaticHashCode();}
public:
StaticMeshComponentManager()=default;
StaticMeshComponent *CreateStaticMeshComponent(SceneNode *psn,StaticMeshComponentData *data);
virtual Component *CreateComponent(SceneNode *psn,ComponentData *data) override;
};//class StaticMeshComponentManager
class StaticMeshComponent:public PrimitiveComponent
{
StaticMeshComponentData *sm_data;
public:
StaticMeshComponent(SceneNode *psn,ComponentData *cd,ComponentManager *cm)
:PrimitiveComponent(psn,cd,cm)
{
sm_data=reinterpret_cast<StaticMeshComponentData *>(cd);
}
virtual ~StaticMeshComponent()=default;
static constexpr const size_t StaticHashCode()
{
return hgl::GetTypeHash<StaticMeshComponent>();
}
const size_t GetHashCode()const override
{
return StaticMeshComponent::StaticHashCode();
}
StaticMeshComponentData &GetData() {return *sm_data;}
const StaticMeshComponentData &GetData()const {return *sm_data;}
};//class StaticMeshComponent
COMPONENT_NAMESPACE_END

View File

@@ -11,4 +11,18 @@ namespace hgl::graph
ENUM_CLASS_RANGE(NDC,Ortho)
};
constexpr const char *CoordinateSystem2DName[]=
{
"NDC",
"0to1",
"Ortho"
};
inline const char *GetCoordinateSystem2DName(const enum class CoordinateSystem2D &cs)
{
RANGE_CHECK_RETURN_NULLPTR(cs)
return CoordinateSystem2DName[size_t(cs)];
}
}//namespace hgl::graph

View File

@@ -1,5 +1,4 @@
#ifndef HGL_GRAPH_INLINE_GEOMETRY_INCLUDE
#define HGL_GRAPH_INLINE_GEOMETRY_INCLUDE
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/math/Vector.h>
@@ -7,235 +6,232 @@
#include<hgl/type/Size2.h>
#include<hgl/color/Color4f.h>
#include<hgl/graph/AABB.h>
namespace hgl
namespace hgl::graph
{
namespace graph
class PrimitiveCreater;
namespace inline_geometry
{
class PrimitiveCreater;
namespace inline_geometry
/**
* 矩形创建信息(扇形/三角形条)
*/
struct RectangleCreateInfo
{
/**
* 矩形创建信息(扇形/三角形条)
*/
struct RectangleCreateInfo
{
RectScope2f scope;
};//struct RectangleCreateInfo
RectScope2f scope;
};//struct RectangleCreateInfo
Primitive *CreateRectangle(PrimitiveCreater *pc,const RectangleCreateInfo *rci);
Primitive *CreateRectangle(PrimitiveCreater *pc,const RectangleCreateInfo *rci);
/**
* 创建延迟渲染用全屏平面
*/
Primitive *CreateGBufferCompositionRectangle(PrimitiveCreater *pc);
/**
* 创建延迟渲染用全屏平面
*/
Primitive *CreateGBufferCompositionRectangle(PrimitiveCreater *pc);
/**
* 圆角矩形创建信息(扇形/线圈)
*/
struct RoundRectangleCreateInfo:public RectangleCreateInfo
{
float radius; ///<圆角半径
uint32_t round_per; ///<圆角精度
};//struct RoundRectangleCreateInfo:public RectangleCreateInfo
/**
* 圆角矩形创建信息(扇形/线圈)
*/
struct RoundRectangleCreateInfo:public RectangleCreateInfo
{
float radius; ///<圆角半径
uint32_t round_per; ///<圆角精度
};//struct RoundRectangleCreateInfo:public RectangleCreateInfo
Primitive *CreateRoundRectangle(PrimitiveCreater *pc,const RoundRectangleCreateInfo *rci);
Primitive *CreateRoundRectangle(PrimitiveCreater *pc,const RoundRectangleCreateInfo *rci);
/**
* 圆形创建信息
*/
struct CircleCreateInfo
{
Vector2f center; ///<圆心坐标
Vector2f radius; ///<半径
uint field_count=8; ///<分段数量
/**
* 圆形创建信息
*/
struct CircleCreateInfo
{
Vector2f center; ///<圆心坐标
Vector2f radius; ///<半径
uint field_count=8; ///<分段数量
bool has_center; ///<是否有圆心点
bool has_center; ///<是否有圆心点
Vector4f center_color; ///<圆心颜色
Vector4f border_color; ///<边缘颜色
};//struct CircleCreateInfo
Vector4f center_color; ///<圆心颜色
Vector4f border_color; ///<边缘颜色
};//struct CircleCreateInfo
/**
* 创建一个2D圆形(扇形/线圈)
*/
Primitive *CreateCircle2D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个2D圆形(扇形/线圈)
*/
Primitive *CreateCircle2D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3D(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个使用三角形绘制的3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3DByIndexTriangles(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 创建一个使用三角形绘制的3D圆形(扇形/圆形XYZ永远为0)
*/
Primitive *CreateCircle3DByIndexTriangles(PrimitiveCreater *pc,const CircleCreateInfo *cci);
/**
* 平面网格创建信息<br>
* 会创建一个在XY平面上居中的网格单个格子尺寸为1。
*/
struct PlaneGridCreateInfo
/**
* 平面网格创建信息<br>
* 会创建一个在XY平面上居中的网格单个格子尺寸为1。
*/
struct PlaneGridCreateInfo
{
Size2u grid_size; ///<格子数量
Size2u sub_count; ///<细分格子数量
uint8 lum; ///<一般线条亮度
uint8 sub_lum; ///<细分及边界线条亮度
};//struct PlaneGridCreateInfo
/**
* 创建一个平面网格(线条)
*/
Primitive *CreatePlaneGrid2D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci); //创建一个平面网格(线条)
Primitive *CreatePlaneGrid3D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci);
/**
* 创建一个平面正方形(三角形)
*/
Primitive *CreatePlaneSqaure(PrimitiveCreater *pc);
struct CubeCreateInfo
{
bool normal;
bool tangent;
bool tex_coord;
enum class ColorType
{
Size2u grid_size; ///<格子数量
NoColor=0, ///<没有颜色
SameColor, ///<一个颜色
FaceColor, ///<每个面一个颜色(请写入6个颜色值)
VertexColor, ///<每个顶点一个颜色(请写入24个颜色值)
Size2u sub_count; ///<细分格子数量
ENUM_CLASS_RANGE(NoColor,VertexColor)
};
uint8 lum; ///<一般线条亮度
uint8 sub_lum; ///<细分及边界线条亮度
};//struct PlaneGridCreateInfo
ColorType color_type;
Vector4f color[24];
/**
* 创建一个平面网格(线条)
*/
Primitive *CreatePlaneGrid2D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci); //创建一个平面网格(线条)
public:
Primitive *CreatePlaneGrid3D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci);
/**
* 创建一个平面正方形(三角形)
*/
Primitive *CreatePlaneSqaure(PrimitiveCreater *pc);
struct CubeCreateInfo
CubeCreateInfo()
{
bool normal;
bool tangent;
bool tex_coord;
normal=false;
tangent=false;
tex_coord=false;
enum class ColorType
{
NoColor=0, ///<没有颜色
SameColor, ///<一个颜色
FaceColor, ///<每个面一个颜色(请写入6个颜色值)
VertexColor, ///<每个顶点一个颜色(请写入24个颜色值)
color_type=ColorType::NoColor;
}
};//struct CubeCreateInfo
ENUM_CLASS_RANGE(NoColor,VertexColor)
};
/**
* 创建一个立方体(三角形)
*/
Primitive *CreateCube(PrimitiveCreater *pc,const CubeCreateInfo *cci);
ColorType color_type;
Vector4f color[24];
struct BoundingBoxCreateInfo
{
bool normal;
public:
CubeCreateInfo()
{
normal=false;
tangent=false;
tex_coord=false;
color_type=ColorType::NoColor;
}
};//struct CubeCreateInfo
/**
* 创建一个立方体(三角形)
*/
Primitive *CreateCube(PrimitiveCreater *pc,const CubeCreateInfo *cci);
struct BoundingBoxCreateInfo
enum class ColorType
{
bool normal;
NoColor=0, ///<没有颜色
SameColor, ///<一个颜色
VertexColor, ///<每个顶点一个颜色(请写入8个颜色值)
enum class ColorType
{
NoColor=0, ///<没有颜色
SameColor, ///<一个颜色
VertexColor, ///<每个顶点一个颜色(请写入8个颜色值)
ENUM_CLASS_RANGE(NoColor,VertexColor)
};
ENUM_CLASS_RANGE(NoColor,VertexColor)
};
ColorType color_type;
Vector4f color[8];
ColorType color_type;
Vector4f color[8];
public:
public:
BoundingBoxCreateInfo()
{
normal=false;
color_type=ColorType::NoColor;
}
};//struct BoundingBoxCreateInfo
/**
* 创建一个绑定盒(线条)
*/
Primitive *CreateBoundingBox(PrimitiveCreater *pc,const BoundingBoxCreateInfo *cci);
/**
* 创建一个球心坐标为0,0,0半径为1的球体(三角形)
*/
Primitive *CreateSphere(PrimitiveCreater *,const uint numberSlices);
/**
* 创建一个穹顶(三角形)
*/
Primitive *CreateDome(PrimitiveCreater *pc, const uint numberSlices);
struct TorusCreateInfo
BoundingBoxCreateInfo(bool n=false,ColorType ct=ColorType::NoColor)
{
float innerRadius,
outerRadius;
normal=n;
uint numberSlices,
numberStacks;
color_type=ct;
}
};//struct BoundingBoxCreateInfo
Vector2f uv_scale={1.0,1.0};
};//struct TorusCreateInfo
/**
* 创建一个绑定盒(线条)
*/
Primitive *CreateBoundingBox(PrimitiveCreater *pc,const BoundingBoxCreateInfo *cci);
/**
* 创建一个圆环(三角形)
*/
Primitive *CreateTorus(PrimitiveCreater *pc,const TorusCreateInfo *tci);
/**
* 创建一个球心坐标为0,0,0半径为1的球体(三角形)
*/
Primitive *CreateSphere(PrimitiveCreater *,const uint numberSlices);
struct CylinderCreateInfo
/**
* 创建一个穹顶(三角形)
*/
Primitive *CreateDome(PrimitiveCreater *pc, const uint numberSlices);
struct TorusCreateInfo
{
float innerRadius,
outerRadius;
uint numberSlices,
numberStacks;
Vector2f uv_scale={1.0,1.0};
};//struct TorusCreateInfo
/**
* 创建一个圆环(三角形)
*/
Primitive *CreateTorus(PrimitiveCreater *pc,const TorusCreateInfo *tci);
struct CylinderCreateInfo
{
float halfExtend, //高度
radius; //半径
uint numberSlices;
};//struct CylinderCreateInfo
/**
* 创建一个圆柱(三角形)
*/
Primitive *CreateCylinder(PrimitiveCreater *,const CylinderCreateInfo *cci);
struct ConeCreateInfo
{
float halfExtend, //高度
radius; //半径
uint numberSlices, //圆切分精度
numberStacks; //柱高层数
};//struct ConeCreateInfo
/**
* 创建一个圆锥(三角形)
*/
Primitive *CreateCone(PrimitiveCreater *,const ConeCreateInfo *cci);
struct AxisCreateInfo
{
float size;
Color4f color[3];
public:
AxisCreateInfo()
{
float halfExtend, //高度
radius; //半径
uint numberSlices;
};//struct CylinderCreateInfo
size=1.0f;
color[0].Set(1,0,0,1);
color[1].Set(0,1,0,1);
color[2].Set(0,0,1,1);
}
};//struct AxisCreateInfo
/**
* 创建一个圆柱(三角形)
*/
Primitive *CreateCylinder(PrimitiveCreater *,const CylinderCreateInfo *cci);
struct ConeCreateInfo
{
float halfExtend, //高度
radius; //半径
uint numberSlices, //圆切分精度
numberStacks; //柱高层数
};//struct ConeCreateInfo
/**
* 创建一个圆锥(三角形)
*/
Primitive *CreateCone(PrimitiveCreater *,const ConeCreateInfo *cci);
struct AxisCreateInfo
{
float size;
Color4f color[3];
public:
AxisCreateInfo()
{
size=1.0f;
color[0].Set(1,0,0,1);
color[1].Set(0,1,0,1);
color[2].Set(0,0,1,1);
}
};//struct AxisCreateInfo
/**
* 创建一个坐标线(线条)
*/
Primitive *CreateAxis(PrimitiveCreater *pc,const AxisCreateInfo *aci);
}//namespace inline_geometry
}//namespace graph
};//namespace hgl
#endif//HGL_GRAPH_INLINE_GEOMETRY_INCLUDE
/**
* 创建一个坐标线(线条)
*/
Primitive *CreateAxis(PrimitiveCreater *pc,const AxisCreateInfo *aci);
}//namespace inline_geometry
}//namespace hgl::graph

View File

@@ -102,14 +102,14 @@ protected:
bool BindVAB(const MeshDataBuffer *,const uint);
void ProcIndirectRender();
void Render(RenderItem *);
bool Render(RenderItem *);
public:
MaterialRenderList(VulkanDevice *d,bool l2w,const RenderPipelineIndex &rpi);
~MaterialRenderList();
void Add(SceneNode *);
void Add(MeshComponent *);
void SetCameraInfo(CameraInfo *ci){camera_info=ci;}
@@ -120,6 +120,6 @@ public:
void Render(RenderCmdBuffer *);
void UpdateLocalToWorld(); //刷新所有对象的LocalToWorld矩阵
void UpdateMaterialInstance(SceneNode *);
void UpdateMaterialInstance(MeshComponent *);
};//class MaterialRenderList
VK_NAMESPACE_END

View File

@@ -62,7 +62,8 @@ public:
};
/**
* 网格体(网格中的最小渲染单位)
* 网格体(网格渲染中的最小渲染单位,只能是一个材质实例)
* 多材质的网格体使用StaticMesh它内含多个Mesh
*/
class Mesh
{
@@ -98,8 +99,8 @@ public:
Primitive * GetPrimitive (){return primitive;}
const AABB & GetBoundingBox ()const{return primitive->GetBoundingBox();}
const MeshDataBuffer * GetDataBuffer ()const{return data_buffer;}
const MeshRenderData * GetRenderData ()const{return render_data;}
const MeshDataBuffer * GetDataBuffer ()const{return data_buffer;}
const MeshRenderData * GetRenderData ()const{return render_data;}
public:

View File

@@ -13,7 +13,7 @@ class PrimitiveCreater
{
protected:
VulkanDevice * device;
VulkanDevice * device;
VertexDataManager * vdm;
const VIL * vil;

View File

@@ -6,6 +6,12 @@
#include<hgl/graph/module/SwapchainModule.h>
#include<hgl/graph/module/GraphModuleManager.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/CameraControl.h>
#include<hgl/graph/Renderer.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/io/event/MouseEvent.h>
#include<hgl/component/CreateComponentInfo.h>
VK_NAMESPACE_BEGIN
@@ -17,6 +23,9 @@ class RenderTargetManager;
class RenderModule;
class Scene;
class Renderer;
class CameraComponentManager{/*现阶段测试使用*/};
class LightComponentManager{/*现阶段测试使用*/};
@@ -27,7 +36,7 @@ class RenderFramework:public io::WindowEvent
Window * win =nullptr;
VulkanInstance * inst =nullptr;
VulkanDevice * device =nullptr;
VulkanDevice * device =nullptr;
RenderResource * render_resource =nullptr;
@@ -47,15 +56,30 @@ protected:
CameraComponentManager *camera_component_manager=nullptr;
LightComponentManager *light_component_manager =nullptr;
protected: //RenderContext,未来合并成一个RenderContext结构
Scene * default_scene =nullptr;
Camera * default_camera =nullptr;
CameraControl * default_camera_control =nullptr;
Renderer * default_renderer =nullptr;
void OnChangeDefaultScene(Scene *);
void CreateDefaultRenderer();
protected: //EventDispatcher
io::MouseEvent *mouse_event=nullptr;
public:
Window * GetWindow ()const{return win;}
VulkanDevice * GetDevice ()const{return device;}
VkDevice GetVkDevice ()const{return device->GetDevice();}
const VulkanPhyDevice * GetPhyDevice ()const{return device->GetPhyDevice();}
VulkanDevAttr * GetDevAttr ()const{return device->GetDevAttr();}
Window * GetWindow ()const{return win;}
VulkanDevice * GetDevice ()const{return device;}
VkDevice GetVkDevice ()const{return device->GetDevice();}
const VulkanPhyDevice * GetPhyDevice ()const{return device->GetPhyDevice();}
VulkanDevAttr * GetDevAttr ()const{return device->GetDevAttr();}
RenderResource * GetRenderResource ()const{return render_resource;}
RenderResource * GetRenderResource ()const{return render_resource;}
public:
@@ -68,6 +92,26 @@ public:
SwapchainModule * GetSwapchainModule (){return sc_module;}
SwapchainRenderTarget * GetSwapchainRenderTarget(){return sc_module?sc_module->GetRenderTarget():nullptr;}
public:
Scene * GetDefaultScene (){return default_scene;}
Camera * GetDefaultCamera (){return default_camera;}
CameraControl * GetDefaultCameraControl (){return default_camera_control;}
Renderer * GetDefaultRenderer (){return default_renderer;}
RenderPass * GetDefaultRenderPass (){return default_renderer->GetRenderPass();}
public:
bool GetMouseCoord(Vector2i *mc)const
{
if(!mouse_event||!mc)
return(false);
*mc=mouse_event->GetMouseCoord();
return(true);
}
public:
RenderFramework(const OSString &);
@@ -81,6 +125,10 @@ public: // event
virtual void OnActive(bool);
virtual void OnClose();
public:
void Tick();
public: // other
RenderList *CreateRenderList()
@@ -90,6 +138,72 @@ public: // other
TileFont *CreateTileFont(FontSource *fs,int limit_count=-1); ///<创建只使用一种字符的Tile字符管理对象
public:
template<typename ...ARGS>
graph::Pipeline *CreatePipeline(ARGS...args)
{
return GetDefaultRenderPass()->CreatePipeline(args...);
}
graph::Material *CreateMaterial(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci)
{
return render_resource->CreateMaterial(mi_name,mci);
}
template<typename T>
graph::MaterialInstance *CreateMaterialInstance(graph::Material *mtl,const graph::VILConfig *vil_config=nullptr,const T *data=nullptr)
{
if(!mtl)
return(nullptr);
return render_resource->CreateMaterialInstance(mtl,vil_config,data);
}
graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mi_name,const graph::mtl::MaterialCreateInfo *mci,const graph::VILConfig *vil_cfg=nullptr)
{
return render_resource->CreateMaterialInstance(mi_name,mci,vil_cfg);
}
graph::MaterialInstance *CreateMaterialInstance(const AnsiString &mtl_name,graph::mtl::MaterialCreateConfig *mtl_cfg,const graph::VILConfig *vil_cfg=nullptr)
{
AutoDelete<graph::mtl::MaterialCreateInfo> mci=graph::mtl::CreateMaterialCreateInfo(GetDevAttr(),mtl_name,mtl_cfg);
return render_resource->CreateMaterialInstance(mtl_name,mci,vil_cfg);
}
SharedPtr<graph::PrimitiveCreater> GetPrimitiveCreater(graph::Material *mtl)
{
if(!mtl)
return(nullptr);
return(new graph::PrimitiveCreater(GetDevice(),mtl->GetDefaultVIL()));
}
SharedPtr<graph::PrimitiveCreater> GetPrimitiveCreater(graph::MaterialInstance *mi)
{
if(!mi)
return(nullptr);
return(new graph::PrimitiveCreater(GetDevice(),mi->GetVIL()));
}
graph::VertexDataManager *CreateVDM(const graph::VIL *vil,const VkDeviceSize vertices_number,VkDeviceSize indices_number,const IndexType type=IndexType::U16);
graph::VertexDataManager *CreateVDM(const graph::VIL *vil,const VkDeviceSize number,const IndexType type=IndexType::U16){return CreateVDM(vil,number,number,type);}
public: // Primitive, Mesh
graph::Primitive *CreatePrimitive(const AnsiString &name,
const uint32_t vertices_count,
const graph::VIL *vil,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list);
graph::Mesh *CreateMesh(const AnsiString &name,
const uint32_t vertices_count,
graph::MaterialInstance *mi,
graph::Pipeline *pipeline,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list);
public: // ComponentManager
template<typename T> T *GetComponentManager()
@@ -106,6 +220,41 @@ public: // ComponentManager
{
return light_component_manager;
}
public: //Component 相关
template<typename C,typename ...ARGS>
inline C *CreateComponent(const CreateComponentInfo *cci,ARGS...args)
{
auto manager=C::GetDefaultManager(); //取得默认管理器
if(!manager)
{
// LOG_ERROR(OS_TEXT("CreateComponent failed, no default manager!"));
return(nullptr);
}
C *c=(C *)(manager->CreateComponent(args...)); //创建组件
if(!c)
{
// LOG_ERROR(OS_TEXT("CreateComponent failed, create component failed!"));
return(nullptr);
}
/**
* 如果此处出现转换错误请检查是否包含了对应的Component头文件。
*/
if(cci)
{
if(cci->owner_node)
cci->owner_node->AttachComponent(c); //将组件附加到所属节点
c->graph::SceneOrient::SetLocalMatrix(cci->mat);
}
return c;
}
};//class RenderFramework
VK_NAMESPACE_END

View File

@@ -29,18 +29,24 @@ namespace hgl
virtual bool ExpendNode(SceneNode *);
public:
const CameraInfo *GetCameraInfo()const{return camera_info;}
public:
RenderList(VulkanDevice *);
virtual ~RenderList()=default;
virtual void SetCamera(CameraInfo *ci){camera_info=ci;} ///<设置相机信息
virtual void SetCameraInfo(CameraInfo *ci){camera_info=ci;} ///<设置相机信息
virtual bool Expend(SceneNode *); ///<展开场景树到渲染列表
bool IsEmpty()const{return !renderable_count;} ///<是否是空的
virtual bool Render(RenderCmdBuffer *); ///<渲染所有对象
virtual void UpdateLocalToWorld(); ///<更新所有对象的变换数据
virtual void UpdateMaterialInstance(SceneNode *); ///<有对象互换了材质实例
virtual void UpdateMaterialInstance(MeshComponent *); ///<有对象互换了材质实例
virtual void Clear(); ///<彻底清理
};//class RenderList

View File

@@ -9,24 +9,32 @@ namespace hgl
{
class Mesh;
class MaterialInstance;
class SceneNode;
class MeshComponent;
struct RenderNode:public Comparator<RenderNode>
{
uint index; ///<在MaterialRenderList中的索引
uint index; ///<在MaterialRenderList中的索引
SceneNode * scene_node;
MeshComponent * sm_component; ///<静态网格组件
uint32 l2w_version;
uint32 l2w_index;
uint32 l2w_version;
uint32 l2w_index;
Vector3f world_position;
float to_camera_distance;
Vector3f world_position;
float to_camera_distance;
//包围盒
//屏幕空间Tile分布
public:
//该函数位于MaterialRenderList.cpp
const int compare(const RenderNode &)const override;
public:
Mesh *GetMesh()const;
MaterialInstance *GetMaterialInstance()const;
};
using RenderNodeList=ArrayList<RenderNode>;

View File

@@ -0,0 +1,44 @@
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/type/IDName.h>
namespace hgl::graph
{
HGL_DEFINE_IDNAME(RenderTaskName,char)
/**
* 最终的具体渲染任务
*/
class RenderTask
{
RenderTaskName task_name;
IRenderTarget * render_target;
RenderList * render_list;
CameraInfo * camera_info;
public:
const RenderTaskName &GetName ()const;
IRenderTarget * GetRenderTarget ()const{return render_target;}
RenderList * GetRenderList ()const{return render_list;}
CameraInfo * GetCameraInfo ()const{return camera_info;}
public:
RenderTask(const RenderTaskName &tn,IRenderTarget *rt=nullptr,CameraInfo *ci=nullptr);
virtual ~RenderTask();
bool SetRenderTarget(IRenderTarget *);
void SetCameraInfo(CameraInfo *);
bool RebuildRenderList(SceneNode *);
bool IsEmpty()const; ///<是否是空的,不可渲染或是没啥可渲染的
bool Render(RenderCmdBuffer *);
};//class RenderTask
}//namespace hgl::graph

57
inc/hgl/graph/Renderer.h Normal file
View File

@@ -0,0 +1,57 @@
#pragma once
#include<hgl/graph/RenderTask.h>
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/CameraControl.h>
#include<hgl/type/Map.h>
namespace hgl::graph
{
class Scene;
class CameraControl;
using RenderTaskNameMap=Map<RenderTaskName,RenderTask *>;
/**
* 渲染器
*/
class Renderer
{
IRenderTarget *render_target;
Scene *scene;
CameraControl *camera_control;
//RenderTaskNameMap static_render_task_list; ///<静态渲染任务列表
//RenderTaskNameMap dynamic_render_task_list; ///<动态渲染任务列表
RenderTask *render_task; ///<当前渲染任务
Color4f clear_color; ///<清屏颜色
bool build_frame=false;
public:
RenderPass *GetRenderPass (){return render_target->GetRenderPass();} ///<取得当前渲染器RenderPass
const VkExtent2D &GetExtent ()const{return render_target->GetExtent();} ///<取得当前渲染器画面尺寸
Scene * GetScene ()const{return scene;} ///<获取场景世界
Camera * GetCamera ()const{return camera_control->GetCamera();} ///<获取当前相机
public:
Renderer(IRenderTarget *);
virtual ~Renderer();
bool SetRenderTarget(IRenderTarget *);
void SetScene(Scene *);
void SetCameraControl(CameraControl *);
void SetClearColor(const Color4f &c){clear_color=c;}
bool RenderFrame(); ///<重新重成这一帧的CommandList
bool Submit(); ///<提交CommandList到GPU
};//class Renderer
}//namespace hgl::graph

60
inc/hgl/graph/Scene.h Normal file
View File

@@ -0,0 +1,60 @@
#pragma once
#include<hgl/graph/SceneNode.h>
#include<hgl/type/Pool.h>
#include<hgl/io/event/EventDispatcher.h>
namespace hgl::graph
{
/**
* 场景管理器<Br>
* 管理一个场景中的所有资源与场景节点
*/
class Scene
{
U8String SceneName; ///<场景名称
ObjectList<SceneNode> SceneNodePool; ///<场景节点池
SceneNode *root_node; ///<场景根节点
protected: // event dispatcher
io::EventDispatcher event_dispatcher; ///<事件分发器
public:
const U8String & GetSceneName()const{return SceneName;} ///<获取场景名称
SceneNode * GetRootNode (){return root_node;} ///<获取场景根节点
public:
Scene()
{
root_node=new SceneNode(this);
}
virtual ~Scene()
{
SAFE_CLEAR(root_node);
}
io::EventDispatcher &GetEventDispatcher() ///<获取事件分发器
{
return event_dispatcher;
}
};//class Scene
bool RegisterScene(Scene *sw); ///<注册场景
bool UnregisterScene(const U8String &scene_name); ///<注销场景
inline bool UnregisterScene(Scene *sw) ///<注销场景
{
if(!sw)return(false);
return UnregisterScene(sw->GetSceneName());
}
Scene *GetScene(const U8String &scene_name); ///<获取指定名称的场景
}//namespace hgl::graph

View File

@@ -4,12 +4,25 @@
#include<hgl/type/IDName.h>
#include<hgl/graph/SceneOrient.h>
#include<hgl/graph/AABB.h>
#include<hgl/graph/OBB.h>
#include<hgl/component/Component.h>
namespace hgl::io
{
class EventDispatcher; // 前向声明事件分发器
}//
namespace hgl::graph
{
using SceneNodeID =uint64;
using SceneNodeName =U16IDName;
class Scene; //场景主类
//每个SceneNode都要记录Scene来区分自己属于那个场景
//这个场景可能是一个确实是一个场景也有可能只是一个StaticMesh
using SceneNodeID =int64;
using SceneNodeList =ObjectList<SceneNode>;
HGL_DEFINE_U16_IDNAME(SceneNodeName)
/**
* 场景节点数据类<br>
@@ -18,108 +31,170 @@ namespace hgl::graph
*/
class SceneNode:public SceneOrient ///场景节点类
{
SceneNode *ParentNode; ///<上级节点
friend class Scene;
SceneNodeID NodeID; ///<节点ID
SceneNodeName NodeName; ///<节点名称
Scene *main_scene=nullptr; ///<主场景
SceneNode *parent_node=nullptr; ///<上级节点
SceneNodeID node_id=-1; ///<节点ID
SceneNodeName node_name; ///<节点名称
void OnChangeScene(Scene *);
protected:
AABB BoundingBox; ///<绑定盒
AABB LocalBoundingBox; ///<本地坐标绑定盒
//AABB WorldBoundingBox; ///<世界坐标绑定盒
Mesh *render_obj=nullptr; ///<可渲染实例
AABB local_bounding_box; ///<本地坐标绑定盒
OBB world_bounding_box; ///<世界坐标绑定盒
protected:
ObjectList<SceneNode> ChildNode; ///<子节点
ObjectList<Component> ComponentList; ///<组件列表
SceneNodeList child_nodes; ///<子节点
/**
* 组件合集一个SceneNode下可能会包含多个组件同时一个组件也可能被多个SceneNode使用。
* 所以这里只保留一个指针不拥有组件的生命周期组件的生命周期由其对应的ComponentManager管理。
*/
ComponentSet component_set; ///<组件合集
public:
const SceneNodeID & GetNodeID ()const { return NodeID; } ///<取得节点ID
const SceneNodeName & GetNodeName ()const { return NodeName; } ///<取得节点名称
Scene *GetScene()const{ return main_scene; } ///<取得主场景
const ObjectList<SceneNode> &GetChildNode()const { return ChildNode; } ///<取得节点列表
const SceneNodeID & GetNodeID ()const { return node_id; } ///<取得节点ID
const SceneNodeName & GetNodeName ()const { return node_name; } ///<取得节点名称
public:
const SceneNodeList & GetChildNode()const { return child_nodes; } ///<取得子节点列表
protected:
SceneNode()=default;
SceneNode(const SceneNode &)=delete;
SceneNode(const SceneNode *)=delete;
SceneNode(const SceneOrient &so ):SceneOrient(so) {}
SceneNode( Mesh *ri ) {render_obj=ri;}
SceneNode(const Matrix4f &mat ):SceneOrient(mat) {}
SceneNode(const Matrix4f &mat, Mesh *ri ):SceneOrient(mat) {render_obj=ri;}
SceneNode():SceneOrient(){}
SceneNode(Scene *s):SceneOrient(),main_scene(s){} ///<从Scene构造
SceneNode(Scene *s,const SceneOrient &so):SceneOrient(so),main_scene(s){} ///<从SceneOrient复制构造
SceneNode(Scene *s,const Matrix4f &mat):SceneOrient(mat),main_scene(s){} ///<从Matrix4f复制构造
public:
virtual ~SceneNode()=default;
virtual ~SceneNode();
public:
virtual SceneNode * CreateNode()const{return(new SceneNode(GetScene()));} ///<创建一个同类的节点对象
virtual void DuplicationChildNodes(SceneNode *node) const ///<复制子节点到指定节点
{
for(SceneNode *sn:GetChildNode())
node->Add(sn->Duplication());
}
virtual void DuplicationComponents(SceneNode *node) const ///<复制组件到指定节点
{
for(Component *c:GetComponents())
node->AttachComponent(c->Duplication());
}
virtual SceneNode * Duplication() const ///<复制一个场景节点
{
if(!this)
return nullptr;
SceneNode *node=CreateNode();
node->SetSceneMatrix(GetSceneMatrix()); //复制本地矩阵
DuplicationChildNodes(node); //复制子节点
DuplicationComponents(node); //复制组件
return node;
}
void Clear() override
{
SetParent(nullptr); //清除父节点
local_bounding_box.Clear();
world_bounding_box.Clear();
child_nodes.Clear();
component_set.Clear();
SceneOrient::Clear();
ParentNode=nullptr;
BoundingBox.SetZero();
LocalBoundingBox.SetZero();
ChildNode.Clear();
ComponentList.Clear();
render_obj=nullptr;
}
const bool ChildNodeIsEmpty()const
{
if(render_obj)return(false);
if(ChildNode.GetCount())return(false);
if(child_nodes.GetCount())return(false);
return(true);
}
void SetParent(SceneNode *sn) {ParentNode=sn;}
SceneNode * GetParent() noexcept{return ParentNode;}
const SceneNode * GetParent()const noexcept{return ParentNode;}
virtual void SetParent(SceneNode *sn)
{
if(parent_node==sn)
return; //如果父节点没有变化,则不需要处理
void SetRenderable(Mesh *);
Mesh * GetRenderable() noexcept{return render_obj;}
const Mesh * GetRenderable()const noexcept{return render_obj;}
parent_node=sn;
OnChangeScene(sn?sn->GetScene():nullptr);
}
SceneNode * GetParent() noexcept{return parent_node;}
const SceneNode * GetParent()const noexcept{return parent_node;}
SceneNode *Add(SceneNode *sn)
{
if(!sn)
return(nullptr);
ChildNode.Add(sn);
child_nodes.Add(sn);
sn->SetParent(this);
return sn;
}
public: //坐标相关方法
public: //事件相关
virtual void SetBoundingBox (const AABB &bb){BoundingBox=bb;} ///<设置绑定盒
virtual io::EventDispatcher *GetEventDispatcher(){return nullptr;} ///<取得事件分发器(如果返回nullptr,则表示该节点不支持事件分发)
public: //坐标相关方法
virtual void RefreshMatrix () override; ///<刷新世界变换
virtual void RefreshBoundingBox (); ///<刷新绑定盒
virtual const AABB & GetBoundingBox ()const{return BoundingBox;} ///<取得绑定盒
virtual const AABB & GetLocalBoundingBox ()const{return LocalBoundingBox;} ///<取得本地坐标绑定盒
virtual const AABB & GetLocalBoundingBox ()const{return local_bounding_box;} ///<取得本地坐标绑定盒
// virtual const AABB & GetWorldBoundingBox ()const{return WorldBoundingBox;} ///<取得世界坐标绑定盒
public: //组件相关方法
bool ComponentIsEmpty ()const {return ComponentList.GetCount()==0;} ///<是否没有组件
virtual int GetComponentCount ()const {return ComponentList.GetCount();} ///<取得组件数量
virtual void AddComponent (Component *comp) {ComponentList.Add(comp);} ///<添加一个组件
virtual void RemoveComponent (Component *comp) {ComponentList.DeleteByValue(comp);} ///<删除一个组件
bool Contains (Component *comp) {return ComponentList.Contains(comp);} ///<是否包含指定组件
bool ComponentIsEmpty ()const{return component_set.IsEmpty();} ///<是否没有组件
virtual const int64 GetComponentCount ()const{return component_set.GetCount();} ///<取得组件数量
virtual bool AttachComponent (Component *comp) ///<添加一个组件
{
if(!comp)return(false);
if(component_set.Add(comp)<0)
return(false);
comp->OnAttach(this); //调用组件的OnAttach方法
return(true);
}
virtual void DetachComponent (Component *comp) ///<删除一个组件
{
if (!comp)return;
component_set.Delete(comp);
comp->OnDetach(this); //调用组件的OnDetach方法
}
bool Contains (Component *comp){return component_set.Contains(comp);} ///<是否包含指定组件
bool HasComponent (const ComponentManager *); ///<是否有指定组件管理器的组件
virtual int GetComponents (ArrayList<Component *> &comp_list,const ComponentManager *); ///<取得所有组件
virtual int GetComponents (ComponentList &comp_list,const ComponentManager *); ///<取得所有组件
const ComponentSet &GetComponents ()const{return component_set;}
};//class SceneNode
SceneNode *Duplication(SceneNode *); ///<复制一个场景节点
}//namespace hgl::graph

View File

@@ -25,15 +25,19 @@ namespace hgl::graph
scene_matrix.Clear();
}
void SetLocalNormal(const Vector3f &nor) {scene_matrix.SetLocalNormal(nor);} ///<设置本地法线
void SetSceneMatrix (const SceneMatrix &sm){scene_matrix=sm;} ///<设置场景矩阵
void SetLocalNormal (const Vector3f &nor){scene_matrix.SetLocalNormal(nor);} ///<设置本地法线
void SetLocalMatrix (const Matrix4f &mat){scene_matrix.SetLocalMatrix(mat);} ///<设置本地矩阵
void SetParentMatrix(const Matrix4f &mat){scene_matrix.SetParentMatrix(mat);} ///<设置上级到世界空间变换矩阵
public:
const uint32 GetLocalToWorldMatrixVersion()const {return scene_matrix.GetNewestVersion();} ///<取得版本号
const SceneMatrix & GetSceneMatrix ()const {return scene_matrix;} ///<取得场景矩阵
const Vector3f & GetWorldPosition() const {return scene_matrix.GetWorldPosition();} ///<取得世界坐标
const uint32 GetLocalToWorldMatrixVersion ()const {return scene_matrix.GetNewestVersion();} ///<取得版本号
const Vector3f & GetWorldPosition ()const {return scene_matrix.GetWorldPosition();} ///<取得世界坐标
const Matrix4f & GetLocalMatrix ()const {return scene_matrix.GetLocalMatrix();} ///<取得本地矩阵
TransformManager & GetTransform () {return scene_matrix.GetTransform();} ///<取得变换管理器

View File

@@ -1,38 +0,0 @@
#pragma once
#include<hgl/graph/SceneNode.h>
namespace hgl::graph
{
class CameraData
{
};
class CameraManager
{
public:
};
/**
* 世界场景管理器<Br>
* 管理一个世界场景中的所有资源与场景节点
*/
class SceneWorld
{
SceneNode *root_node; ///<世界根节点
public:
SceneWorld()
{
root_node=new SceneNode;
}
virtual ~SceneWorld()
{
SAFE_CLEAR(root_node);
}
SceneNode *GetRootNode(){return root_node;}
};//class SceneWorld
}//namespace hgl::graph

View File

@@ -96,6 +96,7 @@ class Semaphore;
struct PipelineLayoutData;
class DescriptorSet;
enum class DescriptorSetType;
struct VertexInputAttribute;
@@ -134,7 +135,16 @@ class IndirectDispatchBuffer;
class RenderResource;
class StaticMesh;
class MeshComponent;
class SceneNode;
class Scene;
class RenderList;
struct CameraInfo;
struct Camera;
class Renderer;
enum class SharingMode
{

View File

@@ -2,6 +2,7 @@
#include<hgl/graph/VK.h>
#include<hgl/graph/VKMemory.h>
#include<hgl/graph/mtl/ShaderBufferSource.h>
VK_NAMESPACE_BEGIN
struct DeviceBufferData
@@ -53,6 +54,8 @@ public:
template<typename T> class DeviceBufferMap
{
protected:
DeviceBuffer *dev_buf;
T data_map;
@@ -75,7 +78,7 @@ public:
delete dev_buf;
}
operator DeviceBuffer *(){return dev_buf;}
DeviceBuffer *GetDeviceBuffer(){return dev_buf;}
T *data(){return &data_map;}
@@ -84,6 +87,32 @@ public:
if(dev_buf)
dev_buf->Write(&data_map,sizeof(T));
}
};
};//template<typename T> class DeviceBufferMap
template<typename T> class UBOInstance:public DeviceBufferMap<T>
{
DescriptorSetType desc_set_type;
AnsiString ubo_name;
public:
const DescriptorSetType & set_type()const{return desc_set_type;}
const AnsiString & name ()const{return ubo_name;}
DeviceBuffer * ubo ()const{return this->dev_buf;}
public:
UBOInstance(DeviceBuffer *buf,const DescriptorSetType dst,const AnsiString &n):DeviceBufferMap<T>(buf)
{
desc_set_type=dst;
ubo_name=n;
}
UBOInstance(DeviceBuffer *buf,const ShaderBufferDesc *desc):DeviceBufferMap<T>(buf)
{
desc_set_type=desc->set_type;
ubo_name=desc->name;
}
};//template<typename T> class UBOInstance:public DeviceBufferMap<T>
VK_NAMESPACE_END

View File

@@ -22,6 +22,7 @@ public:
buffer=nullptr;
offset=0;
stride=count=0;
map_ptr=nullptr;
}
virtual ~VKBufferMap()
@@ -29,7 +30,7 @@ public:
Unmap();
}
void Set(T *buf,const int32_t off,const uint32_t s,const uint32_t c)
void Bind(T *buf,const int32_t off,const uint32_t s,const uint32_t c)
{
buffer=buf;
offset=off;

View File

@@ -51,6 +51,9 @@ public:
class DescriptorBinding;
using DescriptorBindingPtr=DescriptorBinding *;
using DescriptorBindingPtrArray=DescriptorBindingPtr[size_t(DescriptorSetType::RANGE_SIZE)];
class RenderCmdBuffer:public VulkanCmdBuffer
{
uint32_t cv_count;
@@ -61,7 +64,14 @@ class RenderCmdBuffer:public VulkanCmdBuffer
RenderPassBeginInfo rp_begin;
VkPipelineLayout pipeline_layout;
DescriptorBinding *desc_binding=nullptr;
/*
* 绝大部分desc绑定会全部使用这些自动绑定器绑定
* 该数据在渲染前分别会有各自的模块设置进来
* 比如
* DescriptSetType::RenderTarget 即该由RenderTarget模块设置
* DescriptSetType::Scene 的自然由Scene模块设置
*/
DescriptorBindingPtrArray desc_binding{};
private:
@@ -72,11 +82,11 @@ public:
RenderCmdBuffer(const VulkanDevAttr *attr,VkCommandBuffer cb);
~RenderCmdBuffer();
void SetDescriptorBinding(DescriptorBinding *db) { desc_binding=db; }
bool SetDescriptorBinding(DescriptorBinding *);
bool End() override
{
desc_binding=nullptr;
hgl_zero(desc_binding);
return VulkanCmdBuffer::End();
}

View File

@@ -2,8 +2,7 @@
#include<hgl/type/Map.h>
#include<hgl/type/String.h>
#include<hgl/graph/VK.h>
#include<hgl/graph/VKDescriptorSetType.h>
#include<hgl/graph/VKBuffer.h>
VK_NAMESPACE_BEGIN
@@ -24,6 +23,10 @@ class DescriptorBinding
Map<AnsiString,DeviceBuffer *> ssbo_map;
Map<AnsiString,Texture *> texture_map;
public:
const DescriptorSetType GetType()const{return set_type;}
public:
DescriptorBinding(const DescriptorSetType &dst)
@@ -39,11 +42,35 @@ public:
return ubo_map.Add(name,buf);
}
template<typename T>
bool AddUBO(const AnsiString &name,DeviceBufferMap<T> *dbm)
{
if(name.IsEmpty()||!dbm)
return(false);
return ubo_map.Add(name,dbm->GetDeviceBuffer());
}
template<typename T>
bool AddUBO(const UBOInstance<T> *ubo_instance)
{
if(!ubo_instance)
return(false);
if(ubo_instance->set_type()!=set_type)
return(false);
if(ubo_instance->name().IsEmpty())
return(false);
return ubo_map.Add(ubo_instance->name(),ubo_instance->ubo());
}
DeviceBuffer *GetUBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
return GetObjectFromList(ubo_map,name);
return GetObjectFromMap(ubo_map,name);
}
void RemoveUBO(DeviceBuffer *buf)
@@ -61,11 +88,17 @@ public:
return ssbo_map.Add(name,buf);
}
template<typename T>
bool AddSSBO(const AnsiString &name,DeviceBufferMap<T> *dbm)
{
return AddSSBO(name,dbm->GetDeviceBuffer());
}
DeviceBuffer *GetSSBO(const AnsiString &name)
{
if(name.IsEmpty())return(nullptr);
return GetObjectFromList(ssbo_map,name);
return GetObjectFromMap(ssbo_map,name);
}
void RemoveSSBO(DeviceBuffer *buf)
@@ -87,7 +120,7 @@ public:
{
if(name.IsEmpty())return(nullptr);
return GetObjectFromList(texture_map,name);
return GetObjectFromMap(texture_map,name);
}
void RemoveTexture(Texture *tex)

View File

@@ -96,6 +96,7 @@ public: //Buffer相关
VAB * CreateVAB (VkFormat format, uint32_t count,const void *data, SharingMode sm=SharingMode::Exclusive);
VAB * CreateVAB (VkFormat format, uint32_t count, SharingMode sm=SharingMode::Exclusive){return CreateVAB(format,count,nullptr,sm);}
const bool IsSupport (const IndexType &type)const; ///<检测是否支持某种索引类型
const IndexType ChooseIndexType (const VkDeviceSize &vertex_count)const; ///<求一个合适的索引类型
const bool CheckIndexType (const IndexType,const VkDeviceSize &vertex_count)const; ///<检测一个索引类型是否合适
@@ -123,6 +124,18 @@ public: //Buffer相关
{ \
DeviceBuffer *buf=Create##LargeName(T::GetSize()); \
return(buf?new T(buf):nullptr); \
} \
\
template<typename T> T *Create##LargeName(const ShaderBufferDesc *desc) \
{ \
DeviceBuffer *buf=Create##LargeName(T::GetSize()); \
return(buf?new T(buf,desc):nullptr); \
} \
\
template<typename T> T *Create##LargeName(const DescriptorSetType &set_type,const AnsiString &name) \
{ \
DeviceBuffer *buf=Create##LargeName(T::GetSize()); \
return(buf?new T(buf,set_type,name):nullptr); \
}
CREATE_BUFFER_OBJECT(UBO,UNIFORM)

View File

@@ -54,7 +54,7 @@ public:
void SetIBO(IndexBuffer *ib,const int32_t index_offset,const uint32_t count)
{
VKBufferMap<IndexBuffer>::Set(ib,index_offset,ib->GetStride(),count);
VKBufferMap<IndexBuffer>::Bind(ib,index_offset,ib->GetStride(),count);
}
};//class IBMap

View File

@@ -1,11 +1,11 @@
#ifndef HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#define HGL_GRAPH_VULKAN_MATERIAL_INCLUDE
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/type/Map.h>
#include<hgl/type/SortedSet.h>
#include<hgl/type/String.h>
#include<hgl/graph/VKShaderModuleMap.h>
#include<hgl/graph/VKDescriptorSetType.h>
#include<hgl/graph/mtl/ShaderBufferSource.h>
namespace hgl
{
@@ -18,12 +18,15 @@ using ShaderStageCreateInfoList=ArrayList<VkPipelineShaderStageCreateInfo>;
/**
* 材质类<br>
* 用于管理shader提供DescriptorSetLayoutCreater
* 用于管理shader提供DescriptorSetLayoutCreater.
* 在材质需要用到UBO.SSBO数据情况下Material不能被用于渲染需要一个MaterialInstance来提供数据才能进行渲染。所以一般情况下不使用Material进行渲染。<br>
*/
class Material
{
AnsiString name;
PrimitiveType prim; ///<图元类型
VertexInput *vertex_input;
ShaderModuleMap *shader_maps;
@@ -45,7 +48,7 @@ private:
friend class RenderResource;
Material(const AnsiString &);
Material(const AnsiString &,const PrimitiveType &);
public:
@@ -53,6 +56,8 @@ public:
const AnsiString & GetName ()const{return name;}
const PrimitiveType & GetPrimitiveType ()const{return prim;}
const VertexInput * GetVertexInput ()const{return vertex_input;}
const ShaderStageCreateInfoList & GetStageList ()const{return shader_stage_list;}
@@ -83,6 +88,11 @@ public:
bool BindSSBO(const DescriptorSetType &type,const AnsiString &name,DeviceBuffer *ubo,bool dynamic=false);
bool BindImageSampler(const DescriptorSetType &type,const AnsiString &name,Texture *tex,Sampler *sampler);
bool BindUBO(const ShaderBufferDesc *sbd,DeviceBuffer *ubo,bool dynamic=false)
{
return BindUBO(sbd->set_type,sbd->name,ubo,dynamic);
}
void Update();
public:
@@ -97,6 +107,5 @@ public:
MaterialInstance *CreateMI(const VILConfig *vil_cfg=nullptr);
};//class Material
using MaterialSets=SortedSet<Material *>;
using MaterialSet=SortedSet<Material *>;
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_MATERIAL_INCLUDE

View File

@@ -73,7 +73,7 @@ public:
const int GetMIID ()const{return mi_id;} ///<取得材质实例ID
void * GetMIData (){return material->GetMIData(mi_id);} ///<取得材质实例数据
void WriteMIData (const void *data,const int size); ///<写入材质实例数据
void WriteMIData (const void *data,const uint32 size); ///<写入材质实例数据
template<typename T>
void WriteMIData (const T &data){WriteMIData(&data,sizeof(T));} ///<写入材质实例数据

View File

@@ -2,7 +2,6 @@
#include<hgl/graph/VK.h>
#include<hgl/type/String.h>
#include<hgl/type/SortedSet.h>
VK_NAMESPACE_BEGIN
class VulkanPhyDevice

View File

@@ -21,13 +21,19 @@ protected:
protected:
AABB BoundingBox;
AABB bounding_box;
public:
Primitive(const AnsiString &pn,PrimitiveData *pd);
virtual ~Primitive();
void SetBoundingBox(const AABB &bb) { bounding_box=bb; } ///<设置包围盒
void SetBoundingBox(const Vector3f &box_min,const Vector3f &box_max)
{
bounding_box.SetMinMax(box_min,box_max);
}
public:
const AnsiString & GetName ()const{ return prim_name; }
@@ -48,6 +54,6 @@ public:
VertexDataManager * GetVDM (); ///<取得顶点数据管理器
const AABB & GetBoundingBox ()const{return BoundingBox;}
const AABB & GetBoundingBox ()const{return bounding_box;}
};//class Primitive
VK_NAMESPACE_END

View File

@@ -56,15 +56,15 @@ public:
public:
Pipeline *CreatePipeline(Material *,const VIL *,const PipelineData *, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *,const VIL *,const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *,const VIL *,const PipelineData *, const bool prim_restart=false);
Pipeline *CreatePipeline(Material *,const VIL *,const InlinePipeline &, const bool prim_restart=false);
Pipeline *CreatePipeline(Material *mtl, const PipelineData *, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *mtl, const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(Material *mtl, const PipelineData *, const bool prim_restart=false);
Pipeline *CreatePipeline(Material *mtl, const InlinePipeline &, const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const PrimitiveType &,const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const InlinePipeline &, const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const PipelineData *, const bool prim_restart=false);
Pipeline *CreatePipeline(MaterialInstance *, const OSString &, const bool prim_restart=false);
};//class RenderPass
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_RENDER_PASS_INCLUDE

View File

@@ -31,7 +31,7 @@ using MaterialInstanceID =int;
using BufferID =int;
using DescriptorSetID =int;
using PrimitiveID =int;
using RenderableID =int;
using MeshID =int;
using SamplerID =int;
using StaticMeshID =int;
@@ -54,7 +54,7 @@ class RenderResource
IDObjectManage<PrimitiveID, Primitive> rm_primitives; ///<图元合集
IDObjectManage<BufferID, DeviceBuffer> rm_buffers; ///<顶点缓冲区合集
IDObjectManage<SamplerID, Sampler> rm_samplers; ///<采样器合集
IDObjectManage<RenderableID, Mesh> rm_renderables; ///<渲染实例集合集
IDObjectManage<MeshID, Mesh> rm_mesh; ///<渲染实例集合集
private:
@@ -77,16 +77,9 @@ public:
VulkanDevice *GetDevice(){return device;}
//注:并非一定要走这里,这里只是提供一个注册和自动绑定的机制
DescriptorBinding static_descriptor; ///<静态属性描述符绑定管理
DescriptorBinding global_descriptor; ///<全局属性描述符绑定管理
public:
RenderResource(VulkanDevice *dev):device(dev),
static_descriptor(DescriptorSetType::Static),
global_descriptor(DescriptorSetType::Global)
{}
RenderResource(VulkanDevice *dev):device(dev){}
virtual ~RenderResource()=default;
public: //添加数据到管理器如果指针为nullptr会返回-1
@@ -97,7 +90,7 @@ public: //添加数据到管理器如果指针为nullptr会返回-1
PrimitiveID Add(Primitive * p ){return rm_primitives.Add(p);}
BufferID Add(DeviceBuffer * buf ){return rm_buffers.Add(buf);}
SamplerID Add(Sampler * s ){return rm_samplers.Add(s);}
RenderableID Add(Mesh * r ){return rm_renderables.Add(r);}
MeshID Add(Mesh * r ){return rm_mesh.Add(r);}
public: // VAB/VAO
@@ -157,7 +150,7 @@ public: //Get
Primitive * GetPrimitive (const PrimitiveID &id){return rm_primitives.Get(id);}
DeviceBuffer * GetBuffer (const BufferID &id){return rm_buffers.Get(id);}
Sampler * GetSampler (const SamplerID &id){return rm_samplers.Get(id);}
Mesh * GetRenderable (const RenderableID &id){return rm_renderables.Get(id);}
Mesh * GetMesh (const MeshID &id){return rm_mesh.Get(id);}
public: //Release
@@ -167,7 +160,7 @@ public: //Release
void Release(Primitive * p ){rm_primitives.Release(p);}
void Release(DeviceBuffer * buf ){rm_buffers.Release(buf);}
void Release(Sampler * s ){rm_samplers.Release(s);}
void Release(Mesh * r ){rm_renderables.Release(r);}
void Release(Mesh * r ){rm_mesh.Release(r);}
};//class RenderResource
/**

View File

@@ -5,6 +5,7 @@
#include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKSwapchain.h>
#include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
@@ -14,7 +15,7 @@ VK_NAMESPACE_BEGIN
class RenderFramework;
using UBOViewportInfo=DeviceBufferMap<graph::ViewportInfo>;
using UBOViewportInfo=UBOInstance<graph::ViewportInfo>;
class IRenderTarget
{
@@ -29,7 +30,7 @@ class IRenderTarget
public:
RenderFramework * GetRenderFramework ()const{return render_framework;}
VulkanDevice * GetDevice ()const;
VulkanDevice * GetDevice ()const;
VkDevice GetVkDevice ()const;
DescriptorBinding * GetDescriptorBinding(){return &desc_binding;}
@@ -72,10 +73,9 @@ public: // Command Buffer
public:
virtual void Bind (Material *mtl)
virtual ViewportInfo * GetViewportInfo ()
{
if(mtl)
desc_binding.Bind(mtl);
return ubo_vp_info->data();
}
};//class IRenderTarget

View File

@@ -1,9 +1,7 @@
#ifndef HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
#define HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/graph/VKVertexInputLayout.h>
#include<hgl/type/SortedSet.h>
VK_NAMESPACE_BEGIN
@@ -46,4 +44,3 @@ public:
operator VkShaderModule ()const{return stage_create_info->module;}
};//class ShaderModule
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SHADER_MODULE_INCLUDE

View File

@@ -38,16 +38,31 @@ public:
return write_count>=vab_count;
}
void Add(const VkBuffer buf,const VkDeviceSize offset)
bool Add(const VkBuffer buf,const VkDeviceSize offset)
{
if(IsFull())
{
//如果在这里出现错误一般是材质的VertexInput与实现要使用的不匹配。很多时候是由于引擎自动添加的VertexInput但材质里没有。
//比较典型的情况是创建材质时设置了不需要L2W,但实际又进行了传递
return(false); //列表已满
}
vab_list[write_count]=buf;
vab_offset[write_count]=offset;
++write_count;
return(true);
}
void Add(const VkBuffer *buf,const VkDeviceSize *offset,const uint32_t count)
bool Add(const VkBuffer *buf,const VkDeviceSize *offset,const uint32_t count)
{
if(!buf||!offset||!count)
return(false);
if(write_count+count>vab_count)
return(false); //列表已满
hgl_cpy(vab_list +write_count,buf, count);
if(offset)
@@ -56,6 +71,7 @@ public:
hgl_set<VkDeviceSize>(vab_offset+write_count,VkDeviceSize(0),count);
write_count+=count;
return(true);
}
};//class VABList
VK_NAMESPACE_END

View File

@@ -52,9 +52,9 @@ public:
const VkFormat GetFormat()const { return buffer->GetFormat(); }
void SetVAB(VAB *vab,const VkDeviceSize off,const uint32_t count)
void BindVAB(VAB *vab,const VkDeviceSize off,const uint32_t count)
{
VKBufferMap<VAB>::Set(vab,off,vab->GetStride(),count);
VKBufferMap<VAB>::Bind(vab,off,vab->GetStride(),count);
}
};//class VABMap

View File

@@ -23,11 +23,11 @@ public:
public:
RenderFramework * GetRenderFramework ()const{return render_framework;} ///<取得渲染框架
VulkanDevice * GetDevice ()const; ///<取得GPU设备
VulkanDevice * GetDevice ()const; ///<取得GPU设备
public:
GraphModule * Get(const size_t type_hash) {return GetObjectFromList(module_map,type_hash);} ///<取得指定类型的模块
GraphModule * Get(const size_t type_hash) {return GetObjectFromMap(module_map,type_hash);} ///<取得指定类型的模块
template<typename T>
T * Get() {return((T *)Get(typeid(T).hash_code()));} ///<取得指定类型的模块
@@ -36,8 +36,8 @@ public:
template<typename T>
bool Contains()const{return Contains(typeid(T).hash_code());} ///<确认是否包含指定类型的模块
bool Registry(GraphModule *); ///<注册一个模块
bool Unregistry(GraphModule *); ///<注销一个模块
bool Register(GraphModule *); ///<注册一个模块
bool Unregister(GraphModule *); ///<注销一个模块
template<typename T>
T *GetOrCreate() ///<注册一个模块
@@ -47,7 +47,7 @@ public:
T *result=new T(render_framework);
Registry(result);
Register(result);
return result;
}

View File

@@ -14,9 +14,12 @@ namespace blinnphong
constexpr const ShaderBufferSource SBS_SunLight=
{
"SunLight",
DescriptorSetType::Scene,
"sun",
"SunLight",
R"(
vec4 direction;
vec4 color;

View File

@@ -1,7 +1,7 @@
#pragma once
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/mtl/MaterialConfig.h>
#include<hgl/graph/mtl/MaterialCreateConfig.h>
#include<hgl/graph/CoordinateSystem.h>
#include<hgl/graph/VertexAttrib.h>
@@ -51,6 +51,8 @@ public:
return off;
}
const AnsiString ToHashString() override;
};//struct Material2DCreateConfig:public MaterialCreateConfig
DEFINE_MATERIAL_FACTORY_CLASS(VertexColor2D, const Material2DCreateConfig)

View File

@@ -1,7 +1,7 @@
#pragma once
#include<hgl/graph/mtl/MaterialLibrary.h>
#include<hgl/graph/mtl/MaterialConfig.h>
#include<hgl/graph/mtl/MaterialCreateConfig.h>
#include<hgl/graph/CoordinateSystem.h>
#include<hgl/graph/VertexAttrib.h>
@@ -19,14 +19,17 @@ struct Material3DCreateConfig:public MaterialCreateConfig,public Comparator<Mate
public:
Material3DCreateConfig(const PrimitiveType &p):MaterialCreateConfig(p)
Material3DCreateConfig(const PrimitiveType &p,
const WithCamera &wc=WithCamera::With,
const WithLocalToWorld &l2w=WithLocalToWorld::With)
:MaterialCreateConfig(p)
{
rt_output.color=1; //输出一个颜色
rt_output.depth=true; //输出深度
rt_output.depth=true; //输出深度
rt_output.stencil=false; //不输出stencil
camera=true;
local_to_world=false;
camera=(wc==WithCamera::With);
local_to_world=(l2w==WithLocalToWorld::With);
position_format=VAT_VEC3;
@@ -49,8 +52,11 @@ public:
return off;
}
const AnsiString ToHashString() override;
};//struct Material3DCreateConfig:public MaterialCreateConfig
DEFINE_MATERIAL_FACTORY_CLASS(PureColor3D, const Material3DCreateConfig);
DEFINE_MATERIAL_FACTORY_CLASS(VertexColor3D, const Material3DCreateConfig);
DEFINE_MATERIAL_FACTORY_CLASS(VertexLuminance3D,const Material3DCreateConfig);
DEFINE_MATERIAL_FACTORY_CLASS(Gizmo3D, const Material3DCreateConfig);
@@ -61,6 +67,8 @@ struct BillboardMaterialCreateConfig:public Material3DCreateConfig
Vector2u pixel_size; ///<像素尺寸
VkFrontFace front_face=VK_FRONT_FACE_CLOCKWISE; ///<正面朝向
public:
using Material3DCreateConfig::Material3DCreateConfig;

View File

@@ -52,5 +52,7 @@ public:
return off;
}
virtual const AnsiString ToHashString();
};//struct MaterialCreateConfig
STD_MTL_NAMESPACE_END

View File

@@ -1,4 +1,4 @@
#pragma once
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/graph/mtl/StdMaterial.h>
@@ -7,7 +7,7 @@
STD_MTL_NAMESPACE_BEGIN
DefineIDName(MaterialName, char)
HGL_DEFINE_ANSI_IDNAME(MaterialName)
class MaterialFactory
{
@@ -31,18 +31,18 @@ public:
};//class MaterialFactory
bool RegistryMaterialFactory(MaterialFactory *);
bool RegisterMaterialFactory(MaterialFactory *);
MaterialFactory * GetMaterialFactory(const MaterialName &);
template<typename T> class RegistryMaterialFactoryClass
template<typename T> class RegisterMaterialFactoryClass
{
public:
RegistryMaterialFactoryClass()
RegisterMaterialFactoryClass()
{
STD_MTL_NAMESPACE::RegistryMaterialFactory(new T);
STD_MTL_NAMESPACE::RegisterMaterialFactory(new T);
}
};//class RegistryMaterialFactoryClass
};//class RegisterMaterialFactoryClass
#define DEFINE_MATERIAL_FACTORY_CLASS(name,cfg_type) \
namespace inline_material \
@@ -70,7 +70,7 @@ namespace \
} \
}; \
\
static RegistryMaterialFactoryClass<MaterialFactory##name> MaterialFactoryInstance_##name; \
static RegisterMaterialFactoryClass<MaterialFactory##name> MaterialFactoryInstance_##name; \
}
MaterialCreateInfo *CreateMaterialCreateInfo(const VulkanDevAttr *dev_attr,const MaterialName &,MaterialCreateConfig *cfg);

View File

@@ -1,11 +1,19 @@
#pragma once
#include<hgl/graph/VKDescriptorSetType.h>
namespace hgl::graph
{
struct ShaderBufferSource
struct ShaderBufferDesc
{
const DescriptorSetType set_type;
const char *name;
};
struct ShaderBufferSource:public ShaderBufferDesc
{
const char *struct_name;
const char *name;
const char *codes;
};
}//namespace hgl::graph

View File

@@ -23,6 +23,12 @@ namespace hgl::graph
namespace mtl
{
enum class WithCamera:uint8
{
Without=0,
With
};
enum class WithLocalToWorld:uint8
{
Without=0,

View File

@@ -6,8 +6,10 @@
STD_MTL_NAMESPACE_BEGIN
constexpr const ShaderBufferSource SBS_ViewportInfo=
{
"ViewportInfo",
DescriptorSetType::RenderTarget,
"viewport",
"ViewportInfo",
R"(
mat4 ortho_matrix;
@@ -20,8 +22,10 @@ constexpr const ShaderBufferSource SBS_ViewportInfo=
constexpr const ShaderBufferSource SBS_CameraInfo=
{
"CameraInfo",
DescriptorSetType::Camera,
"camera",
"CameraInfo",
R"(
mat4 projection;
@@ -48,12 +52,13 @@ constexpr const ShaderBufferSource SBS_CameraInfo=
};
constexpr const char LocalToWorldStruct[]="LocalToWorld";
constexpr const DescriptorSetType DST_LocalToWorld=DescriptorSetType::PerFrame;
constexpr const ShaderBufferSource SBS_LocalToWorld=
{
"LocalToWorldData",
DescriptorSetType::PerFrame,
"l2w",
"LocalToWorldData",
R"(
mat4 mats[L2W_MAX_COUNT];
@@ -64,12 +69,13 @@ constexpr const ShaderBufferSource SBS_LocalToWorld=
// SSBO则不需要使用[]方式指定为动态大小数组
constexpr const char MaterialInstanceStruct[]="MaterialInstance";
constexpr const DescriptorSetType DST_MaterialInstance=DescriptorSetType::PerMaterial;
constexpr const ShaderBufferSource SBS_MaterialInstance=
{
"MaterialInstanceData",
DescriptorSetType::PerMaterial,
"mtl",
"MaterialInstanceData",
R"(
MaterialInstance mi[MI_MAX_COUNT];)"
@@ -77,11 +83,13 @@ constexpr const ShaderBufferSource SBS_MaterialInstance=
constexpr const ShaderBufferSource SBS_JointInfo=
{
"JointInfo",
"joint",
DescriptorSetType::PerFrame,
R"(
mat4 mats[];
)"
"joint",
"JointInfo",
R"(
mat4 mats[];
)"
};
STD_MTL_NAMESPACE_END

View File

@@ -6,7 +6,7 @@
#include<hgl/shadergen/ShaderCreateInfoFragment.h>
#include<hgl/shadergen/ShaderCreateInfoMap.h>
#include<hgl/graph/RenderTargetOutputConfig.h>
#include<hgl/graph/mtl/MaterialConfig.h>
#include<hgl/graph/mtl/MaterialCreateConfig.h>
#include<hgl/graph/mtl/ShaderBufferSource.h>
#include<hgl/graph/VKSamplerType.h>
@@ -45,6 +45,8 @@ namespace hgl::graph
public:
const PrimitiveType GetPrimitiveType()const{return config->prim;}
const uint32 GetShaderStage ()const{return config->shader_stage_flag_bit;}
bool hasShader (const VkShaderStageFlagBits ss)const{return config->shader_stage_flag_bit&ss;}
@@ -79,13 +81,14 @@ namespace hgl::graph
bool SetMaterialInstance(const AnsiString &mi_glsl_codes,const uint32_t mi_struct_bytes,const uint32_t shader_stage_flag_bits);
bool SetLocalToWorld(const uint32_t shader_stage_flag_bits);
//bool SetWorldPosition(const uint32_t shader_stage_flag_bits);
bool AddStruct(const AnsiString &ubo_typename,const AnsiString &codes);
bool AddStruct(const ShaderBufferSource &ss){return AddStruct(ss.struct_name,ss.codes);}
bool AddUBO(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const AnsiString &struct_name,const AnsiString &name);
bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const AnsiString &struct_name,const AnsiString &name);
bool AddUBO(const uint32_t flag_bits,const DescriptorSetType &set_type,const ShaderBufferSource &ss){return AddUBO(flag_bits,set_type,ss.struct_name,ss.name);}
bool AddUBOStruct(const uint32_t flag_bits,const ShaderBufferSource &ss);
bool AddSampler(const VkShaderStageFlagBits flag_bits,const DescriptorSetType set_type,const SamplerType &st,const AnsiString &name);

View File

@@ -37,6 +37,7 @@ protected:
AnsiString mi_codes;
ArrayList<const char *> user_data_list;
ArrayList<const char *> function_list;
AnsiString main_function;
@@ -88,6 +89,7 @@ public:
bool AddUBO(DescriptorSetType type,const UBODescriptor *sd);
bool AddSampler(DescriptorSetType type,const SamplerDescriptor *sd);
void AddUserData(const char *str){user_data_list.Add(str);}
void AddFunction(const char *str){function_list.Add(str);}
void SetMaterialInstance(UBODescriptor *,const AnsiString &);

View File

@@ -3,33 +3,34 @@
#include<hgl/shadergen/ShaderCreateInfo.h>
#include<hgl/shadergen/ShaderDescriptorInfo.h>
namespace hgl{namespace graph{
class ShaderCreateInfoGeometry:public ShaderCreateInfo
namespace hgl::graph
{
GeometryShaderDescriptorInfo gsdi;
class ShaderCreateInfoGeometry:public ShaderCreateInfo
{
GeometryShaderDescriptorInfo gsdi;
AnsiString input_prim;
AnsiString output_prim;
uint32_t max_vertices;
AnsiString input_prim;
AnsiString output_prim;
uint32_t max_vertices;
public:
public:
bool IsEmptyOutput()const override{return gsdi.IsEmptyOutput();}
void GetOutputStrcutString(AnsiString &str) override;
bool IsEmptyOutput()const override{return gsdi.IsEmptyOutput();}
void GetOutputStrcutString(AnsiString &str) override;
ShaderDescriptorInfo *GetSDI()override{return &gsdi;}
ShaderDescriptorInfo *GetSDI()override{return &gsdi;}
public:
public:
ShaderCreateInfoGeometry(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&gsdi,m);}
~ShaderCreateInfoGeometry()override=default;
ShaderCreateInfoGeometry(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&gsdi,m);}
~ShaderCreateInfoGeometry()override=default;
bool SetGeom(const PrimitiveType &ip,const PrimitiveType &op,const uint32_t mv);
bool SetGeom(const PrimitiveType &ip,const PrimitiveType &op,const uint32_t mv);
int AddOutput(SVList &);
int AddOutput(const ShaderVariableType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;
int AddOutput(SVList &);
int AddOutput(const ShaderVariableType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;
bool ProcLayout() override;
};
}}//namespace hgl::graph
bool ProcLayout() override;
};
}//namespace hgl::graph

View File

@@ -3,44 +3,41 @@
#include<hgl/shadergen/ShaderCreateInfo.h>
#include<hgl/shadergen/ShaderDescriptorInfo.h>
namespace hgl
namespace hgl::graph
{
namespace graph
class ShaderCreateInfoVertex:public ShaderCreateInfo
{
class ShaderCreateInfoVertex:public ShaderCreateInfo
{
VertexShaderDescriptorInfo vsdi;
VertexShaderDescriptorInfo vsdi;
bool ProcSubpassInput();
bool ProcInput(ShaderCreateInfo *) override;
bool ProcSubpassInput();
bool ProcInput(ShaderCreateInfo *) override;
bool IsEmptyOutput()const override{return vsdi.IsEmptyOutput();}
void GetOutputStrcutString(AnsiString &str) override;
bool IsEmptyOutput()const override{return vsdi.IsEmptyOutput();}
void GetOutputStrcutString(AnsiString &str) override;
public:
public:
VIAArray &GetInput(){return vsdi.GetInput();}
VIAArray &GetInput(){return vsdi.GetInput();}
ShaderDescriptorInfo *GetSDI()override{return &vsdi;}
ShaderDescriptorInfo *GetSDI()override{return &vsdi;}
public:
public:
ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&vsdi,m);}
~ShaderCreateInfoVertex()override=default;
ShaderCreateInfoVertex(MaterialDescriptorInfo *m):ShaderCreateInfo(){ShaderCreateInfo::Init(&vsdi,m);}
~ShaderCreateInfoVertex()override=default;
int AddInput(VIAList &);
int AddInput(const graph::VAType &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int AddInput(const AnsiString &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int AddInput(VIAList &);
int AddInput(const graph::VAType &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int AddInput(const AnsiString &type,const AnsiString &name,const VkVertexInputRate input_rate=VK_VERTEX_INPUT_RATE_VERTEX,const VertexInputGroup &group=VertexInputGroup::Basic);
int hasInput(const char *);
int hasInput(const char *);
int AddOutput(SVList &);
int AddOutput(const SVType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;
int AddOutput(SVList &);
int AddOutput(const SVType &type,const AnsiString &name,Interpolation inter=Interpolation::Smooth);
void AddMaterialInstanceOutput() override;
void AddAssign();
void AddAssign();
void AddJoint();
};//class ShaderCreateInfoVertex:public ShaderCreateInfo
}//namespace graph
void AddJoint();
};//class ShaderCreateInfoVertex:public ShaderCreateInfo
}//namespace hgl::graph

View File

@@ -2,6 +2,7 @@
SET REPO="hyzgame"
SET BRANCH=master
git pull
call pull.bat CMAssetsManage %REPO% %BRANCH%
call pull.bat CMCMakeModule %REPO% %BRANCH%
call pull.bat CMCore %REPO% %BRANCH%

2
res

Submodule res updated: e1a36d78f0...fe8fcabeb5

View File

@@ -67,19 +67,20 @@ SET(GRAPH_MODULE_FILES ${SGM_HEADER_PATH}/GraphModule.h
source_group("Framework\\Module" FILES ${GRAPH_MODULE_FILES})
SET(GRAPH_FRAMEWORK_FILES ${SG_INCLUDE_PATH}/RenderFramework.h
RenderFramework.cpp)
RenderFramework.cpp
CameraControl.cpp)
source_group("Framework" FILES ${GRAPH_FRAMEWORK_FILES})
SET(SG_SCENE_SOURCE ${SG_INCLUDE_PATH}/SceneWorld.h
SET(SG_SCENE_SOURCE ${SG_INCLUDE_PATH}/Scene.h
${SG_INCLUDE_PATH}/SceneNodeAttributes.h
${SG_INCLUDE_PATH}/SceneNode.h
${SG_INCLUDE_PATH}/SceneNode.h
${SG_INCLUDE_PATH}/SceneMatrix.h
${SG_INCLUDE_PATH}/SceneOrient.h
Scene/SceneNode.cpp
Scene/SceneOrient.cpp
Scene/SceneMatrix.cpp
Scene/SceneWorld.cpp
Scene/Scene.cpp
)
SET(SG_RENDER_SOURCE ${SG_INCLUDE_PATH}/RenderNode.h
@@ -87,6 +88,11 @@ SET(SG_RENDER_SOURCE ${SG_INCLUDE_PATH}/RenderNode.h
${SG_INCLUDE_PATH}/MaterialRenderList.h
${SG_INCLUDE_PATH}/MaterialRenderMap.h
# ${SG_INCLUDE_PATH}/ShadowPolicy.h
${SG_INCLUDE_PATH}/RenderTask.h
${SG_INCLUDE_PATH}/Renderer.h
render/Renderer.cpp
render/RenderNode.cpp
render/RenderTask.cpp
render/RenderList.cpp
render/MaterialRenderList.cpp
render/RenderAssignBuffer.h
@@ -290,16 +296,37 @@ SET(VK_MESH_SOURCE ${SG_INCLUDE_PATH}/Mesh.h
SOURCE_GROUP("Vulkan\\Mesh" FILES ${VK_MESH_SOURCE})
set(COMPONENT_INCLUDE_PATH ${ROOT_INCLUDE_PATH}/hgl/component)
SET(COLLISION_COMPONENT_INCLUDE_PATH ${COMPONENT_INCLUDE_PATH}/collision)
SET(COMPONENT_FILES ${COMPONENT_INCLUDE_PATH}/Component.h
${COMPONENT_INCLUDE_PATH}/RenderComponent.h
${COMPONENT_INCLUDE_PATH}/SceneComponent.h
${COMPONENT_INCLUDE_PATH}/PrimitiveComponent.h
${COMPONENT_INCLUDE_PATH}/StaticMeshComponent.h
${COMPONENT_INCLUDE_PATH}/RenderComponent.h
${COMPONENT_INCLUDE_PATH}/MeshComponent.h
component/Component.cpp
component/ComponentManager.cpp
component/StaticMeshComponentManager.cpp
component/SceneComponent.cpp
component/MeshComponentManager.cpp
)
SET(COLLISION_COMPONENT_FILES ${COLLISION_COMPONENT_INCLUDE_PATH}/CollisionComponent.h
${COLLISION_COMPONENT_INCLUDE_PATH}/CollisionComponentManager.h
${COLLISION_COMPONENT_INCLUDE_PATH}/PrimitiveCollisionComponent.h
${COLLISION_COMPONENT_INCLUDE_PATH}/SphereCollisionComponent.h
${COLLISION_COMPONENT_INCLUDE_PATH}/BoxCollisionComponent.h
${COLLISION_COMPONENT_INCLUDE_PATH}/CapsuleCollisionComponent.h
${COLLISION_COMPONENT_INCLUDE_PATH}/PlaneCollisionComponent.h
# component/collision/CollisionComponent.cpp
# component/collision/CollisionComponentManager.cpp
# component/collision/PrimitiveCollisionComponent.cpp
# component/collision/SphereCollisionComponent.cpp
# component/collision/BoxCollisionComponent.cpp
# component/collision/CapsuleCollisionComponent.cpp
# component/collision/PlaneCollisionComponent.cpp
)
SOURCE_GROUP("Component" FILES ${COMPONENT_FILES})
SOURCE_GROUP("Component\\Collision" FILES ${COLLISION_COMPONENT_FILES})
IF(WIN32)
OPTION(FORCE_DISCETE_GPU "Force Discrete GPU" OFF)
@@ -377,6 +404,7 @@ add_cm_library(ULRE.SceneGraph "ULRE" ${SCENE_GRAPH_FILES}
${SG_VDM_SOURCE}
${COMPONENT_FILES}
${COLLISION_COMPONENT_FILES}
# ${FONT_MANAGE_SOURCE}
# ${FONT_SOURCE}

View File

@@ -0,0 +1,24 @@
#include<hgl/graph/CameraControl.h>
#include<hgl/graph/VKDescriptorSetType.h>
#include<hgl/graph/VKDescriptorBindingManage.h>
#include<hgl/graph/mtl/UBOCommon.h>
namespace hgl::graph
{
CameraControl::CameraControl(ViewportInfo *v,Camera *c,UBOCameraInfo *ci)
{
vi=v;
camera=c;
ubo_camera_info=ci;
camera_info=ubo_camera_info->data();
desc_binding_camera=new DescriptorBinding(DescriptorSetType::Camera);
desc_binding_camera->AddUBO(ubo_camera_info);
}
CameraControl::~CameraControl()
{
delete desc_binding_camera;
delete ubo_camera_info;
}
}//namespace hgl::graph

File diff suppressed because it is too large Load Diff

View File

@@ -5,9 +5,16 @@
#include<hgl/graph/module/TextureManager.h>
#include<hgl/graph/module/RenderTargetManager.h>
#include<hgl/graph/module/SwapchainModule.h>
#include<hgl/graph/VKRenderTargetSwapchain.h>
#include<hgl/graph/module/RenderModule.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/Scene.h>
#include<hgl/graph/Camera.h>
#include<hgl/graph/FirstPersonCameraControl.h>
#include<hgl/graph/Renderer.h>
#include<hgl/graph/mtl/UBOCommon.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/log/Logger.h>
#include<hgl/Time.h>
@@ -16,6 +23,9 @@ VK_NAMESPACE_BEGIN
bool InitShaderCompiler();
void CloseShaderCompiler();
void InitializeComponentManager();
void UninitializeComponentManager();
namespace mtl
{
void ClearMaterialFactory();
@@ -47,6 +57,10 @@ RenderFramework::RenderFramework(const OSString &an)
RenderFramework::~RenderFramework()
{
SAFE_CLEAR(default_renderer)
SAFE_CLEAR(default_camera_control)
SAFE_CLEAR(default_camera)
SAFE_CLEAR(default_scene)
SAFE_CLEAR(render_resource)
SAFE_CLEAR(module_manager)
@@ -54,6 +68,7 @@ RenderFramework::~RenderFramework()
if(RENDER_FRAMEWORK_COUNT==0)
{
UninitializeComponentManager();
STD_MTL_NAMESPACE::ClearMaterialFactory();
CloseShaderCompiler();
}
@@ -69,6 +84,8 @@ bool RenderFramework::Init(uint w,uint h)
logger::InitLogger(app_name);
InitNativeWindowSystem();
InitializeComponentManager();
}
++RENDER_FRAMEWORK_COUNT;
@@ -95,7 +112,7 @@ bool RenderFramework::Init(uint w,uint h)
if(!device)
return(false);
win->Join(this);
win->AddChildDispatcher(this);
module_manager=new GraphModuleManager(this);
@@ -110,21 +127,78 @@ bool RenderFramework::Init(uint w,uint h)
return(false);
rt_manager=new RenderTargetManager(this,tex_manager,rp_manager);
module_manager->Registry(rt_manager);
module_manager->Register(rt_manager);
sc_module=new SwapchainModule(this,tex_manager,rt_manager,rp_manager);
module_manager->Registry(sc_module);
module_manager->Register(sc_module);
render_resource=new RenderResource(device);
OnChangeDefaultScene(new Scene);
default_camera=new Camera();
CreateDefaultRenderer();
return(true);
}
void RenderFramework::OnChangeDefaultScene(Scene *s)
{
if(default_scene==s)
return;
if(default_scene)
{
this->RemoveChildDispatcher(&(default_scene->GetEventDispatcher()));
}
if(s)
{
this->AddChildDispatcher(&(s->GetEventDispatcher()));
}
default_scene=s;
}
void RenderFramework::CreateDefaultRenderer()
{
SAFE_CLEAR(default_renderer)
IRenderTarget *rt=GetSwapchainRenderTarget();
default_renderer=new Renderer(rt);
default_renderer->SetScene(default_scene);
if(!default_camera_control)
{
auto ubo_camera_info=device->CreateUBO<UBOCameraInfo>(&mtl::SBS_CameraInfo);
auto fpcc=new FirstPersonCameraControl(rt->GetViewportInfo(),default_camera,ubo_camera_info);
auto ckc=new CameraKeyboardControl(fpcc);
auto cmc=new CameraMouseControl(fpcc);
this->AddChildDispatcher(fpcc);
fpcc->AddChildDispatcher(ckc);
fpcc->AddChildDispatcher(cmc);
default_camera_control=fpcc;
mouse_event=cmc;
}
default_renderer->SetCameraControl(default_camera_control);
}
void RenderFramework::OnResize(uint w,uint h)
{
VkExtent2D ext(w,h);
sc_module->OnResize(ext); //其实swapchain_module并不需要传递尺寸数据过去
CreateDefaultRenderer();
}
void RenderFramework::OnActive(bool)
@@ -135,4 +209,72 @@ void RenderFramework::OnClose()
{
}
void RenderFramework::Tick()
{
if(default_camera_control)
{
//没有Tick CameraKeyboardControl所以键盘操作失效了
default_camera_control->Refresh();
}
}
graph::VertexDataManager *RenderFramework::CreateVDM(const graph::VIL *vil,const VkDeviceSize vertices_number,VkDeviceSize indices_number,const IndexType type)
{
if(!vil||vertices_number<=0||indices_number<=0||!device->IsSupport(type))
return(nullptr);
auto *vdm=new VertexDataManager(device,vil);
if(!vdm)
return(nullptr);
if(!vdm->Init(vertices_number,indices_number,type))
{
delete vdm;
return nullptr;
}
return vdm;
}
graph::Primitive *RenderFramework::CreatePrimitive( const AnsiString &name,
const uint32_t vertices_count,
const graph::VIL *vil,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list)
{
auto *pc=new graph::PrimitiveCreater(GetDevice(),vil);
pc->Init(name,vertices_count);
for(const auto &vad:vad_list)
{
if(!pc->WriteVAB(vad.name,vad.format,vad.data))
{
delete pc;
return(nullptr);
}
}
auto *prim=pc->Create();
if(prim)
render_resource->Add(prim);
return prim;
}
graph::Mesh *RenderFramework::CreateMesh( const AnsiString &name,
const uint32_t vertices_count,
graph::MaterialInstance *mi,
graph::Pipeline *pipeline,
const std::initializer_list<graph::VertexAttribDataPtr> &vad_list)
{
auto *prim=this->CreatePrimitive(name,vertices_count,mi->GetVIL(),vad_list);
if(!prim)
return(nullptr);
return render_resource->CreateMesh(prim,mi,pipeline);
}
VK_NAMESPACE_END

View File

@@ -87,7 +87,8 @@ namespace
VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData)
{
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) std::cerr<<"[ERROR] "; else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
std::cerr<<"[ERROR] "; else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) std::cerr<<"[WARNING] "; else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) std::cerr<<"[INFO] "; else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) std::cerr<<"[VERBOSE] "; else
@@ -147,7 +148,8 @@ namespace
{
const char *obj_type_name=GetVkDebugReportObjectTypename(objType);
if(msgFlags&VK_DEBUG_REPORT_ERROR_BIT_EXT) std::cerr<<"[ERROR:"; else
if(msgFlags&VK_DEBUG_REPORT_ERROR_BIT_EXT)
std::cerr<<"[ERROR:"; else
if(msgFlags&VK_DEBUG_REPORT_WARNING_BIT_EXT) std::cerr<<"[WARNING:"; else
if(msgFlags&VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT)std::cerr<<"[PERFORMANCE WARNING:"; else
if(msgFlags&VK_DEBUG_REPORT_INFORMATION_BIT_EXT) std::cerr<<"[INFO:"; else

Some files were not shown because too many files have changed in this diff Show More