// // Created by Administrator on 2015-09-16. // #ifndef DAYDREAM_VIEWPORT_H #define DAYDREAM_VIEWPORT_H #include #include "GUI/Frame.h" #include "Core/World.h" #include "Transform/TransformSystem.h" #include "Core/CTransform.h" #include "Rendering/CCamera.h" #include "Core/RenderQueue.h" #include "Core/Camera.h" namespace dd { 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_FrameCamera = 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; dd::Components::Transform absoluteTransform = m_TransformSystem->AbsoluteTransform(m_CameraEntity); m_FrameCamera->SetFOV(cameraComponent->FOV); m_FrameCamera->SetNearClip(cameraComponent->NearClip); m_FrameCamera->SetFarClip(cameraComponent->FarClip); m_FrameCamera->SetPosition(absoluteTransform.Position); m_FrameCamera->SetOrientation(absoluteTransform.Orientation); } void Draw(std::shared_ptr renderer) override { if (!m_FrameCamera) return; renderer->SetCamera(m_FrameCamera); renderer->SetViewport(AbsoluteRectangle()); renderer->DrawWorld(m_Parent->RenderQueue); } private: std::shared_ptr m_World; std::shared_ptr m_TransformSystem; std::shared_ptr m_FrameCamera; EntityID m_CameraEntity; }; } #endif //DAYDREAM_VIEWPORT_H