1 #pragma once
2 
3 #include "RadiantCameraView.h"
4 #include "irender.h"
5 #include "gtkutil/xorrectangle.h"
6 #include "../selection/RadiantWindowObserver.h"
7 #include "gtkutil/glwidget.h"
8 
9 #include "../map/DeferredDraw.h"
10 
11 const int CAMWND_MINSIZE_X = 240;
12 const int CAMWND_MINSIZE_Y = 200;
13 
14 class SelectionTest;
15 
16 class CamWnd : public scene::Graph::Observer
17 {
18 		View m_view;
19 		// The contained camera
20 		Camera m_Camera;
21 		RadiantCameraView m_cameraview;
22 
23 		guint m_freemove_handle_focusout;
24 		static Shader* m_state_select1;
25 		static Shader* m_state_select2;
26 		FreezePointer m_freezePointer;
27 
28 		bool m_drawing;
29 
30 	public:
31 		gtkutil::GLWidget _glWidget;
32 		GtkWidget* m_gl_widget;
33 		GtkWindow* m_parent;
34 
35 		SelectionSystemWindowObserver* m_window_observer;
36 
37 		XORRectangle m_XORRectangle;
38 
39 		DeferredDraw m_deferredDraw;
40 		DeferredMotion m_deferred_motion;
41 
42 		guint m_selection_button_press_handler;
43 		guint m_selection_button_release_handler;
44 		guint m_selection_motion_handler;
45 		guint m_freelook_button_press_handler;
46 		guint m_sizeHandler;
47 		guint m_exposeHandler;
48 
49 		CamWnd ();
50 		~CamWnd ();
51 
52 		const Vector3& getCameraOrigin () const;
53 		void setCameraOrigin (const Vector3& origin);
54 
55 		const Vector3& getCameraAngles () const;
56 		void setCameraAngles (const Vector3& origin);
57 
58 		// Increases/decreases the far clip plane distance
59 		void cubicScaleIn ();
60 		void cubicScaleOut ();
61 
62 		void queueDraw ();
63 		void draw ();
64 		void update ();
65 
66 		static void captureStates ();
67 		static void releaseStates ();
68 
69 		Camera& getCamera ();
70 
71 		void changeFloor (bool up);
72 
73 		GtkWidget* getWidget ();
74 		void setParent(GtkWindow* parent);
75 		GtkWindow* getParent ();
76 
77 		void enableFreeMove ();
78 		void disableFreeMove ();
79 
80 		bool m_bFreeMove;
81 
82 		void jumpToObject(SelectionTest& selectionTest);
83 
84 		CameraView* getCameraView ();
85 
86 		// Enables/disables the (ordinary) camera movement (non-freelook)
87 		void addHandlersMove ();
88 		void removeHandlersMove ();
89 
90 		void enableDiscreteMoveEvents();
91 		void enableFreeMoveEvents();
92 
93 		void disableDiscreteMoveEvents();
94 		void disableFreeMoveEvents();
95 
96 	private:
97 		void Cam_Draw ();
98 
99 		static gboolean selection_button_press_freemove(GtkWidget* widget, GdkEventButton* event, WindowObserver* observer);
100 		static gboolean selection_button_release_freemove(GtkWidget* widget, GdkEventButton* event, WindowObserver* observer);
101 		static gboolean selection_motion_freemove(GtkWidget *widget, GdkEventMotion *event, WindowObserver* observer);
102 		static gboolean wheelmove_scroll(GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd);
103 		static gboolean selection_button_press(GtkWidget* widget, GdkEventButton* event, WindowObserver* observer);
104 		static gboolean selection_button_release(GtkWidget* widget, GdkEventButton* event, WindowObserver* observer);
105 		static gboolean enable_freelook_button_press(GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd);
106 		static gboolean disable_freelook_button_press(GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd);
107 
108 		static gboolean camera_size_allocate(GtkWidget* widget, GtkAllocation* allocation, CamWnd* camwnd);
109 		static gboolean camera_expose(GtkWidget* widget, GdkEventExpose* event, gpointer data);
110 
111 		void onSceneGraphChange ();
112 };
113 
114 typedef MemberCaller<CamWnd, &CamWnd::queueDraw> CamWndQueueDraw;
115 typedef MemberCaller<CamWnd, &CamWnd::update> CamWndUpdate;
116