whoa/src/ui/game/CGWorldFrame.cpp
fallenoak af4b798942
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
feat(ui): call CWorld::Update from CGWorldFrame::OnWorldUpdate
2026-02-21 21:42:41 -06:00

113 lines
3.0 KiB
C++

#include "ui/game/CGWorldFrame.hpp"
#include "gx/Coordinate.hpp"
#include "gx/Shader.hpp"
#include "gx/Transform.hpp"
#include "object/Client.hpp"
#include "ui/game/CGCamera.hpp"
#include "ui/game/PlayerName.hpp"
#include "world/World.hpp"
#include <storm/Memory.hpp>
#include <tempest/Matrix.hpp>
CSimpleFrame* CGWorldFrame::Create(CSimpleFrame* parent) {
// TODO use CDataAllocator
return STORM_NEW(CGWorldFrame)(parent);
}
void CGWorldFrame::RenderWorld(void* param) {
auto frame = reinterpret_cast<CGWorldFrame*>(param);
C44Matrix savedProj;
GxXformProjection(savedProj);
C44Matrix savedView;
GxXformView(savedView);
frame->OnWorldUpdate();
PlayerNameUpdateWorldText();
frame->OnWorldRender();
PlayerNameRenderWorldText();
GxXformSetProjection(savedProj);
GxXformSetView(savedView);
CShaderEffect::UpdateProjMatrix();
}
CGWorldFrame::CGWorldFrame(CSimpleFrame* parent) : CSimpleFrame(parent) {
// TODO
CGWorldFrame::s_currentWorldFrame = this;
// TODO
this->SetFrameStrata(FRAME_STRATA_WORLD);
this->EnableEvent(SIMPLE_EVENT_KEY, -1);
this->EnableEvent(SIMPLE_EVENT_MOUSE, -1);
this->EnableEvent(SIMPLE_EVENT_MOUSEWHEEL, -1);
// TODO
this->m_camera = STORM_NEW(CGCamera);
// TODO
}
void CGWorldFrame::OnFrameRender(CRenderBatch* batch, uint32_t layer) {
this->CSimpleFrame::OnFrameRender(batch, layer);
if (layer == DRAWLAYER_BACKGROUND) {
batch->QueueCallback(&CGWorldFrame::RenderWorld, this);
}
}
void CGWorldFrame::OnFrameSizeChanged(const CRect& rect) {
this->CSimpleFrame::OnFrameSizeChanged(rect);
// Screen rect (DDC)
this->m_screenRect.minX = std::max(this->m_rect.minX, 0.0f);
this->m_screenRect.minY = std::max(this->m_rect.minY, 0.0f);
this->m_screenRect.maxX = std::min(this->m_rect.maxX, NDCToDDCWidth(1.0f));
this->m_screenRect.maxY = std::min(this->m_rect.maxY, NDCToDDCHeight(1.0f));
// Camera aspect ratio
if (this->m_camera) {
this->m_camera->SetScreenAspect(this->m_screenRect);
}
// Viewport (NDC)
DDCToNDC(this->m_rect.minX, this->m_rect.minY, &this->m_viewport.minX, &this->m_viewport.minY);
DDCToNDC(this->m_rect.maxX, this->m_rect.maxY, &this->m_viewport.maxX, &this->m_viewport.maxY);
this->m_viewport.minX = std::max(this->m_viewport.minX, 0.0f);
this->m_viewport.minY = std::max(this->m_viewport.minY, 0.0f);
this->m_viewport.maxX = std::min(this->m_viewport.maxX, 1.0f);
this->m_viewport.maxY = std::min(this->m_viewport.maxY, 1.0f);
}
void CGWorldFrame::OnWorldRender() {
// TODO
}
void CGWorldFrame::OnWorldUpdate() {
// TODO
auto target = ClntObjMgrObjectPtr(this->m_camera->GetTarget(), TYPE_OBJECT, __FILE__, __LINE__);
// TODO
this->m_camera->SetupWorldProjection(this->m_screenRect);
// TODO
auto targetPos = target && !this->m_camera->HasModel()
? target->GetPosition()
: this->m_camera->Position();
CWorld::Update(this->m_camera->Position(), this->m_camera->Target(), targetPos);
// TODO
}