Correct draw Gizmo Rotate/Scale, OK!!

This commit is contained in:
hyzboy 2024-07-30 23:54:25 +08:00
parent e18a6e7a4a
commit c3a1266da6
11 changed files with 268 additions and 19 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 7f39d7731845b3592cab7b5267eac88f7b13573b
Subproject commit 7165984d2270c61f19653a3a256c05786ec478fa

View File

@ -14,6 +14,12 @@ CreateProject(01_PlaneGrid3D PlaneGrid3D.cpp)
CreateProject(02_RayPicking RayPicking.cpp)
CreateProject(03_MetricCellsGrid MetricCellsGrid.cpp)
CreateProject(04_Gizmo3DTest GizmoTest.cpp Gizmo3DMove.cpp Gizmo.h GizmoResource.h GizmoResource.cpp)
CreateProject(04_Gizmo3DTest GizmoTest.cpp
Gizmo.h
GizmoResource.h
GizmoResource.cpp
Gizmo3DMove.cpp
Gizmo3DScale.cpp
Gizmo3DRotate.cpp)
#CreateProject(03_BlenderAxis BlenderAxis.cpp)

View File

@ -25,14 +25,16 @@ enum class GizmoShape:uint
Sphere, //球
Cone, //圆锥
Cylinder, //圆柱
Torus, //圆环
ENUM_CLASS_RANGE(Plane,Cylinder)
ENUM_CLASS_RANGE(Plane,Torus)
};
bool InitGizmoResource(RenderResource *);
void FreeGizmoResource();
StaticMesh *GetGizmoMoveStaticMesh();
StaticMesh *GetGizmoScaleStaticMesh();
StaticMesh *GetGizmoRotateStaticMesh();
VK_NAMESPACE_END

View File

@ -76,17 +76,20 @@ bool InitGizmoMoveStaticMesh()
if(!cone[i])
return(false);
if(!plane[i])
return(false);
}
{
SceneNode *root_node=new SceneNode(sphere);
SceneNode *root_node=new SceneNode(scale(0.5f),sphere);
{
Transform tm;
constexpr const Vector3f one_scale(1);
constexpr const Vector3f plane_scale(2);
constexpr const Vector3f cylinder_scale(0.35f,0.35f,4.5f);
constexpr const Vector3f cylinder_scale(0.35f,0.35f,4.0f);
{
tm.SetScale(cylinder_scale);

View File

@ -0,0 +1,66 @@
#include"GizmoResource.h"
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.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()
{
Renderable *torus[4]
{
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::Blue),
GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White),
};
for(int i=0;i<4;i++)
{
if(!torus[i])
return(false);
}
{
SceneNode *root_node=new SceneNode();
{
Transform tm;
tm.SetScale(10.0f);
tm.SetRotation(AXIS::Z,90);
root_node->CreateSubNode(tm,torus[0]);
tm.ClearRotation();
root_node->CreateSubNode(tm,torus[1]);
tm.SetRotation(AXIS::X,90);
root_node->CreateSubNode(tm,torus[2]);
}
sm_gizmo_rotate=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_rotate)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -0,0 +1,149 @@
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
10
22
15,5
1
*/
#include"GizmoResource.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()
{
Renderable *sphere=GetGizmoRenderable(GizmoShape::Sphere,GizmoColor::White);
Renderable *cylinder[3]
{
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cylinder,GizmoColor::Blue),
};
Renderable *cube[3]
{
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Cube,GizmoColor::Blue),
};
Renderable *plane[3]=
{
GetGizmoRenderable(GizmoShape::Plane,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Plane,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Plane,GizmoColor::Blue)
};
if(!sphere)
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cube[i])
return(false);
if(!plane[i])
return(false);
}
{
SceneNode *root_node=new SceneNode(scale(0.5f),sphere);
{
Transform tm;
constexpr const Vector3f one_scale(2);
constexpr const Vector3f plane_scale(2);
constexpr const Vector3f cylinder_scale(0.35f,0.35f,4.0f);
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,4.5f);
root_node->CreateSubNode(tm,cylinder[2]); //Z 向上圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,0,9.5f);
root_node->CreateSubNode(tm,cube[2]); //Z 向上圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(5,5,0);
root_node->CreateSubNode(tm,plane[2]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(4.5f,0,0);
root_node->CreateSubNode(tm,cylinder[0]); //X 向右圆柱
tm.SetScale(one_scale);
tm.SetTranslation(9.5f,0,0);
root_node->CreateSubNode(tm,cube[0]); //X 向右圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(0,5,5);
root_node->CreateSubNode(tm,plane[0]);
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,4.5f,0);
root_node->CreateSubNode(tm,cylinder[1]); //Y 向前圆柱
tm.SetScale(one_scale);
tm.SetTranslation(0,9.5f,0);
root_node->CreateSubNode(tm,cube[1]); //Y 向前圆锥
tm.SetScale(plane_scale);
tm.SetTranslation(5,0,5);
root_node->CreateSubNode(tm,plane[1]);
}
}
sm_gizmo_scale=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_scale)
return(false);
return(true);
}
VK_NAMESPACE_END

