Compare commits

..

807 Commits

Author SHA1 Message Date
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
8a99a331c0 将WorkObject增加bool Init()=0纯虚函数用于负责初始化。
这一分支结束,下一分支基于03_auto_instance范例开发WorldManager用于全局World管理,直接由World提供RenderList/SceneRoot等。
2025-05-22 01:11:30 +08:00
66bb363035 部分范例迁移到新WorkObject/CreateMaterialInstance结构 2025-05-18 23:42:39 +08:00
455cb0aa63 Layout codes of MaterialRenderList/SceneNode/SceneOrient 2025-05-18 22:56:38 +08:00
e778f64f00 renamed to CreateMesh from CreateRenderable 2025-05-18 02:19:14 +08:00
a641c56381 renamed to Mesh.h/.cpp from VKRenderable.h/.cpp 2025-05-18 02:15:33 +08:00
4b2f344c5c renamed to MeshDataBuffer from PrimitiveDataBuffer,
renamed to MeshRenderData from PrimitiveRenderData
2025-05-18 02:07:10 +08:00
014fce2c8e renamed Renderable to Mesh 2025-05-18 02:03:16 +08:00
692eeff4a3 Removed mtl_name from MaterialCreateConfig 2025-05-18 01:33:48 +08:00
5a04295f17 updated InlineMaterial.md 2025-05-18 00:28:06 +08:00
f1972908a1 added InlineMaterial.md 2025-05-18 00:19:45 +08:00
2e7c2663e0 所有材质全部使用新方法注册,但此举带来一个问题就是所有代码中的材质代码都被链接,会造成核心可执行程序变大。 2025-05-17 20:47:39 +08:00
0e789b6f47 各种类名结构名优化,不再使用GPU开头 2025-05-17 20:26:36 +08:00
29aa76a917 GPUDeviceAttribute更名为VkDevAttr 2025-05-17 20:13:23 +08:00
2dd60fee7f 将static MaterialFactory 定义移到.h 2025-05-17 20:01:17 +08:00
fd1a629941 将dev_attr从MaterialCreateConfig中移除改到最终的Create函数中。代码能编过,但是static自动注册失效了,待查。 2025-05-16 09:12:33 +08:00
4a4326826e preparing LoadMaterialFromJson(....) 2025-05-16 01:57:29 +08:00
e8e6c20305 Added AssetPath.md 2025-05-10 01:09:00 +08:00
104e5ff615 added doc/CreateMaterialInstance.md 2025-05-10 00:29:20 +08:00
5fec0732f3 新的WorkObject::CreateMaterialInstance封装,直接根据材质名称创建创建实例 2025-05-09 01:34:46 +08:00
b030684cbd 成功使用字符串创建MaterialCreateInfo,为后续使用名称创建材质提供基础 2025-05-09 01:26:58 +08:00
33976d9bf6 MaterialFactoryMap改用ObjectMap 2025-05-07 00:35:43 +08:00
e88facf834 初步实现CreateMaterialCreateInfo(name,cfg,vil),下一待整合进WorkObject/WorkManager后正式启用。 2025-05-06 00:41:07 +08:00
9be5de0f57 准备增加MaterialLibrary 2025-05-05 03:25:19 +08:00
2b251f06d4 Prim改名为PrimitiveType,ParsePrimName改名为ParsePrimitiveType 2025-05-04 23:36:28 +08:00
7169429ede 数据模板跟随变动 2025-05-04 19:33:04 +08:00
a858fcab99 增加批量从hyzgame远端拉取源代码的.bat 2025-04-23 00:38:57 +08:00
aed57437f9 List模板改名为ArrayList 2025-04-23 00:27:43 +08:00
10d0c2c473 定义空的CameraComponentManager/LightComponentManager 2025-04-19 00:33:23 +08:00
0e6546b514 实现一些Component/ComponentManager定义StaticHashCode/GetHashCode()...RegistryComponentManager/GetComponentManager() 2025-04-03 01:35:39 +08:00
44b1f13048 StaticMeshComponentManager 2025-04-01 01:11:32 +08:00
a50c3ef10b use combine instead of ComboFilename 2025-03-28 00:07:16 +08:00
964c17cf94 增加新的StaticMeshComponent,并添加关于各Component关系的注释 2025-03-25 23:15:38 +08:00
87989a8e42 删除旧的StaticMesh 2025-03-25 23:14:40 +08:00
efed9ff0dd 删除旧的StaticMesh 2025-03-25 23:13:30 +08:00
f0512edb5a 准备定义PrimitiveComponent用于取代原本SceneNode中的Renderable数据 2025-03-25 02:19:32 +08:00
ab3f771455 SceneNode增加Component相关函数(但Component的释放还没有完全确定) 2025-03-25 02:18:49 +08:00
0b172bfc81 SceneNode的Owner改名为ParentNode,以及相关函数改名 2025-03-25 01:22:20 +08:00
ee5d633596 增加ComponentManager::GetComponents(..SceneNode) 2025-03-25 01:17:18 +08:00
6d211b3840 初步完成Component/ComponentManager的定义 2025-03-25 01:04:46 +08:00
b05538b501 开启写Component,参考AMD FidelityFX Framework 2025-03-20 02:09:50 +08:00
ada6a41fc6 建立Component,第一步先将Renderable渲染迁移到这上面来 2025-03-18 01:26:35 +08:00
d43a877be1 整理SceneGraph的相关.CPP文件目录,现阶段分立render/scene两个。接下来准备建立SceneWorld,用于写世界管理 2025-03-18 00:38:43 +08:00
a4cc34d03b few 2025-03-17 00:49:56 +08:00
b77ede95e5 Added constexpr values 2025-03-14 21:44:09 +08:00
be3a8a2b00 renew auto_merge_material_instance.cpp 2025-03-14 00:17:54 +08:00
b6a92e8cd3 Added WorkObject::CreatePrimitive function. 2025-03-14 00:17:19 +08:00
7306581616 fixed a bug at vdm compare in PrimitiveDataBuffer 2025-03-14 00:16:53 +08:00
2e2f306b6b RenderList used AutoDelete<>. 2025-03-13 23:56:43 +08:00
cf81e7bcff Fixed a but that compare PrimitiveDataBuffer wrong. 2025-03-13 23:56:22 +08:00
68089e13bc port auto_instance to new WorkObject/RenderFramework 2025-03-13 23:41:51 +08:00
eee00f3c8c Added CreateRenderList() in RenderFramework 2025-03-13 23:37:10 +08:00
52b6e88522 Added Tick(double) in WorkObject 2025-03-13 23:36:47 +08:00
383a568daa adjusted order of codes in draw_triangle_use_UBO.cpp 2025-03-13 01:19:29 +08:00
ce095f97f2 Fixed renew ubo bug. 2025-03-12 02:08:20 +08:00
774f106738 example 0/1 run OK on newly RenderTarget 2025-03-12 01:25:49 +08:00
0706f27354 slit RenderTarget, created VKRenderTargetData.h/.cpp, VKRenderTargetSingle.h/.cpp, VKRenderTargetMultiFrame.h, VKRenderTargetSwapchain.h 2025-03-11 23:51:05 +08:00
62e9d2f904 rewrite CrateUBO 2025-03-06 12:56:16 +08:00
d5df06dca3 Added Resize/event transmit 2025-03-06 01:24:25 +08:00
9c3e16032e improved SwapchainModule::GetSwapchainSize(). 2025-03-06 01:23:39 +08:00
55765cf112 Added DeviceBufferMap, first used in ViewportInfo 2025-03-06 01:22:35 +08:00
c5e9f151fc Put the Viewport in a RenderTarget and pass it after RenderCmdBuffer::Begin. auto bind ViewportInfo to any material. 2025-03-05 01:01:48 +08:00
2f1ccda442 removed mtl/UniformBuffer.h 2025-03-04 22:44:44 +08:00
f88f6378b7 Added .editorconfig 2025-03-04 22:44:10 +08:00
b63edb2f89 renamed to ShaderBufferSource from ShaderBuffer 2025-03-04 22:41:07 +08:00
21c7f36d03 update PipelineCompiler 2025-02-20 02:40:54 +08:00
54d8726145 adjusted order in CMakeLists.txt 2025-02-12 23:24:08 +08:00
9f0625ed4e fixed a bug that crash after window resize. because WorkObject::cur_render_target don't reset after window resize. 2025-02-05 23:36:53 +08:00
e5a46f3ee8 Added "RenderFramework *" in GraphModule and IRenderTarget 2025-02-05 22:44:58 +08:00
7ec1c095cc [WIP] preparing UBO/SSBO<> 2025-02-01 16:32:08 +08:00
3807d9fcbf Fixed draw_triangle_in_NDC.cpp,can run. 2025-02-01 15:40:35 +08:00
0d67993326 added WorkObject::CreateMaterialInstance 2025-01-29 18:10:37 +08:00
052e2c673a new WorkObject Construct function. 2025-01-29 17:42:06 +08:00
7c745df910 Added RunFramework() 2025-01-29 16:30:00 +08:00
a03770fd00 Added WorkObject::CreateRenderable(...) 2025-01-28 22:20:48 +08:00
3c2f7ad705 added render_pass and CreatePipeline at WorkObject. optimized rf_test.cpp 2025-01-28 21:04:48 +08:00
93e38fc14f created ULRE.Work contains WorkObject/WorkManager 2025-01-28 20:48:43 +08:00
dd0cf9bf51 [Milestone] new RenderWorkObject, rf_test run OK! 2025-01-28 20:03:44 +08:00
dcefb261ad Added Render(Renderable *) in RenderCmdBuffer 2025-01-27 05:28:21 +08:00
d63af2d8de Added Vulkan version check at to print vulkan physical device properties. 2025-01-27 04:08:35 +08:00
fda6001451 Added LightCullMode.h 2025-01-27 00:26:39 +08:00
f0a582271e optimized SwapchainModule and SwapchainRenderTarget 2025-01-26 23:47:04 +08:00
74a5847bbc refactored RenderTarget 2025-01-26 23:22:25 +08:00
2576675265 removed RenderPass params at RTSwapchain's construct function 2025-01-26 13:36:15 +08:00
ffaa038f99 Use RenderPass * instead of VkRenderPass in Framebuffer 2025-01-26 12:36:23 +08:00
768ebde879 optimized SwapchainModule::BeginFrame/EndFrame 2025-01-26 12:13:51 +08:00
af03f2967c RenderCmdBUffer::BindFramebuffer removed RenderPass param. 2025-01-26 12:13:03 +08:00
e24286a87f removed render_pass from RenderTarget, use RenderTarget::fbo->render_pass 2025-01-26 12:12:13 +08:00
99f833ef42 RenderPass add GetVkRenderPass() 2025-01-26 12:06:05 +08:00
0735e783e6 reduced codes of rf_test.cpp 2025-01-26 10:32:53 +08:00
053e579071 refactor WorkObject/WorkManager 2025-01-26 09:46:59 +08:00
6e12a411b1 added SwapchainModule::GetRenderCmdBuffer() 2025-01-26 00:15:54 +08:00
022cc4a2f3 removed BeginFrame/EndFrame/Run/RunFrame of RenderFramework 2025-01-25 23:12:31 +08:00
906aba2459 use shorter name of manager/modules.... 2025-01-25 22:31:48 +08:00
b47b096039 optimized image_count of Swapchain 2025-01-25 21:17:00 +08:00
63dac1ef74 moved SwapchainImage's Destruct function to .cpp 2025-01-25 21:16:25 +08:00
0a072d846b I moved a RenderPass to SwapchainModule from SwapchainImage; RenderPass isn't recreated after recreating the swapchain. 2025-01-25 20:27:26 +08:00
7326765057 WorkObject inherit TickObject. 2025-01-25 20:07:52 +08:00
a569d08269 optimized WorkManager, fixed crash after close window. 2025-01-25 20:01:37 +08:00
6fdf0e1fbd removed old codes from rf_test.cpp 2025-01-25 17:30:52 +08:00
2e53b48fff [BIG MILESTONE] render framework first test ok! can draw! 2025-01-25 17:17:55 +08:00
aafdbdd4ea reduced codes of rf_test.cpp 2025-01-25 15:25:29 +08:00
82a3ec4922 [WIP] added Join() at WorkObject 2025-01-25 15:23:36 +08:00
6141dbf4d5 removed RenderFramework::device_render_pass 2025-01-25 01:42:50 +08:00
c8adc9af24 Moved render_cmd_buffer to SwapchainImage 2025-01-25 01:41:00 +08:00
79b0b2ef76 support Vulkan 1.4 caps 2025-01-25 01:40:08 +08:00
ab36f67412 Added DebugUtils::SetTexture() 2025-01-25 01:39:32 +08:00
487d3c4978 added WorkObject.h 2025-01-24 13:23:57 +08:00
0a2862a051 Added Begin in SwapchainModule::Use() 2025-01-19 23:22:26 +08:00
10fbcfef14 RenderFramework::RunFrame/Run 2025-01-19 19:42:38 +08:00
414142283b moved OnResize to GraphModule from RenderModule 2025-01-19 19:41:57 +08:00
96c3718b2a remove about swapchain from GPUDevice class. 2025-01-19 19:06:32 +08:00
014d783e73 [WIP,can't RUN] recreated TextureManager/RenderTargetManager/SwapchainModule 2025-01-19 18:13:06 +08:00
ff8222c256 moved device_render_pass to RenderFramework from GPUDevice. 2025-01-18 20:28:14 +08:00
911afc06f6 preparing newly GraphModule/RenderModule/RenderPassManager/RenderFramework 2025-01-16 02:10:03 +08:00
bd0a3d8be1 to support newly String<>/IDName/Compare 2025-01-15 02:42:04 +08:00
d810540b81 Merge branch 'devel_36_PickGizmo' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_36_PickGizmo 2024-11-21 01:30:50 +08:00
3259f1af4c use SortedSet instead of SortedSets 2024-11-21 01:30:42 +08:00
62d370e508 renamed to SortedSet from SortedSets 2024-11-18 13:19:11 +08:00
2c67990daa little and unimportant update 2024-10-13 00:15:45 +08:00
620d05c6ff added shadow attributes in StaticMesh 2024-10-10 01:59:24 +08:00
d1f1124302 updated SceneNodeAttributes.h 2024-10-10 01:59:05 +08:00
e9d5b369bf Added ShadowPolicy.h 2024-10-10 01:58:47 +08:00
71c0c7e627 Added SceneNodeAttributes.h 2024-10-10 01:23:12 +08:00
2f34d556e4 renamed to ChildNode instead of SubNode 2024-10-06 16:49:08 +08:00
b9fbab56f1 update codes for support new SceneNode 2024-10-06 14:51:38 +08:00
4614562929 optimized SceneNode class. 2024-10-06 02:30:59 +08:00
9450d92784 use Contains instead of IsMember/IsExist 2024-10-05 22:51:27 +08:00
d7f7a7d095 [WIP] preparing SceneManager 2024-09-06 01:04:28 +08:00
59fc27c864 layout codes of GizmoResource.hj 2024-09-02 23:07:20 +08:00
bbbd8b06c2 move the white_torus to GizmoRotate 2024-09-02 00:32:30 +08:00
efd9a447fb use TransformFaceToCamera in GizmoTest.cpp 2024-08-31 15:55:58 +08:00
5e8957b78b TransformFaceToCamera class is finished. 2024-08-31 15:46:11 +08:00
99264b5b0a Split SceneMatrix to standalone files 2024-08-31 00:10:57 +08:00
8ebbd674b2 Moved WorldPosition to SceneMatrix 2024-08-31 00:04:20 +08:00
72ceffeda2 Added UpdateMaterialInstance method. but no any test. 2024-08-30 03:36:01 +08:00
726a8ec635 use circle instead of Square in Gizmo3DMove 2024-08-30 01:29:20 +08:00
cf2efd69b9 Added CreateCircle2D/3D,CreateCircle3DByIndexTriangles functions. 2024-08-30 01:28:49 +08:00
e35abf0051 Added PrimitiveCreater::hasIndex() 2024-08-30 01:28:20 +08:00
e02aaf812d Renamed to Square from plane 2024-08-30 00:38:40 +08:00
ca6d99b6fb gizmo's scale/move/rotate to use same Value. 2024-08-30 00:30:06 +08:00
3f37fec8a8 use hgl_cmp<Matrix4f> instead of IsNearlyEqual 2024-08-29 20:25:57 +08:00
7dc4bb9d76 [BUG FIXED] Fix Bug that to use matrix2f storage local to world matrix. 2024-08-29 13:46:19 +08:00
3fc9971cf7 clear debug code. 2024-08-29 13:45:28 +08:00
442e52e17c [BUG] gizmoMove rootNote's ScaleMatrix's Z is non-work. 2024-08-29 13:37:13 +08:00
8245d83309 TEST CORRECT....WHY? 2024-08-29 13:07:02 +08:00
a9526ce956 Updated to support Newly SceneOrient,compiled all OK! but Non test..next step is test samples. 2024-08-27 01:27:53 +08:00
410b94a127 [WIP] improving SceneOrient 2024-08-25 04:03:57 +08:00
f4e16276ff [WIP] refresh scene orient 2024-08-24 03:08:14 +08:00
8880df8862 preparing Change to new Transform 2024-08-23 02:00:59 +08:00
0a5fb750fa create BillboardSceneNode, but isn't final design. 2024-08-08 01:43:20 +08:00
3589376b79 Layouted SceneOrient.h 2024-08-07 01:12:58 +08:00
9443dd5942 to support GLM_FORCE_AVX2 2024-08-05 01:25:49 +08:00
c0e4c7fe7e updated CMakeModule 2024-08-04 23:55:56 +08:00
ee9bd06f35 Jolt use c++20 2024-08-04 23:55:41 +08:00
421f5f8134 Added source codes of JoltPhysics-5.0.0 2024-08-04 23:43:44 +08:00
5213651054 Used Transform instead of Matrix4f in SceneOrient, MaterialRenderList/RenderAssignBuffer supports updating the L2WMatrix of only the changed objects 2024-08-04 22:35:31 +08:00
3768507169 save full SceneNode in RenderNode,added length sort. 2024-08-02 23:17:07 +08:00
7f074c6c79 Added a white ring outside gizmo_rotate 2024-08-01 01:42:21 +08:00
2137725bd2 Improved Torus codes 2024-07-31 00:17:23 +08:00
f7a0e97e49 test Draw Gizmo Rotate+Move 2024-07-31 00:11:24 +08:00
d5234316ae implement duplication SceneNode 2024-07-31 00:11:04 +08:00
c3a1266da6 Correct draw Gizmo Rotate/Scale, OK!! 2024-07-30 23:54:25 +08:00
e18a6e7a4a improved gizmo3dmove 2024-07-30 13:55:44 +08:00
741e0e8ade OK!OK!OK! Draw Gizmo3DMove model was correct. 2024-07-30 01:01:29 +08:00
f2a6c61c25 [WIP] render gizmo_move, but model is incorrect. 2024-07-30 00:47:28 +08:00
28fcdb6216 preparing LerpLine example. 2024-07-30 00:11:04 +08:00
412ed6f3f2 [WIP] first version of gizmo move test,,can't RUN. 2024-07-29 14:01:10 +08:00
03f7237db3 move StaticMesh.cpp 2024-07-29 13:19:24 +08:00
f79410e434 [WIP] StaticMesh and GizmoMove 2024-07-28 23:34:04 +08:00
eef7f58575 updated texture_format_list.cpp 2024-07-27 20:52:58 +08:00
bd4fc34cbb renamed values's name. 2024-07-27 19:13:35 +08:00
0c669807d7 [WIP]preparing fix DrawText.cpp 2024-07-26 03:27:32 +08:00
8f0cd9f35b use AnsiString in shader 2024-07-26 03:25:09 +08:00
416b7bfcb3 support C++20 2024-07-26 03:24:44 +08:00
fdf073376c fixed BillboardTest.cpp, test run ok! 2024-07-24 23:15:16 +08:00
1a15b93e15 updated codes support new MaterialRenderList::Add 2024-07-20 13:15:12 +08:00
898d01ac62 Change MaterialRenderList::Add 2024-07-18 01:53:23 +08:00
d11b84222f Added IdentityLocalMatrix in SceneOrient 2024-07-17 23:56:10 +08:00
a04752b391 example update. 2024-07-17 01:39:13 +08:00
30bb77d437 removed Center/LocalCenter/WorldCenter from SceneNode. 2024-07-17 01:38:46 +08:00
8ebb3095a7 Added Position/Direction in SceneOrient 2024-07-17 01:38:30 +08:00
6571a27f41 added StaticMesh.cpp/.h in example, they should move to SceneGraph in future 2024-07-15 01:23:13 +08:00
5855b2eb5b use GetObjectFromList instead of GetListObject 2024-07-15 01:21:49 +08:00
ba7be3ff17 fix file's encode 2024-07-15 01:21:28 +08:00
006929e86f splite GizmoResource.h 2024-07-14 23:49:05 +08:00
25957d8d32 fixed RayPicking example 2024-07-10 02:00:18 +08:00
c29346887c added to init 2d gizmo resource. 2024-07-10 01:14:54 +08:00
69b9556ca1 moved GizmoColor/GizmoShape to Gizmo.h 2024-07-10 00:35:57 +08:00
390bd14c7c added AssetFileFormat.md 2024-07-05 01:19:26 +08:00
dcce45a5ce added doc/AssetFileFormat.md 2024-07-05 01:16:13 +08:00
1f7c8fa25b Added frustum_planes in CameraInfo, added FrustumCheck function in MFCamera.h 2024-07-02 23:43:25 +08:00
0ba4674126 removed MIPManager.h 2024-07-02 23:22:46 +08:00
94a0e03c44 [WIP] MIPManager 2024-07-02 00:51:59 +08:00
eb70cb1ea4 [WIP] Gizmo update codes; 2024-07-01 23:31:18 +08:00
7903ac32c1 Update half_float types in VertexAttribBuffer/VertexAttribDataAccess 2024-07-01 23:30:38 +08:00
ac03ae4e44 renamed to SAFE_CLEAR_OBJECT_ARRAY_OBJECT from SAFE_CLEAR_OBJECT_ARRAY 2024-07-01 23:29:59 +08:00
a5fe26b2f0 Fixed little bug in VertexAttribDataAccess, and then added half-float VADA 2024-07-01 21:40:23 +08:00
3a6ec1f589 Added codes of to create shape in GizmoResource.cpp 2024-07-01 13:37:47 +08:00
910a8fa51b Merge branch 'devel_28_Gizmo_Move' into devel_34_Gizmo 2024-07-01 08:43:15 +08:00
cfc3ac8250 Luminance change to ufloat8 instead of float in VertexLum material 2024-07-01 02:57:33 +08:00
9121ebd11b added newly type about VABMap/VADA 2024-07-01 02:56:26 +08:00
107251c9ad Added VIL in Pipeline, add comp VIL in CreateRenderable 2024-07-01 02:55:48 +08:00
04b77cadf9 Added GizmoResource.cpp 2024-06-26 01:51:13 +08:00
0137ef6e0c added M_Gizmo3D.cpp inline material. 2024-06-26 01:50:55 +08:00
fafe6c077b [WIP] Gizmo 2024-06-25 01:17:47 +08:00
09e9e71d59 adjust & layout codes. 2024-06-24 22:30:34 +08:00
a22e802c77 Layout codes 2024-06-21 13:09:20 +08:00
1b5d4aabb0 Optimized shader 2024-06-20 00:23:45 +08:00
af5988d96e optimized shader of billboard dynamic size 2024-06-20 00:21:53 +08:00
56b8798122 maybe finished, all examples test OK! 2024-06-20 00:16:29 +08:00
2f49e80122 [WIP] 2024-06-19 14:03:46 +08:00
806bf5dfdd [WIP] next step is ShaderCreateInfo::ProcOutput 2024-06-19 09:35:54 +08:00
90a4f1d49f finished BillboardFixedSize. next step is use ShaderVariable 2024-06-18 13:08:59 +08:00
3927b3c788 renamed values/struct. 2024-06-18 02:04:11 +08:00
6b9ac3220b removed ShaderResource 2024-06-18 01:50:03 +08:00
4251493415 added construct(VAType,count) function in ShaderVariableType 2024-06-18 01:31:54 +08:00
686372b60f added ShaderVariableType.h 2024-06-18 01:28:53 +08:00
150b27c6e6 updated Billboard,and added FixedSize billboard 2024-06-16 23:49:23 +08:00
c61e4dfdb8 Added Billboard2DWay.cpp and test OK! next step is fixed billboard pixel size. 2024-06-16 22:58:45 +08:00
23197e147c [WIP]preparing Billboard 2DWay sample 2024-06-14 09:13:49 +08:00
f1f0843bee [WIP] Billboard(the 2d way)
Two Modes:

1.fixed billboard size,the size in UBO
2.dynamic billboard size,the size in VAB

two modes to use GeometryShader, convert point/line data to quad data.
2024-06-13 13:56:48 +08:00
8d45c87cfd added camera_up/camera_right in CameraInfo 2024-06-13 01:30:30 +08:00
781e108aa3 added comments 2024-06-12 22:31:25 +08:00
1abe8770d7 removed Std3D/VertexLum2D.mtl 2024-06-12 09:55:50 +08:00
8f9ccc3aa1 removed Std3D/VertexLum2D.mtl 2024-06-12 09:55:08 +08:00
cd01c45980 Merge branch 'devel_31_VDMMergeRender' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_31_VDMMergeRender 2024-06-12 09:49:57 +08:00
941f5ee6ec fixed comment and layout comment. 2024-06-12 09:49:48 +08:00
66fbe5571e added comments 2024-06-12 08:56:01 +08:00
4fcdd42ce4 fixed RayPicking.cpp sample on newest sdk. 2024-06-12 08:53:54 +08:00
d83f04faab fixed a but that PrimitiveCreater::WriteVAB return error. 2024-06-12 08:53:20 +08:00
b71c912fd5 [WIP] RayPicking.cpp 2024-06-12 02:14:56 +08:00
2efb9c83bf added GetVABMap and GetIBMap in Primitive 2024-06-12 02:07:54 +08:00
7b0a185a45 Moved vab_map_list and ibo_map from PrimitiveCreater to PrimitiveData 2024-06-12 01:48:25 +08:00
0a025f0464 added VKBufferMap::Write function. 2024-06-12 01:46:19 +08:00
7f8fbbd3a0 improved VKBufferMap and added newly IBMap/VABMap 2024-06-12 00:23:09 +08:00
cd4733a491 PlaneGrid use 2d position format instead of 3d. 2024-06-02 20:15:56 +08:00
c1d54628d1 Added Std3D/VertexLum2D.mtl 2024-06-02 20:14:30 +08:00
0da0290fc6 resume vab_offset but don't use it in short time. 2024-06-02 15:27:03 +08:00
01bb4b2153 fixed VABMap 2024-06-02 12:40:17 +08:00
66ef3160e1 used newly VKBufferMap in PrimitiveCreater 2024-06-02 12:16:33 +08:00
16ae849809 added VKBufferMap.cpp/.h 2024-06-01 12:08:49 +08:00
8788b3dd6a Clear zero map_ptr_list in PrimitiveCreater 2024-06-01 12:08:26 +08:00
bba5a660a3 fixed PlaneGrid3D sample 2024-06-01 12:07:34 +08:00
aa853fbdfb fixed 3 samples that are texture_quad, texture_rect and texture_rect_array 2024-05-31 23:17:08 +08:00
c780662ff6 fixed draw without VDM 2024-05-31 23:07:05 +08:00
611a9fe61d fixed draw_triangle_in_NDC sample and other about codes. 2024-05-31 22:04:02 +08:00
90152ca74e add texture in BlinnPhongDirectionLight example. 2024-05-30 21:07:13 +08:00
22868dafab [Important] Indirect Draw Finished....test OK!! 2024-05-30 13:39:16 +08:00
6ce713aed5 finished to stat about IndirectDraw data in MaterialRenderList 2024-05-30 13:14:13 +08:00
ac0d1bee59 added VKIndirectCommandBuffer.cpp and other codes. 2024-05-30 01:58:32 +08:00
bf7c6bdeac preparing VKIndirectCommandBuffer.h 2024-05-30 01:14:27 +08:00
cc80fe7f39 add renderitem sort by vdm 2024-05-29 00:55:12 +08:00
55001843ea added vdm sort 2024-05-28 23:49:28 +08:00
8cdf88e2fd added VDM in Primitive/Renderable/PrimitiveDataBuffer 2024-05-28 23:33:15 +08:00
ca8e36687f OK! Can RUN! full OK!...next step is to create VDMRender in MaterialRenderList 2024-05-28 23:10:50 +08:00
86ff7517d9 [WIP] optimizing VDM Support 2024-05-28 02:21:33 +08:00
742fe201ad rename and layout codes. 2024-05-27 01:42:10 +08:00
8bb97ef2de added comments 2024-05-26 15:55:28 +08:00
9947d46ab8 changed many size/count type why to equal vkCmdDraw/vkCmdDrawIndexed 2024-05-26 15:04:44 +08:00
bf5e401566 [STRONG] merge VDM render OK!!! TEST OK! next step is to support VDM Render and non-VDM Render, recommend is two MaterialRenderList class. 2024-05-26 02:25:49 +08:00
0dcf004f4c renamed to VAB from VBO 2024-05-25 22:57:29 +08:00
8d3cd8d561 remove RenderablePrimitiveCreater.h, fixed auto_instance.cpp/auto_merge_material_instance.cpp examples, can RUN. 2024-05-25 22:47:26 +08:00
6740764f07 create DrawData that it split from VertexInputData 2024-05-25 22:08:01 +08:00
a5e76988c7 resume Assign instead of local2world and materialinstanceId in VertexInputStream 2024-05-25 17:58:39 +08:00
08a348392d added GetVDM() in PrimitiveData classes. 2024-05-25 13:48:15 +08:00
0dfb7220b5 finish BIG VBO.Test OK!,Can RUN!..next step is merge drawcall. 2024-05-25 04:11:38 +08:00
4a94d78c1f preparing PrimitiveCreater to support multi primitive 2024-05-25 03:14:26 +08:00
9a4e495027 coded PrimitiveDataVDM, next step is test. 2024-05-25 02:48:37 +08:00
6de3cf789a upgraded InlineGeometry, removed RenderResource::CreatePrimitive. 2024-05-25 01:48:15 +08:00
299d3bd019 newly Primitive/PrimitiveData/PrimitiveCreater, and test OK! can RUN! 2024-05-25 01:46:19 +08:00
78b1982849 output Vendor in PhysicalDeviceCapsOutput 2024-05-25 01:44:47 +08:00
8a0215aee6 supported newly IBMap,can RUN OK!!! 2024-05-23 14:00:23 +08:00
419e0e2574 override Map/Flush/Write functions in IndexBuffer/VAB 2024-05-23 13:59:48 +08:00
cfd67e1a42 [WIP] comments VDM, preparing double PrimitiveCreater 2024-05-23 13:15:47 +08:00
c49feac2e6 delete primitiveData at Destory(PrimitiveData *) 2024-05-23 12:46:45 +08:00
bf50333f5b Remove the excess # include 2024-05-23 02:28:09 +08:00
40ce978f85 newly PrimitiveData struct and Primitive class. Can't Run!!!
next step is to support PrimitiveVDM.
2024-05-23 02:19:40 +08:00
e27442a0b4 [WIP] update PrimitiveCreater/PrimitiveData, CAN'T RUN. 2024-05-22 01:21:05 +08:00
ecb47dae4d moved to VKPrimitiveData.cpp from VKPrimitiveData.h 2024-05-20 18:04:30 +08:00
6892a64393 VKPrimitiveData change to C version. next step is change to pure virtual struct. 2024-05-20 02:12:13 +08:00
3af753ee36 preparing resume PrimitiveData 2024-05-16 20:58:44 +08:00
f31437bf67 remove VABView 2024-05-14 21:09:19 +08:00
14fbbd6fa6 added VABView,preparing new VABViewStadnalone,VABViewVDM 2024-05-14 00:32:49 +08:00
4e6adcd765 added vab_map.Clear() in PrimitiveCreater::Finish() 2024-05-06 00:41:01 +08:00
ead4ba65c1 moved RenderResource to PrimitiveCreater::Finish() 2024-05-05 15:44:51 +08:00
310cc151fa fixed uint8 indextype 2024-05-05 15:12:14 +08:00
03491dbed8 Layout codes. 2024-05-05 04:37:04 +08:00
40094a7529 renamed to vab_map from vbo_map 2024-04-27 11:08:50 +08:00
6ad3b9edb7 to set few functions to private in VKPrimitive 2024-04-27 03:09:16 +08:00
21a63f4a9b improved PrimitiveData 2024-04-27 02:19:01 +08:00
11ebb841be improved IBAccess in VKPrimitive/VKRenderable/MaterialRenderList 2024-04-27 01:13:12 +08:00
ad330f3a42 renamed many values and function's name. 2024-04-27 01:07:44 +08:00
bbf94767fe using IBAccess=IndexBufferAccess 2024-04-27 00:05:25 +08:00
6dba761a80 added VKPrimitiveData.h 2024-04-26 01:17:47 +08:00
5391f0f4aa Temporarily deactivate the WorldBoundingBox 2024-04-26 01:17:30 +08:00
a1bf9336a3 Added RenderCmdBuffer::Draw(const VertexInputData *) 2024-04-26 00:41:53 +08:00
9c6c37c07a renamed to IndexBufferAccess from IndexBufferData 2024-04-26 00:32:11 +08:00
3bbbe18c40 use VAB instead of VBO 2024-04-24 01:44:01 +08:00
d8140ae64e use VAB instead of VBO 2024-04-24 01:38:55 +08:00
acb69d3bf5 use VBOAccessData instead of PrimitiveVertexBuffer, use VBOAccessMap instead of PVBMap 2024-04-23 03:32:25 +08:00
f0c47cd4f1 renamed values. 2024-04-21 01:28:45 +08:00
0b1a0cadae newly PrimitiveCreater and InlineGeometry, test two samples are OK! 2024-04-19 00:41:26 +08:00
8633a18e01 supported uint8_index_type 2024-04-19 00:40:51 +08:00
2bc6246dc0 few codes of PrimitiveCreater, but can't run. 2024-04-18 01:37:59 +08:00
0a752446b0 simply feature copy/check 2024-04-18 01:09:29 +08:00
c32f56fbe2 improved VulkanDeviceCreater::RequirementCheck 2024-04-18 00:56:29 +08:00
b100b4b9cb added sampleRateShading/fillModeNonSolid in VulkanHardwareRequirement 2024-04-18 00:56:02 +08:00
d20e9cf1e3 improved features support/check. 2024-04-18 00:36:52 +08:00
621e056315 preparing to support uint8 index 2024-04-17 20:22:31 +08:00
4fc74d38ba prepare support VDM for PrimitiveCreater 2024-04-17 01:38:35 +08:00
f00cb0b815 split VertexDataManager.h/.cpp 2024-04-17 01:20:52 +08:00
e1d45a7c83 added few feature in future. 2024-04-16 23:34:17 +08:00
c5b8dbe8f6 match new function's name for VertexInputLayout 2024-04-04 01:57:51 +08:00
172ee7bb7b added comments 2024-04-03 19:26:22 +08:00
d41530dad3 renamed to VBO instead of VAD in PrimitiveCreater 2024-04-03 09:13:06 +08:00
6efb50c977 added comments and layout codes. 2024-04-03 00:14:09 +08:00
f4493b09e5 use GetVBOAccessData instead of GetVBO in Primitive. 2024-04-03 00:12:39 +08:00
af8f62ddb4 move the VBOAccessData to VKVertexAttribBuffer.h from VK.h 2024-04-03 00:12:03 +08:00
fff7fd3af0 renamed to VBOAccessData from Primitive::VBOData and then move to VK.h 2024-04-02 23:51:57 +08:00
2fdd7e7bd5 removed name and binding from PrimitiveCreater:: 2024-04-02 23:39:59 +08:00
4ebc8a3260 removed Primitive::GetBuffer(..) function. 2024-04-02 23:36:34 +08:00
5892b075c3 renamed to AcquirePVB from CreatePVB 2024-04-02 23:24:39 +08:00
07a478a2ac adjust position of include 2024-04-02 22:53:13 +08:00
8c51d3a52b [very strong] deleted class VertexAttribData 2024-04-02 22:51:14 +08:00
c1183d351d moved CreateVertexAttribData(...) to PrimitiveCreater.cpp from VertexAttribData.cpp and then delete VertexAttribData.cpp 2024-04-02 22:25:06 +08:00
d4c1dd312e renamed to "vad" from "data" in PrimitiveVertexBuffer 2024-04-02 22:19:02 +08:00
3c22b48f3c moved CreateVAD() to protected 2024-04-02 22:15:44 +08:00
02169963de improved PrimitiveCreater::CreateIBO.. functions for template 2024-04-02 21:34:49 +08:00
ac81e4f8f0 first version of VertexDataManager.h 2024-04-02 21:14:34 +08:00
1d3bec4098 added VertexDataManager::Init(...) function. 2024-04-02 19:41:47 +08:00
3252d1581c removed mtl value from PrimitiveCreater 2024-04-02 15:34:05 +08:00
01bf8b3dd2 updated VertexDataManager 2024-04-01 23:32:18 +08:00
1c03e838e5 layout codes. 2024-03-29 12:58:58 +08:00
0f38f94139 split to two class they are RenderL2WBuffer and RenderMIBuffer from RenderAssignBuffer, two sample program RUN OK! 2024-03-26 01:51:59 +08:00
0639440a13 fixed sample program. 2024-03-26 01:33:17 +08:00
8492b886c9 Layout codes 2024-03-26 01:22:58 +08:00
a60ffbb7da first step OK that it's to resumed to use L2W in VertexInputStream. 2024-03-26 01:20:20 +08:00
b48ef1ac30 use HGL_MATH_LIB instead of HGL_GLM_LIB 2024-03-25 22:55:04 +08:00
c363a6fa51 upgraded to 3.5 from 3.0 that it's cmake version minimum required. 2024-03-19 22:00:26 +08:00
c873271f6e little codes 2024-03-18 13:30:06 +08:00
68ff8a472c few of code, but can RUN. 2024-03-16 14:08:55 +08:00
60ba3e4df2 improved safe. 2024-03-16 00:41:20 +08:00
35b7c9651f used 3 colors in BlinnPhongDirectionLight.cpp 2024-03-16 00:20:27 +08:00
89b9735f99 improved sample. 2024-03-15 01:38:47 +08:00
7f744d1207 updated test codes. 2024-03-13 00:13:58 +08:00
b9f5c69f85 optimized to get normal in AutoShader 2024-03-12 23:29:38 +08:00
c469fde84a adjusted order of codes in Std2DMaterialLoader.cpp and Std3DMaterialLoader.cpp 2024-03-12 23:29:06 +08:00
dd6b2f4fb3 add "hasInput(const char *name)" in ShaderDescriptorInfo and ShaderCreateInfoVertex classes. 2024-03-12 23:28:23 +08:00
ba8b44659b resume GetNormalMatrix/GetNormal in auto shader. 2024-03-12 23:04:12 +08:00
13b2ca0575 fixed Viewport UBO bug. 2024-03-12 22:54:33 +08:00
9d704eb33d updated comments. 2024-03-12 22:31:58 +08:00
86c3b65a42 fixed -normal bug in InlineGeometry.cpp 2024-03-12 21:53:41 +08:00
f6e61e70ce 更改了specular算法,但是有点问题。。。而且高光区有点象是VS算的一样,怀疑是NORMAL在VS算的原因。但fs没有GetLocalToWorld函数,需要尝试修复。 2024-03-12 00:42:32 +08:00
5347ac7091 specular OK in BlinnPhongDirectionLight sample. but direction error. 2024-03-10 22:45:38 +08:00
f56928d734 Fixed bug about SunLightPureColor.mtl 2024-03-10 01:00:42 +08:00
f3a59c1bb3 test sunlight UBO ok! 2024-03-10 00:35:35 +08:00
5188d4149c added Unknow and Static in DescriptorSetType 2024-03-09 23:35:56 +08:00
d4096735f5 adjusted order of codes in MaterialCreateInfo.h 2024-03-09 23:23:34 +08:00
4fafd938b1 new function, MaterialFileData load UBO OK! to make shader OK. 2024-03-09 22:26:45 +08:00
f0848541c2 added a newly AddUBO() in MaterialCreateInfo 2024-03-09 22:25:03 +08:00
cc9e756ece fixed Load of ubo codes. 2024-03-09 21:23:02 +08:00
cdedc81f9f save codes of UBO in AccumMemoryManager 2024-03-09 20:48:30 +08:00
c229259623 added comments 2024-03-09 19:49:44 +08:00
2c2f11f47e
added little safe check of filename in MaterialFileLoader.cpp 2024-03-07 23:04:54 +08:00
c8b3ed0286 preparing blinnphong light sample. added codes of to load ubo. 2024-03-07 13:59:28 +08:00
2ce36ec26c
fixed a bug in ShaderCreateInfoVertex.cpp, put "C-style string" in function that it's a bug. 2024-03-07 00:07:49 +08:00
5ba3c1790d
removed standalone ".glsl" files ,merge to c++ codes. 2024-03-06 23:24:57 +08:00
3874d771d3
aligned codes, append CreateIBO8 functions in VKRenderResource.h 2024-03-06 22:51:07 +08:00
49eb8f42f0
updated DescriptorBinding::BindUBO, to support dynamic param. 2024-03-06 22:40:51 +08:00
c355f96f9b little codes 2024-03-06 13:54:05 +08:00
dc3d7b7792
removed BindingMapping 2024-03-06 00:29:17 +08:00
5f1c60a24a
Improved VKDescriptorBindingManage 2024-03-06 00:26:23 +08:00
ff6a644e8f added BlinnPhong.h 2024-03-04 13:13:33 +08:00
b9e70426a1 removed sun.ubo, next step is UBO in C++ 2024-03-04 13:12:29 +08:00
a7af276a44 updated SunLightPureColor.mtl 2024-03-04 12:58:22 +08:00
8b82c6c25c support the new other codes. 2024-03-02 10:35:27 +08:00
a8d68c295d renamed many values. 2024-02-13 22:27:12 +08:00
f666d5b248 renamed values of BlinnPhongDirectionLight.cpp 2024-02-12 08:23:31 +08:00
55c27a883b init empty BlinnPhongDirectionLight example 2024-02-12 08:20:24 +08:00
6a7f8e7754 fixed access method 2024-02-03 19:53:19 +08:00
1dbf8ae5c7
renamed values. 2023-12-24 01:35:30 +08:00
8dbc1d899c
added to Check ubolist in MaterialFileLoader.cpp 2023-12-05 02:24:09 +08:00
d010ee4278
I updated two sub-modules, Platform and Util. 2023-12-05 02:13:21 +08:00
4aeb28c571
added a parse in MaterialFileLoader.cpp that it's UBOParse 2023-12-05 02:08:18 +08:00
775e031422
added VK_LAYER_AMD_switchable_graphics in VKInstance.h/VKProperties.cpp 2023-12-05 02:07:25 +08:00
deefdf1416
used uint instead of int in Size of viewport 2023-11-10 04:24:10 +08:00
ba2d479f05 improved Gizmo3DMove.cpp 2023-11-02 18:51:02 +08:00
b16341c0f9 draw gizmo3d move, next step is mouse to pick the gizmo 2023-11-01 18:37:10 +08:00
d5eeb081e1 removed codes about RenderCmdBuffer::SetLineWidth 2023-11-01 18:36:20 +08:00
4bb66d2746 added "wide_lines" requirment in CreateRenderDevice and VulkanAppFramework 2023-11-01 11:00:55 +08:00
625a7387ae adjusted VulkanHardwareRequirement order in CreateRenderDevice functions. 2023-11-01 10:59:51 +08:00
c4deceebd9 first step for BlinnPhongPureColor 2023-10-31 17:59:12 +08:00
4ed0e281b2 first run MetricCellsGrid OK! 2023-10-13 19:22:11 +08:00
9369ad115b UBO ViewportInfo in All graphics shader. 2023-10-13 19:21:34 +08:00
7788459109 improved and fixed CreatePlane 2023-10-13 19:21:04 +08:00
a58589f01f moved AddBuffer to .h for RenderResource 2023-10-13 10:47:42 +08:00
240b6fb0e3 added UBO/SSBO/INBO debug output. 2023-10-13 10:42:21 +08:00
b72a924853 Merge branch 'devel_27_Default3DMaterial' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_27_Default3DMaterial 2023-10-13 09:55:20 +08:00
b781ff41a3
removed codes about VkDebugMaker 2023-10-13 02:01:57 +08:00
4ee6962d04
added lot of debug output based VkDebugUtils 2023-10-13 01:48:07 +08:00
7eff39b3b0 draw_triangle_use_UBO support u16 position format and u8 norm color format. 2023-10-12 15:00:39 +08:00
6b13c159d8 added comp operator in MaterialConfig 2023-10-12 14:59:39 +08:00
2f560a28a7 fixed all examples that can RUN OK! 2023-10-12 10:39:43 +08:00
8ba171efda
added debug name. 2023-10-12 05:55:39 +08:00
317635877b
optimized MaterialRenderList, removed last_vil(pipeline already include vil), don't create assign_buffer if material don't include assign 2023-10-12 02:24:58 +08:00
255c7859f1
optimized DescriptorSets::Update 2023-10-12 01:40:59 +08:00
ae85d3fc66
removed ReverseDirection from CameraMouseControl 2023-10-12 01:39:47 +08:00
a5830e18cb added ReserveDirection 2023-10-11 19:38:12 +08:00
ae88a65315 added newly CreateMaterialInstance that include MIData 2023-10-11 19:14:24 +08:00
77b0266cdc Used SceneAppFramework instead of CameraAppFramework in RayPicking.cpp 2023-10-11 19:06:18 +08:00
c99934fdf9 added RenderResource::LoadMaterial functions, it can't easy CreateMaterial from file. 2023-10-11 19:02:17 +08:00
aa6071a948 added newly files and adjust comments. 2023-10-11 18:50:06 +08:00
6f58475abd added SceneAppFramework, global_descriptor.Bind used auto-mode. 2023-10-11 18:49:29 +08:00
cfed14d746 renamed to require_list instead of require in MaterialFileData 2023-10-11 13:14:34 +08:00
27c409c7fd added To parse "require" of the MaterialBlock in MaterialFileLoader.cpp 2023-10-11 13:12:51 +08:00
bee48890cb optimized codes of MaterialFileLoader.cpp 2023-10-10 19:30:07 +08:00
a2669d2123 adjust class's name in MaterialFileLoader.cpp 2023-10-10 19:21:33 +08:00
737438aaed added Normal.glsl BlinnPhongPureColor.mtl 2023-10-10 19:14:10 +08:00
8a5711154f finished StdMaterialLoader, test all examples ok. 2023-10-10 14:49:33 +08:00
3dd308aff1 added sampler parse in MaterialFileLoader.cpp 2023-10-10 14:46:20 +08:00
bead8128b7 test ok that LoadPureColor2D material from file. 2023-10-10 10:57:29 +08:00
019e9964fa Merge branch 'devel_27_Default3DMaterial' of http://www.hyzgame.com:3000/hyzboy/ULRE into devel_27_Default3DMaterial 2023-10-10 09:49:59 +08:00
7ca81f38e8
Std2DMaterialLoader start ok,,but don't support Sampler2D in material file... 2023-10-10 02:48:02 +08:00
03750832c8
MaterialFileData added origin data. 2023-10-10 01:19:05 +08:00
018a72c09a
created MaterialFileData and all material's data in the struct. 2023-10-10 00:24:41 +08:00
55fee1e5d7 renamed few class name; 2023-10-09 21:13:34 +08:00
c5dd359d18 Added Std2DMaterialLoader and Std3DMaterialLoader 2023-10-09 20:57:46 +08:00
85ec666989 used FragColor instead of Color in Fragment shader. 2023-10-09 20:56:56 +08:00
9a5cead33e moved Create to StdMaterial from Std2DMaterial and Std3DMaterial 2023-10-09 20:56:25 +08:00
695f1a22a8 used Block instead of State in MaterialFileLoader.cpp 2023-10-09 18:02:03 +08:00
237c1a469b
writed GeometryShaderStateParse, need to test in furture. 2023-10-09 03:15:42 +08:00
5ede824522
MaterialTextParse completed VertexShader/FragmentShader parse. 2023-10-09 02:22:38 +08:00
46781b9627
used "VertexInput" state in .mtl file-format. 2023-10-09 02:21:56 +08:00
aaff0c23c9
improved CodeParse in MaterialFileLoader.cpp 2023-10-09 01:23:06 +08:00
3a3f9d10b7
Parse MaterialInstance filed in MaterialFileLoader.cpp 2023-10-09 01:12:27 +08:00
b6e391762b added MaterialInstanceStateParse 2023-10-08 20:38:54 +08:00
b262fdc645 added MaterialFileLoader.cpp 2023-10-08 20:00:46 +08:00
5e795c4a7f fragment shader output use "FragColor" instead of "Color". 2023-10-08 10:40:01 +08:00
0524c51feb Set Base-class StdMaterial to Std2DMaterial/Std3DMaterial 2023-10-08 10:04:58 +08:00
8dc9846ae8
Merge remote-tracking branch 'github/devel_27_Default3DMaterial' into devel_27_Default3DMaterial 2023-10-07 23:37:20 +08:00
1d866abb48
use List<const char *> instead of AnsiStringList in ShaderCreateInfo::function_list 2023-10-07 23:35:22 +08:00
ece7912f3c
removed ShaderCreateInfoFragment::UseDefaultMain 2023-10-07 23:34:36 +08:00
4ef37a430e move Material2DCreateConfig/Material3DCreateConfig 2023-10-07 20:59:44 +08:00
1f91ec94e1 added Std2D/3D material files. 2023-10-07 20:09:16 +08:00
86123827cb moved glsl to standalone .glsl file. 2023-10-07 17:02:00 +08:00
19df201ab5 Added ShaderStage macro in ShaderGen 2023-10-07 16:14:34 +08:00
921d6d157f
Update README.md 2023-10-06 23:05:29 +08:00
c0e4128365
Update README.md 2023-10-06 23:03:19 +08:00
8fe5e8dd55
Update README.md 2023-10-06 23:00:09 +08:00
3393a90127
prepare billboard 2023-10-06 22:25:39 +08:00
9b5157594f
added MFGetNormal.h 2023-10-05 01:32:00 +08:00
10d4f2f04a
fixed RayPicking.cpp, it can RUN ok! 2023-10-05 00:50:31 +08:00
a1e7b105f7
added GetViewportInfo/Buffer in VulkanAppFramework.h 2023-10-05 00:48:38 +08:00
67cf89fef1
improved RenderablePrimitiveCreater 2023-10-05 00:48:00 +08:00
e95cbb28a4
improved PlaneGrid 2023-09-29 02:59:10 +08:00
c9d6774bd3 added SetClearColor(COLOR::MozillaCharcoal) in VulkanApplicationFramework 2023-09-28 18:57:15 +08:00
78946994bb Added VertexLum3D material, test PlaneGrid3D OK! 2023-09-28 18:13:51 +08:00
1a63fa8c76 renamed a func in VertexAttribDataAccess1 2023-09-28 18:12:43 +08:00
db766f33ac fixed PlaneGrid3D example, it RUN OK!!! 2023-09-28 17:44:47 +08:00
3db94948c5 fixed a bug in PrimitiveCreater::Finish 2023-09-28 17:44:20 +08:00
cefea7229d added CreateUBODescriptor 2023-09-28 17:42:14 +08:00
45f50b3bc0 added GetPosition3DCamera/GetPosition3DL2WCamera and to support UBO Camera 2023-09-28 17:41:45 +08:00
dbea7764fb added GetPosition3D in Std3DMaterial 2023-09-28 15:03:34 +08:00
1101bcae9d updated codes with AABB in SceneNode 2023-09-28 15:02:57 +08:00
6c7f9ea9d1 perpare it for VertexColor3D material. 2023-09-27 20:31:46 +08:00
253d113375 adjusted path of examples. 2023-09-27 11:36:39 +08:00
ca1bb80b5f updated M_RectTexture2DArray.cpp 2023-09-26 21:57:03 +08:00
922fc2661b added primitive in Material2DCreateConfig 2023-09-26 21:49:37 +08:00
e9a8e5bbf2 updated texture_quad.cpp 2023-09-26 21:16:00 +08:00
bba00534ba removed DescriptorSetType::MaterialInstance 2023-09-26 14:50:38 +08:00
c15fbf8252 texture_rect_array was run OK! 2023-09-25 21:49:35 +08:00
9a7e711658 LoadTexture2DToArray OK! test ok! 2023-09-25 20:32:12 +08:00
65c3d5cad1 renamed to CreateTexture from GetTexture in TextureLoader<> 2023-09-25 19:49:06 +08:00
7d9192051a added codes about Texture2DArray. 2023-09-25 17:34:36 +08:00
22099b6b84 added CopyBufferToImage2D and use it. 2023-09-25 17:33:59 +08:00
322d24c4ca added GPUDevice::CreateTexture2DArray functions. 2023-09-25 17:01:21 +08:00
5230fbc27f added little codes of texture 2d array, but can't run. 2023-09-25 16:38:02 +08:00
f901708b6c improved codes. 2023-09-25 15:37:41 +08:00
2487cb1f36 added CopyBufferToImage.h 2023-09-25 15:13:30 +08:00
7805494ca9 created a new GPUDevice::CopyBufferToImage(CopyBufferToImageInfo *,..) 2023-09-25 14:44:53 +08:00
ac4c97d33a renamed to CopyBufferToImage from CommitTexture 2023-09-25 12:42:48 +08:00
a87a35b5f8 removed old examples. 2023-09-22 11:32:26 +08:00
d456c2bf92
used DescriptorSetType::MaterialInstance 2023-09-22 01:31:04 +08:00
12e18b517b
added MaterialInstance::WriteMIData<>(const T &) 2023-09-22 01:30:44 +08:00
2f00aa8e1e
improved codes. 2023-09-22 01:08:32 +08:00
4e144072e4 texture_rect run ok! 2023-09-21 22:11:20 +08:00
907cb3c852 added M_RectTexture2D.cpp 2023-09-21 21:36:55 +08:00
eb51df8dd0 Added few codes of ShaderCreateInfoGeometry 2023-09-21 21:36:37 +08:00
ed9ba3876f added PureTexture2D material and test. 2023-09-21 20:46:08 +08:00
97290ce54c fixed a bug that lost a ; in ShaderCreateInfo::ProcSampler() 2023-09-21 20:45:34 +08:00
bebac2284f used FAN instead of TRIANGLES in texture_quad.cpp 2023-09-21 17:38:02 +08:00
d5d6a6bc74 added example that it's texture_quad.cpp. 2023-09-21 17:15:36 +08:00
5559178e7c fixed a bug about RenderablePrimitiveCreater::SetIBO 2023-09-21 17:15:12 +08:00
f58ce4f98b removed dirty codes 2023-09-21 17:14:49 +08:00
5c2f136689 renamed project's name 2023-09-21 10:09:31 +08:00
6820ee8c74 completed AutoMergeMaterialInstance,test ok. next step is to support texture2d array 2023-09-20 21:53:30 +08:00
ddb5a0b77a use VIL instead of MI in to sort for RenderNode 2023-09-20 18:56:09 +08:00
69646971ce used VIL instead of MI in MaterialRenderList 2023-09-20 17:19:46 +08:00
e71ec4be85 Added few RenderPass::CreatePipeline functions. 2023-09-20 17:15:13 +08:00
dbe2370a44 1.used uvec2/ushort2 in AssignVBO
2.completed first step then merge MI buffer
2023-09-20 15:55:14 +08:00
00d2677066 update RenderAssignBuffer,but can't run. 2023-09-19 22:04:34 +08:00
4208e47534 newly material instance stat,but can't run. 2023-09-19 21:45:54 +08:00
2dedeaad90 layouted codes of VKMaterialInstance.h 2023-09-19 21:45:28 +08:00
083600a95f added mi_max_count in Material 2023-09-19 21:44:48 +08:00
902dc20340 used ActiveMemoryBlockManager to manage data of material instances in Material class. 2023-09-19 21:09:09 +08:00
164498446a fixed crash in RenderAssignBuffer.cpp because not check ubo_mi before use. 2023-09-19 21:07:07 +08:00
cef5ad073b a few update 2023-09-07 18:09:31 +08:00
c2279c553d fixed a spell error in word. 2023-09-06 17:06:12 +08:00
d959e7988d moved few values to VKRenderAssign.h 2023-09-06 16:55:04 +08:00
202bff5870 moved few codes to RenderAssignBuffer.cpp from MaterialRenderList.cpp 2023-09-06 16:24:05 +08:00
8437d8d561 named values and macro about RenderAssignBuffer 2023-09-06 15:57:52 +08:00
714fc3dcb7
use hgl_min in MaterialCreateInfo.cpp 2023-09-05 23:36:59 +08:00
e030738a5f removed old codes of L2W in AssignBuffer 2023-09-05 20:52:55 +08:00
28b2b53d03 renamed to RenderAssignBuffer from RenderExtraBuffer 2023-09-05 20:48:47 +08:00
8bb742f3f4 OK???? 3rd_draw_triangle_use_RenderList run OK!. 2023-09-05 20:19:53 +08:00
6e8932fc2f comments few codes and then start next step. 2023-09-05 10:28:03 +08:00
9661336325 used uint8 color in third_triangle.cpp 2023-08-18 18:39:25 +08:00
ef84e5c699 renamed to RTSwapchain instead of SwapchainRenderTarget 2023-08-17 11:08:21 +08:00
3b106a3b42 updated CMCore, test can Run OK!. 2023-08-15 14:42:08 +08:00
74003df08b updated list/pool/map....,but can't run. 2023-08-14 21:03:20 +08:00
95c67ba857
fixed name of color. 2023-07-29 01:54:01 +08:00
f51c7c6964 optimized Sort() in MaterialRenderList 2023-07-28 20:41:02 +08:00
3fe8d9f90d Merge branch 'new_RenderList' of h 2023-07-28 20:23:46 +08:00
7967150722 upgraded codes and then it can run. 2023-07-28 20:17:46 +08:00
51a6da3d9f
update #include, but the codes can't compile. 2023-07-22 12:16:26 +08:00
dd047c1644
added WinVulkan.cpp 2023-07-09 22:32:14 +08:00
df80b1af3b update submodules. 2023-06-21 20:17:12 +08:00
64235b12b6 used AutoDelete<>.Finish() at CreateMaterial. 2023-06-15 16:07:11 +08:00
0557ff2bae added check of brand name 2023-06-14 21:03:30 +08:00
b43d4cc5a3 fixed a bug that error in getting the value of features/properties of vkPhysicalDevice 2023-06-14 20:17:10 +08:00
b72144a28b reordered the creating vkdevice 2023-06-14 19:58:56 +08:00
d05f1109b5 removed MaterialData 2023-06-14 18:20:23 +08:00
3de67f8cf1 updated RenderResource::CreateMaterial 2023-06-14 17:55:06 +08:00
9816592bf6 optimized codes of RenderSource::CreateMaterial 2023-06-14 16:55:22 +08:00
82f3ad070b optimized codes about CreateMaterial 2023-06-14 16:49:19 +08:00
b021b05cb0 renamed values in MaterialCreateInfo::SetMaterialInstance 2023-06-13 18:02:00 +08:00
5749d8ec8a optimized ShaderModuleMapByName in RenderResource 2023-06-12 16:30:16 +08:00
e6560dfe5f renamed values. 2023-06-12 15:45:34 +08:00
8f6260f440 fixed bug at GPUDevice::ChangeTexture2D 2023-06-07 20:25:32 +08:00
18850b0e27 BufferImageCopy supported RectScope2<> 2023-06-07 20:23:13 +08:00
de2926a6d5 standalone GPUDevice::CreateMP 2023-06-06 21:03:13 +08:00
1a8bd0a607 removed GPUDevice::CreateMP(Material *,const DescriptorSetType &) 2023-06-06 20:52:23 +08:00
ffaa6b5362 few about MaterialInstance 2023-06-05 21:39:12 +08:00
9d3ea89861 moved CreateMI to Material from GPUDevice. 2023-06-05 20:17:16 +08:00
7f1532dc6e updated example programs that are second_triangle and third_triangle 2023-06-05 17:10:52 +08:00
01cdb7661b used UTF8String instead of OSString in shader_module_by_name and material_by_name of RenderResource 2023-06-05 17:07:37 +08:00
ab6a8435a1 optimized codes of ShaderCreateInfo::ProcDefine 2023-06-05 17:01:13 +08:00
d17932c7a4 removed source codes about "Load Material file" 2023-06-05 17:00:22 +08:00
f4a8406ad8 support MI_MAX_COUNT in ShaderGen 2023-06-02 20:45:19 +08:00
22bc5f6653 rename params name 2023-06-02 14:23:33 +08:00
fc94ee82b4 layout and renamed value 2023-06-02 14:22:07 +08:00
f8fe0e46d6 added WriteMaterialInstance in RenderExtraBuffer 2023-06-01 21:25:50 +08:00
e076b72f1a splited MaterialRenderList and MaterialRenderMap, RenderExtraBuffer 2023-06-01 15:08:45 +08:00
a04742c347 completed MaterialInstance codes in ShaderGen 2023-06-01 14:47:05 +08:00
1668a0c973 added InitLogger at VulkanAppFramework::Init 2023-06-01 14:46:21 +08:00
e2dd652c3a added few codes about MaterialInstance 2023-05-31 20:14:45 +08:00
a2c3438c58 added main_function value and SetMain function at ShaderCreateInfo class. 2023-05-31 20:14:13 +08:00
5521c53c94 to supported new version of GLSLCompiler.dll 2023-05-31 17:18:14 +08:00
71fd42cfc8 updated VKDeviceCreater.cpp 2023-05-30 17:57:12 +08:00
222ff2961f renamed to AccessVAD from CreateCADA 2023-05-29 21:43:39 +08:00
ed5aac2a9d layout codes. 2023-05-22 21:28:48 +08:00
233523231e Move the ShaderStageBind to the PrimitiveCreate inside, and renamed to PrimitiveVertexBuffer 2023-05-22 21:26:43 +08:00
3523afc6c2 added fourth_triangle.cpp, not ok!!! 2023-05-22 15:29:07 +08:00
6b498d7e91 updated PureColor2D material codes 2023-05-22 14:31:37 +08:00
fa7ecb91ac supported MaterialInstance in ShaderGen module. 2023-05-22 14:30:38 +08:00
d5b719152f removed Material::GetMaterialData() 2023-05-22 14:29:39 +08:00
410a386423 added ShaderDescriptorInfo::AddStruct 2023-05-22 14:29:16 +08:00
641ba4431f changed to UTF8 encode 2023-05-19 22:23:40 +08:00
c485941342 added PureColor2D.cpp 2023-05-19 22:22:55 +08:00
198fe55216 added HandoverMI and GetMI at MFCommon.h 2023-05-19 22:22:30 +08:00
ad7c652cd4 added Interpolation at ShaderCreateInfo 2023-05-19 22:21:49 +08:00
46b6797bce added comments. 2023-05-16 16:56:32 +08:00
c8dbd40333 removed VertexColor2D.h 2023-05-16 15:27:51 +08:00
35844d52bc finished Std2DMaterial and new VertexColor2D, and fixed first_triangle,second_triangle,third_triangle samples. 2023-05-16 15:21:32 +08:00
36d872359e
updated README.md 2023-05-16 02:33:19 +08:00
8086fb76f1
fixed a few compile error. 2023-05-16 02:23:45 +08:00
d660691cec added MFGetPosition.h 2023-05-15 22:05:21 +08:00
c5699fd1af 1.splited CoordinateSystem.h, MaterialConfig.h,RenderTargetOutputConfig.h,Material2DConfig.h,StdMaterial.h/.cpp,UBOCommon.h,MFCommon.h
2.adjust namespace.
2023-05-15 21:52:57 +08:00
9316135942 used simply VAT at ShaderCreateInfoVertex.h 2023-05-13 14:59:46 +08:00
8340209697
renamed to JointID/JointWeight instead of BoneID/BoneWeight 2023-05-13 03:14:38 +08:00
aa217c6fc5 added SortedSets<MaterialInstance *> at RenderNode.h/.cpp 2023-05-12 21:37:28 +08:00
d5b69fbe71 removed mi_data from Material 2023-05-12 21:36:52 +08:00
58c62ddb59 renamed two functions that are CreateArrayInUBO and CreateArrayInSSBO 2023-05-12 21:36:17 +08:00
7f3132236f improved MaterialCreateInfo::AddUBO 2023-05-12 20:30:29 +08:00
f8ff6d9cf0 added SBS_MaterialInstance,GetMI at StdMaterial.h 2023-05-12 20:29:27 +08:00
8855f0b880 renamed MaterialID to MaterialInstanceID 2023-05-12 20:28:44 +08:00
254264ac5e
moved to .cpp about ChoosePhysicalDevice 2023-05-12 00:32:12 +08:00
9a24aa237d
fixed TextureFormat example. 2023-05-12 00:31:20 +08:00
ff184ecd7a
added many CreateRenderDevice 2023-05-11 23:40:25 +08:00
81ab733429
added prefer colorspace 2023-05-11 23:33:05 +08:00
05885e443a added VulkanDeviceCreater::ChooseSurfaceFormat 2023-05-11 21:56:07 +08:00
71c543413a fix include 2023-05-11 21:17:06 +08:00
d6d2d337c9 added VKDeviceCreater.h 2023-05-11 21:14:35 +08:00
4ef1283fce added uint8 IndexType 2023-05-11 21:07:26 +08:00
7c4a27771f
created VulkanDeviceCreateInfo and added Swapchain prefer formats list. 2023-05-11 00:56:26 +08:00
a97440e1fc
renamed to sc_fbo from render_frame 2023-05-11 00:55:44 +08:00
e1cfc1e5b8
created a standalone VKPhysicalDeviceCapsOutput.cpp that from VKDeviceCreater.cpp 2023-05-11 00:54:47 +08:00
2c602e9045 added comments. 2023-05-10 21:58:36 +08:00
f46b1382ee added line_rasterization in VKDevice.h/VKDeviceCreater.cpp 2023-05-10 21:56:32 +08:00
459fb3afc4 added dynamic state check at VKDeviceCreater.cpp 2023-05-10 21:48:26 +08:00
27f33e07cb added "Vulkan hardware requirement" at GPUDevice class. 2023-05-10 21:26:15 +08:00
9c956e1c65 1.added RenderTargetOutputConfig at MaterialCreateInfo.
2.added MaterialInstance's data at MaterialCreateInfo.
2023-05-10 11:26:42 +08:00
004504e027
added comments at VKDeviceMaterial.cpp 2023-05-10 02:32:03 +08:00
7c3d9ecf91 added MIData at Material 2023-05-09 22:03:02 +08:00
3f1b8be5d0 added WIP at MaterialInstance 2023-05-08 22:04:00 +08:00
f3ab0a5608 added AddMaterialID and comments at ShaderCreateInfoVertex.h 2023-05-08 18:24:34 +08:00
8e64816af8 Merge branch 'new_RenderList' of https://github.com/hyzboy/ULRE into new_RenderList 2023-05-08 18:19:15 +08:00
5718b1795f supported material group at MaterialRenderList::Bind 2023-05-08 18:18:34 +08:00
c8cbf020eb updated examples that are first_triangle.cpp and second_triangle.cpp 2023-05-08 09:50:45 +08:00
9535a4486e
removed old RenderList 2023-05-07 01:07:26 +08:00
9781e6a9b3
upgraded example/Vulkan/third_triangle.cpp 2023-05-07 00:42:06 +08:00
958183bb29 finished the branch,,,local to world in VertexInputStreaming. 2023-05-06 22:19:50 +08:00
abfc84feff fixed RenderList2D and third_triangle example. 2023-05-06 19:30:08 +08:00
12e64d7ce0 added BindVBO and BindIBO functions at VKCommandBuffer.h/.cpp 2023-05-06 19:29:38 +08:00
34b7937ee2 1.moved IndexBufferData to VK.h from VKPrimitive.h
2.renamed to GetIndexBufferData from GetIndexBuffer of Primitive
2023-05-06 19:28:42 +08:00
2336c7cdf1 optimized names and comment 2023-05-06 10:38:35 +08:00
21201b1695 finished to stat render list,maked buffer list....next step to bind buffer. 2023-05-05 21:12:53 +08:00
2eac17ac61 removed VertexInputDataGroup, Renderable only have basic vertexinputdata 2023-05-05 21:11:39 +08:00
1e03e28f0b updated codes of RenderNode2D/RenderList2D 2023-05-04 22:01:00 +08:00
30c736b7c8 optimized VertexAttribData class 2023-05-04 19:35:09 +08:00
7031270476 VKRenderable and CommandBufferRender supported newly VertexInputLayout 2023-05-04 19:11:18 +08:00
6bdbf87446 PrimitiveCreater supported newly VertexInputLayout 2023-05-04 19:10:22 +08:00
110c141073 ShaderCreateInfoVertex supported VertexInputGroup and VertexInputRate 2023-05-04 19:08:13 +08:00
b9bd4f6c4b renamed a value. 2023-05-02 18:56:55 +08:00
8b0ef244e0 moved VAN to CMSceneGraph from VertexAttribData 2023-04-30 20:42:08 +08:00
c232feb40a temporary to disable the RenderList and RenderNode 2023-04-28 11:10:50 +08:00
db0a8ee256 Created VertexInputData at VKRenderable.h 2023-04-28 11:09:22 +08:00
b26e25df61 newly RenderNode2D/List 2023-04-26 20:52:31 +08:00
cd03ee8211 added RenderNode2D.cpp 2023-04-25 19:18:07 +08:00
48b5479ade first RenderList2D 2023-04-25 18:08:26 +08:00
1ec88c65f8 added comment about memory property in VKDeviceBuffer.cpp 2023-04-25 15:21:23 +08:00
ba6af7a596 renamed to DynamicBufferAccess instead of UBODynamicAccess 2023-04-25 11:43:15 +08:00
d163f914c7 1.added GetRangeSize at VKArrayBuffer
2.renamed to align_size instead of unit_size
2023-04-25 11:36:50 +08:00
0e589e8bcd removed PerObject of DescriptorSetType 2023-04-21 20:27:28 +08:00
011fbdb55d update codes...but can't compile 2023-04-20 21:49:48 +08:00
e488b4c3d3 added half codes. 2023-03-29 21:34:50 +08:00
49f37447d0 added comment at RenderList2D 2023-03-29 21:19:06 +08:00
f280068d50 renamed to InlineDescriptor instead of GlobalDescriptor 2023-03-29 17:27:05 +08:00
137248a274 add lost #include 2023-03-29 16:45:57 +08:00
ec45b977d1 added DescriptorSetType values in AddUBO of MaterialCreateInfo 2023-03-29 16:45:37 +08:00
38f9a2896f optimized codes of VKArrayBuffer 2023-03-29 11:45:15 +08:00
59b02bcb8c optimized VKArrayBuffer 2023-03-28 22:24:22 +08:00
05e96c58ba added VKUBODynamic.h and support from VKArrayBuffer.h 2023-03-28 21:52:08 +08:00
cb09767151 optimized DescriptorBinding::Bind 2023-03-27 12:01:33 +08:00
554220699f added newly functions at MaterialParameters that used index instead of name 2023-03-27 12:00:53 +08:00
3937206fcb upgraded DescriptorBinding 2023-03-27 10:22:55 +08:00
88f23d9a07
Merge branch 'master' of https://github.com/hyzboy/ULRE 2023-03-26 00:04:50 +08:00
15324d9c86
layout codes. 2023-03-26 00:04:31 +08:00
6c3e674d23 used DescriptorBinding in Global Binding 2023-03-25 23:12:08 +08:00
fefdc19674 added GetBindingMap at MaterialDescriptorManager and MaterialParameters 2023-03-25 23:11:43 +08:00
18a4212935 Merge branch 'master' of https://github.com/hyzboy/ULRE 2023-03-25 15:48:09 +08:00
0457d28577 fixed lost of #include 2023-03-25 15:47:08 +08:00
fd39d08fda
Update README.md 2023-03-24 22:43:04 +08:00
8e52595123 standalone RenderList2D 2023-03-24 22:14:43 +08:00
19a20411d8 supported SSBAlign in ArrayBuffer 2023-03-24 22:14:05 +08:00
8363275b36 moved codes to .cpp from VKArrayBuffer.h 2023-03-24 20:39:02 +08:00
939bbfeb1f splite RenderNode2D/3D,RenderList2D/3D 2023-03-23 21:43:10 +08:00
f555c77a83 not run. 2023-03-22 21:40:49 +08:00
160ba000d3 want to split RenderList2D/3D 2023-03-22 21:19:23 +08:00
5f830b8d57 changed GPUArrayBuffer to non-template 2023-03-22 21:18:46 +08:00
5d9aab7dda used RenderablePrimitiveCreater and ZeroToOne coordinate system at third_triangle.cpp 2023-03-22 19:41:06 +08:00
cde2d9f86b used AutoDelete<MaterialCreateInfo> instead of delete operator. 2023-03-22 19:39:53 +08:00
d26eb482e7 used DESCRIPTOR_SET_TYPE_COUNT instead of "int(DescriptorSetType::RANGE_SIZE)" 2023-03-22 19:39:03 +08:00
eb8e0a921b used DESCRIPTOR_SET_TYPE_COUNT instead of "(size_t)DescriptorSetType::RANGE_SIZE" 2023-03-22 19:37:48 +08:00
9fd13680d1 used RenderablePrimitiveCreater in second_triangle.cpp 2023-03-22 18:15:45 +08:00
8af96ed4a5 added a test that it's zero2one coordinate system at second_triangle.cpp 2023-03-22 17:56:36 +08:00
57b480754c renamed name of example project 2023-03-22 16:09:11 +08:00
ac42dcdb26 finished auto bound GlobalDescriptor 2023-03-22 15:58:59 +08:00
e1c3b95de7
next work: support 3-way coordinate system in VertexColor2D material. 2023-03-22 02:41:19 +08:00
ee061e4a1a
Bind ViewportInfo to Global in VulkanAppFramework 2023-03-22 02:40:26 +08:00
f2c6c24ddf
added BindGlobalDescriptor at RenderResource 2023-03-22 02:35:37 +08:00
76f5dcb884
1.added GetDescriptorCount at MaterialParameters
2.renamed to GetBoundCount from GetCount
2023-03-22 02:35:05 +08:00
157c09eff0
added GetBindCount at MaterialDescriptorManager 2023-03-22 02:31:39 +08:00
9f8e63788d used 2d array at binding_map of MaterialDescriptorManager 2023-03-21 22:28:01 +08:00
a7c761e1c5 renamed value. 2023-03-21 21:46:16 +08:00
44620abc21 added SetGlobal/GetGlobal/Free at RenderResource 2023-03-21 21:37:03 +08:00
8bf1ad2a46 added a standard material that it's VertexColor2DNDC. 2023-03-21 21:01:16 +08:00
d26cae0086 removed shadergen namespace 2023-03-21 18:05:48 +08:00
bc9fc9b50f fixed a bug that it don't Add(mtl) at RenderResource::CreateMaterial(MaterialCreateInfo *) 2023-03-21 18:05:27 +08:00
fb4c8ed8c2 removed SPVParseData 2023-03-21 18:04:26 +08:00
0dae30fa06 updated first_triangle.cpp 2023-03-21 14:37:51 +08:00
48b5a978b8 added a newly RenderResource::CreateMaterialInstance(MaterialCreateInfo *,...) 2023-03-21 14:36:48 +08:00
694add27ae first tested ok that AutoMaterial in first_triangle example. 2023-03-21 14:17:33 +08:00
251bbd2705 added "all_dslb=nullptr" at construct function of MaterialDescriptorManager. 2023-03-21 14:16:48 +08:00
3bfc31b57f added a safe check at ~PipelineLayoutData() 2023-03-21 14:15:58 +08:00
8c8a218a3a added GetCount() at MaterialDescriptorInfo class. 2023-03-21 14:15:33 +08:00
9302cbc3ef finished write codes of CreateMaterial from MaterialCreateInfo 2023-03-20 22:09:37 +08:00
696d3259aa renamed to ChangeOrAdd from Update at Map template. 2023-03-20 16:20:32 +08:00
85530e6d57 renamed to MaterialDescriptorManager from MaterialDescriptorSets 2023-03-20 13:55:47 +08:00
81e2aac321 optimized MaterialDescriptorSets 2023-03-20 13:51:25 +08:00
35a282ef5e used DESCRIPTOR_SET_TYPE_COUNT 2023-03-20 13:35:04 +08:00
3a378be660 removed sd_list for MaterialDescriptorSets 2023-03-19 20:41:12 +08:00
aed56a35e0 use GetSPVData/GetSPVSize instead of GetCode/GetCodeSize 2023-03-19 20:23:54 +08:00
09277924f1 comment sd_list_by_set_type array and GetDescriptorList function at MaterialDescriptorSets 2023-03-19 20:18:56 +08:00
c4a4ec5ebc used "uint32_t *" for SPVDATA 2023-03-19 20:18:10 +08:00
703d444cbb added GetInput at ShaderCreateInfoVertex 2023-03-19 20:17:27 +08:00
159c808dad added GetCode/GetCodeSize at ShaderCreateInfo 2023-03-19 20:17:02 +08:00
facdec5556 1.removed VertexShaderModule
2.added VertexInput at MaterialData
3.newly CreateShaderModule/CreateMaterial functions at GPUDevice/RenderResource class.
2023-03-19 19:41:21 +08:00
42f63c5ef1 renamed few values at VKShaderModule 2023-03-19 13:37:55 +08:00
5f4dd09f92 updated ShaderStage 2023-03-18 21:07:21 +08:00
9872f74160 used short funcname. 2023-03-18 17:58:57 +08:00
529d6b7939 used newly ShaderAttributeArray 2023-03-17 21:06:05 +08:00
f748301787 split standalone VKUUID.h/DebugOutProperties.h 2023-03-17 18:15:55 +08:00
165f9d2a5f rename and layout. 2023-03-17 16:21:12 +08:00
4de8139936 reanmed to ShaderAttribute instead of ShaderStage 2023-03-17 16:06:11 +08:00
9ee5f0adaa renamed files of shadergen 2023-03-17 10:14:07 +08:00
555e8fc066 renamed many source of ShaderGen 2023-03-17 10:08:41 +08:00
f564f55e7b added StandardMaterial 2023-03-16 21:54:03 +08:00
31b5bb6d4f added VertexColor2DMaterial at MaterialCreaterTest.cpp 2023-03-15 17:50:33 +08:00
5ba705cd6b updated layout of codes 2023-03-15 14:55:10 +08:00
9cfb88235a fixed a bug that Illegal class copy used 2023-03-15 11:53:13 +08:00
eceaf9ba68 layout codes. 2023-03-15 11:32:38 +08:00
14e7074b3f used ShaderDescriptorManager * instead of ShaderDescriptorManager 2023-03-15 11:09:51 +08:00
f79599b1d4 updated shadergen 2023-03-14 22:22:35 +08:00
2cc0dca050 renamed many values. 2023-03-13 21:58:27 +08:00
ece7fa5f32
writed ProcSubpassInput,ProcStruct,ProcUBO,ProcConst,ProcSampler at ShaderCreater 2023-03-10 02:15:26 +08:00
68b24903bb
Added ProcOutput() at ShaderCreaterFragment 2023-03-10 01:47:01 +08:00
6ee832c39f updated ShaderGen->ShaderCreater. 2023-03-09 23:21:52 +08:00
26f7c915c8 update Input/Output 2023-03-08 21:41:57 +08:00
2ac91b80ac added GLSLCompiler.cpp/.h 2023-03-08 14:02:51 +08:00
eed16928e9 optmized layout of shadergen 2023-03-06 21:30:32 +08:00
6b8e76b75f split codes of ShaderGen 2023-03-06 14:06:20 +08:00
ca36b4454b optimized comments 2023-03-04 18:42:25 +08:00
ba65d1abf2 renamed to PerMaterial instead of PerMaterialInstance 2023-03-04 18:21:03 +08:00
ef8f630056 1.define VAT
2.renamed to UBOStruct instead of UBOCodes.
3.moved AddInput/AddOutput to ShaderCreater from VertexShaderCreater
4.moved descriptor object to MDM from SDM
2023-03-04 16:57:50 +08:00
7a0acaf63e
1.moved descriptor to MaterialDescriptorManager from ShaderDescriptorManager.
2.added UBOCodes in MaterialDescriptorManager
2023-03-04 05:11:51 +08:00
d54aff2a42 first added codes of ShaderGen 2023-03-03 23:02:40 +08:00
84d0dc99c8 moved codes of about camera to CameraAppFramework. 2023-03-02 20:33:44 +08:00
b4dccf7814 use standalone DescriptorSetType,ShaderDescriptor,ShaderStage 2023-03-02 20:19:25 +08:00
f2d5209681 used VulkanFormat::BaseType instead of VulkanNumberType 2023-03-01 15:39:20 +08:00
0abe38de98 LoadMaterial use ConstBufferReader 2023-02-23 19:01:01 +08:00
6536b715c3 added comment. 2023-02-23 17:58:08 +08:00
26b907f611 updated CMSceneGraph 2023-02-23 16:14:31 +08:00
1354 changed files with 207514 additions and 7449 deletions

8
.editorconfig Normal file
View File

@ -0,0 +1,8 @@
root = true
[*]
indent_style = space
indent_size = 4
insert_final_newline = true
trim_trailing_whitespace = true

@ -1 +1 @@
Subproject commit 1e14c1b01dd9b1e6590110cdf5fb239da30d00c1
Subproject commit 0244bff1b60119806f683b54a137cda2cacc17ac

@ -1 +1 @@
Subproject commit ca9aece201dd581c0576fe5448162686081261ff
Subproject commit 6fbc7078181cefc7e5da590c2d4ccc70507934b7

2
CMCore

@ -1 +1 @@
Subproject commit ac5931ce2602d45149e1c8baacf0805fa39f73f6
Subproject commit 71b459c0246d70d0bba5dd49662b5534c579251e

@ -1 +1 @@
Subproject commit ef90beb4501fe8712ab93e4c775612e172598fa3
Subproject commit f0ff214289a1265898feecbdbbd2ddf50bff5dca

@ -1 +1 @@
Subproject commit 09fe2f07ba212393a4b8d3eeffe82f01a058ddc3
Subproject commit 1e7e4a025cdd03125144e167b62f70a8efdaf245

2
CMUtil

@ -1 +1 @@
Subproject commit 9f94d5082bbbba65d55ae259deebbfc72b4a672a
Subproject commit 48383e5f63928bab43320c406219365850507246

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.0)
cmake_minimum_required(VERSION 3.5)
PROJECT(ULRE)
@ -8,34 +8,35 @@ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMCMakeModule)
set(ULRE_3RDPTY_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/3rdpty)
include_directories(${ULRE_3RDPTY_ROOT_PATH}/NvTriStrip)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
SET(ROOT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/inc)
SET(ULRE_RUNTIME_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include(math)
include(vulkan)
include(use_cm_module)
SET(ULRE CMCore
CMPlatform
CMAssetsManage
CMSceneGraph
CMUtil
ULRE.Work
ULRE.Util
ULRE.ShaderGen
ULRE.SceneGraph
${HGL_MATH_LIB}
${RENDER_LIBRARY}
${Vulkan_LIBRARIES})
use_cm_module(Core)
use_cm_module(Util)
use_cm_module(Platform)
use_cm_module(AssetsManage)
use_cm_module(SceneGraph)
SET(ULRE CMCore
CMPlatform
CMAssetsManage
CMSceneGraph
CMUtil
ULRE.Util
ULRE.SceneGraph
${HGL_GLM_LIB}
${RENDER_LIBRARY}
${Vulkan_LIBRARIES})
include_directories(${ULRE_3RDPTY_ROOT_PATH}/NvTriStrip)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc)
SET(ROOT_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/inc)
SET(ULRE_RUNTIME_PATH ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(src)
add_subdirectory(example)

BIN
GLSLCompiler.dll Normal file

Binary file not shown.

View File

@ -1,17 +1,33 @@
# ULRE
experiment project - Ultra Light Rendering Engine
experiment project - Ultra Lightweight Rendering Engine
ULRE is a project of experimental nature,Used to experiment with various rendering related techniques,And do some examples.
ULRE is a project of an experimental nature. Used to experiment with various rendering-related techniques And do some examples.
In the future, its compilicated version will be integrated into CMGameEngine.Used to replace the old rendering engine.
In the future, its complicated version will be integrated into CMGameEngine.Used to replace the old rendering engine.
Platform: Windows,Linux (WIP: Android)
Platform: Windows, Linux (WIP: Android, macOS, iOS)
Graphics API: Vulkan
Milestone:
2. Texture2DArray was integrated into material instances.
Multiple render instances of the same model use different material instances and textures but are still merged into one render.
Although the changes this time are small, they are more significant.
1. a test was completed, and the entire scene was drawn with only one DrawCall.
Although it still has a lot of unfinished work, it is still a significant milestone.
#
ULRE是一个试验性质的工程用于试验各种渲染相关的技术以及做一些范例。在未来它的复杂化版本会被整合到CMGameEngine中用于替代旧的渲染引擎。
平台: Windows,Linux (开发中: Android)
平台: Windows, Linux (开发中: Android, macOS, iOS)
图形API: Vulkan
里程碑:
2. Texture2DArray集成在材质实例中。同一个模型的多个渲染实例使用不同的材质实例以及不同的纹理
但它们依然被合并成一次渲染。这次的改变虽小,但意义更为重大。
1. 完成了一个测试只用了一次DrawCall就绘制出了整个场景。虽然它还有很多未完成的工作但它依然是一个非常重要的里程碑。

View File

@ -0,0 +1,11 @@
mat4 GetJointMatrix()
{
// Joint数据分Joint ID和Joint Weight两部分
// Joint ID是一个uvec4在shader中为整数。在C++端可使用RGBA8UI或是RGBA16UI来传递。
// Joint Weight是权重在shader中为浮点。在C++端使用RGBA8或RGBA4来传递。
return joint.mats[JointID.x]*JointWeight.x+
joint.mats[JointID.y]*JointWeight.y+
joint.mats[JointID.z]*JointWeight.z+
joint.mats[JointID.w]*JointWeight.w;
}

View File

@ -0,0 +1,9 @@
mat3 GetNormalMatrix()
{
return mat3(camera.view*GetLocalToWorld());
}
vec3 GetNormal(mat3 normal_matrix,vec3 normal)
{
return normalize(normal_matrix*normal);
}

View File

@ -0,0 +1,38 @@
#Material
Name PureColor2D
Base Std2D
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec4 Color;
}
#Vertex
Code
{
void main()
{
HandoverMI();
gl_Position=GetPosition2D();
}
}
#Fragment
Output
{
vec4 FragColor
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=mi.Color;
}
}

