00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <config.h>
00021 #include "controller.hxx"
00022 #include "construo.hxx"
00023 #include "graphic_context.hxx"
00024 #include "worldview_component.hxx"
00025 #include "string_utils.hxx"
00026 #include "worldview_insert_tool.hxx"
00027 #include "gui_buttons.hxx"
00028 #include "gui_window.hxx"
00029 #include "gui_label.hxx"
00030 #include "globals.hxx"
00031 #include "screen_manager.hxx"
00032 #include "world_gui_manager.hxx"
00033
00034 using namespace StringUtils;
00035
00036 WorldGUIManager* WorldGUIManager::instance_ = 0;
00037
00038
00039 void increase_particle_mass() {
00040 WorldViewInsertTool& wc = *WorldViewComponent::instance()->get_insert_tool();
00041 wc.set_particle_mass(wc.get_particle_mass() + 1.0f);
00042 }
00043
00044 void decrease_particle_mass() {
00045 WorldViewInsertTool& wc = *WorldViewComponent::instance()->get_insert_tool();
00046 wc.set_particle_mass(wc.get_particle_mass() - 1.0f);
00047 }
00048
00049 void switch_to_insert_mode() {
00050 WorldViewComponent::instance()->set_mode (WorldViewComponent::INSERT_MODE);
00051 }
00052
00053 bool insert_mode_hfunc() {
00054 return WorldViewComponent::instance()->get_mode() == WorldViewComponent::INSERT_MODE;
00055 }
00056
00057 bool zoom_mode_hfunc() {
00058 return WorldViewComponent::instance()->get_mode() == WorldViewComponent::ZOOM_MODE;
00059 }
00060
00061 bool select_mode_hfunc() {
00062 return WorldViewComponent::instance()->get_mode() == WorldViewComponent::SELECT_MODE;
00063 }
00064
00065 bool collider_mode_hfunc() {
00066 return WorldViewComponent::instance()->get_mode() == WorldViewComponent::COLLIDER_MODE;
00067 }
00068
00069 void switch_to_zoom_mode() {
00070 WorldViewComponent::instance()->set_mode (WorldViewComponent::ZOOM_MODE);
00071 }
00072
00073 void switch_to_collider_mode() {
00074 WorldViewComponent::instance()->set_mode (WorldViewComponent::COLLIDER_MODE);
00075 }
00076
00077 void switch_to_select_mode() {
00078 WorldViewComponent::instance()->set_mode (WorldViewComponent::SELECT_MODE);
00079 }
00080
00081 void save_button_callback() {
00082 ScreenManager::instance()->set_gui(ScreenManager::SAVE_GUI);
00083 }
00084
00085 void action_cam_callback() {
00086 Controller::instance()->set_action_cam(!Controller::instance()->get_action_cam());
00087 }
00088
00089 void zoom_in_callback() {
00090 WorldViewComponent::instance()->wheel_up (graphic_context->get_width()/2,
00091 graphic_context->get_height()/2);
00092 }
00093
00094 void zoom_out_callback() {
00095 WorldViewComponent::instance()->wheel_down (graphic_context->get_width()/2,
00096 graphic_context->get_height()/2);
00097
00098 }
00099
00100 void hide_dots_callback() {
00101 Controller& c = *Controller::instance();
00102 c.set_hide_dots(!c.get_hide_dots());
00103 }
00104
00105 bool hide_dots_hfunc ()
00106 {
00107 return Controller::instance()->get_hide_dots();
00108 }
00109
00110 bool action_cam_hfunc ()
00111 {
00112 return Controller::instance()->get_action_cam();
00113 }
00114
00115 void redo_callback ()
00116 {
00117 return Controller::instance()->redo();
00118 }
00119
00120 void undo_callback ()
00121 {
00122 return Controller::instance()->undo();
00123 }
00124
00125 #define BUTTON_POS(n) (75 + n * 30)
00126 #define BUTTON_RPOS(n) (50 + n * 30)
00127 #define BUTTON_WIDTH 75
00128 #define BUTTON_HEIGHT 25
00129 #define BUTTON_LX_POS (graphic_context->get_width() - BUTTON_WIDTH - 10)
00130
00131 WorldGUIManager::WorldGUIManager ()
00132 {
00133 instance_ = this;
00134
00135 add(new WorldViewComponent ());
00136
00137 add(new GUIRunButton ());
00138 add(new GUISlowMoButton ());
00139
00140
00141 add(new GUILoadButton ());
00142 add(new GUIGenericButton ("Save", 10, BUTTON_POS(9), BUTTON_WIDTH, BUTTON_HEIGHT, save_button_callback));
00143
00144 add(new GUIGenericButton ("Undo", 10, BUTTON_POS(5), BUTTON_WIDTH, BUTTON_HEIGHT, undo_callback));
00145 add(new GUIGenericButton ("Redo", 10, BUTTON_POS(6), BUTTON_WIDTH, BUTTON_HEIGHT, redo_callback));
00146
00147 add(new GUIGenericButton ("ActionCam", 10, BUTTON_POS(2), BUTTON_WIDTH, BUTTON_HEIGHT, action_cam_callback, action_cam_hfunc));
00148 add(new GUIGenericButton ("Hide Dots", 10, BUTTON_POS(3), BUTTON_WIDTH, BUTTON_HEIGHT, hide_dots_callback, hide_dots_hfunc));
00149 add(new GUIQuitButton ());
00150
00151
00152
00153 add(new GUIGenericButton ("Insert", BUTTON_LX_POS, BUTTON_RPOS(4), BUTTON_WIDTH, BUTTON_HEIGHT, switch_to_insert_mode, insert_mode_hfunc));
00154 add(new GUIGenericButton ("Select", BUTTON_LX_POS, BUTTON_RPOS(5), BUTTON_WIDTH, BUTTON_HEIGHT, switch_to_select_mode, select_mode_hfunc));
00155 add(new GUIGenericButton ("Collider", BUTTON_LX_POS, BUTTON_RPOS(6), BUTTON_WIDTH, BUTTON_HEIGHT, switch_to_collider_mode, collider_mode_hfunc));
00156 add(new GUIGenericButton ("Zoom", BUTTON_LX_POS, BUTTON_RPOS(7), BUTTON_WIDTH, BUTTON_HEIGHT, switch_to_zoom_mode, zoom_mode_hfunc));
00157
00158 add(new GUIGenericButton ("-", BUTTON_LX_POS + 38, BUTTON_RPOS(8), 25, 25, zoom_out_callback));
00159 add(new GUIGenericButton ("+", BUTTON_LX_POS + 6, BUTTON_RPOS(8), 25, 25, zoom_in_callback));
00160
00161 if(0)
00162 {
00163 add(new GUIGenericButton ("Increase ParticleMass", 650, 220, 140, 25, increase_particle_mass));
00164 add(new GUIGenericButton ("Decrease ParticleMass", 650, 250, 140, 25, decrease_particle_mass));
00165
00166 add(new GUILabel ("Stiffness", 550, 280, 75, 25));
00167
00168 add(new GUIGenericButton ("+", BUTTON_LX_POS, 280, 25, 25, increase_particle_mass));
00169 add(new GUIGenericButton ("-", 680, 280, 25, 25, decrease_particle_mass));
00170
00171 add(new GUIGenericButton ("+", 650, 280, 25, 25, increase_particle_mass));
00172 add(new GUIGenericButton ("-", 680, 280, 25, 25, decrease_particle_mass));
00173 }
00174
00175
00176
00177
00178
00179
00180
00181 }
00182
00183 WorldGUIManager::~WorldGUIManager ()
00184 {
00185 }
00186
00187 void
00188 WorldGUIManager::update()
00189 {
00190 Controller::instance()->update ();
00191 }
00192
00193 void
00194 WorldGUIManager::draw_overlay ()
00195 {
00196 graphic_context->draw_string (10, 20, " [1-9] - quick save");
00197 graphic_context->draw_string (10, 32, "[shift 1-9] - quick load");
00198 graphic_context->draw_string (10, 44, " [space] - run simulation");
00199 graphic_context->draw_string (10, 56, " [tab] - toggle slow motion");
00200
00201 graphic_context->draw_string (200, 20, " [c] - clear scene");
00202 graphic_context->draw_string (200, 32, " [u] - undo to last state");
00203 graphic_context->draw_string (200, 44, " [r] - redo (undo an undo)");
00204 graphic_context->draw_string (200, 56, " [+/-] - zoom in/out");
00205
00206
00207 graphic_context->draw_string (600, 32, "[middle] - scroll");
00208
00209 switch (WorldViewComponent::instance()->get_mode())
00210 {
00211 case WorldViewComponent::INSERT_MODE:
00212 graphic_context->draw_string (600, 20, " [left] - insert/connect spots");
00213 graphic_context->draw_string (600, 44, " [right] - remove spot");
00214 graphic_context->draw_string (400, 20, " [f] - fix current dot");
00215 break;
00216
00217 case WorldViewComponent::SELECT_MODE:
00218 graphic_context->draw_string (600, 20, " [left] - create/move selection");
00219 graphic_context->draw_string (600, 44, " [right] - rotate selection");
00220 graphic_context->draw_string (400, 20, " [v] - set velocity");
00221 graphic_context->draw_string (400, 32, " [d] - duplicate selection");
00222 graphic_context->draw_string (400, 44, " [h] - flip selection");
00223 graphic_context->draw_string (400, 56, " [f] - fix selection");
00224 break;
00225
00226 case WorldViewComponent::ZOOM_MODE:
00227 graphic_context->draw_string (600, 20, " [left] - zoom into region");
00228 break;
00229
00230 case WorldViewComponent::COLLIDER_MODE:
00231 graphic_context->draw_string (600, 20, " [left] - create/move collider");
00232 graphic_context->draw_string (600, 44, " [right] - remove collider");
00233 break;
00234
00235 default:
00236 break;
00237 }
00238
00239 World& world = *Controller::instance()->get_world ();
00240
00241
00242
00243
00244
00245 int bottom_line = graphic_context->get_height() - 10;
00246 graphic_context->draw_string (10, bottom_line-20, "FPS: ");
00247 graphic_context->draw_string (80, bottom_line-20, to_string(current_fps));
00248
00249 graphic_context->draw_string (10, bottom_line, "Pos: ");
00250 graphic_context->draw_string (80, bottom_line,
00251 to_string(WorldViewComponent::instance()->get_gc()->screen_to_world(input_context->get_mouse_pos())));
00252
00253 graphic_context->draw_string (210, bottom_line-20, "Particles: ");
00254 graphic_context->draw_string (280, bottom_line-20, to_string(world.get_num_particles()));
00255
00256 graphic_context->draw_string (210, bottom_line, "Springs: ");
00257 graphic_context->draw_string (280, bottom_line, to_string(world.get_num_springs()));
00258
00259 graphic_context->draw_string (410, bottom_line, "Zoom: ");
00260 graphic_context->draw_string (480, bottom_line, to_string(WorldViewComponent::instance()->get_zoom()));
00261
00262 graphic_context->draw_string (610, bottom_line, "..:: Construo V"VERSION" ::..");
00263
00264 }
00265
00266