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