View File

@ -0,0 +1,39 @@
#Material
Name PureTexture2D
Base Std2D
#VertexInput
vec2 TexCoord
#Vertex
Output
{
vec2 TexCoord
}
Code
{
void main()
{
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@ -0,0 +1,68 @@
#Material
Name RectTexture2D
Base Std2D
Prim SolidRectangles,WireRectangles
#VertexInput
vec4 TexCoord
#Vertex
Output
{
vec4 TexCoord
}
Code
{
void main()
{
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Geometry
in points
out triangle_strip,4
Output
{
vec2 TexCoord
}
Code
{
void main()
{
vec2 vlt=gl_in[0].gl_Position.xy;
vec2 vrb=gl_in[0].gl_Position.zw;
vec2 tlt=Input[0].TexCoord.xy;
vec2 trb=Input[0].TexCoord.zw;
gl_Position=vec4(vlt, vec2(0,1));Output.TexCoord=tlt; EmitVertex();
gl_Position=vec4(vlt.x, vrb.y, vec2(0,1));Output.TexCoord=vec2(tlt.x,trb.y); EmitVertex();
gl_Position=vec4(vrb.x, vlt.y, vec2(0,1));Output.TexCoord=vec2(trb.x,tlt.y); EmitVertex();
gl_Position=vec4(vrb, vec2(0,1));Output.TexCoord=trb; EmitVertex();
EndPrimitive();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@ -0,0 +1,79 @@
#Material
Name RectTexture2DArray
Base Std2D
Prim SolidRectangles,WireRectangles
#MaterialInstance
Length 16
Stage Fragment
Code
{
uvec4 id;
}
#VertexInput
vec4 TexCoord
#Vertex
Output
{
vec4 TexCoord
}
Code
{
void main()
{
HandoverMI();
Output.TexCoord=TexCoord;
gl_Position=GetPosition2D();
}
}
#Geometry
in points
out triangle_strip,4
Output
{
vec2 TexCoord
}
Code
{
void main()
{
vec2 vlt=gl_in[0].gl_Position.xy;
vec2 vrb=gl_in[0].gl_Position.zw;
vec2 tlt=Input[0].TexCoord.xy;
vec2 trb=Input[0].TexCoord.zw;
HandoverMI();gl_Position=vec4(vlt, vec2(0,1));Output.TexCoord=tlt; EmitVertex();
HandoverMI();gl_Position=vec4(vlt.x, vrb.y, vec2(0,1));Output.TexCoord=vec2(tlt.x,trb.y); EmitVertex();
HandoverMI();gl_Position=vec4(vrb.x, vlt.y, vec2(0,1));Output.TexCoord=vec2(trb.x,tlt.y); EmitVertex();
HandoverMI();gl_Position=vec4(vrb, vec2(0,1));Output.TexCoord=trb; EmitVertex();
EndPrimitive();
}
}
#Fragment
sampler2DArray TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=texture(TextureBaseColor,vec3(Input.TexCoord,mi.id.x));
}
}

View File

@ -0,0 +1,37 @@
#Material
Name VertexColor2D
Base Std2D
#VertexInput
vec4 Color
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
Output.Color=Color;
gl_Position=GetPosition2D();
}
}
#Fragment
Output
{
vec4 FragColor
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

View File

@ -0,0 +1,82 @@
#Material
Name BillboardFixedSize
Base Std3D/Billboard
#VertexInput
vec2 TexCoord
#MaterialInstance
Length 8
Stage Vertex
Code
{
uvec2 BillboardSize;
}
#Vertex
Output
{
vec2 BillboardSize
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
Output.BillboardSize=mi.BillboardSize/viewport.canvas_resolution;
gl_Position=GetPosition3D();
gl_Position/=gl_Position.w;
}
}
#Geometry
Output
{
vec2 TexCoord
}
Code
{
void main()
{
const vec2 BillboardVertex[4]=vec2[]
(
vec2(-0.5,-0.5),
vec2(-0.5, 0.5),
vec2( 0.5,-0.5),
vec2( 0.5, 0.5)
);
for(int i=0;i<4;i++)
{
gl_Position=gl_in[0].gl_Position;
gl_Position.xy+=BillboardVertex[i]*Input[0].BillboardSize;
Output.TexCoord=BillboardVertex[i]+vec2(0.5);
EmitVertex();
}
EndPrimitive();
}
}
#Fragment
sampler2D TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=texture(TextureBaseColor,Input.TexCoord);
}
}

