From b58af7ac23a1a922c7aef30033da22804a604a1c Mon Sep 17 00:00:00 2001 From: hyzboy Date: Tue, 17 Nov 2020 17:20:59 +0800 Subject: [PATCH] support new Camera/CameraControl --- CMCore | 2 +- CMSceneGraph | 2 +- example/Vulkan/Geometry3D.cpp | 6 ++-- example/common/VulkanAppFramework.h | 44 ++++++++++++++++------------- src/SceneGraph/RenderList.cpp | 4 +-- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/CMCore b/CMCore index 41b70d47..16f8e89f 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 41b70d47446a8da4dfaaf6ce3c89750495678ceb +Subproject commit 16f8e89f5b72387d1ca49457558235834d8e9e49 diff --git a/CMSceneGraph b/CMSceneGraph index ad2504b4..656dabd5 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit ad2504b4bd5390b887ef9abfc395552493cd5d0c +Subproject commit 656dabd560b5f27e190baf3899104c38019ae9e2 diff --git a/example/Vulkan/Geometry3D.cpp b/example/Vulkan/Geometry3D.cpp index 0356c4ac..849e8395 100644 --- a/example/Vulkan/Geometry3D.cpp +++ b/example/Vulkan/Geometry3D.cpp @@ -30,8 +30,8 @@ private: Pipeline * pipeline =nullptr; }m3d,m2d; - Renderable *ro_plane_grid[3], - *ro_round_rectangle =nullptr; + Renderable *ro_plane_grid[3], + *ro_round_rectangle =nullptr; private: @@ -105,7 +105,7 @@ private: ro_round_rectangle=CreateRenderableRoundRectangle(db,m2d.material,&rrci); } - camera.eye.Set(200,200,200,1.0); + camera.pos.Set(200,200,200,1.0); } bool InitScene() diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index b78cfe70..c8eca004 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -300,18 +300,22 @@ class CameraAppFramework:public VulkanApplicationFramework { private: - GPUBuffer * ubo_world_matrix =nullptr; + GPUBuffer * ubo_world_matrix =nullptr; protected: - ControlCamera camera; - float move_speed=1; + Camera camera; + FreeCameraControl * fcc=nullptr; + float move_speed=1; - Vector2f mouse_last_pos; + Vector2f mouse_last_pos; public: - virtual ~CameraAppFramework()=default; + virtual ~CameraAppFramework() + { + SAFE_CLEAR(fcc); + } virtual bool Init(int w,int h) { @@ -329,10 +333,12 @@ public: camera.height=h; camera.vp_width=w; camera.vp_height=h; - camera.center.Set(0,0,0,1); - camera.eye.Set(10,10,10,1); //xyz三个值不要一样,以方便调试 + camera.target.Set(0,0,0,1); + camera.pos.Set(10,10,10,1); //xyz三个值不要一样,以方便调试 camera.Refresh(); //更新矩阵计算 + + fcc=new FreeCameraControl(&camera); ubo_world_matrix=db->CreateUBO(sizeof(WorldMatrix),&camera.matrix); } @@ -361,17 +367,17 @@ public: SubmitDraw(index); - if(key_status[kbW])camera.Forward (move_speed);else - if(key_status[kbS])camera.Backward (move_speed);else - if(key_status[kbA])camera.Left (move_speed);else - if(key_status[kbD])camera.Right (move_speed);else - if(key_status[kbR])camera.Up (move_speed);else - if(key_status[kbF])camera.Down (move_speed);else + if(key_status[kbW])fcc->Forward (move_speed);else + if(key_status[kbS])fcc->Backward (move_speed);else + if(key_status[kbA])fcc->Left (move_speed);else + if(key_status[kbD])fcc->Right (move_speed);else + if(key_status[kbR])fcc->Up (move_speed);else + if(key_status[kbF])fcc->Down (move_speed);else - if(key_status[kbLeft ])camera.WrapHorzRotate( move_speed);else - if(key_status[kbRight ])camera.WrapHorzRotate(-move_speed);else - if(key_status[kbUp ])camera.WrapVertRotate( move_speed);else - if(key_status[kbDown ])camera.WrapVertRotate(-move_speed);else + //if(key_status[kbLeft ])camera.WrapHorzRotate( move_speed);else + //if(key_status[kbRight ])camera.WrapHorzRotate(-move_speed);else + //if(key_status[kbUp ])camera.WrapVertRotate( move_speed);else + //if(key_status[kbDown ])camera.WrapVertRotate(-move_speed);else return; } @@ -394,8 +400,8 @@ public: Vector2f gap=mouse_pos-mouse_last_pos; bool update=false; - if(gap.x!=0){update=true;if(mouse_key&mbLeft)camera.HorzRotate(-gap.x/10.0f);else camera.WrapHorzRotate(gap.x);} - if(gap.y!=0){update=true;if(mouse_key&mbLeft)camera.VertRotate(-gap.y/10.0f);else camera.WrapVertRotate(gap.y);} +// if(gap.x!=0){update=true;if(mouse_key&mbLeft)camera.HorzRotate(-gap.x/10.0f);else camera.WrapHorzRotate(gap.x);} +// if(gap.y!=0){update=true;if(mouse_key&mbLeft)camera.VertRotate(-gap.y/10.0f);else camera.WrapVertRotate(gap.y);} mouse_last_pos=mouse_pos; } diff --git a/src/SceneGraph/RenderList.cpp b/src/SceneGraph/RenderList.cpp index 2ed9c81e..5f15c699 100644 --- a/src/SceneGraph/RenderList.cpp +++ b/src/SceneGraph/RenderList.cpp @@ -16,8 +16,8 @@ namespace hgl if(!cam||!obj_one||!obj_two) return(0); - return( length_squared(obj_one->GetCenter(),cam->eye)- - length_squared(obj_two->GetCenter(),cam->eye)); + return( length_squared(obj_one->GetCenter(),cam->pos)- + length_squared(obj_two->GetCenter(),cam->pos)); } //bool FrustumClipFilter(const SceneNode *node,void *fc)