#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 #include CSimpleFrame* CGWorldFrame::Create(CSimpleFrame* parent) { // TODO use CDataAllocator return STORM_NEW(CGWorldFrame)(parent); } void CGWorldFrame::RenderWorld(void* param) { auto frame = reinterpret_cast(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 }