Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: 7fd11a9ac0540fabc24ba73fe7a6feb86b298f13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
   ui/modelview.h
   This file is part of the Osirion project and is distributed under
   the terms of the GNU General Public License version 2
*/

#ifndef __INCLUDED_UI_MODELVIEW_H__
#define __INCLUDED_UI_MODELVIEW_H__

#include "math/axis.h"
#include "ui/widget.h"
#include "render/camera.h"

namespace ui
{

class ModelView : public Widget
{
public:
	ModelView(Widget *parent);
	~ModelView();
	
	enum Mode { Model = 0, Globe = 1 };

	inline std::string const &modelname() const {
		return modelview_modelname;
	}

	inline Mode mode() const {
		return modelview_mode;
	}
	
	inline float zoom() const {
		return modelview_zoom;
	}
	
	inline float radius() const {
		return modelview_radius;
	}

	/**
	 * @brief clear the modelview and show nothing
	 * */
	void clear();
	
	/**
	 * @brief show a textured globe with an optional corona
	 * */
	void set_globetexturename(const std::string & texturename, const std::string & coronaname, const std::string ringsname, const bool bright = false);
	
	/**
	 * @brief show a model
	 * */
	void set_modelname(const std::string & modelname);

	/**
	 * @brief et primary and secondary entity color, to be used by the model renderer
	 * */
	void set_colors(const math::Color & color_primary, const math::Color & color_secondary);

	/**
	 * @brief  print modelview widget description
	 * */
	virtual void print(const size_t indent) const;

	/**
	 * @brief set the zoom out factor
	 * @param zoom the new zoom factor
	 * The zoom factor will be clamped to the range [1.0-10.0]
	 * 1.0 is not zoomed out, 10.0 is zoomed out by a factor of 10
	 * */
	void set_zoom(const float zoom);
	
	inline void set_radius(const float radius) {
		modelview_radius = radius;
	}
	
	inline void set_mode(const Mode mode) {
		modelview_mode = mode;
	}

protected:
	/// draw the widget
	virtual void draw();

	/// draw border
	virtual void draw_border();
	
	/// draw border
	virtual void draw_background();

	/**
	 * @brief mouse button press event handler
	 * */
	virtual bool on_mousepress(const unsigned int button);

	/**
	 * @brief mouse button release event handler
	 * */
	virtual bool on_mouserelease(const unsigned int button);
	
	/**
	 * @brief mouse over event handler
	 * */
	virtual void on_mouseover(const math::Vector2f &cursor);
	
	/**
	 * @brief mouse movement event handler
	 * */
	virtual void on_mousemove(const math::Vector2f &cursor);
	
	/**
	 * @brief mouse hweel event handler
	 * */
	virtual bool on_mousewheel(const math::Vector2f & direction);

private:
	void reset();
	
	void draw_model();
	
	void draw_globe();
	
	Mode		modelview_mode;
	
	std::string	modelview_modelname;
	std::string	modelview_globetexturename;
	std::string	modelview_globecoronaname;
	std::string	modelview_globeringsname;
	bool		modelview_globebright;
	
	math::Color	modelview_color_primary;
	math::Color	modelview_color_secondary;
	
	float		modelview_zoom;
	float		modelview_radius;
	
	math::Axis	modelview_axis;
	math::Vector2f	modelview_cursor;
	bool		modelview_dragging;
	
	render::Camera	modelview_camera;
};

}

#endif // __INCLUDED_UI_MODELVIEW_H__