#ifndef GUI_Viewport_h__ #define GUI_Viewport_h__ #include #include "GUI/Frame.h" #include "World.h" #include "Systems/TransformSystem.h" #include "Components/Transform.h" #include "Components/Camera.h" #include "RenderQueue.h" #include "Camera.h" namespace GUI { class Viewport : public Frame { public: Viewport(Frame* parent, std::string name, std::shared_ptr world) : Frame(parent, name) , m_World(world) { } EntityID CameraEntity() const { return m_CameraEntity; } void SetCameraEntity(EntityID cameraEntity) { m_CameraEntity = cameraEntity; auto transformComponent = m_World->GetComponent(cameraEntity); if (!transformComponent) return; auto cameraComponent = m_World->GetComponent(cameraEntity); if (!cameraComponent) return; m_Camera = std::make_shared(cameraComponent->FOV, cameraComponent->NearClip, cameraComponent->FarClip); } void Update(double dt) override { if (!m_TransformSystem) m_TransformSystem = m_World->GetSystem(); auto transformComponent = m_World->GetComponent(m_CameraEntity); if (!transformComponent) return; auto cameraComponent = m_World->GetComponent(m_CameraEntity); if (!cameraComponent) return; Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(m_CameraEntity); m_Camera->SetFOV(cameraComponent->FOV); m_Camera->SetNearClip(cameraComponent->NearClip); m_Camera->SetFarClip(cameraComponent->FarClip); m_Camera->SetPosition(absoluteTransform.Position); m_Camera->SetOrientation(absoluteTransform.Orientation); } void Draw(std::shared_ptr renderer) override { if (!m_Camera) return; renderer->SetCamera(m_Camera); renderer->SetViewport(AbsoluteRectangle()); renderer->DrawWorld(m_Parent->RenderQueue); } private: std::shared_ptr m_World; std::shared_ptr m_TransformSystem; std::shared_ptr m_Camera; EntityID m_CameraEntity; }; } #endif // GUI_Viewport_h__