// qcamera.sip generated by MetaSIP
//
// This file is part of the Qt3DRender Python extension module.
//
// Copyright (c) 2024 Riverbank Computing Limited <info@riverbankcomputing.com>
// 
// This file is part of PyQt6-3D.
// 
// This file may be used under the terms of the GNU General Public License
// version 3.0 as published by the Free Software Foundation and appearing in
// the file LICENSE included in the packaging of this file.  Please review the
// following information to ensure the GNU General Public License version 3.0
// requirements will be met: http://www.gnu.org/copyleft/gpl.html.
// 
// If you do not wish to use this file under the terms of the GPL version 3.0
// then you may purchase a commercial license.  For more information contact
// info@riverbankcomputing.com.
// 
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.


namespace Qt3DRender
{
%TypeHeaderCode
#include <qcamera.h>
%End

    class QCamera : public Qt3DCore::QEntity
    {
%TypeHeaderCode
#include <qcamera.h>
%End

%ConvertToSubClassCode
        static struct class_graph {
            const char *name;
            sipTypeDef **type;
            int yes, no;
        } graph[] = {
            {sipName_Qt3DRender__QAbstractLight, &sipType_Qt3DRender_QAbstractLight, 38, 1},
            {sipName_Qt3DRender__QAbstractRayCaster, &sipType_Qt3DRender_QAbstractRayCaster, 41, 2},
            {sipName_Qt3DRender__QAbstractTexture, &sipType_Qt3DRender_QAbstractTexture, 43, 3},
            {sipName_Qt3DRender__QAbstractTextureImage, &sipType_Qt3DRender_QAbstractTextureImage, 56, 4},
            {sipName_Qt3DRender__QRenderState, &sipType_Qt3DRender_QRenderState, 58, 5},
            {sipName_Qt3DRender__QFrameGraphNode, &sipType_Qt3DRender_QFrameGraphNode, 80, 6},
            {sipName_Qt3DRender__QCamera, &sipType_Qt3DRender_QCamera, -1, 7},
            {sipName_Qt3DRender__QCameraLens, &sipType_Qt3DRender_QCameraLens, -1, 8},
            {sipName_Qt3DRender__QComputeCommand, &sipType_Qt3DRender_QComputeCommand, -1, 9},
            {sipName_Qt3DRender__QEffect, &sipType_Qt3DRender_QEffect, -1, 10},
            {sipName_Qt3DRender__QEnvironmentLight, &sipType_Qt3DRender_QEnvironmentLight, -1, 11},
            {sipName_Qt3DRender__QFilterKey, &sipType_Qt3DRender_QFilterKey, -1, 12},
            {sipName_Qt3DRender__QGeometryRenderer, &sipType_Qt3DRender_QGeometryRenderer, 101, 13},
            {sipName_Qt3DRender__QGraphicsApiFilter, &sipType_Qt3DRender_QGraphicsApiFilter, -1, 14},
            {sipName_Qt3DRender__QLayer, &sipType_Qt3DRender_QLayer, -1, 15},
            {sipName_Qt3DRender__QLevelOfDetail, &sipType_Qt3DRender_QLevelOfDetail, 102, 16},
            {sipName_Qt3DRender__QMaterial, &sipType_Qt3DRender_QMaterial, -1, 17},
            {sipName_Qt3DRender__QObjectPicker, &sipType_Qt3DRender_QObjectPicker, -1, 18},
            {sipName_Qt3DRender__QParameter, &sipType_Qt3DRender_QParameter, -1, 19},
            {sipName_Qt3DRender__QPickEvent, &sipType_Qt3DRender_QPickEvent, 103, 20},
            {sipName_Qt3DRender__QPickingProxy, &sipType_Qt3DRender_QPickingProxy, -1, 21},
            {sipName_Qt3DRender__QPickingSettings, &sipType_Qt3DRender_QPickingSettings, -1, 22},
            {sipName_Qt3DRender__QRenderAspect, &sipType_Qt3DRender_QRenderAspect, -1, 23},
            {sipName_Qt3DRender__QRenderCapabilities, &sipType_Qt3DRender_QRenderCapabilities, -1, 24},
            {sipName_Qt3DRender__QRenderCaptureReply, &sipType_Qt3DRender_QRenderCaptureReply, -1, 25},
            {sipName_Qt3DRender__QRenderPass, &sipType_Qt3DRender_QRenderPass, -1, 26},
            {sipName_Qt3DRender__QRenderSettings, &sipType_Qt3DRender_QRenderSettings, -1, 27},
            {sipName_Qt3DRender__QRenderTarget, &sipType_Qt3DRender_QRenderTarget, -1, 28},
            {sipName_Qt3DRender__QRenderTargetOutput, &sipType_Qt3DRender_QRenderTargetOutput, -1, 29},
            {sipName_Qt3DRender__QSceneLoader, &sipType_Qt3DRender_QSceneLoader, -1, 30},
            {sipName_Qt3DRender__QShaderData, &sipType_Qt3DRender_QShaderData, -1, 31},
            {sipName_Qt3DRender__QShaderImage, &sipType_Qt3DRender_QShaderImage, -1, 32},
            {sipName_Qt3DRender__QShaderProgram, &sipType_Qt3DRender_QShaderProgram, -1, 33},
            {sipName_Qt3DRender__QShaderProgramBuilder, &sipType_Qt3DRender_QShaderProgramBuilder, -1, 34},
            {sipName_Qt3DRender__QStencilOperationArguments, &sipType_Qt3DRender_QStencilOperationArguments, -1, 35},
            {sipName_Qt3DRender__QStencilTestArguments, &sipType_Qt3DRender_QStencilTestArguments, -1, 36},
            {sipName_Qt3DRender__QTechnique, &sipType_Qt3DRender_QTechnique, -1, 37},
            {sipName_Qt3DRender__QTextureWrapMode, &sipType_Qt3DRender_QTextureWrapMode, -1, -1},
            {sipName_Qt3DRender__QDirectionalLight, &sipType_Qt3DRender_QDirectionalLight, -1, 39},
            {sipName_Qt3DRender__QPointLight, &sipType_Qt3DRender_QPointLight, -1, 40},
            {sipName_Qt3DRender__QSpotLight, &sipType_Qt3DRender_QSpotLight, -1, -1},
            {sipName_Qt3DRender__QRayCaster, &sipType_Qt3DRender_QRayCaster, -1, 42},
            {sipName_Qt3DRender__QScreenRayCaster, &sipType_Qt3DRender_QScreenRayCaster, -1, -1},
            {sipName_Qt3DRender__QSharedGLTexture, &sipType_Qt3DRender_QSharedGLTexture, -1, 44},
            {sipName_Qt3DRender__QTexture1D, &sipType_Qt3DRender_QTexture1D, -1, 45},
            {sipName_Qt3DRender__QTexture1DArray, &sipType_Qt3DRender_QTexture1DArray, -1, 46},
            {sipName_Qt3DRender__QTexture2D, &sipType_Qt3DRender_QTexture2D, -1, 47},
            {sipName_Qt3DRender__QTexture2DArray, &sipType_Qt3DRender_QTexture2DArray, -1, 48},
            {sipName_Qt3DRender__QTexture2DMultisample, &sipType_Qt3DRender_QTexture2DMultisample, -1, 49},
            {sipName_Qt3DRender__QTexture2DMultisampleArray, &sipType_Qt3DRender_QTexture2DMultisampleArray, -1, 50},
            {sipName_Qt3DRender__QTexture3D, &sipType_Qt3DRender_QTexture3D, -1, 51},
            {sipName_Qt3DRender__QTextureBuffer, &sipType_Qt3DRender_QTextureBuffer, -1, 52},
            {sipName_Qt3DRender__QTextureCubeMap, &sipType_Qt3DRender_QTextureCubeMap, -1, 53},
            {sipName_Qt3DRender__QTextureCubeMapArray, &sipType_Qt3DRender_QTextureCubeMapArray, -1, 54},
            {sipName_Qt3DRender__QTextureLoader, &sipType_Qt3DRender_QTextureLoader, -1, 55},
            {sipName_Qt3DRender__QTextureRectangle, &sipType_Qt3DRender_QTextureRectangle, -1, -1},
            {sipName_Qt3DRender__QPaintedTextureImage, &sipType_Qt3DRender_QPaintedTextureImage, -1, 57},
            {sipName_Qt3DRender__QTextureImage, &sipType_Qt3DRender_QTextureImage, -1, -1},
            {sipName_Qt3DRender__QAlphaCoverage, &sipType_Qt3DRender_QAlphaCoverage, -1, 59},
            {sipName_Qt3DRender__QAlphaTest, &sipType_Qt3DRender_QAlphaTest, -1, 60},
            {sipName_Qt3DRender__QBlendEquation, &sipType_Qt3DRender_QBlendEquation, -1, 61},
            {sipName_Qt3DRender__QBlendEquationArguments, &sipType_Qt3DRender_QBlendEquationArguments, -1, 62},
            {sipName_Qt3DRender__QClipPlane, &sipType_Qt3DRender_QClipPlane, -1, 63},
            {sipName_Qt3DRender__QColorMask, &sipType_Qt3DRender_QColorMask, -1, 64},
            {sipName_Qt3DRender__QCullFace, &sipType_Qt3DRender_QCullFace, -1, 65},
            {sipName_Qt3DRender__QDepthRange, &sipType_Qt3DRender_QDepthRange, -1, 66},
            {sipName_Qt3DRender__QDepthTest, &sipType_Qt3DRender_QDepthTest, -1, 67},
            {sipName_Qt3DRender__QDithering, &sipType_Qt3DRender_QDithering, -1, 68},
            {sipName_Qt3DRender__QFrontFace, &sipType_Qt3DRender_QFrontFace, -1, 69},
            {sipName_Qt3DRender__QLineWidth, &sipType_Qt3DRender_QLineWidth, -1, 70},
            {sipName_Qt3DRender__QMultiSampleAntiAliasing, &sipType_Qt3DRender_QMultiSampleAntiAliasing, -1, 71},
            {sipName_Qt3DRender__QNoDepthMask, &sipType_Qt3DRender_QNoDepthMask, -1, 72},
            {sipName_Qt3DRender__QPointSize, &sipType_Qt3DRender_QPointSize, -1, 73},
            {sipName_Qt3DRender__QPolygonOffset, &sipType_Qt3DRender_QPolygonOffset, -1, 74},
            {sipName_Qt3DRender__QRasterMode, &sipType_Qt3DRender_QRasterMode, -1, 75},
            {sipName_Qt3DRender__QScissorTest, &sipType_Qt3DRender_QScissorTest, -1, 76},
            {sipName_Qt3DRender__QSeamlessCubemap, &sipType_Qt3DRender_QSeamlessCubemap, -1, 77},
            {sipName_Qt3DRender__QStencilMask, &sipType_Qt3DRender_QStencilMask, -1, 78},
            {sipName_Qt3DRender__QStencilOperation, &sipType_Qt3DRender_QStencilOperation, -1, 79},
            {sipName_Qt3DRender__QStencilTest, &sipType_Qt3DRender_QStencilTest, -1, -1},
            {sipName_Qt3DRender__QBlitFramebuffer, &sipType_Qt3DRender_QBlitFramebuffer, -1, 81},
            {sipName_Qt3DRender__QCameraSelector, &sipType_Qt3DRender_QCameraSelector, -1, 82},
            {sipName_Qt3DRender__QClearBuffers, &sipType_Qt3DRender_QClearBuffers, -1, 83},
            {sipName_Qt3DRender__QDispatchCompute, &sipType_Qt3DRender_QDispatchCompute, -1, 84},
            {sipName_Qt3DRender__QFrustumCulling, &sipType_Qt3DRender_QFrustumCulling, -1, 85},
            {sipName_Qt3DRender__QLayerFilter, &sipType_Qt3DRender_QLayerFilter, -1, 86},
            {sipName_Qt3DRender__QMemoryBarrier, &sipType_Qt3DRender_QMemoryBarrier, -1, 87},
            {sipName_Qt3DRender__QNoDraw, &sipType_Qt3DRender_QNoDraw, -1, 88},
            {sipName_Qt3DRender__QNoPicking, &sipType_Qt3DRender_QNoPicking, -1, 89},
            {sipName_Qt3DRender__QProximityFilter, &sipType_Qt3DRender_QProximityFilter, -1, 90},
            {sipName_Qt3DRender__QRenderCapture, &sipType_Qt3DRender_QRenderCapture, -1, 91},
            {sipName_Qt3DRender__QRenderPassFilter, &sipType_Qt3DRender_QRenderPassFilter, -1, 92},
            {sipName_Qt3DRender__QRenderStateSet, &sipType_Qt3DRender_QRenderStateSet, -1, 93},
            {sipName_Qt3DRender__QRenderSurfaceSelector, &sipType_Qt3DRender_QRenderSurfaceSelector, -1, 94},
            {sipName_Qt3DRender__QRenderTargetSelector, &sipType_Qt3DRender_QRenderTargetSelector, -1, 95},
            {sipName_Qt3DRender__QSetFence, &sipType_Qt3DRender_QSetFence, -1, 96},
            {sipName_Qt3DRender__QSortPolicy, &sipType_Qt3DRender_QSortPolicy, -1, 97},
            {sipName_Qt3DRender__QSubtreeEnabler, &sipType_Qt3DRender_QSubtreeEnabler, -1, 98},
            {sipName_Qt3DRender__QTechniqueFilter, &sipType_Qt3DRender_QTechniqueFilter, -1, 99},
            {sipName_Qt3DRender__QViewport, &sipType_Qt3DRender_QViewport, -1, 100},
            {sipName_Qt3DRender__QWaitFence, &sipType_Qt3DRender_QWaitFence, -1, -1},
            {sipName_Qt3DRender__QMesh, &sipType_Qt3DRender_QMesh, -1, -1},
            {sipName_Qt3DRender__QLevelOfDetailSwitch, &sipType_Qt3DRender_QLevelOfDetailSwitch, -1, -1},
            {sipName_Qt3DRender__QPickLineEvent, &sipType_Qt3DRender_QPickLineEvent, -1, 104},
            {sipName_Qt3DRender__QPickPointEvent, &sipType_Qt3DRender_QPickPointEvent, -1, 105},
            {sipName_Qt3DRender__QPickTriangleEvent, &sipType_Qt3DRender_QPickTriangleEvent, -1, -1},
        };
        