View File

@ -15,6 +15,12 @@ VK_NAMESPACE_BEGIN
bool InitGizmoMoveStaticMesh();
void ClearGizmoMoveStaticMesh();
bool InitGizmoScaleStaticMesh();
void ClearGizmoScaleStaticMesh();
bool InitGizmoRotateStaticMesh();
void ClearGizmoRotateStaticMesh();
namespace
{
static RenderResource * gizmo_rr=nullptr;
@ -198,7 +204,7 @@ namespace
}
{
InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,32),gizmo_triangle.pipeline);
InitGizmoRenderable(GizmoShape::Sphere,CreateSphere(gizmo_triangle.prim_creater,8),gizmo_triangle.pipeline);
}
{
@ -206,8 +212,8 @@ namespace
cci.radius =1; //圆锥半径
cci.halfExtend =1; //圆锤一半高度
cci.numberSlices=32; //圆锥底部分割数
cci.numberStacks=8; //圆锥高度分割数
cci.numberSlices=16; //圆锥底部分割数
cci.numberStacks=3; //圆锥高度分割数
InitGizmoRenderable(GizmoShape::Cone,CreateCone(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
@ -216,12 +222,23 @@ namespace
struct CylinderCreateInfo cci;
cci.halfExtend =1; //圆柱一半高度
cci.numberSlices=32; //圆柱底部分割数
cci.numberSlices=16; //圆柱底部分割数
cci.radius =1; //圆柱半径
InitGizmoRenderable(GizmoShape::Cylinder,CreateCylinder(gizmo_triangle.prim_creater,&cci),gizmo_triangle.pipeline);
}
{
struct TorusCreateInfo tci;
tci.innerRadius=0.975;
tci.outerRadius=1.0;
tci.numberSlices=64;
tci.numberStacks=32;
InitGizmoRenderable(GizmoShape::Torus,CreateTorus(gizmo_triangle.prim_creater,&tci),gizmo_triangle.pipeline);
}
ENUM_CLASS_FOR(GizmoShape,int,i)
{
if(!gizmo_rederable[i].prim)
@ -252,12 +269,16 @@ bool InitGizmoResource(RenderResource *rr)
return(false);
InitGizmoMoveStaticMesh();
InitGizmoScaleStaticMesh();
InitGizmoRotateStaticMesh();
return(true);
}
void FreeGizmoResource()
{
ClearGizmoRotateStaticMesh();
ClearGizmoScaleStaticMesh();
ClearGizmoMoveStaticMesh();
for(GizmoRenderable &gr:gizmo_rederable)

View File

@ -6,7 +6,8 @@ using namespace hgl::graph;
class TestApp:public SceneAppFramework
{
StaticMesh *sm=nullptr;
StaticMesh *sm_move=nullptr;
StaticMesh *sm_rotate=nullptr;
private:
@ -15,7 +16,8 @@ private:
if(!InitGizmoResource(db))
return(false);
sm=GetGizmoMoveStaticMesh();
sm_move =GetGizmoMoveStaticMesh();
sm_rotate =GetGizmoRotateStaticMesh();
return(true);
}
@ -34,7 +36,7 @@ public:
camera_control->SetTarget(Vector3f(0,0,0));
camera_control->Refresh();
SceneNode *sn=sm->GetScene();
SceneNode *sn=sm_rotate->GetScene();
sn->RefreshMatrix();

2
res

@ -1 +1 @@
Subproject commit 475d8ad43ceee084cd24f5d0bed59de9f6aa36fd
Subproject commit e1a36d78f0eead5f6bb65493432c4690637b991d

View File

@ -802,9 +802,9 @@ namespace hgl
// generate normal and stores it in the right position
// NOTE: cos (2PIx) = cos (x) and sin (2PIx) = sin (x) so, we can use this formula
// normal = {cos(2PIs)cos(2PIt) , sin(2PIs)cos(2PIt) ,sin(2PIt)}
*np = +cos2PIs * cos2PIt; ++np;
*np = +sin2PIt; ++np;
*np = +sin2PIs * cos2PIt; ++np;
*np = cos2PIs * cos2PIt; ++np;
*np = sin2PIt; ++np;
*np = sin2PIs * cos2PIt; ++np;
}
if(tcp)

View File

@ -47,7 +47,7 @@ void main()
float specular=max(dot(half_vector,Input.Normal),0.0);
spec_color=specular*pow(specular,64)*SUN_COLOR;
spec_color=specular*pow(specular,16)*SUN_COLOR;
}
FragColor=vec4(direct_color+spec_color,1.0);