clientmap, clientmedia: code modernization
[oweals/minetest.git] / src / clientmap.h
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #ifndef CLIENTMAP_HEADER
21 #define CLIENTMAP_HEADER
22
23 #include "irrlichttypes_extrabloated.h"
24 #include "map.h"
25 #include "camera.h"
26 #include <set>
27 #include <map>
28
29 struct MapDrawControl
30 {
31         // Overrides limits by drawing everything
32         bool range_all = false;
33         // Wanted drawing range
34         float wanted_range = 0.0f;
35         // Maximum number of blocks to draw
36         u32 wanted_max_blocks = 0;
37         // show a wire frame for debugging
38         bool show_wireframe = false;
39 };
40
41 class Client;
42 class ITextureSource;
43
44 /*
45         ClientMap
46
47         This is the only map class that is able to render itself on screen.
48 */
49
50 class ClientMap : public Map, public scene::ISceneNode
51 {
52 public:
53         ClientMap(
54                         Client *client,
55                         MapDrawControl &control,
56                         s32 id
57         );
58
59         virtual ~ClientMap() = default;
60
61         s32 mapType() const
62         {
63                 return MAPTYPE_CLIENT;
64         }
65
66         void drop()
67         {
68                 ISceneNode::drop();
69         }
70
71         void updateCamera(const v3f &pos, const v3f &dir, f32 fov, const v3s16 &offset)
72         {
73                 m_camera_position = pos;
74                 m_camera_direction = dir;
75                 m_camera_fov = fov;
76                 m_camera_offset = offset;
77         }
78
79         /*
80                 Forcefully get a sector from somewhere
81         */
82         MapSector * emergeSector(v2s16 p);
83
84         //void deSerializeSector(v2s16 p2d, std::istream &is);
85
86         /*
87                 ISceneNode methods
88         */
89
90         virtual void OnRegisterSceneNode();
91
92         virtual void render()
93         {
94                 video::IVideoDriver* driver = SceneManager->getVideoDriver();
95                 driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
96                 renderMap(driver, SceneManager->getSceneNodeRenderPass());
97         }
98
99         virtual const aabb3f &getBoundingBox() const
100         {
101                 return m_box;
102         }
103
104         void getBlocksInViewRange(v3s16 cam_pos_nodes,
105                 v3s16 *p_blocks_min, v3s16 *p_blocks_max);
106         void updateDrawList();
107         void renderMap(video::IVideoDriver* driver, s32 pass);
108
109         int getBackgroundBrightness(float max_d, u32 daylight_factor,
110                         int oldvalue, bool *sunlight_seen_result);
111
112         void renderPostFx(CameraMode cam_mode);
113
114         // For debug printing
115         virtual void PrintInfo(std::ostream &out);
116
117         const MapDrawControl & getControl() const { return m_control; }
118         f32 getCameraFov() const { return m_camera_fov; }
119 private:
120         Client *m_client;
121
122         aabb3f m_box = aabb3f(-BS * 1000000, -BS * 1000000, -BS * 1000000,
123                 BS * 1000000, BS * 1000000, BS * 1000000);
124
125         MapDrawControl &m_control;
126
127         v3f m_camera_position = v3f(0,0,0);
128         v3f m_camera_direction = v3f(0,0,1);
129         f32 m_camera_fov = M_PI;
130         v3s16 m_camera_offset;
131
132         std::map<v3s16, MapBlock*> m_drawlist;
133
134         std::set<v2s16> m_last_drawn_sectors;
135
136         bool m_cache_trilinear_filter;
137         bool m_cache_bilinear_filter;
138         bool m_cache_anistropic_filter;
139 };
140
141 #endif
142