/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ // Original file Copyright Crytek GMBH or its affiliates, used under license. #ifndef CRYINCLUDE_EDITOR_2DVIEWPORT_H #define CRYINCLUDE_EDITOR_2DVIEWPORT_H #pragma once #include "Viewport.h" #include "Objects/DisplayContext.h" class QMenu; /** 2D Viewport used mostly for indoor editing, Front/Top/Left viewports. */ class Q2DViewport : public QtViewport { Q_OBJECT public: enum ViewMode { NothingMode = 0, ScrollZoomMode, }; Q2DViewport(QWidget* parent = nullptr); virtual ~Q2DViewport(); virtual void SetType(EViewportType type); virtual EViewportType GetType() const { return m_viewType; } virtual float GetAspectRatio() const { return 1.0f; }; virtual void ResetContent(); virtual void UpdateContent(int flags); public slots: // Called every frame to update viewport. virtual void Update(); public: //! Map world space position to viewport position. virtual QPoint WorldToView(const Vec3& wp) const; virtual QPoint WorldToViewParticleEditor(const Vec3& wp, int width, int height) const; //Eric@conffx //! Map viewport position to world space position. virtual Vec3 ViewToWorld(const QPoint& vp, bool* collideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override; //! Map viewport position to world space ray from camera. virtual void ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const; void OnTitleMenu(QMenu* menu) override; virtual bool HitTest(const QPoint& point, HitContext& hitInfo) override; virtual bool IsBoundsVisible(const AABB& box) const; // ovverided from CViewport. float GetScreenScaleFactor(const Vec3& worldPoint) const override; float GetScreenScaleFactor(const CCamera& camera, const Vec3& object_position) override { return 1; } //Eric@conffx // Overrided from CViewport. void OnDragSelectRectangle(const QRect &rect, bool bNormalizeRect = false) override; void CenterOnSelection() override; void CenterOnAABB(const AABB& aabb) override; /** Get 2D viewports origin. */ Vec3 GetOrigin2D() const; /** Assign 2D viewports origin. */ void SetOrigin2D(const Vec3& org); void SetShowViewMarker(bool bEnable) { m_bShowViewMarker = bEnable; } void SetShowGrid(bool bShowGrid) { m_bShowGrid = bShowGrid; } bool GetShowGrid() const { return m_bShowGrid; }; void SetShowObjectsInfo(bool bShowObjectsInfo) { m_bShowObjectsInfo = bShowObjectsInfo; } bool GetShowObjectsInfo() const { return m_bShowObjectsInfo; } void SetGridLines(bool bShowMinor, bool bShowMajor) { m_bShowMinorGridLines = bShowMinor; m_bShowMajorGridLines = bShowMajor; } void SetGridLineNumbers(bool bShowNumbers) { m_bShowNumbers = bShowNumbers; } void SetAutoAdjust(bool bAuto) { m_bAutoAdjustGrids = bAuto; } protected: enum EViewportAxis { VPA_XY, VPA_XZ, VPA_YZ, VPA_YX, }; void SetAxis(EViewportAxis axis); // Scrolling / zooming related virtual void SetScrollOffset(float x, float y, bool bLimits = true); virtual void GetScrollOffset(float& x, float& y); // Only x and y components used. virtual void SetZoom(float fZoomFactor, const QPoint& center); // overrides from CViewport. virtual void MakeConstructionPlane(int axis); virtual const Matrix34& GetConstructionMatrix(RefCoordSys coordSys); //! Calculate view transformation matrix. virtual void CalculateViewTM(); virtual void SetViewMode(ViewMode eViewMode) { m_eViewMode = eViewMode; }; ViewMode GetViewMode() { return m_eViewMode; }; protected slots: // Render void Render(); protected: // Draw everything. virtual void Draw(DisplayContext& dc); // Draw elements of viewport. void DrawGrid(DisplayContext& dc, bool bNoXNumbers = false); void DrawAxis(DisplayContext& dc); void DrawSelection(DisplayContext& dc); void DrawObjects(DisplayContext& dc); void DrawViewerMarker(DisplayContext& dc); AABB GetWorldBounds(const QPoint& p1, const QPoint& p2); void OnLButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point) override; void OnMButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point) override; void OnMButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point) override; void OnLButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point) override; void OnMouseMove(Qt::KeyboardModifiers modifiers, Qt::MouseButtons buttons, const QPoint& point) override; void resizeEvent(QResizeEvent* event) override; void showEvent(QShowEvent* event) override; void paintEvent(QPaintEvent* event) override; int OnCreate(); void OnRButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point); void OnRButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point); void OnMouseWheel(Qt::KeyboardModifiers modifiers, short zDelta, const QPoint& pt); void OnDestroy(); protected: ////////////////////////////////////////////////////////////////////////// // Variables. ////////////////////////////////////////////////////////////////////////// IRenderer* m_renderer; //! XY/XZ/YZ mode of this 2D viewport. EViewportType m_viewType; EViewportAxis m_axis; //! Axis to cull normals with in this Viewport. int m_cullAxis; // Viewport origin point. Vec3 m_origin2D; // Scrolling / zooming related QPoint m_cMousePos; QPoint m_RMouseDownPos; float m_prevZoomFactor; QSize m_prevScrollOffset; QRect m_rcSelect; QRect m_rcClient; AABB m_displayBounds; bool m_bShowTerrain; bool m_bShowViewMarker; bool m_bShowGrid; bool m_bShowObjectsInfo; bool m_bShowMinorGridLines; bool m_bShowMajorGridLines; bool m_bShowNumbers; bool m_bAutoAdjustGrids; Matrix34 m_screenTM_Inverted; float m_gridAlpha; QColor m_colorGridText; QColor m_colorAxisText; QColor m_colorBackground; bool m_bContentValid; DisplayContext m_displayContext; ViewMode m_eViewMode = NothingMode; //May be changed by parent classes of Q2DViewport //CTopRendererWnd for example will change m_maxZoom to 250.0f float m_minZoom = 0.01f; float m_maxZoom = 500.0f; }; ////////////////////////////////////////////////////////////////////////// class C2DViewport_XY : public Q2DViewport { Q_OBJECT public: static const GUID& GetClassID() { return QtViewport::GetClassID(); } C2DViewport_XY(QWidget* parent = nullptr) : Q2DViewport(parent) { SetType(ET_ViewportXY); } }; ////////////////////////////////////////////////////////////////////////// class C2DViewport_XZ : public Q2DViewport { Q_OBJECT public: static const GUID& GetClassID() { return QtViewport::GetClassID(); } C2DViewport_XZ(QWidget* parent = nullptr) : Q2DViewport(parent) { SetType(ET_ViewportXZ); } }; ////////////////////////////////////////////////////////////////////////// class C2DViewport_YZ : public Q2DViewport { Q_OBJECT public: static const GUID& GetClassID() { return QtViewport::GetClassID(); } C2DViewport_YZ(QWidget* parent = nullptr) : Q2DViewport(parent) { SetType(ET_ViewportYZ); } }; #endif // CRYINCLUDE_EDITOR_2DVIEWPORT_H