2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-12-09 00:27:42 +00:00

Bug fixes and CGuiFrame mouse events

This commit is contained in:
Jack Andersen
2019-01-19 20:43:11 -10:00
parent 851e113dc0
commit 47c6b5cba8
21 changed files with 118 additions and 46 deletions

View File

@@ -9,6 +9,7 @@
#include "zeus/CColor.hpp"
#include "CSimplePool.hpp"
#include "Graphics/CModel.hpp"
#include "CGuiWidgetDrawParms.hpp"
namespace urde {
@@ -140,6 +141,16 @@ void CGuiFrame::Draw(const CGuiWidgetDrawParms& parms) const {
CGraphics::SetCullMode(ERglCullMode::Front);
}
CGuiWidget* CGuiFrame::BestCursorHit(const zeus::CVector2f& point, const CGuiWidgetDrawParms& parms) const {
x14_camera->Draw(parms);
zeus::CMatrix4f vp = CGraphics::GetPerspectiveProjectionMatrix(false) * CGraphics::g_CameraMatrix.toMatrix4f();
CGuiWidget* ret = nullptr;
for (const auto& widget : x2c_widgets)
if (widget->GetMouseActive() && widget->TestCursorHit(vp, point))
ret = widget.get();
return ret;
}
void CGuiFrame::Initialize() {
SortDrawOrder();
xc_headWidget->SetColor(xc_headWidget->xa4_color);
@@ -168,6 +179,28 @@ void CGuiFrame::LoadWidgetsInGame(CInputStream& in, CSimplePool* sp) {
}
void CGuiFrame::ProcessUserInput(const CFinalInput& input) const {
if (const auto& kbm = input.GetKBM()) {
zeus::CVector2f point(kbm->m_mouseCoord.norm[0] * 2.f - 1.f,
kbm->m_mouseCoord.norm[1] * 2.f - 1.f);
CGuiWidget* hit = BestCursorHit(point, {});
if (!m_inMouseDown && kbm->m_mouseButtons[int(boo::EMouseButton::Primary)]) {
m_inMouseDown = true;
m_mouseDownWidget = hit;
if (m_mouseDownCb)
m_mouseDownCb(hit);
} else if (m_inMouseDown && !kbm->m_mouseButtons[int(boo::EMouseButton::Primary)]) {
m_inMouseDown = false;
if (m_mouseUpCb)
m_mouseUpCb(m_mouseDownWidget);
}
if (hit != m_lastMouseOverWidget) {
if (m_inMouseDown)
hit = nullptr;
if (m_mouseOverChangeCb)
m_mouseOverChangeCb(m_lastMouseOverWidget, hit);
m_lastMouseOverWidget = hit;
}
}
if (input.ControllerIdx() != 0)
return;
for (auto& widget : x2c_widgets) {