You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
7.5 KiB
C++
253 lines
7.5 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
|
|
|
|
#ifndef CRYINCLUDE_EDITOR_2DVIEWPORT_H
|
|
#define CRYINCLUDE_EDITOR_2DVIEWPORT_H
|
|
|
|
#pragma once
|
|
|
|
#if !defined(Q_MOC_RUN)
|
|
#include "Viewport.h"
|
|
#include "Objects/DisplayContext.h"
|
|
#endif
|
|
|
|
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([[maybe_unused]] const CCamera& camera, [[maybe_unused]] 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.
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//! 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>();
|
|
}
|
|
|
|
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>();
|
|
}
|
|
|
|
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>();
|
|
}
|
|
|
|
C2DViewport_YZ(QWidget* parent = nullptr)
|
|
: Q2DViewport(parent) { SetType(ET_ViewportYZ); }
|
|
};
|
|
|
|
#endif // CRYINCLUDE_EDITOR_2DVIEWPORT_H
|