View File

@ -0,0 +1,2 @@
vec4 direction;
vec4 color;

View File

@ -0,0 +1,92 @@
#Material
Name BlinnPhong+HalfLambert shading model only color
Reference https://zhuanlan.zhihu.com/p/442023993
Base Std3D/BlinnPhong
//某些Require并不真的存在.ubo文件写成一行一个是为了方便未来改成带路径的
Require LocalToWorld
Require Camera
define HAVE_SPECULAR off //默认不定义HAVE_SPECULAR
UBO
{
File BlinnPhongSun.ubo //文件名,如果/开头表示从ShaderLibrary根目录开始没有则表示同一目录
Struct BlinnPhongSun //结构名称
Name sun //在代码中的变量名
Stage Fragment //会引用的shader
Set Global //Descriptor Set
}
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec3 Color;
float Gloss;
}
#VertexInput
vec3 Normal
#Vertex
Output
{
vec4 Position;
vec3 Normal;
}
Code
{
void main()
{
Output.Normal =GetNormal();
Output.Position =GetPosition3D();
HandoverMI();
gl_Position =Output.Position;
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
#define HAVE_SPECULAR
void main()
{
MaterialInstance mi=GetMI();
//点乘法线和光照
float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5;
//直接光颜色
vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb;
#ifndef HAVE_SPECULAR
FragColor=vec4(direct_color,1.0);
#else
vec3 spec_color=vec3(0.0);
if(intensity>0.0)
{
vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos));
float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,mi.Gloss)*sun.color.rgb;
}
FragColor=vec4(direct_color+spec_color,1.0);
#endif//HAVE_SPECULAR
}
}

