Otclient 1.0  14/8/2020
mapview.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2010-2020 OTClient <https://github.com/edubart/otclient>
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21  */
22 
23 #ifndef MAPVIEW_H
24 #define MAPVIEW_H
25 
26  // Define 1, to draw separately. (Ground first => remainder after)
27 #define DRAW_SEPARATELY 0
28 
29  // Define 1, to draw creature information after light.
30 #define DRAW_CREATURE_INFORMATION_AFTER_LIGHT 0
31 
36 #include "lightview.h"
37 
38  // @bindclass
39 class MapView : public LuaObject
40 {
41 public:
42  enum ViewMode {
47  };
48 
49  MapView();
50  ~MapView();
51  void draw(const Rect& rect);
52 
53 private:
54  void updateGeometry(const Size& visibleDimension, const Size& optimizedSize);
55  void updateVisibleTilesCache();
56  void requestVisibleTilesCacheUpdate() { m_mustUpdateVisibleTilesCache = true; }
57 
58 protected:
59  void onTileUpdate(const Position& pos, const ThingPtr& thing, const Otc::Operation operation);
60  void onMapCenterChange(const Position& pos);
61 
62  friend class Map;
63 
64 public:
65  // floor visibility related
66  int getLockedFirstVisibleFloor() { return m_lockedFirstVisibleFloor; }
67  void lockFirstVisibleFloor(int firstVisibleFloor);
69 
70  bool isMultifloor() { return m_multifloor; }
71  void setMultifloor(bool enable) { m_multifloor = enable; requestVisibleTilesCacheUpdate(); }
72 
73  // map dimension related
74  Point getVisibleCenterOffset() { return m_visibleCenterOffset; }
75  Size getVisibleDimension() { return m_visibleDimension; }
76  void setVisibleDimension(const Size& visibleDimension);
77  int getTileSize() { return m_tileSize; }
78  int getCachedFirstVisibleFloor() { return m_cachedFirstVisibleFloor; }
79  int getCachedLastVisibleFloor() { return m_cachedLastVisibleFloor; }
80 
81  // view mode related
82  ViewMode getViewMode() { return m_viewMode; }
83  void setViewMode(ViewMode viewMode);
84  void optimizeForSize(const Size& visibleSize);
85 
86  void setAutoViewMode(bool enable);
87  bool isAutoViewModeEnabled() { return m_autoViewMode; }
88 
89  // camera related
90  CreaturePtr getFollowingCreature() { return m_followingCreature; }
91  void followCreature(const CreaturePtr& creature);
92  bool isFollowingCreature() { return m_followingCreature && m_follow; }
93 
95  void setCameraPosition(const Position& pos);
96 
97  void setMinimumAmbientLight(float intensity) { m_minimumAmbientLight = intensity; requestDrawing(Position(), Otc::ReDrawLight, true); }
98  float getMinimumAmbientLight() { return m_minimumAmbientLight; }
99 
100  // drawing related
101  void setDrawTexts(bool enable) { m_drawTexts = enable; }
102  bool isDrawingTexts() { return m_drawTexts; }
103 
104  void setDrawNames(bool enable) { m_drawNames = enable; requestDrawing(Position(), Otc::ReDrawAllInformation, true); }
105  bool isDrawingNames() { return m_drawNames; }
106 
107  void setDrawHealthBars(bool enable) { m_drawHealthBars = enable; requestDrawing(Position(), Otc::ReDrawAllInformation, true); }
108  bool isDrawingHealthBars() { return m_drawHealthBars; }
109 
110  void setDrawLights(bool enable);
111  bool isDrawingLights() { return m_drawLights; }
112 
113  void setDrawManaBar(bool enable) { m_drawManaBar = enable; requestDrawing(Position(), Otc::ReDrawAllInformation, true); }
114  bool isDrawingManaBar() { return m_drawManaBar; }
115 
116  void move(int x, int y);
117 
119 
120  void setShader(const PainterShaderProgramPtr& shader, float fadein, float fadeout);
121  PainterShaderProgramPtr getShader() { return m_shader; }
122 
123  Position getPosition(const Point& point, const Size& mapSize);
124 
125  MapViewPtr asMapView() { return static_self_cast<MapView>(); }
126 
127  void requestDrawing(const Position& pos, const Otc::RequestDrawFlags reDrawFlags, const bool force = false, const bool isLocalPlayer = false);
128  void resetLastCamera() { m_lastCameraPosition = Position(); }
129 
130  std::vector<CreaturePtr> getVisibleCreatures() { return m_visibleCreatures; }
131 
132 private:
133  struct ViewPort {
134  int top, right, bottom, left;
135  };
136 
137  struct FrameCache {
138  FrameBufferPtr tile, staticText,
139  creatureInformation;
140  };
141 
142  int calcFirstVisibleFloor();
143  int calcLastVisibleFloor();
144 
145  void initViewPortDirection();
146 
147 #if DRAW_SEPARATELY == 1
148  void drawSeparately(const int floor, const ViewPort& viewPort, LightView* lightView);
149 #endif
150 
151  void drawCreatureInformation(const Rect& rect, Point drawOffset, const float horizontalStretchFactor, const float verticalStretchFactor);
152  void drawText(const Rect& rect, Point drawOffset, const float horizontalStretchFactor, const float verticalStretchFactor);
153 
154  Rect calcFramebufferSource(const Size& destSize);
155 
156  Point transformPositionTo2D(const Position& position, const Position& relativePosition)
157  {
158  return Point((m_virtualCenterOffset.x + (position.x - relativePosition.x) - (relativePosition.z - position.z)) * m_tileSize,
159  (m_virtualCenterOffset.y + (position.y - relativePosition.y) - (relativePosition.z - position.z)) * m_tileSize);
160  }
161 
162  bool isInRange(const Position& pos);
163  bool canRenderTile(const TilePtr& tile, const ViewPort& viewPort, LightView* lightView);
164 
165  int m_lockedFirstVisibleFloor;
166  int m_cachedFirstVisibleFloor;
167  int m_cachedLastVisibleFloor;
168  int m_tileSize;
169 
170  Rect m_rectDimension;
171 
172  Size m_drawDimension;
173  Size m_visibleDimension;
174  Size m_optimizedSize;
175 
176  Point m_virtualCenterOffset;
177  Point m_visibleCenterOffset;
178  Point m_moveOffset;
179 
180  Position m_customCameraPosition;
181 
182  std::array<ViewPort, Otc::InvalidDirection + 1> m_viewPortDirection;
183 
184  stdext::boolean<true> m_mustUpdateVisibleTilesCache;
185  stdext::boolean<true> m_mustCleanFramebuffer;
186  stdext::boolean<true> m_shaderSwitchDone;
187  stdext::boolean<true> m_drawHealthBars;
188  stdext::boolean<true> m_autoViewMode;
189  stdext::boolean<true> m_drawManaBar;
190  stdext::boolean<true> m_multifloor;
191  stdext::boolean<true> m_drawTexts;
192  stdext::boolean<true> m_drawNames;
193  stdext::boolean<true> m_smooth;
194  stdext::boolean<true> m_follow;
195 
196  stdext::boolean<false> m_drawLights;
197 
198  std::vector<CreaturePtr> m_visibleCreatures;
199 
200  std::array<std::vector<TilePtr>, Otc::MAX_Z + 1> m_cachedVisibleTiles;
201 
202  PainterShaderProgramPtr m_shader;
203  PainterShaderProgramPtr m_nextShader;
204 
205  CreaturePtr m_followingCreature;
206 
207  FrameCache m_frameCache;
208 
209  ViewMode m_viewMode;
210  LightViewPtr m_lightView;
211 
212  float m_minimumAmbientLight;
213  float m_fadeInTime;
214  float m_fadeOutTime;
215  float m_scaleFactor;
216 
217  uint32 m_redrawFlag;
218 
219  Timer m_minTimeRender;
220  Timer m_fadeTimer;
221 
222  uint_fast8_t m_floorMin, m_floorMax;
223 
224  Position m_lastCameraPosition;
225 };
226 
227 #endif
MapView::NEAR_VIEW
@ NEAR_VIEW
Definition: mapview.h:43
lightview.h
MapView::setDrawHealthBars
void setDrawHealthBars(bool enable)
Definition: mapview.h:107
Painter::BlendEquation_Add
@ BlendEquation_Add
Definition: painter.h:35
MapView::lockFirstVisibleFloor
void lockFirstVisibleFloor(int firstVisibleFloor)
Definition: mapview.cpp:488
MapView::getLockedFirstVisibleFloor
int getLockedFirstVisibleFloor()
Definition: mapview.h:66
TPoint::y
T y
Definition: point.h:83
MapView::setDrawManaBar
void setDrawManaBar(bool enable)
Definition: mapview.h:113
MapView::setMinimumAmbientLight
void setMinimumAmbientLight(float intensity)
Definition: mapview.h:97
paintershaderprogram.h
MapView::getCachedFirstVisibleFloor
int getCachedFirstVisibleFloor()
Definition: mapview.h:78
MapView::getShader
PainterShaderProgramPtr getShader()
Definition: mapview.h:121
TRect< int >
Position::x
int x
Definition: position.h:265
MapView::setMultifloor
void setMultifloor(bool enable)
Definition: mapview.h:71
uint32
uint32_t uint32
Definition: types.h:35
MapView::isDrawingTexts
bool isDrawingTexts()
Definition: mapview.h:102
MapView::isAutoViewModeEnabled
bool isAutoViewModeEnabled()
Definition: mapview.h:87
MapView::isMultifloor
bool isMultifloor()
Definition: mapview.h:70
MapView::getCachedLastVisibleFloor
int getCachedLastVisibleFloor()
Definition: mapview.h:79
MapView::getPosition
Position getPosition(const Point &point, const Size &mapSize)
Definition: mapview.cpp:550
MapView::FAR_VIEW
@ FAR_VIEW
Definition: mapview.h:45
Point
TPoint< int > Point
Definition: point.h:86
Position::y
int y
Definition: position.h:266
MapView::isFollowingCreature
bool isFollowingCreature()
Definition: mapview.h:92
Otc::ReDrawLight
@ ReDrawLight
Definition: const.h:57
MapView::setDrawLights
void setDrawLights(bool enable)
Definition: mapview.cpp:731
Otc::RequestDrawFlags
RequestDrawFlags
Definition: const.h:55
stdext::boolean< true >
LightView
Definition: lightview.h:37
luaobject.h
Position::z
short z
Definition: position.h:267
MapView::setShader
void setShader(const PainterShaderProgramPtr &shader, float fadein, float fadeout)
Definition: mapview.cpp:713
declarations.h
MapView::setAddLightMethod
void setAddLightMethod(bool add)
Definition: mapview.h:118
MapView::getViewMode
ViewMode getViewMode()
Definition: mapview.h:82
MapView::setVisibleDimension
void setVisibleDimension(const Size &visibleDimension)
Definition: mapview.cpp:500
MapView::setAutoViewMode
void setAutoViewMode(bool enable)
Definition: mapview.cpp:524
MapView::unlockFirstVisibleFloor
void unlockFirstVisibleFloor()
Definition: mapview.cpp:494
Position
Definition: position.h:33
MapView::MID_VIEW
@ MID_VIEW
Definition: mapview.h:44
MapView::asMapView
MapViewPtr asMapView()
Definition: mapview.h:125
MapView::resetLastCamera
void resetLastCamera()
Definition: mapview.h:128
LightView::setBlendEquation
void setBlendEquation(Painter::BlendEquation blendEquation)
Definition: lightview.h:48
TPoint::x
T x
Definition: point.h:83
MapView::setDrawTexts
void setDrawTexts(bool enable)
Definition: mapview.h:101
MapView::getCameraPosition
Position getCameraPosition()
Definition: mapview.cpp:705
MapView::requestDrawing
void requestDrawing(const Position &pos, const Otc::RequestDrawFlags reDrawFlags, const bool force=false, const bool isLocalPlayer=false)
Definition: mapview.cpp:806
MapView::getMinimumAmbientLight
float getMinimumAmbientLight()
Definition: mapview.h:98
Otc::ReDrawAllInformation
@ ReDrawAllInformation
Definition: const.h:64
Otc::MAX_Z
@ MAX_Z
Definition: const.h:37
MapView::setDrawNames
void setDrawNames(bool enable)
Definition: mapview.h:104
MapView::setCameraPosition
void setCameraPosition(const Position &pos)
Definition: mapview.cpp:543
MapView::onTileUpdate
void onTileUpdate(const Position &pos, const ThingPtr &thing, const Otc::Operation operation)
Definition: mapview.cpp:463
MapView::getFollowingCreature
CreaturePtr getFollowingCreature()
Definition: mapview.h:90
MapView::isDrawingLights
bool isDrawingLights()
Definition: mapview.h:111
MapView::isDrawingHealthBars
bool isDrawingHealthBars()
Definition: mapview.h:108
MapView::isDrawingManaBar
bool isDrawingManaBar()
Definition: mapview.h:114
declarations.h
stdext::shared_object_ptr
Definition: shared_object.h:39
MapView
Definition: mapview.h:39
MapView::MapView
MapView()
Definition: mapview.cpp:53
Timer
Definition: timer.h:28
MapView::getVisibleCenterOffset
Point getVisibleCenterOffset()
Definition: mapview.h:74
MapView::draw
void draw(const Rect &rect)
Definition: mapview.cpp:86
MapView::ViewMode
ViewMode
Definition: mapview.h:42
MapView::getTileSize
int getTileSize()
Definition: mapview.h:77
Painter::BlendEquation_Max
@ BlendEquation_Max
Definition: painter.h:36
MapView::followCreature
void followCreature(const CreaturePtr &creature)
Definition: mapview.cpp:536
MapView::optimizeForSize
void optimizeForSize(const Size &visibleSize)
Definition: mapview.cpp:531
Otc::Operation
Operation
Definition: const.h:28
TPoint< int >
LuaObject
LuaObject, all script-able classes have it as base.
Definition: luaobject.h:30
MapView::move
void move(int x, int y)
Definition: mapview.cpp:577
MapView::getVisibleCreatures
std::vector< CreaturePtr > getVisibleCreatures()
Definition: mapview.h:130
MapView::~MapView
~MapView()
Definition: mapview.cpp:79
MapView::setViewMode
void setViewMode(ViewMode viewMode)
Definition: mapview.cpp:518
TSize< int >
MapView::isDrawingNames
bool isDrawingNames()
Definition: mapview.h:105
MapView::getVisibleDimension
Size getVisibleDimension()
Definition: mapview.h:75
Map
Definition: map.h:141
MapView::onMapCenterChange
void onMapCenterChange(const Position &pos)
Definition: mapview.cpp:483
MapView::HUGE_VIEW
@ HUGE_VIEW
Definition: mapview.h:46