diff options
Diffstat (limited to 'src/runtimerender/graphobjects/Qt3DSRenderCamera.h')
-rw-r--r-- | src/runtimerender/graphobjects/Qt3DSRenderCamera.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/runtimerender/graphobjects/Qt3DSRenderCamera.h b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h new file mode 100644 index 0000000..be8d53e --- /dev/null +++ b/src/runtimerender/graphobjects/Qt3DSRenderCamera.h @@ -0,0 +1,177 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2012 NVIDIA Corporation. +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt 3D Studio. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#pragma once +#ifndef QT3DS_RENDER_CAMERA_H +#define QT3DS_RENDER_CAMERA_H +#include "Qt3DSRenderNode.h" +#include "Qt3DSRenderRay.h" + +namespace qt3ds { +namespace render { + + struct SCameraGlobalCalculationResult + { + bool m_WasDirty; + bool m_ComputeFrustumSucceeded; + SCameraGlobalCalculationResult(bool inWasDirty, bool inComputeSucceeded = true) + : m_WasDirty(inWasDirty) + , m_ComputeFrustumSucceeded(inComputeSucceeded) + { + } + }; + + struct CameraScaleModes + { + enum Enum { + Fit = 0, + SameSize, + FitHorizontal, + FitVertical, + }; + }; + + struct CameraScaleAnchors + { + enum Enum { + Center = 0, + North, + NorthEast, + East, + SouthEast, + South, + SouthWest, + West, + NorthWest, + }; + }; + + struct SCuboidRect + { + QT3DSF32 m_Left; + QT3DSF32 m_Top; + QT3DSF32 m_Right; + QT3DSF32 m_Bottom; + SCuboidRect(QT3DSF32 l = 0.0f, QT3DSF32 t = 0.0f, QT3DSF32 r = 0.0f, QT3DSF32 b = 0.0f) + : m_Left(l) + , m_Top(t) + , m_Right(r) + , m_Bottom(b) + { + } + void Translate(QT3DSVec2 inTranslation) + { + m_Left += inTranslation.x; + m_Right += inTranslation.x; + m_Top += inTranslation.y; + m_Bottom += inTranslation.y; + } + }; + + struct SCamera : public SNode + { + + // Setting these variables should set dirty on the camera. + QT3DSF32 m_ClipNear; + QT3DSF32 m_ClipFar; + + QT3DSF32 m_FOV; // Radians + bool m_FOVHorizontal; + + QT3DSMat44 m_Projection; + CameraScaleModes::Enum m_ScaleMode; + CameraScaleAnchors::Enum m_ScaleAnchor; + // Record some values from creating the projection matrix + // to use during mouse picking. + QT3DSVec2 m_FrustumScale; + + SCamera(); + + QT3DSMat33 GetLookAtMatrix(const QT3DSVec3 &inUpDir, const QT3DSVec3 &inDirection) const; + // Set our position, rotation member variables based on the lookat target + // Marks this object as dirty. + // Need to test this when the camera's local transform is null. + // Assumes parent's local transform is the identity, meaning our local transform is + // our global transform. + void LookAt(const QT3DSVec3 &inCameraPos, const QT3DSVec3 &inUpDir, const QT3DSVec3 &inTargetPos); + + SCameraGlobalCalculationResult CalculateGlobalVariables(const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions); + bool CalculateProjection(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions); + bool ComputeFrustumOrtho(const NVRenderRectF &inViewport, const QT3DSVec2 &inDesignDimensions); + // Used when rendering the widgets in studio. This scales the widget when in orthographic + // mode in order to have + // constant size on screen regardless. + // Number is always greater than one + QT3DSF32 GetOrthographicScaleFactor(const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions) const; + bool ComputeFrustumPerspective(const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions); + // Text may be scaled so that it doesn't appear pixellated when the camera itself is doing + // the scaling. + QT3DSF32 GetTextScaleFactor(const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions) const; + + void CalculateViewProjectionMatrix(QT3DSMat44 &outMatrix) const; + + // If this is an orthographic camera, the cuboid properties are the distance from the center + // point + // to the left, top, right, and bottom edges of the view frustum in world units. + // If this is a perspective camera, the cuboid properties are the FOV angles + // (left,top,right,bottom) + // of the view frustum. + + // Return a normalized rect that describes the area the camera is rendering to. + // This takes into account the various camera properties (scale mode, scale anchor). + SCuboidRect GetCameraBounds(const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions) const; + + // Setup a camera VP projection for rendering offscreen. + static void SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture, + QT3DSMat44 &outVP); + static void SetupOrthographicCameraForOffscreenRender(NVRenderTexture2D &inTexture, + QT3DSMat44 &outVP, SCamera &outCamera); + + // Unproject a point (x,y) in viewport relative coordinates meaning + // left, bottom is 0,0 and values are increasing right,up respectively. + SRay Unproject(const QT3DSVec2 &inLayerRelativeMouseCoords, const NVRenderRectF &inViewport, + const QT3DSVec2 &inDesignDimensions, bool sceneCameraView = false) const; + + // Unproject a given coordinate to a 3d position that lies on the same camera + // plane as inGlobalPos. + // Expects CalculateGlobalVariables has been called or doesn't need to be. + QT3DSVec3 UnprojectToPosition(const QT3DSVec3 &inGlobalPos, const SRay &inRay) const; + + QT3DSF32 verticalFov(QT3DSF32 aspectRatio) const; + QT3DSF32 verticalFov(const NVRenderRectF &inViewport) const; + }; +} +} + +#endif |