View File

@ -0,0 +1,100 @@
#Material
Name BlinnPhong+HalfLambert shading model only color
Reference https://zhuanlan.zhihu.com/p/442023993
Base Std3D/BlinnPhong
//某些Require并不真的存在.ubo文件写成一行一个是为了方便未来改成带路径的
Require LocalToWorld
Require Camera
define HAVE_SPECULAR off //默认不定义HAVE_SPECULAR
UBO
{
File BlinnPhongSun.ubo //文件名,如果/开头表示从ShaderLibrary根目录开始没有则表示同一目录
Struct BlinnPhongSun //结构名称
Name sun //在代码中的变量名
Stage Fragment //会引用的shader
Set Global //Descriptor Set
}
#MaterialInstance
Length 32
Stage Fragment
Code
{
vec4 Color;
uint tex_id;
}
#VertexInput
vec3 Normal
vec2 TexCoord
#Vertex
Output
{
vec4 Position;
vec3 Normal;
vec2 TexCoord
}
Code
{
void main()
{
Output.Normal =GetNormal();
Output.Position =GetPosition3D();
Output.TexCoord =TexCoord;
HandoverMI();
gl_Position =Output.Position;
}
}
#Fragment
sampler2DArray TextureBaseColor
Output
{
vec4 FragColor;
}
Code
{
#define HAVE_SPECULAR
void main()
{
MaterialInstance mi=GetMI();
vec4 texture_color=texture(TextureBaseColor,vec3(Input.TexCoord,mi.tex_id));
//点乘法线和光照
float intensity=0.5*max(dot(Input.Normal,sun.direction.xyz),0.0)+0.5;
//直接光颜色
vec3 direct_color =intensity*sun.color.rgb*mi.Color.rgb*texture_color.rgb;
#ifndef HAVE_SPECULAR
FragColor=vec4(direct_color,1.0);
#else
vec3 spec_color=vec3(0.0);
if(intensity>0.0)
{
vec3 half_vector=normalize(sun.direction.xyz+normalize(Input.Position.xyz+camera.pos));
float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,8)*sun.color.rgb;
}
FragColor=vec4(direct_color+spec_color,1.0);
#endif//HAVE_SPECULAR
}
}

View File

@ -0,0 +1,87 @@
#Material
Name MetricCellsGrid
Base Std3D
Reference https://www.shadertoy.com/view/wdSXzm
#VertexInput
vec2 TexCoord
#MaterialInstance
Length 120
Stage Fragment
Code
{
vec4 x_color;
vec4 y_color;
vec4 x_axis_color;
vec4 y_axis_color;
vec4 center_color;
vec2 lum; //x=0.1 sub cell line,y=0.2 big cell line
vec2 cell_step;
vec2 big_cell_step;
vec2 scale;
float axis_line_width;
float center_radius;
}
#Vertex
Output
{
vec2 TexCoord
}
Code
{
void main()
{
HandoverMI();
Output.TexCoord=TexCoord;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
float edge=viewport.inv_viewport_resolution.y;
float x=(Input.TexCoord.x-0.5)*mi.scale.x;
float y=(Input.TexCoord.y-0.5)*mi.scale.y;
vec4 color=vec4(0,0,0,1);
// ======= Lines + Bold lines
color.xyz += step(1.0 - 1.0 / mi.cell_step.x, fract(x / mi.cell_step.x )) * mi.x_color.rgb * mi.lum.x;
color.xyz += step(1.0 - 1.0 / mi.big_cell_step.x, fract(x / mi.big_cell_step.x)) * mi.x_color.rgb * mi.lum.y;
color.xyz += step(1.0 - 1.0 / mi.cell_step.y, fract(y / mi.cell_step.y )) * mi.y_color.rgb * mi.lum.x;
color.xyz += step(1.0 - 1.0 / mi.big_cell_step.y, fract(y / mi.big_cell_step.y)) * mi.y_color.rgb * mi.lum.y;
// ======= AXES
float xb = step(abs(x) - mi.axis_line_width, 0.0);
float yb = step(abs(y) - mi.axis_line_width, 0.0);
color.rgb = mix(color.rgb, mi.x_axis_color.rgb, (xb));
color.rgb = mix(color.rgb, mi.y_axis_color.rgb, (yb));
// ======= CENTER
float cb = length(vec2(x,y))-mi.center_radius;
color.rgb = mix(color.rgb, mi.center_color.rgb, cb>0.0?0.0:smoothstep(0,edge*mi.scale.y,abs(cb)));
FragColor=color;
}
}

View File

@ -0,0 +1,38 @@
#Material
Name PureColor3D
Base Std3D
#MaterialInstance
Length 16
Stage Fragment
Code
{
vec4 Color;
}
#Vertex
Code
{
void main()
{
HandoverMI();
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
FragColor=mi.Color;
}
}

View File

@ -0,0 +1,38 @@
#Material
Name VertexColor3D
Base Std3D
#VertexInput
vec4 Color
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
Output.Color=Color;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

View File

@ -0,0 +1,47 @@
#Material
Name VertexLum3D
Base Std3D
#MaterialInstance
Length 16
Stage Vertex
Code
{
vec4 Color;
}
#VertexInput
float Luminance
#Vertex
Output
{
vec4 Color
}
Code
{
void main()
{
MaterialInstance mi=GetMI();
Output.Color=Luminance*mi.Color;
gl_Position=GetPosition3D();
}
}
#Fragment
Output
{
vec4 FragColor;
}
Code
{
void main()
{
FragColor=Input.Color;
}
}

34
doc/AssetFileFormat.md Normal file
View File

@ -0,0 +1,34 @@
# 为什么我们使用INI/TOML做为资产文件格式?
大部分的数据文件,我们会将其分为属性文本部分与二进制数据部分。
其中属性部分我们会使用INI/TOML方式编写。这样利于git/hg/svn等版本控制系统进行差异合并。
比如一个纹理贴图它的二进制部分首先是有它的“原始位图数据阵列”它的属性部分包含“宽、高、象素格式”这样的不可更改数据也包括“sRGB/Linear色彩空间、纹理分组、建议过滤方式、特定平台建议的压缩算法”等可调整数据。还有资产使用过程中产生的“引用资产列表”和“被引用资产列表”。
而这些可调整数据,我们可能是会随时修改的,甚至是不同的人可能会修改不同的部分。
如果我们将这些数据全部放入一个二进制文件中比如png/jpeg中。那么每修改一个小小的属性都需要向git/svn仓库提交整个二进制文件。这是相当愚蠢和不合理的。
而众所周知不管是免费的git/hg/svn还是收费的p4它们针对文本文件都会有一系列的差异化比较合并功能。而这个差异化自动合并都是基于文本行的。
所以,我们的所有资产文件,都会分裂成二进制数据文件和属性文本文件。而在这个属性文本文件中,对于每一项属性,是使用独立的行来保存数据的。
# Why do we use the INI/TOML as an asset file format?
For most files, we will split into the attributes text part and binary data part.
We will use the INI/TOML format to write the properties part. Because the format easily merges diff by git/hg/svn.
For example a texture. It's binary data includes "Raw bitmap data".
Its attributes part include "width, height, pixel format", they can't change.
Also, "sRGB/Linear colour space", "texture group", "recommend filter type" and "recommend compress format of special platform".
We may modify this data at any time. Even many people modify different parts at the same time.
If we use a binary file that it includes all data. for example, .png or .jpeg.
We need commit whole binary data after changed a few attributes. This behaviour is quite stupid and irrational.
Most people know this knowledge: Free git/hg/svn and commercial p4. They both include a merge-diff tool, which is text based.
so, we all asset files, they should split into the attributes text part and binary data part.
In this attribute's text file, a separate line is used to save data for each attribute.

28
doc/AssetPath.md Normal file
View File

@ -0,0 +1,28 @@
# AssetPath
具体源代码参见CMAssetManage中的AssetPath.h
# 大致规则
Asset代表的资产意味应用程序本身所拥有的资源。而AssetPath意味指向这个资产的一个字符串。
AssetPath的组成规和Windows/UNIX/Linux的路径原则类似大致如下
```C++
LOCATION:/abc/123/test_material.mtl
```
LOCATION 它代表资产所在的大范围位置,是可以不存在的,也就是说如下的写法也是可以的
```C++
:/abc/123/test_material.mtl
```
这个LOCATION的定义我们暂时有以下几个
| LOCATION | 意义 |
|----------|------------------|
| 不写 | 应用程序本身的资产包 |
| Asset | 应用程序本身的资产包 |
| Engine | 代表引擎资产 |
| PlugIn | 代表插件资产 |
| ExtPack | 应用程序扩展资产包(一般用于额外安装或下载的资产包) |
| OS | 操作系统真实路径访问 |

BIN
doc/BlenderGizmo/Move.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

BIN
doc/BlenderGizmo/Rotate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

BIN
doc/BlenderGizmo/Scale.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View File

@ -0,0 +1,47 @@
# CreateMaterialInstance
## 1st
最早最根本的方法直接在C++代码层面通过mtl::CreateVertexColor2D()函数来创建MaterialCreateInfo
```C++
mtl::Material2DCreateConfig cfg(GetDeviceAttribute(),"VertexColor2D",PrimitiveType::Triangles);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg);
material_instance=CreateMaterialInstance(mci);
```
## 2nd
注册材质系统引入后的方法,通过名称"VertexColor2D"来创建MaterialCreateInfo
```C++
mtl::Material2DCreateConfig cfg(GetDeviceAttribute(),"VertexColor2D",PrimitiveType::Triangles);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateMaterialCreateInfo("VertexColor2D",&cfg);
material_instance=CreateMaterialInstance(mci);
```
## 3rd
其实是第二种方法在WorkObject层面的封装
```C++
mtl::Material2DCreateConfig cfg(GetDeviceAttribute(),"VertexColor2D",PrimitiveType::Triangles);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
material_instance=CreateMaterialInstance("VertexColor2D",&cfg);
```
## 4th
是更进一步的封装通过材质配置文件连带Material2DCreateConfig的具体配置都进行了封闭。
```C++
AssetPath path(":/asset/test_material.mtl");
material_instance=CreateMaterialInstance(path);
```

BIN
doc/Gizmo.odg Normal file

Binary file not shown.

20
doc/InlineMaterial.md Normal file
View File

@ -0,0 +1,20 @@
# 程序内嵌材质/Shader
# Material/Shader embedded in program code
问题(Question):
```
即然可以从文件中加载材质了,那为什么还需要有程序代码中内嵌的材质/Shader呢
I can load a material from a file. Why do we need a few materials/shaders embedded in the code?
```
这个问题很好,答案也很简单:
Good question, the answer is straightforward:
```
我们需要在资产损坏或丢失的情况下,依然可以渲染一些内容, 比如: 一个报错对话框。
We need to be able to render some content, such as an error dialog box, even if the asset is damaged or lost.
```

View File

@ -10,4 +10,6 @@
endmacro()
CreateProject(00.line line.cpp)
CreateProject(01.roundbox roundbox.cpp)
CreateProject(01.LerpLine LerpLine.cpp)
CreateProject(02.roundbox roundbox.cpp)

View File

@ -0,0 +1,121 @@
// 主要用于测试几种2D插值算法
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/math/HalfFloat.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.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[VERTEX_COUNT*2]=
{
-1.0, 0.0,
1.0, 0.0,
};
constexpr VkFormat PositionFormat=VF_V2F;
constexpr float color_data[VERTEX_COUNT*4]=
{ 1,0,0,1,
0,1,0,1,
0,0,1,1
};
constexpr VkFormat ColorFormat=VF_V4F;
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitAutoMaterial()
{
mtl::Material2DCreateConfig cfg(device->GetDevAttr(),"VertexColor2D",PrimitiveType::Lines);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreateVertexColor2D(&cfg);
material_instance=db->CreateMaterialInstance(mci);
return material_instance;
}
bool InitPipeline()
{
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,PrimitiveType::Lines);
return pipeline;
}
bool InitVBO()
{
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Triangle",VERTEX_COUNT);
if(!rpc.WriteVAB(VAN::Position, PositionFormat, position_data))return(false);
if(!rpc.WriteVAB(VAN::Color, ColorFormat, color_data ))return(false);
render_obj=db->CreateMesh(&rpc,material_instance,pipeline);
return(render_obj);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitAutoMaterial())
return(false);
if(!InitPipeline())
return(false);
if(!InitVBO())
return(false);
if(!BuildCommandBuffer(render_obj))
return(false);
return(true);
}
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -36,10 +36,10 @@ private:
Camera cam;
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
DeviceBuffer * ubo_camera_info =nullptr;
DeviceBuffer * ubo_color_material =nullptr;
DeviceBuffer * ubo_line_config =nullptr;
Mesh * render_obj =nullptr;
DeviceBuffer * ubo_camera_info =nullptr;
DeviceBuffer * ubo_color_material =nullptr;
DeviceBuffer * ubo_line_config =nullptr;
Pipeline * pipeline =nullptr;
@ -53,8 +53,8 @@ private:
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
//pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/alpha2d"),Prim::LineStrip); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material_instance,InlinePipeline::Alpha2D,Prim::LineStrip); //等同上一行为Framework重载默认使用swapchain的render target
//pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/alpha2d"),PrimitiveType::LineStrip); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material_instance,InlinePipeline::Alpha2D,PrimitiveType::LineStrip); //等同上一行为Framework重载默认使用swapchain的render target
if(!pipeline)
return(false);
@ -116,9 +116,9 @@ private:
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(VAN::Position, db->CreateVAB(VF_V2F,VERTEX_COUNT,position_data)))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
render_obj=db->CreateMesh(primitive,material_instance,pipeline);
return(true);
}
@ -143,7 +143,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
cam.width=w;
cam.height=h;

