OpenClonk
C4Viewport.h
Go to the documentation of this file.
1 /*
2  * OpenClonk, http://www.openclonk.org
3  *
4  * Copyright (c) 1998-2000, Matthes Bender
5  * Copyright (c) 2001-2009, RedWolf Design GmbH, http://www.clonk.de/
6  * Copyright (c) 2009-2016, The OpenClonk Team and contributors
7  *
8  * Distributed under the terms of the ISC license; see accompanying file
9  * "COPYING" for details.
10  *
11  * "Clonk" is a registered trademark of Matthes Bender, used with permission.
12  * See accompanying file "TRADEMARK" for details.
13  *
14  * To redistribute this file separately, substitute the full license texts
15  * for the above references.
16  */
17 
18 /* A viewport to each player */
19 
20 #ifndef INC_C4Viewport
21 #define INC_C4Viewport
22 
23 #include "graphics/C4FacetEx.h"
24 
25 class C4ViewportWindow;
26 class C4FoWRegion;
27 struct ZoomData;
28 
30 {
31  friend class C4MouseControl;
32 public:
33  C4Viewport();
34  ~C4Viewport();
35  // "display" coordinates
36  int32_t ViewWdt;
37  int32_t ViewHgt;
38  // position of landscape border (left,top,right, bottom) in viewport. 0 if there is not border
40  int32_t DrawX;
41  int32_t DrawY;
42  // facets used for last drawing operations
45  // factor between "landscape" and "display"
46  bool fIsNoOwnerViewport; // this viewport is found for searches of NO_OWNER-viewports; even if it has a player assigned (for network obs)
47 
48  float GetZoom() { return Zoom; }
49  void SetZoom(float zoom_value);
50  float GetGUIZoom() const { return Clamp<float>(float(ViewWdt)/1280, 0.5f, 1.0f); }
51  void Execute();
52  void ClearPointers(C4Object *obj);
53  void SetOutputSize(int32_t draw_x, int32_t draw_y, int32_t out_x, int32_t out_y, int32_t out_wdt, int32_t out_hgt);
54  void CalculateZoom();
55  void ChangeZoom(float by_factor);
56  void SetZoom(float to_zoom, bool direct = false);
57  void SetZoomLimits(float to_min_zoom, float to_max_zoom);
58  float GetZoomByViewRange(int32_t size_x, int32_t size_y) const; // set zoom such that the supplied size is visible in the viewport
59  float GetZoomLimitMin() const { return ZoomLimitMin; }
60  float GetZoomLimitMax() const { return ZoomLimitMax; }
61  float GetZoomTarget() const { return ZoomTarget; }
62  bool Init(int32_t for_player, bool set_temporary_only);
63  void DropFile(const char* filename, float x, float y);
64  bool TogglePlayerLock();
65  bool GetPlayerLock() { return PlayerLock; }
66  void NextPlayer();
68  bool IsViewportMenu(class C4Menu *menu);
69  C4Viewport *GetNext() { return Next; }
70  int32_t GetPlayer() { return Player; }
71  void CenterPosition();
72  void DisableFoW();
73  void EnableFoW();
74 public:
76  float GetViewX() { return viewX; }
78  float GetViewY() { return viewY; }
80  float GetViewCenterX() { return viewX + ViewWdt/Zoom/2; }
82  float GetViewCenterY() { return viewY + ViewHgt/Zoom/2; }
83 
84  // Convert window coordinates to game coordinates
85  float WindowToGameX(int32_t win_x) { return GetViewX() + float(win_x) / Zoom; }
86  float WindowToGameY(int32_t win_y) { return GetViewY() + float(win_y) / Zoom; }
87 
89  void ScrollView(float by_x, float by_y);
91  void SetViewX(float x);
92  void SetViewY(float y);
94  void SetViewOffset(int32_t x, int32_t y) { viewOffsX = x; viewOffsY = y; }
95 
96 private:
97  float viewX, viewY; // current view position in landscape coordinates (upper left corner)
98  float targetViewX, targetViewY; // target view position for smooth scrolling
99  int32_t viewOffsX, viewOffsY; // desired view offset in landscape coordinates
100 
101  void UpdateBordersX();
102  void UpdateBordersY();
103 protected:
104  float Zoom;
105  float ZoomTarget;
107  int32_t ViewportOpenFrame; // Game FrameCounter in which viewport was opened. Used to init zoom during initial fullscreen viewport movement chaos, but not change it later e.g. when other local players join.
108  int32_t Player;
110  int32_t OutX,OutY;
113  std::unique_ptr<C4ViewportWindow> pWindow;
114  std::unique_ptr<C4FoWRegion> pFoW;
115  void DrawPlayerStartup(C4TargetFacet &cgo);
116  void Draw(C4TargetFacet &cgo, bool draw_game, bool draw_overlay);
117  void DrawOverlay(C4TargetFacet &cgo, const ZoomData &GameZoom);
118  void DrawMenu(C4TargetFacet &cgo);
119  void DrawPlayerInfo(C4TargetFacet &cgo);
120  void InitZoom();
121  void BlitOutput();
122  void AdjustZoomAndPosition();
123 public:
124  float GetZoom() const { return Zoom; }
125  void AdjustPosition(bool immediate = false);
126  C4ViewportWindow* GetWindow() {return pWindow.get();}
127  bool UpdateOutputSize(int32_t new_width = 0, int32_t new_height = 0);
130 
131 #ifdef WITH_QT_EDITOR
132  class C4ConsoleQtViewportScrollArea *scrollarea;
133 #endif
134 
135 #ifdef _WIN32
136  friend LRESULT APIENTRY ViewportWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
137 #endif
138  friend class C4ViewportWindow;
139  friend class C4ViewportList;
140  friend class C4GraphicsSystem;
142 };
143 
145 public:
146  C4ViewportList();
148  void Clear();
149  void ClearPointers(C4Object *obj);
150  void Execute(bool DrawBackground);
152  void RecalculateViewports();
153  void DisableFoW();
154  void EnableFoW();
155  bool CreateViewport(int32_t player_nr, bool silent = false);
156  bool CloseViewport(int32_t player_nr, bool silent);
157  int32_t GetViewportCount();
158  C4Viewport* GetViewport(int32_t player_nr, C4Viewport* prev = nullptr);
160  bool CloseViewport(C4Viewport * viewport);
161 #ifdef USE_WIN32_WINDOWS
162  C4Viewport* GetViewport(HWND hwnd);
163 #endif
164  int32_t GetAudibility(int32_t x, int32_t y, int32_t *pan, int32_t audibility_radius = 0, int32_t *out_player = nullptr);
165  bool ViewportNextPlayer();
166 
167  bool FreeScroll(C4Vec2D scroll_by); // key callback: Scroll ownerless viewport by some offset
168  bool ViewportZoomOut();
169  bool ViewportZoomIn();
170 protected:
171  void MouseMoveToViewport(int32_t button, int32_t x, int32_t y, DWORD key_param);
175  C4RectList BackgroundAreas; // rectangles covering background without viewports in fullscreen
176  friend class C4GUI::Screen;
177  friend class C4GraphicsSystem;
178 };
179 
181 
182 #endif
C4ViewportList Viewports
LRESULT APIENTRY ViewportWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
uint32_t DWORD
Definition: C4Menu.h:123
Definition: C4Rect.h:28
bool GetPlayerLock()
Definition: C4Viewport.h:65
bool ViewPositionByScrollBars()
float BorderTop
Definition: C4Viewport.h:39
float Zoom
Definition: C4Viewport.h:104
void ChangeZoom(float by_factor)
Definition: C4Viewport.cpp:519
float ZoomTarget
Definition: C4Viewport.h:105
C4Rect GetOutputRect()
Definition: C4Viewport.h:67
C4TargetFacet last_gui_draw_cgo
Definition: C4Viewport.h:44
void CalculateZoom()
Definition: C4Viewport.cpp:481
int32_t ViewWdt
Definition: C4Viewport.h:36
void EnableFoW()
Definition: C4Viewport.cpp:834
float GetZoomByViewRange(int32_t size_x, int32_t size_y) const
Definition: C4Viewport.cpp:558
bool UpdateOutputSize(int32_t new_width=0, int32_t new_height=0)
Definition: C4Viewport.cpp:52
bool Init(int32_t for_player, bool set_temporary_only)
Definition: C4Viewport.cpp:786
int32_t ViewportOpenFrame
Definition: C4Viewport.h:107
float GetViewCenterY()
Definition: C4Viewport.h:82
std::unique_ptr< C4ViewportWindow > pWindow
Definition: C4Viewport.h:113
float BorderRight
Definition: C4Viewport.h:39
float GetViewY()
Definition: C4Viewport.h:78
int32_t OutY
Definition: C4Viewport.h:110
void CenterPosition()
Definition: C4Viewport.cpp:755
void SetViewX(float x)
Definition: C4Viewport.cpp:888
int32_t OutX
Definition: C4Viewport.h:110
void DrawMenu(C4TargetFacet &cgo)
Definition: C4Viewport.cpp:163
float GetZoomTarget() const
Definition: C4Viewport.h:61
C4ViewportWindow * GetWindow()
Definition: C4Viewport.h:126
void DrawPlayerInfo(C4TargetFacet &cgo)
Definition: C4Viewport.cpp:775
float WindowToGameX(int32_t win_x)
Definition: C4Viewport.h:85
int32_t GetPlayer()
Definition: C4Viewport.h:70
int32_t ViewHgt
Definition: C4Viewport.h:37
bool ScrollBarsByViewPosition()
Definition: C4Console.cpp:710
void ScrollView(float by_x, float by_y)
Definition: C4Viewport.cpp:882
void SetZoomLimits(float to_min_zoom, float to_max_zoom)
Definition: C4Viewport.cpp:547
void DisableFoW()
Definition: C4Viewport.cpp:829
float BorderLeft
Definition: C4Viewport.h:39
C4Viewport * GetNext()
Definition: C4Viewport.h:69
void SetViewY(float y)
Definition: C4Viewport.cpp:907
void InitZoom()
Definition: C4Viewport.cpp:505
C4TargetFacet last_game_draw_cgo
Definition: C4Viewport.h:43
void DrawPlayerStartup(C4TargetFacet &cgo)
Definition: C4Viewport.cpp:848
bool ResetMenuPositions
Definition: C4Viewport.h:111
float GetZoomLimitMin() const
Definition: C4Viewport.h:59
float GetViewCenterX()
Definition: C4Viewport.h:80
float GetGUIZoom() const
Definition: C4Viewport.h:50
void NextPlayer()
Definition: C4Viewport.cpp:962
friend class C4ConsoleQtViewportView
Definition: C4Viewport.h:141
void SetOutputSize(int32_t draw_x, int32_t draw_y, int32_t out_x, int32_t out_y, int32_t out_wdt, int32_t out_hgt)
Definition: C4Viewport.cpp:926
void AdjustZoomAndPosition()
Definition: C4Viewport.cpp:599
float ZoomLimitMax
Definition: C4Viewport.h:106
float GetViewX()
Definition: C4Viewport.h:76
bool TogglePlayerLock()
Definition: C4Console.cpp:711
void DropFile(const char *filename, float x, float y)
Definition: C4Viewport.cpp:47
std::unique_ptr< C4FoWRegion > pFoW
Definition: C4Viewport.h:114
float ZoomLimitMin
Definition: C4Viewport.h:106
float GetZoom() const
Definition: C4Viewport.h:124
bool PlayerLock
Definition: C4Viewport.h:109
float WindowToGameY(int32_t win_y)
Definition: C4Viewport.h:86
int32_t DrawY
Definition: C4Viewport.h:41
void Execute()
Definition: C4Viewport.cpp:443
int32_t Player
Definition: C4Viewport.h:108
void SetViewOffset(int32_t x, int32_t y)
Definition: C4Viewport.h:94
void BlitOutput()
Definition: C4Viewport.cpp:432
int32_t DrawX
Definition: C4Viewport.h:40
C4Viewport * Next
Definition: C4Viewport.h:112
void AdjustPosition(bool immediate=false)
Definition: C4Viewport.cpp:653
void Draw(C4TargetFacet &cgo, bool draw_game, bool draw_overlay)
Definition: C4Viewport.cpp:235
void DrawOverlay(C4TargetFacet &cgo, const ZoomData &GameZoom)
Definition: C4Viewport.cpp:132
bool fIsNoOwnerViewport
Definition: C4Viewport.h:46
bool IsViewportMenu(class C4Menu *menu)
Definition: C4Viewport.cpp:994
void SetZoom(float zoom_value)
Definition: C4Viewport.cpp:592
float GetZoomLimitMax() const
Definition: C4Viewport.h:60
float GetZoom()
Definition: C4Viewport.h:48
float BorderBottom
Definition: C4Viewport.h:39
void ClearPointers(C4Object *obj)
Definition: C4Viewport.cpp:957
bool FreeScroll(C4Vec2D scroll_by)
bool ViewportNextPlayer()
C4Viewport * FirstViewport
Definition: C4Viewport.h:173
int32_t GetViewportCount()
C4Viewport * GetFirstViewport()
Definition: C4Viewport.h:159
void RecalculateViewports()
C4Viewport * GetViewport(int32_t player_nr, C4Viewport *prev=nullptr)
C4RectList BackgroundAreas
Definition: C4Viewport.h:175
void DrawFullscreenBackground()
void Execute(bool DrawBackground)
bool CloseViewport(int32_t player_nr, bool silent)
bool CreateViewport(int32_t player_nr, bool silent=false)
C4Facet ViewportArea
Definition: C4Viewport.h:174
bool ViewportZoomOut()
int32_t GetAudibility(int32_t x, int32_t y, int32_t *pan, int32_t audibility_radius=0, int32_t *out_player=nullptr)
bool ViewportZoomIn()
void MouseMoveToViewport(int32_t button, int32_t x, int32_t y, DWORD key_param)
void ClearPointers(C4Object *obj)
void SortViewportsByPlayerControl()