ULRE/example/Gizmo/Gizmo3DMove.cpp

153 lines
4.5 KiB
C++
Raw Permalink Normal View History

2024-06-25 01:17:47 +08:00
/*
Gizmo move
2024-06-25 01:17:47 +08:00
ref: Blender 4
2024-06-25 01:17:47 +08:00
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
2024-06-25 01:17:47 +08:00
10
22
15,5
2024-06-25 01:17:47 +08:00
1
*/
#include"GizmoResource.h"
#include<hgl/graph/SceneNode.h>
2024-07-28 23:34:04 +08:00
#include<hgl/graph/VKRenderResource.h>
#include<hgl/graph/InlineGeometry.h>
#include<hgl/graph/RenderFramework.h>
#include<hgl/component/MeshComponent.h>
VK_NAMESPACE_BEGIN
2024-07-28 23:34:04 +08:00
namespace
{
static SceneNode *sn_gizmo_move=nullptr;
}//namespace
SceneNode *GetGizmoMoveNode()
{
return sn_gizmo_move;
}
void ClearGizmoMoveNode()
{
SAFE_CLEAR(sn_gizmo_move);
}
bool InitGizmoMoveNode(RenderFramework *render_framework)
{
2025-06-15 07:43:13 +08:00
Mesh *sphere=GetGizmoMesh(GizmoShape::Sphere,GizmoColor::White);
2025-05-18 02:03:16 +08:00
Mesh *cylinder[3]
{
2025-06-15 07:43:13 +08:00
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cylinder,GizmoColor::Blue),
};
2025-05-18 02:03:16 +08:00
Mesh *cone[3]
2024-07-28 23:34:04 +08:00
{
2025-06-15 07:43:13 +08:00
GetGizmoMesh(GizmoShape::Cone,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Cone,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Cone,GizmoColor::Blue),
};
Mesh *square[3]=
2024-07-30 13:55:44 +08:00
{
GetGizmoMesh(GizmoShape::Square,GizmoColor::Red),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Green),
GetGizmoMesh(GizmoShape::Square,GizmoColor::Blue)
2024-07-30 13:55:44 +08:00
};
if(!sphere)
return(false);
2024-07-28 23:34:04 +08:00
for(int i=0;i<3;i++)
{
if(!cylinder[i])
2024-07-28 23:34:04 +08:00
return(false);
if(!cone[i])
return(false);
2024-07-30 23:54:25 +08:00
if(!square[i])
2024-07-30 23:54:25 +08:00
return(false);
}
2024-07-28 23:34:04 +08:00
{
sn_gizmo_move=new SceneNode();
2024-08-29 13:07:02 +08:00
sn_gizmo_move->AttachComponent(render_framework->CreateComponent<MeshComponent>(sphere));
2024-07-28 23:34:04 +08:00
{
Transform tm;
2024-07-28 23:34:04 +08:00
2024-08-05 01:25:49 +08:00
const Vector3f one_scale(1);
const Vector3f square_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
2024-07-30 13:55:44 +08:00
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[2]); //Z 向上圆柱
2024-07-30 13:55:44 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[2]); //Z 向上圆锥
2024-07-30 13:55:44 +08:00
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,square[2]);
2024-07-30 13:55:44 +08:00
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[0]); //X 向右圆柱
2024-07-30 13:55:44 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[0]); //X 向右圆锥
2024-07-30 13:55:44 +08:00
tm.SetScale(square_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,square[0]);
2024-07-30 13:55:44 +08:00
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cylinder[1]); //Y 向前圆柱
2024-07-30 13:55:44 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,cone[1]); //Y 向前圆锥
2024-07-28 23:34:04 +08:00
tm.SetScale(square_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
render_framework->CreateComponent<MeshComponent>(tm.GetMatrix(),sn_gizmo_move,square[1]);
2024-07-30 13:55:44 +08:00
}
}
2024-07-28 23:34:04 +08:00
}
if(!sn_gizmo_move)
return(false);
return(true);
}
VK_NAMESPACE_END