View File

@ -42,7 +42,7 @@ private:
Camera cam;
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Mesh * render_obj =nullptr;
DeviceBuffer * ubo_camera_info =nullptr;
DeviceBuffer * ubo_rb_config =nullptr;
@ -66,7 +66,7 @@ private:
if(!material_instance)
return(false);
pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/alpha2d"),Prim::SolidRectangles); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material_instance,OS_TEXT("res/pipeline/alpha2d"),PrimitiveType::SolidRectangles); //等同上一行为Framework重载默认使用swapchain的render target
if(!pipeline)
return(false);
@ -138,9 +138,9 @@ private:
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V4I16,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(VAN::Position, db->CreateVAB(VF_V4I16,VERTEX_COUNT,position_data)))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
render_obj=db->CreateMesh(primitive,material_instance,pipeline);
return(true);
}
@ -165,7 +165,7 @@ public:
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
cam.width=w;
cam.height=h;

View File

@ -0,0 +1,199 @@
// Billboard
#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/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#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;
static float position_data[3]=
{
0,0,0
};
static float lumiance_data[2]={1,1};
static Color4f white_color(1,1,1,1);
static Color4f yellow_color(1,1,0,1);
class TestApp:public WorkObject
{
Color4f color;
private:
Material * mtl_plane_grid =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * pipeline_plane_grid =nullptr;
Primitive * prim_plane_grid =nullptr;
MaterialInstance * mi_billboard =nullptr;
Pipeline * pipeline_billboard =nullptr;
Mesh * ro_billboard =nullptr;
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
private:
bool InitPlaneGridMP()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
{
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);
if(!pipeline_plane_grid)return(false);
}
return(true);
}
bool InitBillboardMP()
{
mtl::BillboardMaterialCreateConfig cfg(PrimitiveType::Billboard);
{
cfg.fixed_size=true;
mi_billboard=CreateMaterialInstance(mtl::inline_material::Billboard2D,&cfg);
if(!mi_billboard)return(false);
pipeline_billboard=CreatePipeline(mi_billboard,InlinePipeline::Solid3D);
if(!pipeline_billboard)return(false);
}
return(true);
}
bool InitTexture()
{
TextureManager *tex_manager=GetTextureManager();
texture=tex_manager->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"),true);
if(!texture)return(false);
sampler=db->CreateSampler();
if(!mi_billboard->GetMaterial()->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
Vector2u texture_size(texture->GetWidth(),texture->GetHeight());
mi_billboard->WriteMIData(texture_size);
return(true);
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
auto pc=GetPrimitiveCreater(mi_plane_grid);
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(500,500);
pgci.sub_count.Set(5,5);
pgci.lum=128;
pgci.sub_lum=192;
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
}
{
auto pc=GetPrimitiveCreater(mi_billboard);
pc->Init("Billboard",1);
if(!pc->WriteVAB(VAN::Position,VF_V3F,position_data))
return(false);
ro_billboard=db->CreateMesh(pc,mi_billboard,pipeline_billboard);
if(!ro_billboard)
return(false);
}
return(true);
}
bool InitScene()
{
CreateComponentInfo cci(GetSceneRoot());
CreateComponent<MeshComponent>(&cci,db->CreateMesh(prim_plane_grid,mi_plane_grid,pipeline_plane_grid));
CreateComponent<MeshComponent>(&cci,ro_billboard);
CameraControl *camera_control=GetCameraControl();
camera_control->SetPosition(Vector3f(32,32,32));
camera_control->SetTarget(Vector3f(0,0,0));
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
}
bool Init() override
{
if(!InitPlaneGridMP())
return(false);
if(!InitBillboardMP())
return(false);
if(!InitTexture())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("Billboard"),1280,720);
}

View File

@ -0,0 +1,18 @@
macro(CreateProject name)
add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK})
target_link_libraries(${name} ${ULRE})
IF(MSVC)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
set_property(TARGET ${name} PROPERTY VS_DPI_AWARE "PerMonitor")
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Basic")
endmacro()
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(04_Billboard BillboardTest.cpp)

View File

@ -0,0 +1,6 @@
#include<hgl/graph/mtl/MaterialLibrary.h>
STD_MTL_NAMESPACE_BEGIN
STD_MTL_NAMESPACE_END

View File

@ -0,0 +1,112 @@
// 该范例主要演示使用RenderList系统绘制多个三角形并利用RenderList进行排序以及自动合并进行Instance渲染
#include<hgl/WorkManager.h>
#include<hgl/math/Math.h>
#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;
constexpr uint32_t VERTEX_COUNT=3;
constexpr uint32_t TRIANGLE_NUMBER=12;
constexpr float position_data[VERTEX_COUNT*2]=
{
0.0, 0.0,
-0.1, 0.9,
0.1, 0.9
};
constexpr uint8 color_data[VERTEX_COUNT][4]=
{
{255,0,0,255},
{0,255,0,255},
{0,0,255,255}
};
class TestApp:public WorkObject
{
private:
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::NDC,
mtl::WithLocalToWorld::With);
VILConfig vil_config;
vil_config.Add(VAN::Color,VF_V4UN8);
material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config);
}
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为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_V4UN8, color_data }
});
if(!render_obj)
return(false);
double rad;
CreateComponentInfo cci(GetSceneRoot());
for(uint i=0;i<TRIANGLE_NUMBER;i++)
{
rad=deg2rad<double>((360.0f/double(TRIANGLE_NUMBER))*i); //这里一定要加<double>或<float>否则结果用int保存会出现问题
cci.mat=rotate(rad,Vector3f(0,0,1));
CreateComponent<MeshComponent>(&cci,render_obj);
}
return(true);
}
public:
using WorkObject::WorkObject;
bool Init() override
{
GetRenderer()->SetClearColor(Color4f(0.2f,0.2f,0.2f,1.0f));
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
return(true);
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("AutoInstance"),1024,1024);
}

View File

@ -0,0 +1,120 @@
// 该范例主要演示使用一个材质下的不同材质实例传递颜色参数绘制三角形并依赖RenderList中的自动合并功能让同一材质下所有不同材质实例的对象一次渲染完成。
#include<hgl/WorkManager.h>
#include<hgl/math/Math.h>
#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;
constexpr uint32_t VERTEX_COUNT=3;
constexpr float position_data[VERTEX_COUNT*2]=
{
0.0, 0.0,
-0.1, 0.9,
0.1, 0.9
};
constexpr uint DRAW_OBJECT_COUNT=12;
constexpr double TRI_ROTATE_ANGLE=360.0f/DRAW_OBJECT_COUNT;
#define USE_MATERIAL_FILE true //是否使用材质文件
class TestApp:public WorkObject
{
Material * material =nullptr;
struct
{
MaterialInstance * mi;
Mesh * mesh;
}render_obj[DRAW_OBJECT_COUNT]{};
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,CoordinateSystem2D::NDC,mtl::WithLocalToWorld::With);
#ifndef USE_MATERIAL_FILE
AutoDelete<mtl::MaterialCreateInfo> mci=mtl::CreatePureColor2D(&cfg); //走程序内置材质创建函数
material=db->CreateMaterial(mci);
#else
material=db->LoadMaterial("Std2D/PureColor2D",&cfg); //走材质文件加载
#endif//USE_MATERIAL_FILE
if(!material)
return(false);
for(uint i=0;i<DRAW_OBJECT_COUNT;i++)
{
render_obj[i].mi=db->CreateMaterialInstance(material);
if(!render_obj[i].mi)
return(false);
Color4f color=GetColor4f((COLOR)(i+int(COLOR::Blue)),1.0);
render_obj[i].mi->WriteMIData(color); //设置MaterialInstance的数据
}
}
pipeline=CreatePipeline(material,InlinePipeline::Solid2D);
return pipeline;
}
bool InitVBOAndRenderList()
{
Primitive *prim=CreatePrimitive("Triangle",VERTEX_COUNT,material->GetDefaultVIL(),
{{VAN::Position, VF_V2F, position_data}});
if(!prim)
return(false);
db->Add(prim);
CreateComponentInfo cci(GetSceneRoot());
for(uint i=0;i<DRAW_OBJECT_COUNT;i++)
{
render_obj[i].mesh=db->CreateMesh(prim,render_obj[i].mi,pipeline);
if(!render_obj[i].mesh)
return(false);
cci.mat=rotate(deg2rad<double>(TRI_ROTATE_ANGLE*i),AxisVector::Z);
CreateComponent<MeshComponent>(&cci,render_obj[i].mesh);
}
return(true);
}
public:
using WorkObject::WorkObject;
bool Init() override
{
if(!InitMaterial())
return(false);
if(!InitVBOAndRenderList())
return(false);
return(true);
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("AutoInstance"),1024,1024);
}

View File

@ -0,0 +1,117 @@
// 该范例主要演示使用2D坐系统直接绘制一个渐变色的三角形,使用UBO传递Viewport信息
#include<hgl/WorkManager.h>
#include<hgl/graph/VKVertexInputConfig.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/component/MeshComponent.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t VERTEX_COUNT=3;
static float position_data_float[VERTEX_COUNT][2]=
{
{0.5, 0.25},
{0.75, 0.75},
{0.25, 0.75}
};
static int16 position_data[VERTEX_COUNT][2]={};
constexpr uint8 color_data[VERTEX_COUNT*4]=
{
255,0,0,255,
0,255,0,255,
0,0,255,255
};
constexpr VAType POSITION_SHADER_FORMAT =VAT_IVEC2;
constexpr VkFormat POSITION_DATA_FORMAT =VF_V2I16;
constexpr VkFormat COLOR_DATA_FORMAT =VF_V4UN8;
class TestApp:public WorkObject
{
private:
MaterialInstance * material_instance =nullptr;
Mesh * mesh_triangle =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
mtl::Material2DCreateConfig cfg(PrimitiveType::Triangles,
CoordinateSystem2D::Ortho,
mtl::WithLocalToWorld::With);
VILConfig vil_config;
cfg.position_format = POSITION_SHADER_FORMAT; //这里指定shader中使用ivec2当做顶点输入格式
// ^
// + 这上下两种格式要配套,否则会出错
// v
vil_config.Add(VAN::Position, POSITION_DATA_FORMAT); //这里指定VAB中使用RG16I当做顶点数据格式
vil_config.Add(VAN::Color, COLOR_DATA_FORMAT); //这里指定VAB中使用RGBA8UNorm当做颜色数据格式
material_instance=CreateMaterialInstance(mtl::inline_material::VertexColor2D,&cfg,&vil_config);
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
const auto ext=GetExtent();
for(uint i=0;i<VERTEX_COUNT;i++)
{
position_data[i][0]=position_data_float[i][0]*ext.width;
position_data[i][1]=position_data_float[i][1]*ext.height;
}
mesh_triangle=CreateMesh("Triangle",VERTEX_COUNT,material_instance,pipeline,
{
{VAN::Position,POSITION_DATA_FORMAT,position_data},
{VAN::Color, COLOR_DATA_FORMAT, color_data}
});
if(!mesh_triangle)
return(false);
CreateComponentInfo cci(GetSceneRoot());
return CreateComponent<MeshComponent>(&cci,mesh_triangle); //创建一个静态网格组件
}
public:
using WorkObject::WorkObject;
bool Init() override
{
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
return(true);
}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("Draw triangle use UBO"));
}

View File

@ -1,7 +1,24 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common)
SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h)
SET(VULKAN_APP_FRAMEWORK ${CMAKE_CURRENT_SOURCE_DIR}/common/VulkanAppFramework.h)
add_subdirectory(Basic)
add_subdirectory(Texture)
add_subdirectory(LightBasic)
add_subdirectory(Gizmo)
add_subdirectory(Vulkan)
add_subdirectory(2dVector)
add_subdirectory(GUI)
macro(CreateProject name)
add_executable(${name} ${ARGN})
target_link_libraries(${name} ${ULRE})
IF(WIN32)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example")
endmacro()

View File

@ -11,3 +11,4 @@ endmacro()
CreateProject(00.control_point_2d control_point_2d.cpp)
CreateProject(01.align_test align_test.cpp)
CreateProject(02.TextDrawTest DrawText.cpp)

View File

@ -1,4 +1,4 @@
#include<hgl/type/StringList.h>
#include<hgl/io/LoadString.h>
#include<hgl/graph/font/TextRender.h>
#include"VulkanAppFramework.h"
@ -8,14 +8,14 @@ using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH =1280;
constexpr uint32_t SCREEN_HEIGHT=SCREEN_WIDTH/16*9;
class TestApp:public VulkanApplicationFramework
class TestApp:public CameraAppFramework
{
private:
TextRender * text_render =nullptr;
TextPrimitive * text_primitive =nullptr;
Renderable * render_obj =nullptr;
Mesh * render_obj =nullptr;
public:
@ -28,7 +28,7 @@ private:
bool InitTextRenderable()
{
UTF16String str;
U16String str;
LoadStringFromTextFile(str,OS_TEXT("res/text/DaoDeBible.txt"));
@ -44,7 +44,7 @@ private:
if(!text_primitive)
return(false);
render_obj=text_render->CreateRenderable(text_primitive);
render_obj=text_render->CreateMesh(text_primitive);
if(!render_obj)
return(false);
@ -61,16 +61,21 @@ public:
if(!InitTextRenderable())
return(false);
BuildCommandBuffer(render_obj);
VulkanApplicationFramework::BuildCommandBuffer(render_obj);
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
VulkanApplicationFramework::BuildCommandBuffer(render_obj);
}
void BuildCommandBuffer(uint32_t index)
{
VulkanApplicationFramework::BuildCommandBuffer(index,render_obj);
}
};//class TestApp:public VulkanApplicationFramework

View File

@ -0,0 +1,24 @@
macro(CreateProject name)
add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK})
target_link_libraries(${name} ${ULRE})
IF(MSVC)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
set_property(TARGET ${name} PROPERTY VS_DPI_AWARE "PerMonitor")
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Gizmo")
endmacro()
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
)

44
example/Gizmo/Gizmo.h Normal file
View File

@ -0,0 +1,44 @@
#pragma once
#include<hgl/graph/VK.h>
#include<hgl/component/Component.h>
VK_NAMESPACE_BEGIN
enum class GizmoColor:uint
{
Black=0,
White,
Red,
Green,
Blue,
Yellow,
ENUM_CLASS_RANGE(Black,Yellow)
};
enum class GizmoShape:uint
{
Square=0, //方块
Circle, //圆
Cube, //立方体
Sphere, //球
Cone, //圆锥
Cylinder, //圆柱
Torus, //圆环
ENUM_CLASS_RANGE(Square,Torus)
};
bool InitGizmoResource(RenderFramework *);
void FreeGizmoResource();
ComponentDataPtr GetGizmoMeshComponentDataPtr(const GizmoShape &shape,const GizmoColor &color);
SceneNode *GetGizmoMoveNode();
//SceneNode *GetGizmoScaleMesh();
//SceneNode *GetGizmoRotateMesh();
VK_NAMESPACE_END

View File

@ -0,0 +1,198 @@
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
10
22
15,5
1
*/
#include"GizmoResource.h"
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
VK_NAMESPACE_BEGIN
namespace
{
/**
* Gizmo
*/
class GizmoMoveNode:public SceneNode
{
struct GizmoMoveAxis
{
MeshComponent *cylinder; //圆柱
MeshComponent *cone; //圆锥
MeshComponent *square; //双轴调节正方形
};
MeshComponent *sphere=nullptr;
GizmoMoveAxis axis[3]{}; //X,Y,Z 三个轴
public:
using SceneNode::SceneNode;
SceneNode *CreateNode()const override
{
return(new GizmoMoveNode);
}
bool Init(RenderFramework *render_framework)
{
ComponentDataPtr sphere=GetGizmoMeshComponentDataPtr(GizmoShape::Sphere,GizmoColor::White);
ComponentDataPtr cylinder[3]
{
GetGizmoMeshComponentDataPtr(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoMeshComponentDataPtr(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoMeshComponentDataPtr(GizmoShape::Cylinder,GizmoColor::Blue),
};
ComponentDataPtr cone[3]
{
GetGizmoMeshComponentDataPtr(GizmoShape::Cone,GizmoColor::Red),
GetGizmoMeshComponentDataPtr(GizmoShape::Cone,GizmoColor::Green),
GetGizmoMeshComponentDataPtr(GizmoShape::Cone,GizmoColor::Blue),
};
ComponentDataPtr square[3]=
{
GetGizmoMeshComponentDataPtr(GizmoShape::Square,GizmoColor::Red),
GetGizmoMeshComponentDataPtr(GizmoShape::Square,GizmoColor::Green),
GetGizmoMeshComponentDataPtr(GizmoShape::Square,GizmoColor::Blue)
};
if(!sphere)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cone[i])
return(false);
if(!square[i])
return(false);
}
CreateComponentInfo cci(this);
render_framework->CreateComponent<MeshComponent>(&cci,sphere);
{
Transform tm;
const Vector3f one_scale(1);
const Vector3f square_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cylinder[2]); //Z 向上圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cone[2]); //Z 向上圆锥
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,square[2]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cylinder[0]); //X 向右圆柱
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cone[0]); //X 向右圆锥
tm.SetScale(square_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,square[0]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cylinder[1]); //Y 向前圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,cone[1]); //Y 向前圆锥
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
cci.mat=tm;
render_framework->CreateComponent<MeshComponent>(&cci,square[1]);
}
}
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->Init(render_framework))
{
delete sn_gizmo_move;
sn_gizmo_move=nullptr;
return(false);
}
return(true);
}
VK_NAMESPACE_END

View File

@ -0,0 +1,80 @@
#include"GizmoResource.h"
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/TransformFaceToCamera.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_rotate=nullptr;
}//namespace
StaticMesh *GetGizmoRotateStaticMesh()
{
return sm_gizmo_rotate;
}
void ClearGizmoRotateStaticMesh()
{
SAFE_CLEAR(sm_gizmo_rotate);
}
bool InitGizmoRotateStaticMesh()
{
Mesh *torus[4]
{
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::Blue),
GetGizmoMesh(GizmoShape::Torus,GizmoColor::White),
};
for(auto *r:torus)
{
if(!r)
return(false);
}
{
SceneNode *root_node=new SceneNode();
{
Transform tm;
tm.SetScale(GIZMO_ARROW_LENGTH);
root_node->Add(new SceneNode(tm,torus[0]));
tm.SetRotation(AXIS::Z,90);
root_node->Add(new SceneNode(tm,torus[1]));
tm.SetRotation(AXIS::Y,90);
root_node->Add(new SceneNode(tm,torus[2]));
}
{
SceneNode *white_torus=new SceneNode(scale(13),torus[3]);
white_torus->SetLocalNormal(AxisVector::X);
TransformFaceToCamera *rotate_white_torus_tfc=new TransformFaceToCamera();
//暂时因为无法传入Camera所以无法正确计算朝向正在设计Actor/World结构
white_torus->GetTransform().AddTransform(rotate_white_torus_tfc);
root_node->Add(white_torus);
}
sm_gizmo_rotate=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_rotate)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -0,0 +1,152 @@
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
10
22
15,5
1
*/
#include"GizmoResource.h"
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
VK_NAMESPACE_BEGIN
namespace
{
static StaticMesh *sm_gizmo_scale=nullptr;
}//namespace
StaticMesh *GetGizmoScaleStaticMesh()
{
return sm_gizmo_scale;
}
void ClearGizmoScaleStaticMesh()
{
SAFE_CLEAR(sm_gizmo_scale);
}
bool InitGizmoScaleStaticMesh()
{
Mesh *center_cube=GetGizmoMesh(GizmoShape::Cube,GizmoColor::White);
Mesh *cylinder[3]
{
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Blue),
};
Mesh *cube[3]
{
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cube,GizmoColor::Blue),
};
Mesh *square[3]=
{
GetGizmoMesh(GizmoShape::Square,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Blue)
};
if(!center_cube)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cube[i])
return(false);
if(!square[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
root_node->Add(new SceneNode(scale(GIZMO_CENTER_SPHERE_RADIUS*2),center_cube));
{
Transform tm;
const Vector3f one_scale(1);
const Vector3f plane_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
root_node->Add(new SceneNode(tm,cylinder[2])); //Z 向上圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
root_node->Add(new SceneNode(tm,cube[2])); //Z 向上圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
root_node->Add(new SceneNode(tm,square[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,cube[0])); //X 向右圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
root_node->Add(new SceneNode(tm,square[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,cube[1])); //Y 向前圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
root_node->Add(new SceneNode(tm,square[1]));
}
}
sm_gizmo_scale=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_scale)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -0,0 +1,352 @@
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKPipeline.h>
#include<hgl/graph/VKPrimitive.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/color/Color.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/SceneNode.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
#include"GizmoResource.h"
VK_NAMESPACE_BEGIN
bool InitGizmoMoveNode(RenderFramework *);
void ClearGizmoMoveNode();
//bool InitGizmoScaleMesh();
//void ClearGizmoScaleMesh();
//
//bool InitGizmoRotateMesh();
//void ClearGizmoRotateMesh();
namespace
{
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;
PrimitiveCreater * prim_creater;
};
static GizmoResource gizmo_line{};
static GizmoResource gizmo_triangle{};
struct GizmoMesh
{
Primitive *prim;
struct
{
Mesh *mesh;
MeshComponentData *mcd;
ComponentDataPtr cdp;
public:
void Create(Primitive *prim,MaterialInstance *mi,Pipeline *ppl)
{
mesh=CreateMesh(prim,mi,ppl);
mcd=new MeshComponentData(mesh);
cdp=mcd;
}
}mesh_data[size_t(GizmoColor::RANGE_SIZE)];
public:
void Create(Primitive *p)
{
prim=p;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
mesh_data[i].Create(prim,gizmo_triangle.mi[i],gizmo_triangle.pipeline);
}
void Clear()
{
SAFE_CLEAR(prim)
for(auto &md:mesh_data)
{
md.cdp.unref();
SAFE_CLEAR(md.mesh);
}
}
};//class GizmoMesh
GizmoMesh gizmo_mesh[size_t(GizmoShape::RANGE_SIZE)]{};
void InitGizmoMesh(const GizmoShape &gs,Primitive *prim)
{
if(!prim)
return;
gizmo_mesh[size_t(gs)].Create(prim);
}
bool InitMI(GizmoResource *gr)
{
if(!gr||!gr->mtl)
return(false);
Color4f color;
for(uint i=0;i<uint(GizmoColor::RANGE_SIZE);i++)
{
color=GetColor4f(gizmo_color[i],1.0);
gr->mi[i]=gizmo_rr->CreateMaterialInstance(gr->mtl,nullptr,&color);
if(!gr->mi[i])
return(false);
}
return(true);
}
bool InitGizmoResource2D()
{
if(!gizmo_rr)
return(false);
VulkanDevice *device=render_framework->GetDevice();
VulkanDevAttr *dev_attr=device->GetDevAttr();
RenderPass *render_pass=render_framework->GetDefaultRenderPass();
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
cfg.position_format=VAT_VEC3;
mtl::MaterialCreateInfo *mci=CreateVertexLuminance3D(dev_attr,&cfg);
if(!mci)
return(false);
gizmo_line.mtl=gizmo_rr->CreateMaterial("GizmoLine",mci);
if(!gizmo_line.mtl)
return(false);
gizmo_line.mtl->Update();
}
{
gizmo_line.pipeline=render_pass->CreatePipeline(gizmo_line.mtl,InlinePipeline::Solid3D);
if(!gizmo_line.pipeline)
return(false);
}
if(!InitMI(&gizmo_line))
return(false);
{
gizmo_line.vdm=new VertexDataManager(device,gizmo_line.mtl->GetDefaultVIL());
if(!gizmo_line.vdm)
return(false);
if(!gizmo_line.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
return(false);
}
{
}
return(true);
}
bool InitGizmoResource3D()
{
if(!gizmo_rr)
return(false);
VulkanDevice *device=render_framework->GetDevice();
VulkanDevAttr *dev_attr=device->GetDevAttr();
RenderPass *render_pass=render_framework->GetDefaultRenderPass();
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Triangles);
cfg.local_to_world=true;
cfg.material_instance=true;
mtl::MaterialCreateInfo *mci=CreateGizmo3D(dev_attr,&cfg);
if(!mci)
return(false);
gizmo_triangle.mtl=gizmo_rr->CreateMaterial("GizmoTriangle",mci);
if(!gizmo_triangle.mtl)
return(false);
gizmo_triangle.mtl->Update();
}
{
gizmo_triangle.pipeline=render_pass->CreatePipeline(gizmo_triangle.mtl,InlinePipeline::Solid3D);
if(!gizmo_triangle.pipeline)
return(false);
}
if(!InitMI(&gizmo_triangle))
return(false);
{
gizmo_triangle.vdm=new VertexDataManager(device,gizmo_triangle.mtl->GetDefaultVIL());
if(!gizmo_triangle.vdm)
return(false);
if(!gizmo_triangle.vdm->Init( HGL_SIZE_1MB, //最大顶点数量
HGL_SIZE_1MB, //最大索引数量
IndexType::U16)) //索引类型
return(false);
}
{
gizmo_triangle.prim_creater=new PrimitiveCreater(gizmo_triangle.vdm);
if(!gizmo_triangle.prim_creater)
return(false);
}
{
using namespace inline_geometry;
{
InitGizmoMesh(GizmoShape::Square,CreatePlaneSqaure(gizmo_triangle.prim_creater));
}
{
CircleCreateInfo cci;
cci.center=Vector2f(0,0);
cci.radius=Vector2f(0.5,0.5);
cci.field_count=16;
cci.has_center=false;
InitGizmoMesh(GizmoShape::Circle,CreateCircle3DByIndexTriangles(gizmo_triangle.prim_creater,&cci));
}
{
CubeCreateInfo cci;
cci.normal=true;
cci.tangent=false;
cci.tex_coord=false;
InitGizmoMesh(GizmoShape::Cube,CreateCube(gizmo_triangle.prim_creater,&cci));
}
{
InitGizmoMesh(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,16));
}
{
ConeCreateInfo cci;
cci.radius =GIZMO_CONE_RADIUS; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=3; //圆锥高度分割数
InitGizmoMesh(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci));
}
{
struct CylinderCreateInfo cci;
cci.halfExtend =1; //圆柱一半高度
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1; //圆柱半径
InitGizmoMesh(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci));
}
{
struct TorusCreateInfo tci;
tci.innerRadius=0.975;
tci.outerRadius=1.0;
tci.numberSlices=64;
tci.numberStacks=8;
InitGizmoMesh(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci));
}
ENUM_CLASS_FOR(GizmoShape,int,i)
{
if(!gizmo_mesh[i].prim)
return(false);
}
}
return(true);
}
}//namespace
bool InitGizmoResource(RenderFramework *rf)
{
if(!rf)
return(false);
render_framework=rf;
gizmo_rr=render_framework->GetRenderResource();
VulkanDevice *device=render_framework->GetDevice();
if(!InitGizmoResource3D())
return(false);
if(!InitGizmoResource2D())
return(false);
InitGizmoMoveNode(rf);
//InitGizmoScaleMesh();
//InitGizmoRotateMesh();
return(true);
}
void FreeGizmoResource()
{
//ClearGizmoRotateMesh();
//ClearGizmoScaleMesh();
ClearGizmoMoveNode();
for(GizmoMesh &gr:gizmo_mesh)
gr.Clear();
SAFE_CLEAR(gizmo_triangle.prim_creater);
SAFE_CLEAR(gizmo_triangle.vdm);
SAFE_CLEAR(gizmo_line.prim_creater);
SAFE_CLEAR(gizmo_line.vdm);
}
ComponentDataPtr GetGizmoMeshComponentDataPtr(const GizmoShape &shape,const GizmoColor &color)
{
if(!gizmo_rr)
return(nullptr);
RANGE_CHECK_RETURN_NULLPTR(shape)
RANGE_CHECK_RETURN_NULLPTR(color)
return gizmo_mesh[size_t(shape)].mesh_data[size_t(color)].cdp;
}
VK_NAMESPACE_END

