From ca6d99b6fbad254b4c6cdeda3fe2a064a994bf97 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 30 Aug 2024 00:30:06 +0800 Subject: [PATCH] gizmo's scale/move/rotate to use same Value. --- CMCore | 2 +- example/Gizmo/Gizmo3DMove.cpp | 20 ++++++++++---------- example/Gizmo/Gizmo3DRotate.cpp | 2 +- example/Gizmo/Gizmo3DScale.cpp | 30 ++++++++++++++++-------------- example/Gizmo/GizmoResource.cpp | 4 ++-- example/Gizmo/GizmoResource.h | 15 +++++++++++++++ example/Gizmo/GizmoTest.cpp | 3 +++ res | 2 +- src/SceneGraph/SceneNode.cpp | 2 ++ 9 files changed, 51 insertions(+), 29 deletions(-) diff --git a/CMCore b/CMCore index 97743adb..0ac2a943 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 97743adb3f36fdda659b584e6ff93773b2a85f2a +Subproject commit 0ac2a9431a14767c018f6f20a8ea0a3604b859ee diff --git a/example/Gizmo/Gizmo3DMove.cpp b/example/Gizmo/Gizmo3DMove.cpp index 235b999b..3a8c1903 100644 --- a/example/Gizmo/Gizmo3DMove.cpp +++ b/example/Gizmo/Gizmo3DMove.cpp @@ -91,50 +91,50 @@ bool InitGizmoMoveStaticMesh() const Vector3f one_scale(1); const Vector3f plane_scale(2); - const Vector3f cylinder_scale(0.35f,0.35f,4.0f); + const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH); { tm.SetScale(cylinder_scale); - tm.SetTranslation(0,0,4.5f); + tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET); root_node->CreateSubNode(tm,cylinder[2]); //Z 向上圆柱 tm.SetScale(one_scale); - tm.SetTranslation(0,0,9.5f); + tm.SetTranslation(0,0,GIZMO_CONE_OFFSET); root_node->CreateSubNode(tm,cone[2]); //Z 向上圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(5,5,0); + tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0); root_node->CreateSubNode(tm,plane[2]); } { tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::Y,90); - tm.SetTranslation(4.5f,0,0); + tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0); root_node->CreateSubNode(tm,cylinder[0]); //X 向右圆柱 tm.SetScale(one_scale); - tm.SetTranslation(9.5f,0,0); + tm.SetTranslation(GIZMO_CONE_OFFSET,0,0); root_node->CreateSubNode(tm,cone[0]); //X 向右圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(0,5,5); + tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET); root_node->CreateSubNode(tm,plane[0]); } { tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::X,-90); - tm.SetTranslation(0,4.5f,0); + tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0); root_node->CreateSubNode(tm,cylinder[1]); //Y 向前圆柱 tm.SetScale(one_scale); - tm.SetTranslation(0,9.5f,0); + tm.SetTranslation(0,GIZMO_CONE_OFFSET,0); root_node->CreateSubNode(tm,cone[1]); //Y 向前圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(5,0,5); + tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET); root_node->CreateSubNode(tm,plane[1]); } } diff --git a/example/Gizmo/Gizmo3DRotate.cpp b/example/Gizmo/Gizmo3DRotate.cpp index 6ed4d5f9..c3b57677 100644 --- a/example/Gizmo/Gizmo3DRotate.cpp +++ b/example/Gizmo/Gizmo3DRotate.cpp @@ -42,7 +42,7 @@ bool InitGizmoRotateStaticMesh() { Transform tm; - tm.SetScale(10.0f); + tm.SetScale(GIZMO_ARROW_LENGTH); root_node->CreateSubNode(tm,torus[0]); diff --git a/example/Gizmo/Gizmo3DScale.cpp b/example/Gizmo/Gizmo3DScale.cpp index 8bc86d9a..cfbf6669 100644 --- a/example/Gizmo/Gizmo3DScale.cpp +++ b/example/Gizmo/Gizmo3DScale.cpp @@ -44,7 +44,7 @@ void ClearGizmoScaleStaticMesh() bool InitGizmoScaleStaticMesh() { - Renderable *sphere=GetGizmoRenderable(GizmoShape::Sphere,GizmoColor::White); + Renderable *center_cube=GetGizmoRenderable(GizmoShape::Cube,GizmoColor::White); Renderable *cylinder[3] { GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red), @@ -66,7 +66,7 @@ bool InitGizmoScaleStaticMesh() GetGizmoRenderable(GizmoShape::Plane,GizmoColor::Blue) }; - if(!sphere) + if(!center_cube) return(false); for(int i=0;i<3;i++) @@ -82,57 +82,59 @@ bool InitGizmoScaleStaticMesh() } { - SceneNode *root_node=new SceneNode(scale(0.5f),sphere); + SceneNode *root_node=new SceneNode(); + + root_node->CreateSubNode(scale(GIZMO_CENTER_SPHERE_RADIUS*2),center_cube); { Transform tm; - const Vector3f one_scale(2); + const Vector3f one_scale(1); const Vector3f plane_scale(2); - const Vector3f cylinder_scale(0.35f,0.35f,4.0f); + const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH); { tm.SetScale(cylinder_scale); - tm.SetTranslation(0,0,4.5f); + tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET); root_node->CreateSubNode(tm,cylinder[2]); //Z 向上圆柱 tm.SetScale(one_scale); - tm.SetTranslation(0,0,9.5f); + tm.SetTranslation(0,0,GIZMO_CONE_OFFSET); root_node->CreateSubNode(tm,cube[2]); //Z 向上圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(5,5,0); + tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0); root_node->CreateSubNode(tm,plane[2]); } { tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::Y,90); - tm.SetTranslation(4.5f,0,0); + tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0); root_node->CreateSubNode(tm,cylinder[0]); //X 向右圆柱 tm.SetScale(one_scale); - tm.SetTranslation(9.5f,0,0); + tm.SetTranslation(GIZMO_CONE_OFFSET,0,0); root_node->CreateSubNode(tm,cube[0]); //X 向右圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(0,5,5); + tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET); root_node->CreateSubNode(tm,plane[0]); } { tm.SetScale(cylinder_scale); tm.SetRotation(AxisVector::X,-90); - tm.SetTranslation(0,4.5f,0); + tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0); root_node->CreateSubNode(tm,cylinder[1]); //Y 向前圆柱 tm.SetScale(one_scale); - tm.SetTranslation(0,9.5f,0); + tm.SetTranslation(0,GIZMO_CONE_OFFSET,0); root_node->CreateSubNode(tm,cube[1]); //Y 向前圆锥 tm.SetScale(plane_scale); - tm.SetTranslation(5,0,5); + tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET); root_node->CreateSubNode(tm,plane[1]); } } diff --git a/example/Gizmo/GizmoResource.cpp b/example/Gizmo/GizmoResource.cpp index d1d956ba..68e85448 100644 --- a/example/Gizmo/GizmoResource.cpp +++ b/example/Gizmo/GizmoResource.cpp @@ -210,8 +210,8 @@ namespace { ConeCreateInfo cci; - cci.radius =1; //圆锥半径 - cci.halfExtend =1; //圆锤一半高度 + cci.radius =GIZMO_CONE_RADIUS; //圆锥半径 + cci.halfExtend =1; //圆锤一半高度 cci.numberSlices=16; //圆锥底部分割数 cci.numberStacks=3; //圆锥高度分割数 diff --git a/example/Gizmo/GizmoResource.h b/example/Gizmo/GizmoResource.h index 0ebb72b2..ac9f7349 100644 --- a/example/Gizmo/GizmoResource.h +++ b/example/Gizmo/GizmoResource.h @@ -20,6 +20,21 @@ constexpr const COLOR gizmo_color[size_t(GizmoColor::RANGE_SIZE)]= COLOR::BlenderYellow, }; +constexpr const float GIZMO_ARROW_LENGTH=10; ///<箭头整体长度 +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; ///<二轴调节点偏移量(方片或圆) + Renderable *GetGizmoRenderable(const GizmoShape &gs,const GizmoColor &); StaticMesh *CreateGizmoStaticMesh(SceneNode *); diff --git a/example/Gizmo/GizmoTest.cpp b/example/Gizmo/GizmoTest.cpp index cb650dc1..f1d49524 100644 --- a/example/Gizmo/GizmoTest.cpp +++ b/example/Gizmo/GizmoTest.cpp @@ -61,6 +61,7 @@ class TestApp:public SceneAppFramework StaticMesh *sm_move=nullptr; StaticMesh *sm_rotate=nullptr; + StaticMesh *sm_scale=nullptr; Renderable *face_torus=nullptr; @@ -73,6 +74,7 @@ private: sm_move =GetGizmoMoveStaticMesh(); sm_rotate =GetGizmoRotateStaticMesh(); + sm_scale =GetGizmoScaleStaticMesh(); face_torus =GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White); @@ -88,6 +90,7 @@ private: root.CreateSubNode(sm_move->GetScene()); root.CreateSubNode(sm_rotate->GetScene()); + //root.CreateSubNode(sm_scale->GetScene()); //{ // Transform tm; diff --git a/res b/res index 475d8ad4..e1a36d78 160000 --- a/res +++ b/res @@ -1 +1 @@ -Subproject commit 475d8ad43ceee084cd24f5d0bed59de9f6aa36fd +Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d diff --git a/src/SceneGraph/SceneNode.cpp b/src/SceneGraph/SceneNode.cpp index d0cc0bfe..de2246a9 100644 --- a/src/SceneGraph/SceneNode.cpp +++ b/src/SceneGraph/SceneNode.cpp @@ -44,6 +44,8 @@ namespace hgl */ void SceneNode::RefreshMatrix() { + SceneOrient::RefreshMatrix(); + // if (scene_matrix.IsNewestVersion()) //自己不变,不代表下面不变 //return;