void SplitPaneLayout::createViews() { // We need to know the camera position first _cameraPosition = getCameraPositionFromRegistry(); // Initialise mapping and create the views for (int i = QuadrantTopLeft; i <= QuadrantBottomRight; ++i) { Position pos = static_cast<Position>(i); Quadrant quadrant; quadrant.type = (_cameraPosition == pos) ? Quadrant::Camera : Quadrant::OrthoView; wxWindow* parent = (pos == QuadrantTopLeft || pos == QuadrantBottomLeft) ? _splitPane.vertPane1 : _splitPane.vertPane2; if (quadrant.type == Quadrant::Camera) { _camWnd = GlobalCamera().createCamWnd(parent); quadrant.widget = _camWnd->getMainWidget(); } else { quadrant.xyWnd = GlobalXYWnd().createEmbeddedOrthoView(XY, parent); quadrant.widget = quadrant.xyWnd->getGLWidget(); } _quadrants[pos] = quadrant; } // Call Split on the wxSplitterWindows to complete creation _splitPane.vertPane1->SplitHorizontally(_quadrants[QuadrantTopLeft].widget, _quadrants[QuadrantBottomLeft].widget); _splitPane.vertPane2->SplitHorizontally(_quadrants[QuadrantTopRight].widget, _quadrants[QuadrantBottomRight].widget); }
void Camera::setOrigin(const Vector3& newOrigin) { _origin = newOrigin; _prevOrigin = _origin; updateModelview(); m_update(); GlobalCamera().movedNotify(); }
void Camera::setAngles(const Vector3& newAngles) { _angles = newAngles; _prevAngles = _angles; updateModelview(); m_update(); GlobalCamera().movedNotify(); }
void Camera::keyMove() { m_mouseMove.flush(); //rMessage() << "keymove... "; float time_seconds = m_keycontrol_timer.elapsed_msec() / static_cast<float>(msec_per_sec); m_keycontrol_timer.start(); if (time_seconds > 0.05f) { time_seconds = 0.05f; // 20fps } keyControl(time_seconds * 5.0f); m_update(); GlobalCamera().movedNotify(); }
void MapPosition::store(const cmd::ArgumentList& args) { rMessage() << "Storing map position #" << _index << std::endl; CamWndPtr camwnd = GlobalCamera().getActiveCamWnd(); if (camwnd != NULL) { _position = camwnd->getCameraOrigin(); _angle = camwnd->getCameraAngles(); // Tag the map as modified GlobalMap().setModified(true); } else { rError() << "MapPosition: Warning: Couldn't find Camera." << std::endl; } }
/* greebo: Saves the current camera position/angles to worldspawn */ void Map::saveCameraPosition() { const std::string keyLastCamPos = GlobalRegistry().get(RKEY_LAST_CAM_POSITION); const std::string keyLastCamAngle = GlobalRegistry().get(RKEY_LAST_CAM_ANGLE); if (m_world_node != NULL) { // Retrieve the entity from the worldspawn node Entity* worldspawn = Node_getEntity(m_world_node); assert(worldspawn != NULL); // This must succeed CamWndPtr camWnd = GlobalCamera().getActiveCamWnd(); if (camWnd == NULL) return; worldspawn->setKeyValue(keyLastCamPos, string::to_string(camWnd->getCameraOrigin())); worldspawn->setKeyValue(keyLastCamAngle, string::to_string(camWnd->getCameraAngles())); } }
void MainFrame::Shutdown (void) { map::AutoSaver().stopTimer(); ui::TexTool::Instance().shutdown(); GlobalUndoSystem().trackerDetach(m_saveStateTracker); GlobalXYWnd().destroyViews(); GlobalCamera().deleteCamWnd(m_pCamWnd); m_pCamWnd = 0; PreferencesDialog_destroyWindow(); delete _sidebar; // Stop the AutoSaver class from being called map::AutoSaver().stopTimer(); }
void CamWnd::changeFloor(bool up) { float current = m_Camera.getOrigin()[2] - 48; float bestUp; float bestDown; GlobalSceneGraph().traverse(FloorHeightWalker(current, bestUp, bestDown)); if (up && bestUp != GlobalRegistry().getFloat("game/defaults/maxWorldCoord")) { current = bestUp; } if (!up && bestDown != -GlobalRegistry().getFloat("game/defaults/maxWorldCoord")) { current = bestDown; } const Vector3& org = m_Camera.getOrigin(); m_Camera.setOrigin(Vector3(org[0], org[1], current + 48)); m_Camera.updateModelview(); update(); GlobalCamera().movedNotify(); }
// move the view to a certain position void Map::focusViews(const Vector3& point, const Vector3& angles) { // Set the camera and the views to the given point GlobalCamera().focusCamera(point, angles); GlobalXYWnd().setOrigin(point); }
/** * @brief Create the user settable window layout */ void MainFrame::Create (void) { GtkWindow* window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); // do this here, because the commands are needed _sidebar = new ui::Sidebar(); GtkWidget *sidebar = _sidebar->getWidget(); // Tell the XYManager which window the xyviews should be transient for GlobalXYWnd().setGlobalParentWindow(window); GlobalWindowObservers_connectTopLevel(window); gtk_window_set_transient_for(ui::Splash::Instance().getWindow(), window); #ifndef _WIN32 { GdkPixbuf* pixbuf = gtkutil::getLocalPixbuf(ui::icons::ICON); if (pixbuf != 0) { gtk_window_set_icon(window, pixbuf); g_object_unref(pixbuf); } } #endif gtk_widget_add_events(GTK_WIDGET(window), GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_FOCUS_CHANGE_MASK); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(mainframe_delete), this); m_position_tracker.connect(window); g_MainWindowActive.connect(window); GtkWidget* vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show(vbox); GlobalEventManager().connect(GTK_OBJECT(window)); GlobalEventManager().connectAccelGroup(GTK_WINDOW(window)); m_nCurrentStyle = eSplit; // Create the Filter menu entries ui::FiltersMenu::addItemsToMainMenu(); // Retrieve the "main" menubar from the UIManager GtkMenuBar* mainMenu = GTK_MENU_BAR(GlobalUIManager().getMenuManager()->get("main")); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(mainMenu), false, false, 0); // Instantiate the ToolbarCreator and retrieve the standard toolbar widget ui::ToolbarCreator toolbarCreator; GtkToolbar* generalToolbar = toolbarCreator.getToolbar("view"); gtk_widget_show(GTK_WIDGET(generalToolbar)); GlobalSelectionSetManager().init(generalToolbar); // Pack it into the main window gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(generalToolbar), FALSE, FALSE, 0); GtkWidget* main_statusbar = create_main_statusbar(m_pStatusLabel); gtk_box_pack_end(GTK_BOX(vbox), main_statusbar, FALSE, TRUE, 2); GtkWidget* hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(hbox), TRUE, TRUE, 0); gtk_widget_show(hbox); GtkToolbar* main_toolbar_v = toolbarCreator.getToolbar("edit"); gtk_widget_show(GTK_WIDGET(main_toolbar_v)); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET(main_toolbar_v), FALSE, FALSE, 0); // Connect the window position tracker _windowPosition.loadFromPath(RKEY_WINDOW_STATE); // Yes, connect the position tracker, this overrides the existing setting. _windowPosition.connect(window); int startMonitor = GlobalRegistry().getInt(RKEY_MULTIMON_START_MONITOR); if (startMonitor < gtkutil::MultiMonitor::getNumMonitors()) { // Load the correct coordinates into the position tracker _windowPosition.fitToScreen(gtkutil::MultiMonitor::getMonitor(startMonitor), 0.8f, 0.8f); } // Apply the position _windowPosition.applyPosition(); int windowState = string::toInt(GlobalRegistry().getAttribute(RKEY_WINDOW_STATE, "state"), GDK_WINDOW_STATE_MAXIMIZED); if (windowState & GDK_WINDOW_STATE_MAXIMIZED) gtk_window_maximize(window); m_window = window; gtk_widget_show(GTK_WIDGET(window)); // The default XYView pointer XYWnd* xyWnd; GtkWidget* mainHBox = gtk_hbox_new(0, 0); gtk_box_pack_start(GTK_BOX(hbox), mainHBox, TRUE, TRUE, 0); gtk_widget_show(mainHBox); int w, h; gtk_window_get_size(window, &w, &h); // camera m_pCamWnd = GlobalCamera().newCamWnd(); GlobalCamera().setCamWnd(m_pCamWnd); GlobalCamera().setParent(m_pCamWnd, window); GtkWidget* camera = m_pCamWnd->getWidget(); // Allocate the three ortho views xyWnd = GlobalXYWnd().createXY(); xyWnd->setViewType(XY); GtkWidget* xy = xyWnd->getWidget(); XYWnd* yzWnd = GlobalXYWnd().createXY(); yzWnd->setViewType(YZ); GtkWidget* yz = yzWnd->getWidget(); XYWnd* xzWnd = GlobalXYWnd().createXY(); xzWnd->setViewType(XZ); GtkWidget* xz = xzWnd->getWidget(); // split view (4 views) GtkHPaned* split = create_split_views(camera, yz, xy, xz); gtk_box_pack_start(GTK_BOX(mainHBox), GTK_WIDGET(split), TRUE, TRUE, 0); // greebo: In any layout, there is at least the XY view present, make it active GlobalXYWnd().setActiveXY(xyWnd); PreferencesDialog_constructWindow(window); GlobalGrid().addGridChangeCallback(FreeCaller<XY_UpdateAllWindows> ()); /* enable button state tracker, set default states for begin */ GlobalUndoSystem().trackerAttach(m_saveStateTracker); gtk_box_pack_start(GTK_BOX(mainHBox), GTK_WIDGET(sidebar), FALSE, FALSE, 0); // Start the autosave timer so that it can periodically check the map for changes map::AutoSaver().startTimer(); }
void RegularLayout::activate() { GtkWindow* parent = GlobalMainFrame().getTopLevelWindow(); // Create a new camera window and parent it _camWnd = GlobalCamera().createCamWnd(); // greebo: The mainframe window acts as parent for the camwindow _camWnd->setContainer(parent); // Pack in the camera window GtkWidget* camWindow = gtkutil::FramedWidget(_camWnd->getWidget()); // Allocate a new OrthoView and set its ViewType to XY XYWndPtr xyWnd = GlobalXYWnd().createEmbeddedOrthoView(); xyWnd->setViewType(XY); // Create a framed window out of the view's internal widget GtkWidget* xyView = gtkutil::FramedWidget(xyWnd->getWidget()); // Create the texture window GtkWidget* texWindow = gtkutil::FramedWidget( GlobalTextureBrowser().constructWindow(parent) ); // Now pack those widgets into the paned widgets gtkutil::Paned texCamPane(gtkutil::Paned::Vertical); // First, pack the texwindow and the camera texCamPane.setFirstChild(camWindow, true); // allow shrinking texCamPane.setSecondChild(texWindow, true); // allow shrinking _regular.texCamPane = texCamPane.getWidget(); // Depending on the viewstyle, pack the xy left or right gtkutil::Paned horizPane(gtkutil::Paned::Horizontal); if (_regularLeft) { horizPane.setFirstChild(_regular.texCamPane, true); // allow shrinking horizPane.setSecondChild(xyView, true); // allow shrinking } else { // This is "regular", put the xyview to the left horizPane.setFirstChild(xyView, true); // allow shrinking horizPane.setSecondChild(_regular.texCamPane, true); // allow shrinking } _regular.horizPane = horizPane.getWidget(); // Retrieve the main container of the main window GtkWidget* mainContainer = GlobalMainFrame().getMainContainer(); gtk_container_add(GTK_CONTAINER(mainContainer), GTK_WIDGET(_regular.horizPane)); // Set some default values for the width and height gtk_paned_set_position(GTK_PANED(_regular.horizPane), 500); gtk_paned_set_position(GTK_PANED(_regular.texCamPane), 350); // Connect the pane position trackers _regular.posHPane.connect(_regular.horizPane); _regular.posTexCamPane.connect(_regular.texCamPane); // Now attempt to load the paned positions from the registry restoreStateFromPath(RKEY_REGULAR_ROOT); GlobalGroupDialog().showDialogWindow(); // greebo: Now that the dialog is shown, tell the Entity Inspector to reload // the position info from the Registry once again. GlobalEntityInspector().restoreSettings(); GlobalGroupDialog().hideDialogWindow(); gtk_widget_show_all(mainContainer); // Hide the camera toggle option for non-floating views GlobalUIManager().getMenuManager().setVisibility("main/view/cameraview", false); // Hide the console/texture browser toggles for non-floating/non-split views GlobalUIManager().getMenuManager().setVisibility("main/view/textureBrowser", false); }
void SplitPaneLayout::constructLayout() { _splitPane = SplitPaneView(); _cameraPosition = getCameraPositionFromRegistry(); const Glib::RefPtr<Gtk::Window>& parent = GlobalMainFrame().getTopLevelWindow(); // Create a new camera window and parent it _camWnd = GlobalCamera().createCamWnd(); // greebo: The mainframe window acts as parent for the camwindow _camWnd->setContainer(parent); _camera = Gtk::manage(new gtkutil::FramedWidget(*_camWnd->getWidget())); // Allocate paned widgets _splitPane.horizPane.reset(new Gtk::HPaned); _splitPane.vertPane1 = Gtk::manage(new Gtk::VPaned); _splitPane.vertPane2 = Gtk::manage(new Gtk::VPaned); // Arrange the widgets into the paned views _splitPane.horizPane->pack1(*_splitPane.vertPane1, true, true); _splitPane.horizPane->pack2(*_splitPane.vertPane2, true, true); // Retrieve the main container of the main window Gtk::Container* mainContainer = GlobalMainFrame().getMainContainer(); mainContainer->add(*_splitPane.horizPane); _splitPane.horizPane->set_position(200); _splitPane.vertPane1->set_position(200); _splitPane.vertPane2->set_position(400); _splitPane.posHPane.connect(_splitPane.horizPane.get()); _splitPane.posVPane1.connect(_splitPane.vertPane1); _splitPane.posVPane2.connect(_splitPane.vertPane2); // Attempt to restore this layout's state, this will also construct the orthoviews restoreStateFromPath(RKEY_SPLITPANE_ROOT); // Distribute widgets among quadrants distributeWidgets(); { Gtk::Frame* textureBrowser = Gtk::manage(new gtkutil::FramedWidget( *GlobalTextureBrowser().constructWindow(parent) )); // Add the Media Browser page GlobalGroupDialog().addPage( "textures", // name "Textures", // tab title "icon_texture.png", // tab icon *textureBrowser, // page widget _("Texture Browser") ); } GlobalGroupDialog().showDialogWindow(); // greebo: Now that the dialog is shown, tell the Entity Inspector to reload // the position info from the Registry once again. GlobalEntityInspector().restoreSettings(); GlobalGroupDialog().hideDialogWindow(); mainContainer->show_all(); }
// Handles the mouseDown event, basically determines which action should be performed (select or manipulate) void RadiantWindowObserver::onMouseDown(const WindowVector& position, GdkEventButton* ev) { // Retrieve the according ObserverEvent for the GdkEventButton ui::ObserverEvent observerEvent = GlobalEventManager().MouseEvents().getObserverEvent(ev); // Check if the user wants to copy/paste a texture if (observerEvent == ui::obsCopyTexture || observerEvent == ui::obsPasteTextureProjected || observerEvent == ui::obsPasteTextureNatural || observerEvent == ui::obsPasteTextureCoordinates || observerEvent == ui::obsPasteTextureToBrush || observerEvent == ui::obsJumpToObject) { // Get the mouse position DeviceVector devicePosition(device_constrained(window_to_normalised_device(position, _width, _height))); // Check the target object render::View scissored(*_selectObserver._view); ConstructSelectionTest(scissored, Rectangle::ConstructFromPoint(devicePosition, _selectObserver._epsilon)); SelectionVolume volume(scissored); // Do we have a camera view (fill() == true)? if (_selectObserver._view->fill()) { if (observerEvent == ui::obsJumpToObject) { CamWndPtr cam = GlobalCamera().getActiveCamWnd(); if (cam != NULL) { cam->jumpToObject(volume); } } // If the apply texture modifier is held else if (observerEvent == ui::obsPasteTextureProjected) { // Paste the shader projected (TRUE), but not to an entire brush (FALSE) selection::algorithm::pasteShader(volume, true, false); } // If the copy texture modifier is held else if (observerEvent == ui::obsCopyTexture) { // Set the source texturable from the given test GlobalShaderClipboard().setSource(volume); } else if (observerEvent == ui::obsPasteTextureNatural) { // Paste the shader naturally (FALSE), but not to an entire brush (FALSE) selection::algorithm::pasteShader(volume, false, false); } else if (observerEvent == ui::obsPasteTextureCoordinates) { // Clone the texture coordinates from the patch in the clipboard selection::algorithm::pasteTextureCoords(volume); } else if (observerEvent == ui::obsPasteTextureToBrush) { // Paste the shader projected (TRUE), and to the entire brush (TRUE) selection::algorithm::pasteShader(volume, true, true); } } } // Have any of the "selection" events occurred? // greebo: This could be an "else if (observerEvent != obsNothing)" as well, // but perhaps there will be more events in the future that aren't selection events. if (observerEvent == ui::obsManipulate || observerEvent == ui::obsSelect || observerEvent == ui::obsToggle || observerEvent == ui::obsToggleFace || observerEvent == ui::obsToggleGroupPart || observerEvent == ui::obsReplace || observerEvent == ui::obsReplaceFace) { _mouseDown = true; // Determine the current mouse position DeviceVector devicePosition(window_to_normalised_device(position, _width, _height)); if (observerEvent == ui::obsManipulate && _manipulateObserver.mouseDown(devicePosition)) { // This is a manipulation operation, register the callbacks // Note: the mouseDown call in the if clause returned already true, // so a manipulator could be successfully selected _mouseMotionCallback = boost::bind(&ManipulateObserver::mouseMoved, &_manipulateObserver, _1); _mouseUpCallback = boost::bind(&ManipulateObserver::mouseUp, &_manipulateObserver, _1); _listenForCancelEvents = true; } else { // Call the mouseDown method of the selector class, this covers all of the other events _selectObserver.mouseDown(devicePosition); _mouseMotionCallback = boost::bind(&SelectObserver::mouseMoved, &_selectObserver, _1); _mouseUpCallback = boost::bind(&SelectObserver::mouseUp, &_selectObserver, _1); // greebo: the according actions (toggle face, replace, etc.) are handled in the mouseUp methods. } } }
void Camera::mouseMove(int x, int y) { //rMessage() << "mousemove... "; freeMove(-x, -y); m_update(); GlobalCamera().movedNotify(); }
void RegularLayout::activate() { wxFrame* topLevelParent = GlobalMainFrame().getWxTopLevelWindow(); // Main splitter _regular.horizPane = new wxSplitterWindow(topLevelParent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_LIVE_UPDATE | wxSP_3D | wxWANTS_CHARS, "RegularHorizPane"); _regular.horizPane->SetSashGravity(0.5); _regular.horizPane->SetSashPosition(500); _regular.horizPane->SetMinimumPaneSize(1); // disallow unsplitting GlobalMainFrame().getWxMainContainer()->Add(_regular.horizPane, 1, wxEXPAND); // Allocate a new OrthoView and set its ViewType to XY XYWndPtr xywnd = GlobalXYWnd().createEmbeddedOrthoView(XY, _regular.horizPane); // Texture/Camera Pane _regular.texCamPane = new wxSplitterWindow(_regular.horizPane, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_LIVE_UPDATE | wxSP_3D | wxWANTS_CHARS, "RegularTexCamPane"); _regular.texCamPane->SetSashGravity(0.5); _regular.texCamPane->SetSashPosition(350); _regular.texCamPane->SetMinimumPaneSize(1); // disallow unsplitting // Create a new camera window and parent it _camWnd = GlobalCamera().createCamWnd(_regular.texCamPane); // Texture Window wxWindow* texBrowser = GlobalTextureBrowser().constructWindow(_regular.texCamPane); _regular.texCamPane->SplitHorizontally(_camWnd->getMainWidget(), texBrowser); if (_regularLeft) { _regular.horizPane->SplitVertically(_regular.texCamPane, xywnd->getGLWidget()); } else { // This is "regular", put the xyview to the left _regular.horizPane->SplitVertically(xywnd->getGLWidget(), _regular.texCamPane); } // Connect the pane position trackers _regular.posHPane.connect(_regular.horizPane); _regular.posTexCamPane.connect(_regular.texCamPane); // Now attempt to load the paned positions from the registry restoreStateFromPath(RKEY_REGULAR_ROOT); GlobalGroupDialog().showDialogWindow(); // greebo: Now that the dialog is shown, tell the Entity Inspector to reload // the position info from the Registry once again. GlobalEntityInspector().restoreSettings(); GlobalGroupDialog().hideDialogWindow(); topLevelParent->Layout(); // Hide the camera toggle option for non-floating views GlobalUIManager().getMenuManager().setVisibility("main/view/cameraview", false); // Hide the console/texture browser toggles for non-floating/non-split views GlobalUIManager().getMenuManager().setVisibility("main/view/textureBrowser", false); }