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