!XT (Code) Update copyright headers in Code/Sandbox.
[CRYENGINE.git] / Code / Sandbox / Plugins / EditorCommon / QViewport.h
bloba5406aefe916dde2bbb8141b9f4f158bb071724c
1 // Copyright 2001-2018 Crytek GmbH / Crytek Group. All rights reserved.
3 #pragma once
4 #include <QWidget>
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;
15 class CCamera;
16 struct SRenderingPassInfo;
17 struct SRendParams;
18 struct Ray;
19 struct IRenderer;
20 struct I3DEngine;
21 struct SSystemGlobalEnvironment;
23 using Serialization::IArchive;
25 struct SKeyEvent;
26 struct SMouseEvent;
27 struct SViewportSettings;
28 struct SViewportState;
30 class QViewport;
31 struct SRenderContext
33 CCamera* camera;
34 QViewport* viewport;
35 SRendParams* renderParams;
36 SRenderingPassInfo* passInfo;
37 IRenderAuxGeom* pAuxGeom;
40 class QViewportConsumer;
41 class EDITOR_COMMON_API QViewport : public QWidget
43 Q_OBJECT
44 public:
45 QViewport(SSystemGlobalEnvironment* env, QWidget* parent, int supersamplingFactor = 1);
46 ~QViewport();
48 void AddConsumer(QViewportConsumer* consumer);
49 void RemoveConsumer(QViewportConsumer* consumer);
51 void CaptureMouse();
52 void ReleaseMouse();
53 void SetForegroundUpdateMode(bool foregroundUpdate);
54 CCamera* Camera() const { return m_camera.get(); }
55 void ResetCamera();
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);
68 int Width() const;
69 int Height() const;
71 IGizmoManager* GetGizmoManager() { return &m_gizmoManager; }
73 public slots:
74 void Update();
75 signals:
76 void SignalPreRender(const SRenderContext&);
77 void SignalRender(const SRenderContext&);
78 void SignalKey(const SKeyEvent&);
79 void SignalMouse(const SMouseEvent&);
80 void SignalUpdate();
81 void SignalCameraMoved(const QuatT& qt);
82 protected:
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);
94 private:
95 struct SPrivate;
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);
109 void DrawGrid();
110 void DrawOrigin(const ColorB& col);
111 void DrawOrigin(const int left, const int top, const float scale, const Matrix34 cameraTM);
113 void ProcessMouse();
114 void ProcessKeys();
115 void PreRender();
116 void Render();
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;
127 int m_width;
128 int m_height;
129 int m_supersamplingFactor;
130 QPoint m_mousePressPos;
131 int64 m_lastTime;
132 float m_lastFrameTime;
133 float m_averageFrameTime;
134 bool m_renderContextCreated;
135 bool m_creatingRenderContext;
136 bool m_updating;
137 bool m_rotationMode;
138 bool m_panMode;
139 bool m_orbitModeEnabled;
140 bool m_orbitMode;
141 bool m_fastMode;
142 bool m_slowMode;
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;