View File

@ -0,0 +1,41 @@
#pragma once
#include"Gizmo.h"
#include<hgl/color/Color.h>
VK_NAMESPACE_BEGIN
class SceneNode;
class PrimitiveCreater;
class MeshComponent;
constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]=
{
COLOR::MozillaCharcoal,
COLOR::BlanchedAlmond,
COLOR::BlenderAxisRed,
COLOR::BlenderAxisGreen,
COLOR::BlenderAxisBlue,
COLOR::BlenderYellow,
};
constexpr const float GIZMO_ARROW_LENGTH =10.0f; ///<箭头整体长度
constexpr const float GIZMO_CENTER_SPHERE_RADIUS=1.0f; ///<中心球半径
constexpr const float GIZMO_CONE_LENGTH =1.0f; ///<圆锥高度
constexpr const float GIZMO_CONE_RADIUS =1.0f; ///<圆锥底部半径
constexpr const float GIZMO_CONE_OFFSET =GIZMO_ARROW_LENGTH-(GIZMO_CONE_LENGTH/2.0f); ///<圆锥偏移量
constexpr const float GIZMO_CYLINDER_RADIUS =0.25f; ///<圆柱半径
constexpr const float GIZMO_CYLINDER_LENGTH =GIZMO_ARROW_LENGTH-GIZMO_CENTER_SPHERE_RADIUS-GIZMO_CONE_LENGTH; ///<圆柱长度
constexpr const float GIZMO_CYLINDER_HALF_LENGTH=GIZMO_CYLINDER_LENGTH/2.0f; ///<圆柱一半长度
constexpr const float GIZMO_CYLINDER_OFFSET =GIZMO_CYLINDER_HALF_LENGTH+GIZMO_CENTER_SPHERE_RADIUS; ///<圆柱偏移量
constexpr const float GIZMO_TWO_AXIS_OFFSET =5.0F; ///<二轴调节点偏移量(方片或圆)
Mesh *GetGizmoMesh(const GizmoShape &gs,const GizmoColor &);
VK_NAMESPACE_END

132
example/Gizmo/GizmoTest.cpp Normal file
View File

@ -0,0 +1,132 @@
#include<hgl/WorkManager.h>
#include"Gizmo.h"
#include<hgl/graph/Ray.h>
using namespace hgl;
using namespace hgl::graph;
const Vector3f GizmoPosition(0,0,0);
///**
//* 一种永远转向正面的变换节点
//*/
//class TransformBillboard:public TransformBase
//{
// CameraInfo *camera_info=nullptr;
// bool face_to_camera=false;
//
// ViewportInfo *viewport_info=nullptr;
// float fixed_scale=1.0;
//
//public:
//
// virtual void SetCameraInfo (CameraInfo * ci ){camera_info =ci;}
// virtual void SetViewportInfo(ViewportInfo * vi ){viewport_info =vi;}
//
// virtual void SetFaceToCamera(bool ftc ){face_to_camera=ftc;}
// virtual void SetFixedScale (const float size){fixed_scale =size;}
//
// virtual bool RefreshTransform(const Transform &tf=IdentityTransform) override
// {
// if(!camera_info)
// {
// return SceneNode::RefreshTransform(tf);
// }
//
// if(face_to_camera)
// {
// LocalTransform.SetRotation(CalculateFacingRotationQuat(GetWorldPosition(),camera_info->view,AxisVector::X));
// }
//
// if(viewport_info)
// {
// const float screen_height=viewport_info->GetViewportHeight();
//
// const Vector4f pos=camera_info->Project(GetWorldPosition());
//
// LocalTransform.SetScale(pos.w*fixed_scale/screen_height);
// }
//
// return SceneNode::RefreshTransform(tf);
// }
//};//class BillboardSceneNode:public SceneNode
class TestApp:public WorkObject
{
SceneNode *sm_move=nullptr;
//StaticMesh *sm_rotate=nullptr;
//StaticMesh *sm_scale=nullptr;
private:
bool InitGizmo()
{
if(!InitGizmoResource(GetRenderFramework()))
return(false);
sm_move =GetGizmoMoveNode();
//sm_rotate =GetGizmoRotateStaticMesh();
//sm_scale =GetGizmoScaleStaticMesh();
return(true);
}
void InitGizmoSceneTree()
{
SceneNode *root=GetSceneRoot();
root->Add(sm_move->Duplication());
//root.Add(Duplication(sm_rotate->GetScene()));
//root.CreateSubNode(sm_scale->GetScene());
}
public:
bool Init() override
{
if(!InitGizmo())
return(false);
InitGizmoSceneTree();
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();
// const float screen_height=vi->GetViewportHeight();
// const Vector4f pos=ci->Project(GizmoPosition);
// //{
// // Transform tm;
// // tm.SetScale(pos.w*16.0f/screen_height);
// // root.SetLocalTransform(tm);
// //}
//}
};//class TestApp:public WorkObject
int os_main(int,os_char **)
{
return RunFramework<TestApp>(OS_TEXT("Gizmo"),1280,720);
}

View File

@ -0,0 +1,137 @@
// PlaneGrid3D
#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_plane_grid =nullptr;
MaterialInstance * material_instance[3]{};
private:
bool InitMDP()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
cfg.position_format=VAT_VEC2;
material=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!material)return(false);
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
Color4f GridColor;
COLOR ce=COLOR::BlenderAxisRed;
for(uint i=0;i<3;i++)
{
GridColor=GetColor4f(ce,1.0);
material_instance[i]=db->CreateMaterialInstance(material,&vil_config,&GridColor);
ce=COLOR((int)ce+1);
}
pipeline=CreatePipeline(material_instance[0],InlinePipeline::Solid3D);
return pipeline;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(32,32);
pgci.sub_count.Set(8,8);
pgci.lum=180;
pgci.sub_lum=255;
auto pc=GetPrimitiveCreater(material_instance[0]);
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
return prim_plane_grid;
}
void Add(SceneNode *parent_node,MaterialInstance *mi,const Matrix4f &mat)
{
Mesh *ri=db->CreateMesh(prim_plane_grid,mi,pipeline);
if(!ri)
return;
CreateComponentInfo cci(parent_node,mat);
CreateComponent<MeshComponent>(&cci,ri);
}
bool InitScene()
{
SceneNode *scene_root=GetSceneRoot(); //取得缺省场景根节点
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->SetReserveDirection(true,true); //反转x,y
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
}
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("PlaneGrid3D"),1280,720);
}

View File

@ -0,0 +1,204 @@
// RayPicking
#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/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#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;
static float position_data[2][3]=
{
{100,100,100},
{0,0,0}
};
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 WorkObject
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
Material * mtl_plane_grid =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * pipeline_plane_grid =nullptr;
Primitive * prim_plane_grid =nullptr;
Material * mtl_line =nullptr;
MaterialInstance * mi_line =nullptr;
Pipeline * pipeline_line =nullptr;
Primitive * prim_line =nullptr;
VABMap * prim_line_vab_map =nullptr;
Ray ray;
private:
bool InitMaterialAndPipeline()
{
mtl::Material3DCreateConfig cfg(PrimitiveType::Lines);
cfg.local_to_world=true;
VILConfig vil_config;
vil_config.Add(VAN::Luminance,VF_V1UN8);
{
cfg.position_format=VAT_VEC2;
mtl_plane_grid=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_plane_grid)return(false);
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);
if(!pipeline_plane_grid)return(false);
}
{
cfg.position_format=VAT_VEC3;
mtl_line=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_line)return(false);
mi_line=db->CreateMaterialInstance(mtl_line,&vil_config,&yellow_color);
if(!mi_line)return(false);
pipeline_line=CreatePipeline(mi_line,InlinePipeline::Solid3D);
if(!pipeline_line)
return(false);
}
return(true);
}
Mesh *Add(SceneNode *parent_node,Primitive *r,MaterialInstance *mi,Pipeline *p)
{
Mesh *ri=db->CreateMesh(r,mi,p);
if(!ri)
{
LOG_ERROR(OS_TEXT("Create Mesh failed."));
return(nullptr);
}
CreateComponentInfo cci(parent_node);
CreateComponent<MeshComponent>(&cci,ri);
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
auto pc=GetPrimitiveCreater(mi_plane_grid);
struct PlaneGridCreateInfo pgci;
pgci.grid_size.Set(32,32);
pgci.sub_count.Set(8,8);
pgci.lum=128;
pgci.sub_lum=196;
prim_plane_grid=CreatePlaneGrid2D(pc,&pgci);
}
{
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);
}
return(true);
}
bool InitScene()
{
SceneNode *scene_root=GetSceneRoot(); //取得缺省场景根节点
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));
return(true);
}
public:
using WorkObject::WorkObject;
~TestApp()
{
SAFE_CLEAR(prim_plane_grid);
}
bool Init() override
{
if(!InitMaterialAndPipeline())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
void Tick(double) override
{
Vector2i mouse_position;
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代表的数据数量,不是字节数
}
};//class TestApp:public CameraAppFramework
int os_main(int,os_char **)
{
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

@ -0,0 +1,333 @@
// BlinnPhong direction light
#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/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
#include<hgl/graph/mtl/Material3DCreateConfig.h>
#include<hgl/graph/mtl/BlinnPhong.h>
#include<hgl/graph/VertexDataManager.h>
#include<hgl/graph/PrimitiveCreater.h>
using namespace hgl;
using namespace hgl::graph;
static float lumiance_data[2]={1,1};
static Color4f white_color(1,1,1,1);
static mtl::blinnphong::SunLight sun_light=
{
Vector4f(1,1,1,0), //direction
Vector4f(1,0.95,0.9,1) //color
};
constexpr const COLOR AxisColor[4]=
{
//COLOR::Red, //X轴颜色
//COLOR::Green, //Y轴颜色
//COLOR::Blue, //Z轴颜色
COLOR::White, //全局颜色
COLOR::GhostWhite,
COLOR::BlanchedAlmond,
COLOR::AntiqueWhite
};
constexpr const os_char *tex_filename[]=
{
OS_TEXT("eucalyptus-cross-versailles.Tex2D"),
OS_TEXT("tints-ashton-green-stretcher.Tex2D"),
OS_TEXT("worn-clay-cobble-in-desert-stretcher.Tex2D"),
OS_TEXT("plain-grey-sheer.Tex2D"),
};
constexpr const size_t TexCount=sizeof(tex_filename)/sizeof(os_char *);
class TestApp:public SceneAppFramework
{
private: //plane grid
Material * mtl_vertex_lum =nullptr;
MaterialInstance * mi_plane_grid =nullptr;
Pipeline * p_line =nullptr;
Primitive * prim_plane_grid =nullptr;
private:
DeviceBuffer * ubo_sun =nullptr;
Texture2DArray * texture =nullptr;
Sampler * sampler =nullptr;
private: //sphere
Material * mtl_blinnphong =nullptr;
PrimitiveCreater * pc_blinnphong =nullptr;
VertexDataManager * vdm_blinnphong =nullptr;
MaterialInstance * mi_blinnphong[4]{};
Pipeline * p_blinnphong =nullptr;
Primitive * prim_sphere =nullptr;
Primitive * prim_cone =nullptr;
Primitive * prim_cylinder =nullptr;
private:
bool InitTexture()
{
texture=db->CreateTexture2DArray( "SeamlessBackground",
256,256, ///<纹理尺寸
TexCount, ///<纹理层数
PF_BC1_RGBUN, ///<纹理格式
false); ///<是否自动产生mipmaps
if(!texture)return(false);
OSString filename;
for(uint i=0;i<TexCount;i++)
{
filename=filesystem::MergeFilename(OS_TEXT("res/image/seamless"),tex_filename[i]);
if(!db->LoadTexture2DToArray(texture,i,filename))
return(false);
}
return(true);
}
bool InitVertexLumMP()
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"VertexLuminance3D",PrimitiveType::Lines);
cfg.local_to_world=true;
mtl_vertex_lum=db->LoadMaterial("Std3D/VertexLum3D",&cfg);
if(!mtl_vertex_lum)return(false);
mi_plane_grid=db->CreateMaterialInstance(mtl_vertex_lum,nullptr,&white_color);
if(!mi_plane_grid)return(false);
p_line=CreatePipeline(mtl_vertex_lum,InlinePipeline::Solid3D,PrimitiveType::Lines);
if(!p_line)
return(false);
return(true);
}
bool CreateBlinnPhongUBO()
{
ubo_sun=db->CreateUBO("sun",sizeof(sun_light),&sun_light);
if(!ubo_sun)return(false);
return(true);
}
bool InitBlinnPhongSunLightMP()
{
mtl::Material3DCreateConfig cfg(device->GetDevAttr(),"BlinnPhong3D",PrimitiveType::Triangles);
cfg.local_to_world=true;
cfg.material_instance=true;
mtl_blinnphong=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColorTexture",&cfg);
if(!mtl_blinnphong)return(false);
mtl_blinnphong->BindUBO(DescriptorSetType::Global,"sun",ubo_sun);
mtl_blinnphong->Update();
sampler=db->CreateSampler();
if(!mtl_blinnphong->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
struct MIData
{
Color4f color;
uint32 tex_id[4];
}mi_data;
constexpr const uint MIDataStride=sizeof(MIData);
for(uint i=0;i<4;i++)
{
mi_data.color=GetColor4f(AxisColor[i],4);
mi_data.tex_id[0]=i;
mi_blinnphong[i]=db->CreateMaterialInstance(mtl_blinnphong, //材质
nullptr, //顶点输入配置,这里使用nullptr即代表会使用默认配置那么结果将等同于上面的mtl_blinnphong->GetDefaultVIL()
&mi_data); //材质实例参数
if(!mi_blinnphong[i])return(false);
}
p_blinnphong=CreatePipeline(mtl_blinnphong,InlinePipeline::Solid3D,PrimitiveType::Triangles);
if(!p_blinnphong)
return(false);
return(true);
}
bool InitVDMAndPC()
{
vdm_blinnphong=new VertexDataManager(device,mtl_blinnphong->GetDefaultVIL());
if(!vdm_blinnphong->Init( 1024*1024, //VAB最大容量
1024*1024, //索引最大容量
IndexType::U16)) //索引类型
{
delete vdm_blinnphong;
vdm_blinnphong=nullptr;
return(false);
}
pc_blinnphong=new PrimitiveCreater(vdm_blinnphong);
//pc_blinnphong=new PrimitiveCreater(device,mtl_blinnphong->GetDefaultVIL());
return(true);
}
bool CreateRenderObject()
{
using namespace inline_geometry;
//Plane Grid
//{
// struct PlaneGridCreateInfo pgci;
// pgci.grid_size.Set(32,32);
// pgci.sub_count.Set(8,8);
// pgci.lum=0.5;
// pgci.sub_lum=0.75;
// prim_plane_grid=CreatePlaneGrid(pc_blinnphong,mtl_vertex_lum->GetDefaultVIL(),&pgci);
//}
//Sphere
prim_sphere=CreateSphere(pc_blinnphong,16);
//Cone
{
struct ConeCreateInfo cci;
cci.radius =1; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=8; //圆锥高度分割数
prim_cone=CreateCone(pc_blinnphong,&cci);
}
//Cyliner
{
struct CylinderCreateInfo cci;
cci.halfExtend =1.25; //圆柱一半高度
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1.25f; //圆柱半径
prim_cylinder=CreateCylinder(pc_blinnphong,&cci);
}
return(true);
}
Mesh *Add(Primitive *r,MaterialInstance *mi,Pipeline *p,const Matrix4f &mat=Identity4f)
{
if(!r)
return(nullptr);
if(!mi)
return(nullptr);
if(!p)
return(nullptr);
Mesh *ri=db->CreateMesh(r,mi,p);
if(!ri)
{
LOG_ERROR("Create Mesh failed! Primitive: "+r->GetName());
return(nullptr);
}
render_root.CreateSubNode(mat,ri);
return ri;
}
bool InitScene()
{
//Add(prim_plane_grid,mi_plane_grid,p_line,Identity4f);
Add(prim_sphere, mi_blinnphong[0],p_blinnphong,translate(Vector3f(0,0,2)));
Add(prim_cone, mi_blinnphong[1],p_blinnphong);
Add(prim_cylinder, mi_blinnphong[2],p_blinnphong,translate(Vector3f(0,0,-5)));
camera->pos=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:
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitTexture())
return(false);
//if(!InitVertexLumMP())
// return(false);
if(!CreateBlinnPhongUBO())
return(false);
if(!InitBlinnPhongSunLightMP())
return(false);
if(!InitVDMAndPC())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
~TestApp()
{
SAFE_CLEAR(prim_cone)
SAFE_CLEAR(prim_cylinder)
SAFE_CLEAR(prim_sphere)
SAFE_CLEAR(prim_plane_grid)
SAFE_CLEAR(pc_blinnphong)
SAFE_CLEAR(vdm_blinnphong)
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
return RunApp<TestApp>(1280,720);
}

View File

@ -0,0 +1,13 @@
macro(CreateProject name)
add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK})
target_link_libraries(${name} ${ULRE})
IF(MSVC)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
set_property(TARGET ${name} PROPERTY VS_DPI_AWARE "PerMonitor")
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Light Basic")
endmacro()
CreateProject(01_BlinnPhongDirectionLight BlinnPhongDirectionLight.cpp)

View File

@ -0,0 +1,16 @@
macro(CreateProject name)
add_executable(${name} ${ARGN} ${VULKAN_APP_FRAMEWORK})
target_link_libraries(${name} ${ULRE})
IF(MSVC)
set_target_properties(${name} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${ULRE_RUNTIME_PATH})
set_property(TARGET ${name} PROPERTY VS_DPI_AWARE "PerMonitor")
ENDIF()
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Texture")
endmacro()
CreateProject(05_texture_format texture_format_list.cpp)
CreateProject(06_texture_quad texture_quad.cpp)
CreateProject(07_texture_rect texture_rect.cpp)
CreateProject(08_texture_rect_array texture_rect_array.cpp)

View File

