ULRE/example/Gizmo/GizmoTest.cpp

164 lines
4.0 KiB
C++
Raw Normal View History

2024-07-01 23:31:18 +08:00
#include"VulkanAppFramework.h"
#include"Gizmo.h"
#include<hgl/graph/TransformFaceToCamera.h>
#include<hgl/graph/Ray.h>
2024-07-01 23:31:18 +08:00
using namespace hgl;
using namespace hgl::graph;
const Vector3f GizmoPosition(0,0,0);
2024-08-29 13:07:02 +08:00
///**
//* 一种永远转向正面的变换节点
2024-08-29 13:07:02 +08:00
//*/
//class TransformBillboard:public TransformBase
2024-08-29 13:07:02 +08:00
//{
// CameraInfo *camera_info=nullptr;
// bool face_to_camera=false;
//
// ViewportInfo *viewport_info=nullptr;
// float fixed_scale=1.0;
//
//public:
//
// virtual void SetCameraInfo (CameraInfo * ci ){camera_info =ci;}
// virtual void SetViewportInfo(ViewportInfo * vi ){viewport_info =vi;}
//
// virtual void SetFaceToCamera(bool ftc ){face_to_camera=ftc;}
// virtual void SetFixedScale (const float size){fixed_scale =size;}
//
// virtual bool RefreshTransform(const Transform &tf=IdentityTransform) override
// {
// if(!camera_info)
// {
// return SceneNode::RefreshTransform(tf);
// }
//
// if(face_to_camera)
// {
// LocalTransform.SetRotation(CalculateFacingRotationQuat(GetWorldPosition(),camera_info->view,AxisVector::X));
// }
//
// if(viewport_info)
// {
// const float screen_height=viewport_info->GetViewportHeight();
//
// const Vector4f pos=camera_info->Project(GetWorldPosition());
//
// LocalTransform.SetScale(pos.w*fixed_scale/screen_height);
// }
//
// return SceneNode::RefreshTransform(tf);
// }
//};//class BillboardSceneNode:public SceneNode
2024-07-01 23:31:18 +08:00
class TestApp:public SceneAppFramework
{
2024-07-31 00:11:24 +08:00
SceneNode root;
SceneNode *rotate_white_torus=nullptr;
2024-07-31 00:11:24 +08:00
2024-07-30 23:54:25 +08:00
StaticMesh *sm_move=nullptr;
StaticMesh *sm_rotate=nullptr;
StaticMesh *sm_scale=nullptr;
Renderable *face_torus=nullptr;
2024-07-01 23:31:18 +08:00
private:
bool InitGizmo()
{
if(!InitGizmoResource(db))
2024-07-01 23:31:18 +08:00
return(false);
2024-07-30 23:54:25 +08:00
sm_move =GetGizmoMoveStaticMesh();
sm_rotate =GetGizmoRotateStaticMesh();
sm_scale =GetGizmoScaleStaticMesh();
face_torus =GetGizmoRenderable(GizmoShape::Torus,GizmoColor::White);
2024-07-01 23:31:18 +08:00
return(true);
}
void InitGizmoSceneTree()
{
camera_control->Refresh();
CameraInfo *ci=camera_control->GetCameraInfo();
root.Clear();
root.CreateSubNode(sm_move->GetScene());
root.CreateSubNode(sm_rotate->GetScene());
//root.CreateSubNode(sm_scale->GetScene());
{
rotate_white_torus=new SceneNode(scale(13),face_torus);
rotate_white_torus->SetLocalNormal(AxisVector::X);
TransformFaceToCamera *rotate_white_torus_tfc=new TransformFaceToCamera(ci);
rotate_white_torus->GetTransform().AddTransform(rotate_white_torus_tfc);
root.AddSubNode(rotate_white_torus);
}
2024-08-29 13:07:02 +08:00
root.RefreshMatrix();
render_list->SetCamera(ci);
render_list->Expend(&root);
}
2024-07-01 23:31:18 +08:00
public:
2024-07-01 23:31:18 +08:00
bool Init(uint w,uint h)
{
if(!SceneAppFramework::Init(w,h))
return(false);
if(!InitGizmo())
return(false);
InitGizmoSceneTree();
camera->pos=Vector3f(32,32,32);
camera_control->SetTarget(Vector3f(0,0,0));
return(true);
}
~TestApp()
{
FreeGizmoResource();
}
void BuildCommandBuffer(uint32 index) override
{
camera_control->Refresh();
const CameraInfo *ci=camera_control->GetCameraInfo();
const ViewportInfo *vi=GetViewportInfo();
const float screen_height=vi->GetViewportHeight();
const Vector4f pos=ci->Project(GizmoPosition);
//{
// Transform tm;
// tm.SetScale(pos.w*16.0f/screen_height);
// root.SetLocalTransform(tm);
//}
root.RefreshMatrix();
render_list->UpdateLocalToWorld();
2024-07-01 23:31:18 +08:00
SceneAppFramework::BuildCommandBuffer(index);
2024-07-01 23:31:18 +08:00
}
};//class TestApp:public SceneAppFramework
int main(int,char **)
{
2024-07-31 00:11:24 +08:00
return RunApp<TestApp>(1024,1024);
2024-07-01 23:31:18 +08:00
}