1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
6 #include <CryMath/Cry_Math.h>
7 #include <CryMath/Cry_Matrix34.h>
8 #include <CryRenderer/IRenderer.h>
9 #include "QViewportEvents.h"
10 #include <CrySerialization/Forward.h>
11 #include "Gizmos/GizmoManager.h"
12 #include "DisplayViewportAdapter.h"
14 struct DisplayContext
;
16 struct SRenderingPassInfo
;
21 struct SSystemGlobalEnvironment
;
23 using Serialization::IArchive
;
27 struct SViewportSettings
;
28 struct SViewportState
;
35 SRendParams
* renderParams
;
36 SRenderingPassInfo
* passInfo
;
37 IRenderAuxGeom
* pAuxGeom
;
40 class QViewportConsumer
;
41 class EDITOR_COMMON_API QViewport
: public QWidget
45 QViewport(SSystemGlobalEnvironment
* env
, QWidget
* parent
, int supersamplingFactor
= 1);
48 void AddConsumer(QViewportConsumer
* consumer
);
49 void RemoveConsumer(QViewportConsumer
* consumer
);
53 void SetForegroundUpdateMode(bool foregroundUpdate
);
54 CCamera
* Camera() const { return m_camera
.get(); }
56 void Serialize(IArchive
& ar
);
58 void SetSceneDimensions(const Vec3
& size
) { m_sceneDimensions
= size
; }
59 void SetSettings(const SViewportSettings
& settings
);
60 const SViewportSettings
& GetSettings() const { return *m_settings
; }
61 void SetState(const SViewportState
& state
);
62 const SViewportState
& GetState() const { return *m_state
; }
63 void SetOrbitMode(bool orbitMode
);
64 bool ScreenToWorldRay(Ray
* ray
, int x
, int y
);
65 QPoint
ProjectToScreen(const Vec3
& point
);
66 void LookAt(const Vec3
& target
, float radius
, bool snap
);
71 IGizmoManager
* GetGizmoManager() { return &m_gizmoManager
; }
76 void SignalPreRender(const SRenderContext
&);
77 void SignalRender(const SRenderContext
&);
78 void SignalKey(const SKeyEvent
&);
79 void SignalMouse(const SMouseEvent
&);
81 void SignalCameraMoved(const QuatT
& qt
);
83 void mousePressEvent(QMouseEvent
* ev
) override
;
84 void mouseReleaseEvent(QMouseEvent
* ev
) override
;
85 void wheelEvent(QWheelEvent
* ev
) override
;
86 void mouseMoveEvent(QMouseEvent
* ev
) override
;
87 void keyPressEvent(QKeyEvent
* ev
) override
;
88 void keyReleaseEvent(QKeyEvent
* ev
) override
;
89 void resizeEvent(QResizeEvent
* ev
) override
;
90 void moveEvent(QMoveEvent
* ev
) override
;
91 void paintEvent(QPaintEvent
* ev
) override
;
92 bool event(QEvent
* ev
) override
;
93 bool winEvent(MSG
* message
, long* result
);
97 void IEditorEventFromQViewportEvent(const SMouseEvent
& qEvt
, CPoint
& p
, EMouseEvent
& evt
, int& flags
);
99 void CameraMoved(QuatT qt
, bool snap
);
100 bool CreateRenderContext();
101 void DestroyRenderContext();
102 void SetCurrentContext();
103 void RestorePreviousContext();
104 void InitDisplayContext(uintptr_t displayContextHandle
);
105 void UpdateBackgroundColor();
107 void CreateGridLine(ColorB col
, const float alpha
, const float alphaFalloff
, const float slide
, const float halfSlide
, const float maxSlide
, const Vec3
& stepDir
, const Vec3
& orthoDir
);
108 void CreateGridLines(const uint count
, const uint interStepCount
, const Vec3
& stepDir
, const float stepSize
, const Vec3
& orthoDir
, const float offset
);
110 void DrawOrigin(const ColorB
& col
);
111 void DrawOrigin(const int left
, const int top
, const float scale
, const Matrix34 cameraTM
);
117 void RenderInternal();
118 bool OnMouseEvent(const SMouseEvent
& ev
);
119 void OnKeyEvent(const SKeyEvent
& ev
);
120 float CalculateMoveSpeed(bool shiftPressed
, bool ctrlPressed
, bool bBackForth
= false) const;
121 void CreateLookAt(const Vec3
& target
, float radius
, QuatT
& cameraTarget
) const;
122 struct SPreviousContext
;
123 std::vector
<SPreviousContext
> m_previousContexts
;
124 std::auto_ptr
<CCamera
> m_camera
;
125 DisplayContext m_displayContext
;
129 int m_supersamplingFactor
;
130 QPoint m_mousePressPos
;
132 float m_lastFrameTime
;
133 float m_averageFrameTime
;
134 bool m_renderContextCreated
;
135 bool m_creatingRenderContext
;
139 bool m_orbitModeEnabled
;
144 Vec3 m_cameraSmoothPosRate
;
145 float m_cameraSmoothRotRate
;
146 int m_mouseMovementsSinceLastFrame
;
147 f32 m_LightRotationRadian
;
148 SMouseEvent m_pendingMouseMoveEvent
;
150 Vec3 m_sceneDimensions
;
151 std::unique_ptr
<SPrivate
> m_private
;
152 std::unique_ptr
<SViewportSettings
> m_settings
;
153 std::unique_ptr
<SViewportState
> m_state
;
154 std::vector
<QViewportConsumer
*> m_consumers
;
155 std::vector
<Vec3
> m_gridLineVertices
;
156 std::vector
<uint32
> m_gridLineVerticesColor
;
157 SSystemGlobalEnvironment
* m_env
;
158 IRenderAuxGeom
* m_pAuxGeom
;
160 std::unique_ptr
<CDisplayViewportAdapter
> m_pViewportAdapter
;
161 CGizmoManager m_gizmoManager
;