        int i = 0;
        
        sipType = NULL;
        
        do
        {
            struct class_graph *cg = &graph[i];
        
            if (cg->name != NULL && sipCpp->inherits(cg->name))
            {
                sipType = *cg->type;
                i = cg->yes;
            }
            else
                i = cg->no;
        }
        while (i >= 0);
%End

    public:
        explicit QCamera(Qt3DCore::QNode *parent /TransferThis/ = 0);
        virtual ~QCamera();

        enum CameraTranslationOption
        {
            TranslateViewCenter,
            DontTranslateViewCenter,
        };

        Qt3DRender::QCameraLens *lens() const;
        Qt3DCore::QTransform *transform() const;
        QQuaternion tiltRotation(float angle) const;
        QQuaternion panRotation(float angle) const;
        QQuaternion rollRotation(float angle) const;
        QQuaternion rotation(float angle, const QVector3D &axis) const;
        void translate(const QVector3D &vLocal, Qt3DRender::QCamera::CameraTranslationOption option = Qt3DRender::QCamera::TranslateViewCenter);
        void translateWorld(const QVector3D &vWorld, Qt3DRender::QCamera::CameraTranslationOption option = Qt3DRender::QCamera::TranslateViewCenter);
        void tilt(float angle);
        void pan(float angle);
        void pan(float angle, const QVector3D &axis);
        void roll(float angle);
        void tiltAboutViewCenter(float angle);
        void panAboutViewCenter(float angle);
        void panAboutViewCenter(float angle, const QVector3D &axis);
        void rollAboutViewCenter(float angle);
        void rotate(const QQuaternion &q);
        void rotateAboutViewCenter(const QQuaternion &q);
        Qt3DRender::QCameraLens::ProjectionType projectionType() const;
        float nearPlane() const;
        float farPlane() const;
        float fieldOfView() const;
        float aspectRatio() const;
        float left() const;
        float right() const;
        float bottom() const;
        float top() const;
        QMatrix4x4 projectionMatrix() const;
        QVector3D position() const;
        QVector3D upVector() const;
        QVector3D viewCenter() const;
        QVector3D viewVector() const;
        QMatrix4x4 viewMatrix() const;