@ -1,4 +1,5 @@
#include<iostream>
#include<iomanip>
#include<hgl/graph/VK.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKInstance.h>
@ -8,32 +9,6 @@ using namespace hgl::graph;
VK_NAMESPACE_USING;
constexpr char *texture_compress_name[]=
{
"NONE",
"S3TC",
"PVRTC",
"ETC1",
"ETC2",
"EAC",
"ATC",
"ASTC",
"YUV"
};
constexpr char *data_type_name[]
{
"NONE",
"UNORM",
"SNORM",
"USCALED",
"SSCALED",
"UINT",
"SINT",
"UFLOAT",
"SFLOAT",
"SRGB"
};//
VulkanInstance *InitVulkanInstance()
{
@ -63,8 +38,8 @@ int main(int,char **)
{
Window * win =nullptr;
VulkanInstance * inst =nullptr;
GPUDevice * device =nullptr;
const GPUPhysicalDevice * physical_device =nullptr;
VulkanDevice * device =nullptr;
const VulkanPhyDevice * physical_device =nullptr;
inst=InitVulkanInstance();
@ -86,35 +61,36 @@ int main(int,char **)
for(uint32_t i=0;i<count;i++)
{
std::cout<<i<<". ";
std::cout<<std::setw(4)<<i<<". ";
std::cout<<" Format [ID:"<<vf->format<<"]["<<vf->name<<"] ";
std::cout<<"Format [ID:"<<std::setw(10)<<vf->format<<"]["<<std::setw(16)<<vf->name<<"]";
if(vf->compress_type!=TextureCompressType::NONE)
std::cout<<"use "<<texture_compress_name[size_t(vf->compress_type)]<<" compress.";
else
std::cout<<vf->bytes<<" bytes/pixel.";
if(vf->depth!=VulkanNumberType::NONE)
std::cout<<"[Depth:"<<data_type_name[size_t(vf->depth)]<<"]";
if(vf->depth!=VulkanBaseType::NONE)
std::cout<<"[ Depth:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->depth)]<<"]";
if(vf->stencil!=VulkanNumberType::NONE)
std::cout<<"[Stencil:"<<data_type_name[size_t(vf->stencil)]<<"]";
if(vf->stencil!=VulkanBaseType::NONE)
std::cout<<"[Stencil:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->stencil)]<<"]";
if((vf->depth==VulkanNumberType::NONE)
&&(vf->stencil==VulkanNumberType::NONE))
std::cout<<"[Color:"<<data_type_name[size_t(vf->color)]<<"]";
if((vf->depth==VulkanBaseType::NONE)
&&(vf->stencil==VulkanBaseType::NONE))
std::cout<<"[ Color:"<<std::setw(8)<<VulkanBaseTypeName[size_t(vf->color)]<<"]";
{
const VkFormatProperties fp=physical_device->GetFormatProperties(vf->format);
if(fp.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
std::cout<<"[Optimal]";
if(fp.linearTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
std::cout<<"[Linear]";
if(fp.bufferFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)
std::cout<<"[Buffer]";
char olb[]="[ ]";
if(fp.optimalTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT )olb[1]='O';
if(fp.linearTilingFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT )olb[2]='L';
if(fp.bufferFeatures&VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT )olb[2]='B';
std::cout<<olb;
}
if(vf->compress_type!=TextureCompressType::NONE)
std::cout<<" use "<<TextureCompressTypeName[size_t(vf->compress_type)]<<" compress.";
else
std::cout<<std::setw(4)<<vf->bytes<<" bytes/pixel.";
std::cout<<std::endl;
@ -124,4 +100,4 @@ int main(int,char **)
delete inst;
return 0;
}
}

View File

@ -1,17 +1,18 @@
// 2.texture_rect
// 该示例是1.indices_rect的进化演示在矩形上贴上贴图
// 画一个带纹理的四边形
#include"VulkanAppFramework.h"
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
using namespace hgl;
using namespace hgl::graph;
VK_NAMESPACE_BEGIN
Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename);
Texture2D *CreateTexture2DFromFile(VulkanDevice *device,const OSString &filename);
VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=256;
@ -21,26 +22,18 @@ constexpr uint32_t VERTEX_COUNT=4;
constexpr float position_data[VERTEX_COUNT][2]=
{
{0, 0},
{SCREEN_WIDTH, 0},
{0, SCREEN_HEIGHT},
{SCREEN_WIDTH, SCREEN_HEIGHT}
{-1, -1},
{ 1, -1},
{ 1, 1},
{-1, 1},
};
constexpr float tex_coord_data[VERTEX_COUNT][2]=
{
{0,0},
{1,0},
{0,1},
{1,1}
};
constexpr uint32_t INDEX_COUNT=6;
constexpr uint16 index_data[INDEX_COUNT]=
{
0,1,3,
0,3,2
{1,1},
{0,1}
};
class TestApp:public VulkanApplicationFramework
@ -49,22 +42,28 @@ private:
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Renderable * renderable =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/Texture2D"));
if(!material_instance)return(false);
mtl::Material2DCreateConfig cfg(device->GetDevAttr(),"PureTexture2D",PrimitiveType::Fan);
BindCameraUBO(material_instance);
cfg.coordinate_system=CoordinateSystem2D::NDC;
cfg.local_to_world=false;
material=db->LoadMaterial("Std2D/PureTexture2D",&cfg);
if(!material)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,PrimitiveType::Fan); //等同上一行为Framework重载默认使用swapchain的render target
if(!pipeline)
return(false);
@ -73,23 +72,28 @@ private:
sampler=db->CreateSampler();
if(!material_instance->BindImageSampler(DescriptorSetType::Value,"tex",texture,sampler))return(false);
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
material_instance=db->CreateMaterialInstance(material);
return(true);
}
bool InitVBO()
{
auto primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Quad",VERTEX_COUNT);
if(!primitive->Set(VAN::Position,db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(VAN::TexCoord,db->CreateVBO(VF_V2F,VERTEX_COUNT,tex_coord_data)))return(false);
if(!primitive->Set(db->CreateIBO16(INDEX_COUNT,index_data)))return(false);
if(!rpc.WriteVAB(VAN::Position, VF_V2F, position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord, VF_V2F, tex_coord_data))return(false);
renderable=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
render_obj=db->CreateMesh(&rpc,material_instance,pipeline);
return(render_obj);
}
public:
@ -105,16 +109,16 @@ public:
if(!InitVBO())
return(false);
BuildCommandBuffer(renderable);
BuildCommandBuffer(render_obj);
return(true);
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(renderable);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework

View File

@ -0,0 +1,136 @@
// 画一个带纹理的矩形2D模式专用
#include"VulkanAppFramework.h"
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
using namespace hgl;
using namespace hgl::graph;
VK_NAMESPACE_BEGIN
Texture2D *CreateTexture2DFromFile(VulkanDevice *device,const OSString &filename);
VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=256;
constexpr uint32_t SCREEN_HEIGHT=256;
constexpr float position_data[4]=
{
0, //left
0, //top
1, //right
1 //bottom
};
constexpr float tex_coord_data[4]=
{
0,0,
1,1
};
class TestApp:public VulkanApplicationFramework
{
private:
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Mesh * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
mtl::Material2DCreateConfig cfg(device->GetDevAttr(),"RectTexture2D",PrimitiveType::SolidRectangles);
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
cfg.local_to_world=false;
material=db->LoadMaterial("Std2D/RectTexture2D",&cfg);
if(!material)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,PrimitiveType::SolidRectangles); //等同上一行为Framework重载默认使用swapchain的render target
if(!pipeline)
return(false);
texture=db->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"),true);
if(!texture)return(false);
sampler=db->CreateSampler();
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
material_instance=db->CreateMaterialInstance(material);
return(true);
}
bool InitVBO()
{
PrimitiveCreater rpc(device,material_instance->GetVIL());
rpc.Init("Rectangle",1);
if(!rpc.WriteVAB(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
render_obj=db->CreateMesh(&rpc,material_instance,pipeline);
return(render_obj);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
BuildCommandBuffer(render_obj);
return(true);
}
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
return 0xff;
#endif//
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -0,0 +1,216 @@
// 画一个带纹理的矩形2D模式专用
#include"VulkanAppFramework.h"
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/graph/VKInlinePipeline.h>
#include<hgl/graph/PrimitiveCreater.h>
#include<hgl/graph/mtl/Material2DCreateConfig.h>
#include<hgl/math/Math.h>
#include<hgl/filesystem/Filename.h>
using namespace hgl;
using namespace hgl::graph;
VK_NAMESPACE_BEGIN
//Texture2D *CreateTexture2DFromFile(VulkanDevice *device,const OSString &filename);
VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=256;
constexpr uint32_t SCREEN_HEIGHT=256;
float position_data[4]=
{
0, //left
0, //top
1, //right
1 //bottom
};
constexpr float tex_coord_data[4]=
{
0,0,
1,1
};
constexpr const os_char *tex_filename[]=
{
OS_TEXT("001-online resume.Tex2D"),
OS_TEXT("002-salary.Tex2D"),
OS_TEXT("003-application.Tex2D"),
OS_TEXT("004-job interview.Tex2D")
};
constexpr const size_t TexCount=sizeof(tex_filename)/sizeof(os_char *);
class TestApp:public VulkanApplicationFramework
{
private:
SceneNode render_root;
RenderList * render_list =nullptr;
Texture2DArray * texture =nullptr;
Sampler * sampler =nullptr;
Material * material =nullptr;
Pipeline * pipeline =nullptr;
DeviceBuffer * tex_id_ubo =nullptr;
Primitive * prim_rectangle =nullptr;
struct
{
MaterialInstance * mi;
Mesh * mesh;
}render_obj[TexCount]{};
private:
bool InitTexture()
{
texture=db->CreateTexture2DArray( "freepik icons",
512,512, ///<纹理尺寸
TexCount, ///<纹理层数
PF_BC1_RGBAUN, ///<纹理格式
false); ///<是否自动产生mipmaps
if(!texture)return(false);
OSString filename;
for(uint i=0;i<TexCount;i++)
{
filename=filesystem::MergeFilename(OS_TEXT("res/image/icon/freepik"),tex_filename[i]);
if(!db->LoadTexture2DToArray(texture,i,filename))
return(false);
}
return(true);
}
bool InitMaterial()
{
mtl::Material2DCreateConfig cfg(device->GetDevAttr(),"RectTexture2DArray",PrimitiveType::SolidRectangles);
cfg.coordinate_system=CoordinateSystem2D::ZeroToOne;
cfg.local_to_world=true;
material=db->LoadMaterial("Std2D/RectTexture2DArray",&cfg);
if(!material)
return(false);
pipeline=CreatePipeline(material,InlinePipeline::Solid2D,PrimitiveType::SolidRectangles); //等同上一行为Framework重载默认使用swapchain的render target
if(!pipeline)
return(false);
sampler=db->CreateSampler();
if(!material->BindImageSampler( DescriptorSetType::PerMaterial, ///<描述符合集
mtl::SamplerName::BaseColor, ///<采样器名称
texture, ///<纹理
sampler)) ///<采样器
return(false);
for(uint32_t i=0;i<TexCount;i++)
{
render_obj[i].mi=db->CreateMaterialInstance(material);
if(!render_obj[i].mi)
return(false);
render_obj[i].mi->WriteMIData(i); //设置MaterialInstance的数据
}
return(true);
}
bool InitVBOAndRenderList()
{
PrimitiveCreater rpc(device,material->GetDefaultVIL());
rpc.Init("Rectangle",1);
position_data[2]=1.0f/float(TexCount);
if(!rpc.WriteVAB(VAN::Position,VF_V4F,position_data))return(false);
if(!rpc.WriteVAB(VAN::TexCoord,VF_V4F,tex_coord_data))return(false);
prim_rectangle=rpc.Create();
Vector3f offset(1.0f/float(TexCount),0,0);
for(uint32_t i=0;i<TexCount;i++)
{
render_obj[i].mesh=db->CreateMesh(prim_rectangle,render_obj[i].mi,pipeline);
if(!render_obj[i].mesh)
return(false);
offset.x=position_data[2]*float(i);
render_root.CreateSubNode(translate(offset),render_obj[i].mesh);
}
render_root.RefreshMatrix();
render_list->Expend(&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(prim_rectangle);
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH*TexCount,SCREEN_HEIGHT))
return(false);
render_list=new RenderList(device);
if(!InitTexture())
return(false);
if(!InitMaterial())
return(false);
if(!InitVBOAndRenderList())
return(false);
BuildCommandBuffer(render_list);
return(true);
}
void Resize(uint w,uint h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_list);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
return 0xff;
#endif//
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -5,7 +5,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/Mesh.h>
#include<hgl/graph/RenderList.h>
using namespace hgl;

View File

@ -10,41 +10,32 @@
set_property(TARGET ${name} PROPERTY FOLDER "ULRE/Example/Vulkan/${group}")
endmacro()
CreateProject("Basic" 1st_triangle first_triangle.cpp)
CreateProject("Basic" 2nd_triangle second_triangle.cpp)
CreateProject("Basic" 3rd_triangle third_triangle.cpp)
CreateProject("Basic" FragCoord FragCoordTest.cpp)
CreateProject("Basic" indices_rect indices_rect.cpp)
CreateProject("Basic" FullScreenTriangle FullScreenTriangle.cpp)
CreateProject("Basic" InstanceTriangle InstanceTriangle.cpp)
#CreateProject("Basic" FragCoord FragCoordTest.cpp)
CreateProject("Texture" TextureFormat TextureFormat.cpp)
CreateProject("Texture" texture_rect texture_rect.cpp)
#CreateProject("Texture" HQFilterTexture HQFilterTexture.cpp)
#CreateProject(06.Geometry2D Geometry2D.cpp)
CreateProject("Geometry2D" RectanglePrimitive RectanglePrimitive.cpp)
CreateProject("Tile" DrawTile DrawTile.cpp)
CreateProject("Tile" DrawText DrawText.cpp)
#CreateProject("Tile" DrawTile DrawTile.cpp)
#CreateProject("Tile" DrawText DrawText.cpp)
CreateProject("Geometry3D " Geometry3D Geometry3D.cpp)
#CreateProject("Geometry3D " Geometry3D Geometry3D.cpp)
CreateProject("Scene" SceneTree SceneTree.cpp)
#CreateProject("Scene" SceneTree SceneTree.cpp)
#CreateProject("Scene" LoadStaticMesh LoadStaticMesh.cpp LoadScene.cpp)
CreateProject("Scene" InlineGeometryScene InlineGeometryScene.cpp)
#CreateProject("Scene" InlineGeometryScene InlineGeometryScene.cpp)
CreateProject("Scene/Sky" SkyColor SkyColor.cpp)
CreateProject("Scene/Sky" Atmosphere Atmosphere.cpp)
#CreateProject("Scene/Sky" SkyColor SkyColor.cpp)
#CreateProject("Scene/Sky" Atmosphere Atmosphere.cpp)
CreateProject("Advanced Rendering" OffscreenRender OffscreenRender.cpp)
#CreateProject("Advanced Rendering" OffscreenRender OffscreenRender.cpp)
#CreateProject(12.PBRBasic PBRBasic.cpp)
#CreateProject(12.Deferred Deferred.cpp)
CreateProject("Advanced Rendering" DeferredRender DeferredRender.cpp)
#CreateProject("Advanced Rendering" DeferredRender DeferredRender.cpp)
#CreateProject(14.AutoMaterial auto_material.cpp)
CreateProject("Texture" Cubemap Cubemap.cpp)
CreateProject("Texture" EquirectangularMap EquirectangularMap.cpp)
CreateProject("Picking" RayPicking RayPicking.cpp)
#CreateProject("Texture" Cubemap Cubemap.cpp)
#CreateProject("Texture" EquirectangularMap EquirectangularMap.cpp)
#CreateProject("Picking" RayPicking RayPicking.cpp)
CreateProject("Landscape" TerrainSimple TerrainSimple.cpp)
#CreateProject("Landscape" TerrainSimple TerrainSimple.cpp)

View File

@ -5,7 +5,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/Mesh.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/RenderList.h>

View File

@ -103,7 +103,7 @@ private:
const VkFormat GetCandidateFormat(const VkFormat *fmt_list, const uint count)
{
auto pd = device->GetPhysicalDevice();
auto pd = device->GetPhyDevice();
for (uint i = 0; i < count; i++)
if (pd->IsColorAttachmentOptimal(fmt_list[i]))
@ -118,7 +118,7 @@ private:
const VkFormat GetDepthCandidateFormat()
{
auto pd = device->GetPhysicalDevice();
auto pd = device->GetPhyDevice();
for (VkFormat fmt : depth_candidate_format)
if (pd->IsDepthAttachmentOptimal(fmt))

View File

@ -4,7 +4,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/Mesh.h>
#include<hgl/graph/RenderList.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKImageView.h>
@ -16,7 +16,7 @@ using namespace hgl;
using namespace hgl::graph;
VK_NAMESPACE_BEGIN
Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename);
Texture2D *CreateTexture2DFromFile(VulkanDevice *device,const OSString &filename);
VK_NAMESPACE_END
constexpr uint32_t SCREEN_WIDTH=1280;
@ -139,7 +139,7 @@ private:
#ifdef _DEBUG
{
auto da=device->GetDeviceAttribute();
auto da=device->GetDevAttr();
if(da->debug_maker)
{
@ -160,7 +160,7 @@ private:
fbi.SetExtent(SCREEN_WIDTH,SCREEN_HEIGHT);
gbuffer.rt=device->CreateRenderTarget(&fbi);
gbuffer.rt=device->CreateRT(&fbi);
if(!gbuffer.rt)return(false);
@ -172,7 +172,7 @@ private:
#ifdef _DEBUG
{
auto da=device->GetDeviceAttribute();
auto da=device->GetDevAttr();
VkQueue q=*(gbuffer.rt->GetQueue());
VkFramebuffer fbo= gbuffer.rt->GetFramebuffer()->GetFramebuffer();
@ -229,7 +229,7 @@ private:
#ifdef _DEBUG
{
auto da=device->GetDeviceAttribute();
auto da=device->GetDevAttr();
if(da->debug_maker)
{

View File

@ -5,7 +5,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/Mesh.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/RenderList.h>

View File

@ -1,87 +0,0 @@
// 全屏三角形
// 该范例用于演示使用索引画一个覆盖全屏的三角形但是不传递任何顶点信息顶点坐标在vertex shader中通过gl_VertexIndex计算出来。
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=256;
constexpr uint32_t SCREEN_HEIGHT=256;
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable *renderable =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/fullscreen"));
if(!material_instance)return(false);
BindCameraUBO(material_instance);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles);
return pipeline;
}
bool InitVBO()
{
auto primitive=db->CreatePrimitive(3);
if(!primitive)return(false);
renderable=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
BuildCommandBuffer(renderable);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(renderable);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
return 0xff;
#endif//
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,160 +0,0 @@
// 4.Geometry3D
#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>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
class TestApp:public CameraAppFramework
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
SceneNode render_root;
RenderList *render_list=nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane_grid[3];
private:
bool InitMDP()
{
material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
if(!material)return(false);
material_instance=db->CreateMaterialInstance(material);
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline)
return(false);
return(true);
}
Renderable *Add(Primitive *r,const Matrix4f &mat)
{
Renderable *ri=db->CreateRenderable(r,material_instance,pipeline);
render_root.CreateSubNode(mat,ri);
return ri;
}
void CreateRenderObject()
{
using namespace inline_geometry;
struct PlaneGridCreateInfo pgci;
pgci.coord[0]=Vector3f(-100,-100,0);
pgci.coord[1]=Vector3f( 100,-100,0);
pgci.coord[2]=Vector3f( 100, 100,0);
pgci.coord[3]=Vector3f(-100, 100,0);
pgci.step.x=32;
pgci.step.y=32;
pgci.side_step.x=8;
pgci.side_step.y=8;
pgci.color.Set(0.5,0,0,1);
pgci.side_color.Set(1,0,0,1);
const VIL *vil=material_instance->GetVIL();
ro_plane_grid[0]=CreatePlaneGrid(db,vil,&pgci);
pgci.color.Set(0,0.5,0,1);
pgci.side_color.Set(0,1,0,1);
ro_plane_grid[1]=CreatePlaneGrid(db,vil,&pgci);
pgci.color.Set(0,0,0.5,1);
pgci.side_color.Set(0,0,1,1);
ro_plane_grid[2]=CreatePlaneGrid(db,vil,&pgci);
}
bool InitScene()
{
Add(ro_plane_grid[0],Matrix4f(1.0f));
Add(ro_plane_grid[1],rotate(HGL_RAD_90,0,1,0));
Add(ro_plane_grid[2],rotate(HGL_RAD_90,1,0,0));
camera->pos=Vector3f(200,200,200);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
render_list=new RenderList(device);
if(!InitMDP())
return(false);
CreateRenderObject();
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32 index)
{
render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
void Resize(int w,int h)override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -5,7 +5,7 @@
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/VKRenderable.h>
#include<hgl/graph/Mesh.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/RenderList.h>
@ -109,7 +109,7 @@ private:
VK_SAMPLER_ADDRESS_MODE_REPEAT,
0.0f,
VK_TRUE,
device->GetPhysicalDevice()->GetMaxSamplerAnisotropy(),
device->GetPhyDevice()->GetMaxSamplerAnisotropy(),
false,
VK_COMPARE_OP_NEVER,
0.0f,

View File

@ -1,103 +0,0 @@
// Instance Triangle
// 基本的Instance绘制测试用例,不使用场景树
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_SIZE=512;
constexpr uint32_t VERTEX_COUNT=3;
constexpr float position_data[VERTEX_COUNT][2]=
{
{0,0},
{0.25,-0.75},
{0,-1}
};
constexpr float color_data[VERTEX_COUNT][4]=
{ {1,0,0,1},
{0,1,0,1},
{0,0,1,1}
};
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"));
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false);
if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_SIZE,SCREEN_SIZE))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
if(!BuildCommandBuffer(render_obj))
return(false);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -80,7 +80,7 @@ public:
{
FramebufferInfo fbi(UPF_RGBA8,OFFSCREEN_SIZE,OFFSCREEN_SIZE);
os.render_taget=device->CreateRenderTarget(&fbi);
os.render_taget=device->CreateRT(&fbi);
if(!os.render_taget)return(false);
os.command_buffer=device->CreateRenderCommandBuffer();

View File

@ -1,191 +0,0 @@
// 18.RayPicking
#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/Ray.h>
#include<hgl/graph/VKVertexAttribBuffer.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=1280;
constexpr uint32_t SCREEN_HEIGHT=720;
static float position_data[2][3]=
{
{100,100,100},
{0,0,0}
};
static float color_data[2][4]=
{
{1,1,0,1},
{1,1,0,1}
};
class TestApp:public CameraAppFramework
{
Color4f color;
DeviceBuffer *ubo_color=nullptr;
private:
SceneNode render_root;
RenderList * render_list =nullptr;
Material * material =nullptr;
MaterialInstance * material_instance =nullptr;
Pipeline * pipeline =nullptr;
Primitive * ro_plane_grid =nullptr;
Primitive * ro_line =nullptr;
VBO * vbo_pos =nullptr;
Ray ray;
private:
bool InitMDP()
{
material=db->CreateMaterial(OS_TEXT("res/material/VertexColor3D"));
if(!material)return(false);
material_instance=db->CreateMaterialInstance(material);
if(!material_instance)return(false);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid3D,Prim::Lines);
if(!pipeline)
return(false);
return(true);
}
Renderable *Add(Primitive *r,const Matrix4f &mat)
{
Renderable *ri=db->CreateRenderable(r,material_instance,pipeline);
render_root.CreateSubNode(mat,ri);
return ri;
}
bool CreateRenderObject()
{
using namespace inline_geometry;
{
struct PlaneGridCreateInfo pgci;
pgci.coord[0]=Vector3f(-100,-100,0);
pgci.coord[1]=Vector3f( 100,-100,0);
pgci.coord[2]=Vector3f( 100, 100,0);
pgci.coord[3]=Vector3f(-100, 100,0);
pgci.step.x=32;
pgci.step.y=32;
pgci.side_step.x=8;
pgci.side_step.y=8;
pgci.color.Set(0.25,0,0,1);
pgci.side_color.Set(1,0,0,1);
const VIL *vil=material_instance->GetVIL();
ro_plane_grid=CreatePlaneGrid(db,vil,&pgci);
}
{
ro_line=db->CreatePrimitive(2);
if(!ro_line)return(false);
if(!ro_line->Set(VAN::Position, vbo_pos=db->CreateVBO(VF_V3F,2,position_data )))return(false);
if(!ro_line->Set(VAN::Color, db->CreateVBO(VF_V4F,2,color_data )))return(false);
}
return(true);
}
bool InitScene()
{
Add(ro_plane_grid,Matrix4f(1.0f));
Add(ro_line,Matrix4f(1.0f));
camera->pos=Vector3f(100,100,50);
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
render_root.RefreshMatrix();
render_list->Expend(camera->info,&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!CameraAppFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
render_list=new RenderList(device);
if(!InitMDP())
return(false);
if(!CreateRenderObject())
return(false);
if(!InitScene())
return(false);
return(true);
}
void BuildCommandBuffer(uint32 index)
{
const CameraInfo &ci=GetCameraInfo();
ray.Set(GetMouseCoord(),&ci); //设置射线查询的屏幕坐标点
const Vector3f pos=ray.ClosestPoint(Vector3f(0,0,0)); //求射线上与点(0,0,0)最近的点的坐标
vbo_pos->Write(&pos,3*sizeof(float)); //更新VBO上这个点的位置
render_root.RefreshMatrix();
render_list->Expend(ci,&render_root);
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
void Resize(int w,int h)override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class TestApp:public CameraAppFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,117 +0,0 @@
// 2.RectanglePrimivate
// 该示例是texture_rect的进化演示使用GeometryShader画矩形
#include"VulkanAppFramework.h"
#include<hgl/graph/VKTexture.h>
#include<hgl/graph/VKSampler.h>
#include<hgl/math/Math.h>
using namespace hgl;
using namespace hgl::graph;
VK_NAMESPACE_BEGIN
Texture2D *CreateTexture2DFromFile(GPUDevice *device,const OSString &filename);
VK_NAMESPACE_END
constexpr uint32_t SCREEN_SIZE=512;
constexpr uint32_t VERTEX_COUNT=1;
constexpr float BORDER=0.1f;
constexpr float position_data[4]=
{
SCREEN_SIZE*BORDER, SCREEN_SIZE*BORDER,
SCREEN_SIZE*(1.0-BORDER), SCREEN_SIZE*(1.0-BORDER)
};
constexpr float tex_coord_data[4]=
{
0,0,1,1
};
class TestApp:public VulkanApplicationFramework
{
private:
Texture2D * texture =nullptr;
Sampler * sampler =nullptr;
MaterialInstance * material_instance =nullptr;
Primitive * primitive =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/TextureRect2D"));
if(!material_instance)return(false);
BindCameraUBO(material_instance);
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::SolidRectangles);
if(!pipeline)return(false);
texture=db->LoadTexture2D(OS_TEXT("res/image/lena.Tex2D"));
if(!texture)return(false);
sampler=db->CreateSampler();
if(!material_instance->BindImageSampler(DescriptorSetType::Value,"tex",texture,sampler))return(false);
return(true);
}
bool InitVBO()
{
primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
primitive->Set(VAN::Position,db->CreateVBO(VF_V4F,VERTEX_COUNT,position_data));
primitive->Set(VAN::TexCoord,db->CreateVBO(VF_V4F,VERTEX_COUNT,tex_coord_data));
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
return(render_obj);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_SIZE,SCREEN_SIZE))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
BuildCommandBuffer(render_obj);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,150 +0,0 @@
// first_triangle
// 该范例主要演示使用NDC坐标系直接绘制一个渐变色的三角形
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/math/HalfFloat.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.h>
#include<hgl/graph/VKRenderablePrimitiveCreater.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 VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
#if defined(USE_HALF_FLOAT_POSITION)||defined(USE_UNORM8_COLOR)
VILConfig vil_config;
#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
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"),&vil_config);
#else
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2DNDC"));
#endif//
if(!material_instance)
return(false);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
RenderablePrimitiveCreater rpc(db,VERTEX_COUNT);
#ifdef USE_HALF_FLOAT_POSITION
Float32toFloat16(position_data_hf,position_data_float,VERTEX_COUNT*2);
#endif//USE_HALF_FLOAT_POSITION
if(!rpc.SetVBO(VAN::Position, PositionFormat, position_data))return(false);
if(!rpc.SetVBO(VAN::Color, ColorFormat, color_data ))return(false);
render_obj=rpc.Create(material_instance,pipeline);
return(render_obj);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
if(!BuildCommandBuffer(render_obj))
return(false);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,111 +0,0 @@
// indices_rect
// 该示例演示使用索引数据画一个矩形,并使用了颜色材质
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
using namespace hgl;
using namespace hgl::graph;
constexpr uint32_t SCREEN_WIDTH=256;
constexpr uint32_t SCREEN_HEIGHT=256;
constexpr uint32_t VERTEX_COUNT=4;
static Vector4f color(1,1,1,1);
constexpr float position_data[VERTEX_COUNT][2]=
{
{0,0},
{SCREEN_WIDTH,0},
{0,SCREEN_HEIGHT},
{SCREEN_WIDTH,SCREEN_HEIGHT}
};
constexpr uint32_t INDEX_COUNT=6;
constexpr uint16 index_data[INDEX_COUNT]=
{
0,1,3,
0,3,2
};
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable *renderable =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/FragColor"));
if(!material_instance)return(false);
BindCameraUBO(material_instance);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
auto primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position,db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data)))return(false);
if(!primitive->Set(db->CreateIBO16(INDEX_COUNT,index_data)))return(false);
renderable=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
BuildCommandBuffer(renderable);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(renderable);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
return 0xff;
#endif//
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,106 +0,0 @@
// third_triangle
// 该范例主要演示使用2D坐系统直接绘制一个渐变色的三角形
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/graph/SceneInfo.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]=
{
{SCREEN_WIDTH*0.5, SCREEN_HEIGHT*0.25},
{SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75},
{SCREEN_WIDTH*0.25, SCREEN_HEIGHT*0.75}
};
constexpr float color_data[VERTEX_COUNT][4]=
{
{1,0,0,1},
{0,1,0,1},
{0,0,1,1}
};
class TestApp:public VulkanApplicationFramework
{
private:
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
if(!material_instance)
return(false);
BindCameraUBO(material_instance);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false);
if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
return(true);
}
public:
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
if(!BuildCommandBuffer(render_obj))
return(false);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_obj);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -1,123 +0,0 @@
// second_triangle
// 该范例主要演示使用场景树系统绘制三角形
#include"VulkanAppFramework.h"
#include<hgl/math/Math.h>
#include<hgl/filesystem/FileSystem.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]=
{
{SCREEN_WIDTH*0.5, SCREEN_HEIGHT*0.25},
{SCREEN_WIDTH*0.25, SCREEN_HEIGHT*0.75},
{SCREEN_WIDTH*0.75, SCREEN_HEIGHT*0.75}
};
constexpr float color_data[VERTEX_COUNT][4]=
{ {1,0,0,1},
{0,1,0,1},
{0,0,1,1}
};
class TestApp:public VulkanApplicationFramework
{
private:
SceneNode render_root;
RenderList * render_list =nullptr;
MaterialInstance * material_instance =nullptr;
Renderable * render_obj =nullptr;
Pipeline * pipeline =nullptr;
private:
bool InitMaterial()
{
material_instance=db->CreateMaterialInstance(OS_TEXT("res/material/VertexColor2D"));
if(!material_instance)
return(false);
BindCameraUBO(material_instance);
// pipeline=db->CreatePipeline(material_instance,sc_render_target,OS_TEXT("res/pipeline/solid2d"));
pipeline=CreatePipeline(material_instance,InlinePipeline::Solid2D,Prim::Triangles); //等同上一行为Framework重载默认使用swapchain的render target
return pipeline;
}
bool InitVBO()
{
Primitive *primitive=db->CreatePrimitive(VERTEX_COUNT);
if(!primitive)return(false);
if(!primitive->Set(VAN::Position, db->CreateVBO(VF_V2F,VERTEX_COUNT,position_data )))return(false);
if(!primitive->Set(VAN::Color, db->CreateVBO(VF_V4F,VERTEX_COUNT,color_data )))return(false);
render_obj=db->CreateRenderable(primitive,material_instance,pipeline);
if(!render_obj)
return(false);
render_root.CreateSubNode(render_obj);
render_root.RefreshMatrix();
render_list->Expend(GetCameraInfo(),&render_root);
return(true);
}
public:
~TestApp()
{
SAFE_CLEAR(render_list);
}
bool Init()
{
if(!VulkanApplicationFramework::Init(SCREEN_WIDTH,SCREEN_HEIGHT))
return(false);
render_list=new RenderList(device);
if(!InitMaterial())
return(false);
if(!InitVBO())
return(false);
BuildCommandBuffer(render_list);
return(true);
}
void Resize(int w,int h)override
{
VulkanApplicationFramework::Resize(w,h);
BuildCommandBuffer(render_list);
}
};//class TestApp:public VulkanApplicationFramework
int main(int,char **)
{
TestApp app;
if(!app.Init())
return(-1);
while(app.Run());
return 0;
}

