1 #pragma once
2 
3 
4 #include "FredRenderer.h"
5 #include "Editor.h"
6 #include "IDialogProvider.h"
7 
8 #include <object/object.h>
9 
10 namespace fso {
11 namespace fred {
12 
13 struct ViewSettings {
14 	bool Universal_heading = false;
15 	bool Show_stars = true;
16 	bool Show_horizon = false;
17 	bool Show_grid = true;
18 	bool Show_distances = true;
19 	bool Show_asteroid_field = true;
20 	bool Aa_gridlines = false;
21 	bool Show_coordinates = false;
22 	bool Show_outlines = false;
23 	bool Draw_outlines_on_selected_ships = true;
24 	bool Show_grid_positions = true;
25 	bool Show_dock_points = false;
26 	bool Show_starts = true;
27 	bool Show_ships = true;
28 	std::array<bool, MAX_IFFS> Show_iff;
29 	bool Show_ship_info = true;
30 	bool Show_ship_models = true;
31 	bool Show_paths_fred = false;
32 	bool Lighting_on = false;
33 	bool FullDetail = false;
34 	bool Show_waypoints = true;
35 	bool Show_compass = true;
36 	bool Highlight_selectable_subsys = false;
37 
38 	ViewSettings();
39 };
40 
41 class EditorViewport {
42 	std::unique_ptr<FredRenderer> _renderer; //!< Internal, owned pointer
43 
44 	/**
45 	* A lot of this stuff doesn't belong here
46 	* @todo: Move camera stuff into own class
47 	*/
48 	int last_x = 0;
49 	int last_y = 0;
50 
51 	matrix my_orient = vmd_identity_matrix;
52 	matrix trackball_orient = vmd_identity_matrix;
53 	matrix Last_eye_orient = vmd_identity_matrix;
54 	matrix Last_control_orient = vmd_identity_matrix;
55 	int Last_cursor_over = -1;
56 
57 	int Flying_controls_mode = 1;
58 
59 	fix lasttime = 0;
60 
61 	bool inc_mission_time();
62 	void process_system_keys(int key);
63 	void process_controls(vec3d* pos, matrix* orient, float frametime, int key, int mode = 0);
64 	void level_object(matrix* orient);
65 
66 	void initialSetup();
67  public:
68 	enum {
69 		DUP_DRAG_OF_WING = 2
70 	};
71 
72 	EditorViewport(Editor* in_editor, std::unique_ptr<FredRenderer>&& in_renderer);
73 
74 	void needsUpdate();
75 
76 	void resetView();
77 
78 	void select_objects(const Marking_box& box);
79 
80 	void resetViewPhysics();
81 
82 	void game_do_frame(const int cur_object_index);
83 
84 	void move_mouse(int btn, int mdx, int mdy);
85 
86 	int object_check_collision(object* objp, vec3d* p0, vec3d* p1, vec3d* hitpos);
87 
88 	int select_object(int cx, int cy);
89 
90 
91 	// viewpoint -> attach camera to current ship.
92 	// cur_obj -> ship viewed.
93 	void level_controlled();
94 	void verticalize_controlled();
95 
96 	void drag_rotate_save_backup();
97 
98 	int create_object_on_grid(int x, int y, int waypoint_instance);
99 
100 	int	create_object(vec3d *pos, int waypoint_instance = -1);
101 
102 	int duplicate_marked_objects();
103 	int drag_objects(int x, int y);
104 
105 	int drag_rotate_objects(int mouse_dx, int mouse_dy);
106 
107 	void view_universe(bool just_marked);
108 
109 	void view_object(int obj_num);
110 
111 	vec3d Last_eye_pos;
112 
113 	vec3d eye_pos;
114 	vec3d Last_control_pos = vmd_zero_vector;
115 	vec3d my_pos;
116 	matrix eye_orient;
117 	control_info view_controls;
118 
119 	ViewSettings view;
120 
121 	int Cursor_over = -1;
122 	CursorMode Editing_mode = CursorMode::Moving;
123 
124 	matrix view_orient = vmd_identity_matrix;
125 	vec3d view_pos;
126 	physics_info view_physics;
127 	grid* The_grid;
128 
129 	int physics_speed = 1;
130 	int physics_rot = 25;
131 
132 	vec3d Constraint;
133 	vec3d Anticonstraint;
134 	bool Single_axis_constraint = false;
135 
136 	int viewpoint = 0;
137 	int view_obj = -1;
138 
139 	int Control_mode = 0;
140 
141 	bool Selection_lock = false;
142 
143 	bool button_down = false;
144 	int on_object = -1;
145 	int Dup_drag = 0;
146 
147 	int cur_model_index = 0;
148 
149 	bool Bg_bitmap_dialog = false;
150 
151 	object_orient_pos rotation_backup[MAX_OBJECTS];
152 
153 	vec3d saved_cam_pos = vmd_zero_vector;
154 	matrix saved_cam_orient;
155 
156 	vec3d original_pos = vmd_zero_vector;
157 
158 	bool moved = false;
159 
160 	int Duped_wing;
161 
162 	bool Group_rotate = true;
163 	bool Lookat_mode = false;
164 	bool Move_ships_when_undocking = true;
165 
166 	Editor* editor = nullptr;
167 	FredRenderer* renderer = nullptr;
168 	IDialogProvider* dialogProvider = nullptr;
169 };
170 
171 }
172 }
173 
174 
175 
176