    public slots:
        void setProjectionType(Qt3DRender::QCameraLens::ProjectionType type);
        void setNearPlane(float nearPlane);
        void setFarPlane(float farPlane);
        void setFieldOfView(float fieldOfView);
        void setAspectRatio(float aspectRatio);
        void setLeft(float left);
        void setRight(float right);
        void setBottom(float bottom);
        void setTop(float top);
        void setProjectionMatrix(const QMatrix4x4 &projectionMatrix);
        void setPosition(const QVector3D &position);
        void setUpVector(const QVector3D &upVector);
        void setViewCenter(const QVector3D &viewCenter);

    signals:
        void projectionTypeChanged(Qt3DRender::QCameraLens::ProjectionType projectionType /ScopesStripped=1/);
        void nearPlaneChanged(float nearPlane);
        void farPlaneChanged(float farPlane);
        void fieldOfViewChanged(float fieldOfView);
        void aspectRatioChanged(float aspectRatio);
        void leftChanged(float left);
        void rightChanged(float right);
        void bottomChanged(float bottom);
        void topChanged(float top);
        void projectionMatrixChanged(const QMatrix4x4 &projectionMatrix);
        void positionChanged(const QVector3D &position);
        void upVectorChanged(const QVector3D &upVector);
        void viewCenterChanged(const QVector3D &viewCenter);
        void viewVectorChanged(const QVector3D &viewVector);
        void viewMatrixChanged();

    public:
        float exposure() const;

    public slots:
        void setExposure(float exposure);

    signals:
        void exposureChanged(float exposure);

    public slots:
        void viewAll();
        void viewSphere(const QVector3D &center, float radius);
        void viewEntity(Qt3DCore::QEntity *entity);
    };
};
