1 /* 2 Copyright (C) 2010-2014 Kristian Duske 3 4 This file is part of TrenchBroom. 5 6 TrenchBroom is free software: you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 TrenchBroom is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef TrenchBroom_MapViewBase 21 #define TrenchBroom_MapViewBase 22 23 #include "Assets/EntityDefinition.h" 24 #include "Model/ModelTypes.h" 25 #include "View/ActionContext.h" 26 #include "View/CameraLinkHelper.h" 27 #include "View/GLAttribs.h" 28 #include "View/InputState.h" 29 #include "View/MapView.h" 30 #include "View/RenderView.h" 31 #include "View/ToolBoxConnector.h" 32 #include "View/UndoableCommand.h" 33 #include "View/ViewTypes.h" 34 35 namespace TrenchBroom { 36 class Logger; 37 38 namespace IO { 39 class Path; 40 } 41 42 namespace Renderer { 43 class Compass; 44 class MapRenderer; 45 class RenderBatch; 46 class RenderContext; 47 class Vbo; 48 } 49 50 namespace View { 51 class AnimationManager; 52 class Command; 53 class FlyModeHelper; 54 class GLContextManager; 55 class MapViewToolBox; 56 class MovementRestriction; 57 class Selection; 58 class Tool; 59 60 class MapViewBase : public MapView, public RenderView, public ToolBoxConnector, public CameraLinkableView { 61 protected: 62 static const wxLongLong DefaultCameraAnimationDuration; 63 64 Logger* m_logger; 65 MapDocumentWPtr m_document; 66 MapViewToolBox& m_toolBox; 67 68 AnimationManager* m_animationManager; 69 private: 70 Renderer::MapRenderer& m_renderer; 71 Renderer::Compass* m_compass; 72 protected: 73 MapViewBase(wxWindow* parent, Logger* logger, MapDocumentWPtr document, MapViewToolBox& toolBox, Renderer::MapRenderer& renderer, GLContextManager& contextManager); 74 75 void setCompass(Renderer::Compass* compass); 76 public: 77 virtual ~MapViewBase(); 78 private: 79 void bindObservers(); 80 void unbindObservers(); 81 82 void nodesDidChange(const Model::NodeList& nodes); 83 void toolChanged(Tool* tool); 84 void commandDone(Command::Ptr command); 85 void commandUndone(UndoableCommand::Ptr command); 86 void selectionDidChange(const Selection& selection); 87 void textureCollectionsDidChange(); 88 void entityDefinitionsDidChange(); 89 void modsDidChange(); 90 void editorContextDidChange(); 91 void mapViewConfigDidChange(); 92 void gridDidChange(); 93 void preferenceDidChange(const IO::Path& path); 94 void documentDidChange(MapDocument* document); 95 private: // interaction events 96 void bindEvents(); 97 98 void OnMoveObjectsForward(wxCommandEvent& event); 99 void OnMoveObjectsBackward(wxCommandEvent& event); 100 void OnMoveObjectsLeft(wxCommandEvent& event); 101 void OnMoveObjectsRight(wxCommandEvent& event); 102 void OnMoveObjectsUp(wxCommandEvent& event); 103 void OnMoveObjectsDown(wxCommandEvent& event); 104 105 void OnDuplicateObjectsForward(wxCommandEvent& event); 106 void OnDuplicateObjectsBackward(wxCommandEvent& event); 107 void OnDuplicateObjectsLeft(wxCommandEvent& event); 108 void OnDuplicateObjectsRight(wxCommandEvent& event); 109 void OnDuplicateObjectsUp(wxCommandEvent& event); 110 void OnDuplicateObjectsDown(wxCommandEvent& event); 111 112 void OnRollObjectsCW(wxCommandEvent& event); 113 void OnRollObjectsCCW(wxCommandEvent& event); 114 void OnPitchObjectsCW(wxCommandEvent& event); 115 void OnPitchObjectsCCW(wxCommandEvent& event); 116 void OnYawObjectsCW(wxCommandEvent& event); 117 void OnYawObjectsCCW(wxCommandEvent& event); 118 119 void OnFlipObjectsH(wxCommandEvent& event); 120 void OnFlipObjectsV(wxCommandEvent& event); 121 122 void duplicateAndMoveObjects(Math::Direction direction); 123 void duplicateObjects(); 124 void moveObjects(Math::Direction direction); 125 Vec3 moveDirection(Math::Direction direction) const; 126 void rotateObjects(Math::RotationAxis axis, bool clockwise); 127 Vec3 rotationAxis(Math::RotationAxis axis, bool clockwise) const; 128 private: // tool mode events 129 void OnToggleRotateObjectsTool(wxCommandEvent& event); 130 void OnMoveRotationCenterForward(wxCommandEvent& event); 131 void OnMoveRotationCenterBackward(wxCommandEvent& event); 132 void OnMoveRotationCenterLeft(wxCommandEvent& event); 133 void OnMoveRotationCenterRight(wxCommandEvent& event); 134 void OnMoveRotationCenterUp(wxCommandEvent& event); 135 void OnMoveRotationCenterDown(wxCommandEvent& event); 136 void moveRotationCenter(Math::Direction direction); 137 138 void OnToggleClipSide(wxCommandEvent& event); 139 void OnPerformClip(wxCommandEvent& event); 140 void OnRemoveLastClipPoint(wxCommandEvent& event); 141 142 void OnMoveVerticesForward(wxCommandEvent& event); 143 void OnMoveVerticesBackward(wxCommandEvent& event); 144 void OnMoveVerticesLeft(wxCommandEvent& event); 145 void OnMoveVerticesRight(wxCommandEvent& event); 146 void OnMoveVerticesUp(wxCommandEvent& event); 147 void OnMoveVerticesDown(wxCommandEvent& event); 148 void moveVertices(Math::Direction direction); 149 150 void OnCancel(wxCommandEvent& event); 151 bool cancel(); 152 153 void OnDeactivateTool(wxCommandEvent& event); 154 private: // group management 155 void OnGroupSelectedObjects(wxCommandEvent& event); 156 void OnUngroupSelectedObjects(wxCommandEvent& event); 157 void OnRenameGroups(wxCommandEvent& event); 158 private: // reparenting objects 159 void OnAddObjectsToGroup(wxCommandEvent& event); 160 void OnRemoveObjectsFromGroup(wxCommandEvent& event); 161 Model::Node* findNewGroupForObjects(const Model::NodeList& nodes) const; 162 163 void OnMoveBrushesTo(wxCommandEvent& event); 164 Model::Node* findNewParentEntityForBrushes(const Model::NodeList& nodes) const; 165 166 bool canReparentNodes(const Model::NodeList& nodes, const Model::Node* newParent) const; 167 void reparentNodes(const Model::NodeList& nodes, Model::Node* newParent); 168 Model::NodeList collectReparentableNodes(const Model::NodeList& nodes, const Model::Node* newParent) const; 169 170 void OnCreatePointEntity(wxCommandEvent& event); 171 void OnCreateBrushEntity(wxCommandEvent& event); 172 173 Assets::EntityDefinition* findEntityDefinition(Assets::EntityDefinition::Type type, size_t index) const; 174 void createPointEntity(const Assets::PointEntityDefinition* definition); 175 void createBrushEntity(const Assets::BrushEntityDefinition* definition); 176 bool canCreateBrushEntity(); 177 private: // other events 178 void OnSetFocus(wxFocusEvent& event); 179 void OnKillFocus(wxFocusEvent& event); 180 void OnActivateFrame(wxActivateEvent& event); 181 protected: // accelerator table management 182 void updateAcceleratorTable(); 183 private: 184 void updateAcceleratorTable(bool hasFocus); 185 ActionContext actionContext() const; 186 private: // implement ViewEffectsService interface 187 void doFlashSelection(); 188 private: // implement MapView interface 189 bool doGetIsCurrent() const; 190 void doSetToolBoxDropTarget(); 191 void doClearDropTarget(); 192 bool doCanFlipObjects() const; 193 void doFlipObjects(Math::Direction direction); 194 private: // implement RenderView interface 195 void doInitializeGL(bool firstInitialization); 196 bool doShouldRenderFocusIndicator() const; 197 void doRender(); 198 Renderer::RenderContext createRenderContext(); 199 void setupGL(Renderer::RenderContext& renderContext); 200 void renderCoordinateSystem(Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch); 201 void renderPointFile(Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch); 202 void renderCompass(Renderer::RenderBatch& renderBatch); 203 private: // implement ToolBoxConnector 204 void doShowPopupMenu(); 205 wxMenu* makeEntityGroupsMenu(Assets::EntityDefinition::Type type, int id); 206 207 void OnUpdatePopupMenuItem(wxUpdateUIEvent& event); 208 void updateGroupObjectsMenuItem(wxUpdateUIEvent& event) const; 209 void updateUngroupObjectsMenuItem(wxUpdateUIEvent& event) const; 210 void updateRenameGroupsMenuItem(wxUpdateUIEvent& event) const; 211 void updateReparentBrushesMenuItem(wxUpdateUIEvent& event) const; 212 void updateMoveBrushesToWorldMenuItem(wxUpdateUIEvent& event) const; 213 private: // subclassing interface 214 virtual Vec3 doGetMoveDirection(Math::Direction direction) const = 0; 215 virtual Vec3 doComputePointEntityPosition(const BBox3& bounds) const = 0; 216 217 virtual ActionContext doGetActionContext() const = 0; 218 virtual wxAcceleratorTable doCreateAccelerationTable(ActionContext context) const = 0; 219 virtual bool doCancel() = 0; 220 221 virtual Renderer::RenderContext doCreateRenderContext() = 0; 222 virtual void doRenderGrid(Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch) = 0; 223 virtual void doRenderMap(Renderer::MapRenderer& renderer, Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch) = 0; 224 virtual void doRenderTools(MapViewToolBox& toolBox, Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch) = 0; 225 virtual void doRenderExtras(Renderer::RenderContext& renderContext, Renderer::RenderBatch& renderBatch); 226 227 virtual void doAfterPopupMenu(); 228 }; 229 } 230 } 231 232 #endif /* defined(TrenchBroom_MapViewBase) */ 233