// Copyright (c) 2022 Dominic Masters // // This software is released under the MIT License. // https://opensource.org/licenses/MIT #include "Camera.hpp" #include "game/DawnGame.hpp" using namespace Dawn; Camera::Camera(SceneItem *item) : SceneItemComponent(item) { this->getRenderTarget()->eventRenderTargetResized.addListener( this, &Camera::onRenderTargetResize ); } void Camera::updateProjection() { switch(this->type) { case CAMERA_TYPE_ORTHONOGRAPHIC: this->projection = glm::ortho( this->orthoLeft, this->orthoRight, this->orthoBottom, this->orthoTop, this->clipNear, this->clipFar ); break; case CAMERA_TYPE_PERSPECTIVE: this->projection = glm::perspective( this->fov, this->getAspect(), this->clipNear, this->clipFar ); break; } } RenderTarget * Camera::getRenderTarget() { if(this->target == nullptr) { return this->getGame()->renderManager.getBackBuffer(); } return this->target; } void Camera::setRenderTarget(RenderTarget *renderTarget) { if(renderTarget == this->target) return; this->getRenderTarget()->eventRenderTargetResized.removeListener( this, &Camera::onRenderTargetResize ); this->target = renderTarget; this->getRenderTarget()->eventRenderTargetResized.addListener( this, &Camera::onRenderTargetResize ); this->updateProjection(); this->eventRenderTargetResized.invoke( renderTarget->getWidth(), renderTarget->getHeight() ); } float_t Camera::getAspect() { auto target = this->getRenderTarget(); return target->getWidth() / target->getHeight(); } void Camera::onStart() { this->updateProjection(); } void Camera::onRenderTargetResize(RenderTarget *target, float_t w, float_t h) { this->updateProjection(); this->eventRenderTargetResized.invoke(w, h); } void Camera::onDispose() { this->getRenderTarget()->eventRenderTargetResized.removeListener( this, &Camera::onRenderTargetResize ); }