ULRE/example/Gizmo/Gizmo3DScale.cpp

153 lines
4.1 KiB
C++
Raw Normal View History

2024-07-30 23:54:25 +08:00
/*
Gizmo move
ref: Blender 4
0 9-10
*----------------->>>>
|
|
| 5+
| +6
|
|
v
10
22
15,5
1
*/
#include"GizmoResource.h"
#include<hgl/graph/SceneNode.h>
2024-07-30 23:54:25 +08:00
#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 *center_cube=GetGizmoRenderable(GizmoShape::Cube,GizmoColor::White);
2024-07-30 23:54:25 +08:00
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),
};
2024-08-30 00:38:40 +08:00
Renderable *square[3]=
2024-07-30 23:54:25 +08:00
{
2024-08-30 00:38:40 +08:00
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Red),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Green),
GetGizmoRenderable(GizmoShape::Square,GizmoColor::Blue)
2024-07-30 23:54:25 +08:00
};
if(!center_cube)
2024-07-30 23:54:25 +08:00
return(false);
for(int i=0;i<3;i++)
{
if(!cylinder[i])
return(false);
if(!cube[i])
return(false);
2024-08-30 00:38:40 +08:00
if(!square[i])
2024-07-30 23:54:25 +08:00
return(false);
}
{
SceneNode *root_node=new SceneNode();
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(scale(GIZMO_CENTER_SPHERE_RADIUS*2),center_cube));
2024-07-30 23:54:25 +08:00
{
Transform tm;
const Vector3f one_scale(1);
2024-08-05 01:25:49 +08:00
const Vector3f plane_scale(2);
const Vector3f cylinder_scale(GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_RADIUS,GIZMO_CYLINDER_HALF_LENGTH);
2024-07-30 23:54:25 +08:00
{
tm.SetScale(cylinder_scale);
tm.SetTranslation(0,0,GIZMO_CYLINDER_OFFSET);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cylinder[2])); //Z 向上圆柱
2024-07-30 23:54:25 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(0,0,GIZMO_CONE_OFFSET);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cube[2])); //Z 向上圆锥
2024-07-30 23:54:25 +08:00
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET,0);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,square[2]));
2024-07-30 23:54:25 +08:00
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::Y,90);
tm.SetTranslation(GIZMO_CYLINDER_OFFSET,0,0);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cylinder[0])); //X 向右圆柱
2024-07-30 23:54:25 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(GIZMO_CONE_OFFSET,0,0);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cube[0])); //X 向右圆锥
2024-07-30 23:54:25 +08:00
tm.SetScale(plane_scale);
tm.SetTranslation(0,GIZMO_TWO_AXIS_OFFSET,GIZMO_TWO_AXIS_OFFSET);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,square[0]));
2024-07-30 23:54:25 +08:00
}
{
tm.SetScale(cylinder_scale);
tm.SetRotation(AxisVector::X,-90);
tm.SetTranslation(0,GIZMO_CYLINDER_OFFSET,0);
2024-07-30 23:54:25 +08:00
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cylinder[1])); //Y 向前圆柱
2024-07-30 23:54:25 +08:00
tm.SetScale(one_scale);
tm.SetTranslation(0,GIZMO_CONE_OFFSET,0);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,cube[1])); //Y 向前圆锥
2024-07-30 23:54:25 +08:00
tm.SetScale(plane_scale);
tm.SetTranslation(GIZMO_TWO_AXIS_OFFSET,0,GIZMO_TWO_AXIS_OFFSET);
2024-10-06 14:51:38 +08:00
root_node->Add(new SceneNode(tm,square[1]));
2024-07-30 23:54:25 +08:00
}
}
sm_gizmo_scale=CreateGizmoStaticMesh(root_node);
}
if(!sm_gizmo_scale)
return(false);
return(true);
}
VK_NAMESPACE_END