View File

@ -2,7 +2,7 @@
#include<hgl/platform/Window.h>
#include<hgl/graph/VKInstance.h>
#include<hgl/graph/VKPhysicalDevice.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKDeviceCreater.h>
#include<hgl/graph/VKSemaphore.h>
#include<hgl/graph/VKBuffer.h>
#include<hgl/graph/VKShaderModule.h>
@ -19,9 +19,14 @@
#include<hgl/graph/VKMaterialInstance.h>
#include<hgl/graph/VKRenderTarget.h>
#include<hgl/graph/VKRenderResource.h>
#ifdef _DEBUG
#include<hgl/graph/VKDeviceAttribute.h>
#endif//_DEBUG
#include<hgl/graph/RenderList.h>
#include<hgl/graph/mtl/UBOCommon.h>
#include<hgl/color/Color.h>
#include<hgl/Time.h>
#include<hgl/log/LogInfo.h>
//#include<hgl/graph/LookAtCameraControl.h>
#include<hgl/graph/FirstPersonCameraControl.h>
@ -33,6 +38,12 @@ using namespace hgl;
using namespace hgl::io;
using namespace hgl::graph;
namespace hgl{namespace graph
{
bool InitShaderCompiler();
void CloseShaderCompiler();
}}//namespace hgl::graph
class VulkanApplicationFramework:WindowEvent
{
protected:
@ -42,7 +53,7 @@ protected:
protected:
GPUDevice * device =nullptr;
VulkanDevice * device =nullptr;
RenderPass * device_render_pass =nullptr;
SwapchainRenderTarget * sc_render_target =nullptr;
@ -59,28 +70,42 @@ protected:
RenderResource * db =nullptr;
protected:
Camera * camera =nullptr;
DeviceBuffer * ubo_camera_info =nullptr;
ViewportInfo vp_info;
DeviceBuffer * ubo_vp_info =nullptr;
public:
virtual void BindRenderResource(RenderResource *rr)
{
if(!rr)
return;
rr->static_descriptor.AddUBO(mtl::SBS_ViewportInfo.name,ubo_vp_info);
}
virtual ~VulkanApplicationFramework()
{
SAFE_CLEAR(camera);
CloseShaderCompiler();
win->Unjoin(this);
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
SAFE_CLEAR(device);
SAFE_CLEAR(win);
SAFE_CLEAR(inst);
}
virtual bool Init(int w,int h)
virtual bool Init(uint w,uint h)
{
clear_color.Set(0,0,0,1);
logger::InitLogger(OS_TEXT("VulkanTest"));
if(!InitShaderCompiler())
return(false);
SetClearColor(COLOR::MozillaCharcoal);
#ifdef _DEBUG
if(!CheckStrideBytesByFormat())
@ -105,7 +130,6 @@ public:
cili.lunarg.standard_validation = true;
cili.khronos.validation = true;
//cili.RenderDoc.Capture = true;
inst=CreateInstance("VulkanTest",nullptr,&cili);
@ -113,10 +137,16 @@ public:
return(false);
}
device=CreateRenderDevice(inst,win);
{
VulkanHardwareRequirement vh_req;
if(!device)
return(false);
vh_req.wideLines=VulkanHardwareRequirement::SupportLevel::Want;
device=CreateRenderDevice(inst,win,&vh_req);
if(!device)
return(false);
}
device_render_pass=device->GetRenderPass();
@ -127,48 +157,30 @@ public:
win->Join(this);
{
camera=new Camera;
vp_info.Set(w,h);
camera->width=w;
camera->height=h;
camera->vp_width=w;
camera->vp_height=h;
camera->pos=Vector3f(10,10,10);
camera->RefreshCameraInfo();
ubo_camera_info=db->CreateUBO(sizeof(CameraInfo),&camera->info);
ubo_vp_info=db->CreateUBO("Viewport",sizeof(ViewportInfo),&vp_info);
}
BindRenderResource(db);
return(true);
}
const CameraInfo &GetCameraInfo()
virtual void Resize(uint w,uint h)
{
return camera->info;
vp_info.Set(w,h);
ubo_vp_info->Write(&vp_info);
}
DeviceBuffer *GetCameraInfoBuffer()
ViewportInfo *GetViewportInfo()
{
return ubo_camera_info;
return &vp_info;
}
bool BindCameraUBO(MaterialInstance *mi)
DeviceBuffer *GetViewportInfoBuffer()
{
return mi->BindUBO(DescriptorSetType::Global,"g_camera",ubo_camera_info);
}
virtual void Resize(int w,int h)
{
camera->width=w;
camera->height=h;
camera->vp_width=w;
camera->vp_height=h;
camera->RefreshCameraInfo();
ubo_camera_info->Write(&camera->info);
return ubo_vp_info;
}
void SetClearColor(const Color4f &cc)
@ -193,7 +205,7 @@ public:
void InitCommandBuffer()
{
if(cmd_buf)
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
sc_render_target=device->GetSwapchainRT();
@ -204,51 +216,37 @@ public:
cmd_buf=hgl_zero_new<RenderCmdBuffer *>(swap_chain_count);
for(int32_t i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateRenderCommandBuffer();
cmd_buf[i]=device->CreateRenderCommandBuffer(device->GetPhyDevice()->GetDeviceName()+AnsiString(":RenderCmdBuffer_")+AnsiString::numberOf(i));
}
}
bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri)
bool BuildCommandBuffer(RenderCmdBuffer *cb,Framebuffer *fbo,Mesh *ri)
{
if(!ri)return(false);
const IndexBuffer *ib=ri->GetIndexBuffer();
cb->Begin();
cb->BindFramebuffer(rp,fb);
cb->BindFramebuffer(fbo);
cb->SetClearColor(0,clear_color);
cb->BeginRenderPass();
cb->BindPipeline(ri->GetPipeline());
cb->BindDescriptorSets(ri);
cb->BindVBO(ri);
if (ib)
cb->DrawIndexed(ib->GetCount(),ri->GetInstanceCount());
else
cb->Draw(ri->GetDrawCount(),ri->GetInstanceCount());
cb->BindDescriptorSets(ri->GetMaterial());
cb->BindDataBuffer(ri->GetDataBuffer());
cb->Draw(ri->GetDataBuffer(),ri->GetRenderData());
cb->EndRenderPass();
cb->End();
return(true);
}
void BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri)
{
if(!cb||!rt||!ri)
return;
BuildCommandBuffer(cb,rt->GetRenderPass(),rt->GetFramebuffer(),ri);
}
bool BuildCommandBuffer(uint32_t index,Renderable *ri)
bool BuildCommandBuffer(uint32_t index,Mesh *ri)
{
if(!ri)return(false);
return BuildCommandBuffer(cmd_buf[index],sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index),ri);
return BuildCommandBuffer(cmd_buf[index],
sc_render_target->GetFramebuffer(),ri);
}
bool BuildCommandBuffer(Renderable *ri)
bool BuildCommandBuffer(Mesh *ri)
{
if(!ri)return(false);
@ -258,7 +256,7 @@ public:
return(true);
}
bool BuildCurrentCommandBuffer(Renderable *ri)
bool BuildCurrentCommandBuffer(Mesh *ri)
{
if(!ri)return(false);
@ -272,7 +270,7 @@ public:
RenderCmdBuffer *cb=cmd_buf[index];
cb->Begin();
cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
cb->BindFramebuffer(sc_render_target->GetFramebuffer(index));
cb->SetClearColor(0,clear_color);
cb->BeginRenderPass();
rl->Render(cb);
@ -292,7 +290,22 @@ public:
}
template<typename ...ARGS>
Pipeline *CreatePipeline(ARGS...args){return device_render_pass->CreatePipeline(args...);}
Pipeline *CreatePipeline(ARGS...args)
{
Pipeline *p=device_render_pass->CreatePipeline(args...);
if(!p)
return(nullptr);
#ifdef _DEBUG
DebugUtils *du=device->GetDebugUtils();
if(du)
du->SetPipeline(*p,"Pipeline:"+p->GetName());
#endif//_DEBUG
return p;
}
public:
@ -333,129 +346,14 @@ 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;
}
const Vector2f &GetMouseCoord()const{return mouse_pos;}
void Update()
{
cur_time=GetDoubleTime();
}
};
class CameraAppFramework:public VulkanApplicationFramework
{
protected:
Camera * camera =nullptr;
DeviceBuffer * ubo_camera_info =nullptr;
FirstPersonCameraControl *camera_control=nullptr;
CameraKeyboardControl * ckc=nullptr;
@ -465,24 +363,40 @@ protected:
public:
virtual void BindRenderResource(RenderResource *rr) override
{
if(!rr)return;
VulkanApplicationFramework::BindRenderResource(rr);
rr->global_descriptor.AddUBO(mtl::SBS_CameraInfo.name,ubo_camera_info);
}
virtual ~CameraAppFramework()
{
SAFE_CLEAR(ckc);
SAFE_CLEAR(cmc);
SAFE_CLEAR(camera);
}
virtual bool Init(int w,int h)
virtual bool Init(uint w,uint h) override
{
if(!VulkanApplicationFramework::Init(w,h))
return(false);
InitCamera(w,h);
BindRenderResource(db);
return(true);
}
virtual void InitCamera(int w,int h)
{
camera_control=new FirstPersonCameraControl(camera);
camera=new Camera;
camera->pos=Vector3f(10,10,10);
camera_control=new FirstPersonCameraControl(&vp_info,camera);
camera_control->Refresh(); //更新矩阵计算
@ -491,26 +405,38 @@ public:
win->Join(ckc);
win->Join(cmc);
RefreshCameraInfo(camera_control->GetCameraInfo(),&vp_info,camera);
ubo_camera_info=db->CreateUBO("CameraInfo",sizeof(CameraInfo),camera_control->GetCameraInfo());
}
void Resize(int w,int h)override
void Resize(uint w,uint h)override
{
camera->width=w;
camera->height=h;
camera->vp_width=w;
camera->vp_height=h;
vp_info.Set(w,h);
camera_control->Refresh();
ubo_camera_info->Write(&camera->info);
ubo_camera_info->Write(camera_control->GetCameraInfo());
}
CameraInfo *GetCameraInfo()
{
return camera_control->GetCameraInfo();
}
DeviceBuffer *GetCameraInfoBuffer()
{
return ubo_camera_info;
}
virtual void BuildCommandBuffer(uint32_t index)=0;
virtual void Draw()override
{
camera_control->Refresh(); //更新相机矩阵
ubo_camera_info->Write(&camera->info); //写入缓冲区
camera_control->Refresh(); //更新相机矩阵
ubo_camera_info->Write(camera_control->GetCameraInfo()); //写入缓冲区
const uint32_t index=AcquireNextImage();
@ -521,4 +447,55 @@ public:
ckc->Update();
cmc->Update();
}
};//class CameraAppFramework
};//class CameraAppFramework
class SceneAppFramework:public CameraAppFramework
{
protected:
SceneNode render_root;
RenderList * render_list =nullptr;
public:
SceneAppFramework()=default;
virtual ~SceneAppFramework()
{
SAFE_CLEAR(render_list);
}
virtual bool Init(uint width,uint height) override
{
if(!CameraAppFramework::Init(width,height))
return(false);
render_list=new RenderList(device);
return(true);
}
virtual void BuildCommandBuffer(uint32 index) override
{
VulkanApplicationFramework::BuildCommandBuffer(index,render_list);
}
virtual void Resize(uint w,uint h) override
{
CameraAppFramework::Resize(w,h);
VulkanApplicationFramework::BuildCommandBuffer(render_list);
}
};//class SceneAppFramework:public CameraAppFramework
template<typename T> int RunApp(uint w,uint h)
{
T app;
if(!app.Init(w,h))
return(-1);
while(app.Run());
return 0;
}

95
inc/hgl/WorkManager.h Normal file
View File

@ -0,0 +1,95 @@
#pragma once
#include<hgl/WorkObject.h>
#include<hgl/graph/VKRenderTargetSwapchain.h>
namespace hgl
{
/**
* WorkObject<br>
*/
class WorkManager
{
protected:
graph::RenderFramework *render_framework;
uint fps=60;
double frame_time=1.0f/double(fps);
double last_update_time=0;
double last_render_time=0;
double cur_time=0;
WorkObject *cur_work_object=nullptr;
public:
WorkManager(graph::RenderFramework *rf)
{
render_framework=rf;
}
virtual ~WorkManager()
{
SAFE_CLEAR(cur_work_object);
}
void SetFPS(uint f)
{
fps=f;
frame_time=1.0f/double(fps);
}
void Tick(WorkObject *wo);
virtual void Render(WorkObject *wo);
void Run(WorkObject *wo);
};//class WorkManager
class SwapchainWorkManager:public WorkManager,public io::WindowEvent
{
graph::SwapchainModule *swapchain_module;
public:
SwapchainWorkManager(graph::RenderFramework *rf):WorkManager(rf)
{
swapchain_module=rf->GetSwapchainModule();
render_framework->Join(this);
}
~SwapchainWorkManager()
{
render_framework->Unjoin(this);
}
void Render(WorkObject *wo) override;
void OnResize(uint w,uint h) override;
};
template<typename WO> int RunFramework(const OSString &title,uint width=1280,uint height=720)
{
graph::RenderFramework rf(title);
if(!rf.Init(width,height))
return(-1);
SwapchainWorkManager wm(&rf);
WO *wo=new WO(&rf);
if(!wo->Init())
{
delete wo;
return(-2);
}
wm.Run(wo);
return 0;
}
}//namespcae hgl

123
inc/hgl/WorkObject.h Normal file
View File

@ -0,0 +1,123 @@
#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>
namespace hgl
{
namespace graph::mtl
{
class MaterialCreateInfo;
}
/**
* </p>
*
* WorkObject被定义为工作对象WorkObject的Render函数下
*/
class WorkObject:public TickObject
{
graph::RenderFramework *render_framework=nullptr;
bool destroy_flag=false;
bool render_dirty=true;
protected:
//以下数据均取自RenderFramework
graph::RenderResource *db=nullptr; //暂时的,未来会被更好的机制替代
graph::Scene * scene=nullptr; //场景
graph::Renderer * renderer=nullptr; //渲染器
public:
graph::RenderFramework * GetRenderFramework (){return render_framework;}
graph::VulkanDevice * GetDevice (){return render_framework->GetDevice();}
graph::VulkanDevAttr * GetDevAttr (){return render_framework->GetDevAttr();}
graph::TextureManager * GetTextureManager (){return render_framework->GetTextureManager();}
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;}
void MarkDestory(){destroy_flag=true;}
const bool IsRenderDirty ()const{return render_dirty;}
void MarkRenderDirty(){render_dirty=true;}
public:
WorkObject(graph::RenderFramework *,graph::Renderer *r=nullptr);
virtual ~WorkObject()=default;
virtual bool Init()=0;
virtual void OnRendererChange(graph::RenderFramework *rf,graph::Renderer *r);
virtual void OnResize(const VkExtent2D &){}
virtual void Tick(double){}
virtual void Render(double delta_time);
public:
#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;}
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>)
#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)
{
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)
{
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
/**
* .
* WorkObject的基础上再提供RenderWorkObject派生类
*
*
* 使WorkObject
* */
}//namespcae hgl

View File

@ -0,0 +1,209 @@
#pragma once
#include<hgl/type/DataType.h>
#include<hgl/type/SortedSet.h>
#include<hgl/type/ArrayList.h>
/**
* Component/Data/Manager
*
* AMD FidelityFX
*
* AMD FidelityFX中Component存放于Entity下SceneNode
* Entity还是SceneNodeComponent的管理
* AMD FidelityFX中的SceneScene
*
* ComponentData是每个Component的数据Component或是其它模块提供数据
* ComponentManager是Component的管理器Component的创建
*
* AMD FidelityFX一样ComponentManager与Scene基本无关
* World之中
* Scene密切相关的Component它对应的Manager才会出现在Scene中CameraManager/LightManager
* MeshComponent之类的纯资源型就会是独立存在的
*
* Component是组件的基类
*
* SceneComponent是场景组件基类
*
* PrimitiveComponent是图元组件的基类
* Component都必须是一个有3D空间的几何图元
* PrimitiveComponent提供数据进行计算
* RenderComponent是可渲染组件的基类
*
* MeshComponent是静态网格组件RenderComponent实现
*/
#define COMPONENT_NAMESPACE hgl::graph
#define COMPONENT_NAMESPACE_BEGIN namespace COMPONENT_NAMESPACE {
#define COMPONENT_NAMESPACE_END }
COMPONENT_NAMESPACE_BEGIN
class ComponentManager;
class SceneNode;
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>
*
*/
class Component
{
static uint unique_id_count;
uint unique_id;
SceneNode * OwnerNode;
ComponentManager * Manager;
ComponentDataPtr Data;
protected:
friend class ComponentManager;
virtual void OnDetachManager(ComponentManager *cm)
{
if(cm==Manager)
Manager=nullptr;
}
public:
Component()=delete;
Component(ComponentDataPtr,ComponentManager *);
virtual ~Component();
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;}
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;
protected:
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
#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 RegistryComponentManager(ComponentManager *);
ComponentManager *GetComponentManager(const size_t hash_code);
template<typename T> inline T *GetComponentManager(bool create_default=true)
{
T *cm=(T *)GetComponentManager(T::StaticTypeHash());
if(!cm&&create_default)
{
cm=new T;
RegistryComponentManager(cm);
}
return cm;
}
COMPONENT_NAMESPACE_END

View File

@ -0,0 +1,93 @@
#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;
public:
COMPONENT_CLASS_BODY(Mesh)
public:
MeshComponent(ComponentDataPtr cdp,MeshComponentManager *cm):RenderComponent(cdp,cm)
{
sm_data=cdp;
}
virtual ~MeshComponent()=default;
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;
}
};//class MeshComponent
COMPONENT_NAMESPACE_END

View File

@ -0,0 +1,20 @@
#pragma once
#include<hgl/component/SceneComponent.h>
COMPONENT_NAMESPACE_BEGIN
/**
* <br>
*
*/
class PrimitiveComponent:public SceneComponent
{
public:
using SceneComponent::SceneComponent;
virtual ~PrimitiveComponent()=default;
};//class PrimitiveComponent
COMPONENT_NAMESPACE_END

View File

@ -0,0 +1,18 @@
#pragma once
#include<hgl/component/PrimitiveComponent.h>
COMPONENT_NAMESPACE_BEGIN
/**
*
*/
class RenderComponent:public PrimitiveComponent
{
public:
using PrimitiveComponent::PrimitiveComponent;
virtual ~RenderComponent()=default;
};//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,7 +1,7 @@
#ifndef HGL_DB_FIELD_TYPE_INCLUDE
#define HGL_DB_FIELD_TYPE_INCLUDE
#include<hgl/type/List.h>
#include<hgl/type/ArrayList.h>
#include<hgl/type/StringList.h>
namespace hgl
{

View File

@ -7,7 +7,7 @@ namespace hgl
namespace graph
{
/**
* 2Dλͼ¼ÓÔØ
* 2D位图加载类
*/
class Bitmap2DLoader:public Texture2DLoader
{
@ -20,8 +20,8 @@ namespace hgl
Bitmap2DLoader():Texture2DLoader(){}
~Bitmap2DLoader();
void *OnBegin(uint32 total_bytes) override;
void OnEnd() override {}
void *OnBegin(uint32 total_bytes,const VkFormat &) override;
bool OnEnd() override {return(false);}
BitmapData *GetBitmap();
};//class Bitmap2DLoader

View File

@ -0,0 +1,28 @@
#pragma once
#include<hgl/TypeFunc.h>
namespace hgl::graph
{
enum class CoordinateSystem2D
{
NDC,
ZeroToOne, //左上角为0,0右下角为1,1
Ortho, //左上角为0,0右下角为(width-1),(height-1)
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

@ -4,12 +4,15 @@
#include<hgl/graph/VK.h>
#include<hgl/math/Vector.h>
#include<hgl/type/RectScope.h>
#include<hgl/type/Size2.h>
#include<hgl/color/Color4f.h>
#include<hgl/graph/AABB.h>
namespace hgl
{
namespace graph
{
class PrimitiveCreater;
namespace inline_geometry
{
/**
@ -20,12 +23,12 @@ namespace hgl
RectScope2f scope;
};//struct RectangleCreateInfo
Primitive *CreateRectangle(RenderResource *db,const VIL *vil,const RectangleCreateInfo *rci);
Primitive *CreateRectangle(PrimitiveCreater *pc,const RectangleCreateInfo *rci);
/**
*
*/
Primitive *CreateGBufferCompositionRectangle(RenderResource *db,const VIL *vil);
Primitive *CreateGBufferCompositionRectangle(PrimitiveCreater *pc);
/**
* (/线)
@ -36,7 +39,7 @@ namespace hgl
uint32_t round_per; ///<圆角精度
};//struct RoundRectangleCreateInfo:public RectangleCreateInfo
Primitive *CreateRoundRectangle(RenderResource *db,const VIL *vil,const RoundRectangleCreateInfo *rci);
Primitive *CreateRoundRectangle(PrimitiveCreater *pc,const RoundRectangleCreateInfo *rci);
/**
*
@ -45,9 +48,9 @@ namespace hgl
{
Vector2f center; ///<圆心坐标
Vector2f radius; ///<半径
uint field_count=8; ///<分段
uint field_count=8; ///<分段
bool has_color =false;
bool has_center; ///<是否有圆心点
Vector4f center_color; ///<圆心颜色
Vector4f border_color; ///<边缘颜色
@ -56,44 +59,43 @@ namespace hgl
/**
* 2D圆形(/线)
*/
Primitive *CreateCircle(RenderResource *db,const VIL *vil,const CircleCreateInfo *cci);
Primitive *CreateCircle2D(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);
/**
* <br>
* XY平面上居中的网格1
*/
struct PlaneGridCreateInfo
{
Vector3f coord[4];
Vector2u step;
Size2u grid_size; ///<格子数量
Vector2u side_step; //到边界的步数
Size2u sub_count; ///<细分格子数量
Color4f color; //一般线条颜色
Color4f side_color; //边界线条颜色
uint8 lum; ///<一般线条亮度
uint8 sub_lum; ///<细分及边界线条亮度
};//struct PlaneGridCreateInfo
/**
* (线)
*/
Primitive *CreatePlaneGrid(RenderResource *db,const VIL *vil,const PlaneGridCreateInfo *pgci);
Primitive *CreatePlaneGrid2D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci); //创建一个平面网格(线条)
struct PlaneCreateInfo
{
Vector2f tile;
public:
PlaneCreateInfo()
{
tile.x=1.0f;
tile.y=1.0f;
}
};//struct PlaneCreateInfo
Primitive *CreatePlaneGrid3D(PrimitiveCreater *pc,const PlaneGridCreateInfo *pgci);
/**
* ()
* ()
*/
Primitive *CreatePlane(RenderResource *db,const VIL *vil,const PlaneCreateInfo *pci);
Primitive *CreatePlaneSqaure(PrimitiveCreater *pc);
struct CubeCreateInfo
{
@ -129,7 +131,7 @@ namespace hgl
/**
* ()
*/
Primitive *CreateCube(RenderResource *db,const VIL *vil,const CubeCreateInfo *cci);
Primitive *CreateCube(PrimitiveCreater *pc,const CubeCreateInfo *cci);
struct BoundingBoxCreateInfo
{
@ -160,17 +162,17 @@ namespace hgl
/**
* (线)
*/
Primitive *CreateBoundingBox(RenderResource *db,const VIL *vil,const BoundingBoxCreateInfo *cci);
Primitive *CreateBoundingBox(PrimitiveCreater *pc,const BoundingBoxCreateInfo *cci);
/**
* 0,0,01()
*/
Primitive *CreateSphere(RenderResource *db,const VIL *vil,const uint numberSlices);
Primitive *CreateSphere(PrimitiveCreater *,const uint numberSlices);
/**
* ()
*/
Primitive *CreateDome(RenderResource *db,const VIL *vil, const uint numberSlices);
Primitive *CreateDome(PrimitiveCreater *pc, const uint numberSlices);
struct TorusCreateInfo
{
@ -186,7 +188,7 @@ namespace hgl
/**
* ()
*/
Primitive *CreateTorus(RenderResource *db,const VIL *vil,const TorusCreateInfo *tci);
Primitive *CreateTorus(PrimitiveCreater *pc,const TorusCreateInfo *tci);
struct CylinderCreateInfo
{
@ -198,7 +200,7 @@ namespace hgl
/**
* ()
*/
Primitive *CreateCylinder(RenderResource *db,const VIL *vil,const CylinderCreateInfo *cci);
Primitive *CreateCylinder(PrimitiveCreater *,const CylinderCreateInfo *cci);
struct ConeCreateInfo
{
@ -211,7 +213,7 @@ namespace hgl
/**
* ()
*/
Primitive *CreateCone(RenderResource *db,const VIL *vil,const ConeCreateInfo *cci);
Primitive *CreateCone(PrimitiveCreater *,const ConeCreateInfo *cci);
struct AxisCreateInfo
{
@ -232,7 +234,7 @@ namespace hgl
/**
* 线(线)
*/
Primitive *CreateAxis(RenderResource *db,const VIL *vil,const AxisCreateInfo *aci);
Primitive *CreateAxis(PrimitiveCreater *pc,const AxisCreateInfo *aci);
}//namespace inline_geometry
}//namespace graph
};//namespace hgl

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