직교투영 카메라를 사용해서 버튼만들기
#pragma once
#include "Component.h"
class Button : public Component
{
using Super = Component;
public:
Button();
virtual ~Button();
bool Picked(POINT screenPos);
void Create(Vec2 screenPos, Vec2 size, shared_ptr<class Material> material);
void AddOnClinckedEvent(std::function<void(void)> func);
void InvokeOnClicked();
private:
std::function<void(void)> _onClicked;
RECT _rect;
};
#include "pch.h"
#include "Button.h"
#include "Material.h"
#include "MeshRenderer.h"
Button::Button() : Component(ComponentType::Button) {}
Button::~Button() {}
bool Button::Picked(POINT screenPos)
{
return ::PtInRect(&_rect, screenPos);
}
void Button::Create(Vec2 screenPos, Vec2 size, shared_ptr<class Material> material)
{
auto gameObject = _gameObject.lock();
float height = GRAPHICS->GetViewport().GetHeight();
float width = GRAPHICS->GetViewport().GetWidth();
float x = screenPos.x - width / 2;
float y = height / 2 - screenPos.y;
Vec3 position = Vec3(x, y, 0);
gameObject->GetOrAddTransform()->SetPosition(position);
gameObject->GetOrAddTransform()->SetScale(Vec3(size.x, size.y, 1));
gameObject->SetLayerIndex(Layer_UI);
if (gameObject->GetMeshRenderer() == nullptr)
gameObject->AddComponent(make_shared<MeshRenderer>());
gameObject->GetMeshRenderer()->SetMaterial(material);
auto mesh = RESOURCES->Get<Mesh>(L"Quad");
gameObject->GetMeshRenderer()->SetMesh(mesh);
gameObject->GetMeshRenderer()->SetPass(0);
// Picking
_rect.left = screenPos.x - size.x / 2;
_rect.right = screenPos.x + size.x / 2;
_rect.top = screenPos.y - size.y / 2;
_rect.bottom = screenPos.y + size.y / 2;
}
void Button::AddOnClinckedEvent(std::function<void(void)> func)
{
_onClicked = func;
}
void Button::InvokeOnClicked()
{
if (_onClicked)
_onClicked();
}
void Scene::PickUI()
{
if (INPUT->GetButtonDown(KEY_TYPE::LBUTTON) == false)
return;
if (GetUICamera() == nullptr)
return;
POINT screenPt = INPUT->GetMousePos();
shared_ptr<Camera> camera = GetUICamera()->GetCamera();
const auto gameObjects = GetObjects();
for (auto& gameObject : gameObjects)
{
if (gameObject->GetButton() == nullptr)
continue;
if (gameObject->GetButton()->Picked(screenPt))
gameObject->GetButton()->InvokeOnClicked();
}
}
// Mesh 버튼 형식
{
auto obj = make_shared<GameObject>();
obj->AddComponent(make_shared<Button>());
obj->GetButton()->Create(Vec2(100, 100), Vec2(100, 100), RESOURCES->Get<Material>(L"Veigar"));
//obj->GetOrAddTransform()->SetLocalPosition(Vec3(0.f, 200.f, 0.f));
//obj->GetOrAddTransform()->SetScale(Vec3(200.f));
//obj->AddComponent(make_shared<MeshRenderer>());
//
//obj->SetLayerIndex(Layer_UI);
//{
// obj->GetMeshRenderer()->SetMaterial(RESOURCES->Get<Material>(L"Veigar"));
//}
//{
// auto mesh = RESOURCES->Get<Mesh>(L"Quad");
// obj->GetMeshRenderer()->SetMesh(mesh);
// obj->GetMeshRenderer()->SetPass(0);
//}
obj->GetButton()->AddOnClickedEvent([obj]() { CUR_SCENE->Remove(obj); });
CUR_SCENE->Add(obj);
}
