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_MapFacade
21 #define TrenchBroom_MapFacade
22 
23 #include "Assets/AssetTypes.h"
24 #include "Model/EntityColor.h"
25 #include "Model/ModelTypes.h"
26 
27 namespace TrenchBroom {
28     namespace Model {
29         class BrushFaceAttributes;
30         class ChangeBrushFaceAttributesRequest;
31         class NodeCollection;
32 
33         class MapFacade {
34         public:
35             virtual ~MapFacade();
36         public: // selection
37             virtual bool hasSelection() const = 0;
38             virtual bool hasSelectedNodes() const = 0;
39             virtual bool hasSelectedBrushFaces() const = 0;
40 
41             virtual const AttributableNodeList allSelectedAttributableNodes() const = 0;
42             virtual const NodeCollection& selectedNodes() const = 0;
43             virtual const BrushFaceList allSelectedBrushFaces() const = 0;
44             virtual const BrushFaceList& selectedBrushFaces() const = 0;
45 
46             virtual const BBox3& referenceBounds() const = 0;
47             virtual const BBox3& lastSelectionBounds() const = 0;
48             virtual const BBox3& selectionBounds() const = 0;
49             virtual const String& currentTextureName() const = 0;
50 
51             virtual void selectAllNodes() = 0;
52             virtual void selectSiblings() = 0;
53             virtual void selectTouching(bool del) = 0;
54             virtual void selectInside(bool del) = 0;
55             virtual void selectNodesWithFilePosition(const std::vector<size_t>& positions) = 0;
56             virtual void select(const NodeList& nodes) = 0;
57             virtual void select(Node* node) = 0;
58             virtual void select(const BrushFaceList& faces) = 0;
59             virtual void select(BrushFace* face) = 0;
60             virtual void convertToFaceSelection() = 0;
61 
62             virtual void deselectAll() = 0;
63             virtual void deselect(Node* node) = 0;
64             virtual void deselect(const NodeList& nodes) = 0;
65             virtual void deselect(BrushFace* face) = 0;
66         public: // adding, removing, reparenting, and duplicating nodes
67             virtual void addNode(Node* node, Node* parent) = 0;
68             virtual void removeNode(Node* node) = 0;
69 
70             virtual NodeList addNodes(const ParentChildrenMap& nodes) = 0;
71             virtual void removeNodes(const NodeList& nodes) = 0;
72 
73             virtual void reparentNodes(Node* newParent, const NodeList& children) = 0;
74             virtual void reparentNodes(const ParentChildrenMap& nodes) = 0;
75             virtual bool deleteObjects() = 0;
76             virtual bool duplicateObjects() = 0;
77         public: // modifying transient node attributes
78             virtual void hide(const Model::NodeList nodes) = 0;
79             virtual void show(const Model::NodeList& nodes) = 0;
80             virtual void resetVisibility(const Model::NodeList& nodes) = 0;
81 
82             virtual void lock(const Model::NodeList& nodes) = 0;
83             virtual void unlock(const Model::NodeList& nodes) = 0;
84             virtual void resetLock(const Model::NodeList& nodes) = 0;
85         public: // modifying objects
86             virtual bool translateObjects(const Vec3& delta) = 0;
87             virtual bool rotateObjects(const Vec3& center, const Vec3& axis, FloatType angle) = 0;
88             virtual bool flipObjects(const Vec3& center, Math::Axis::Type axis) = 0;
89         public: // modifying entity attributes
90             virtual bool setAttribute(const AttributeName& name, const AttributeValue& value) = 0;
91             virtual bool renameAttribute(const AttributeName& oldName, const AttributeName& newName) = 0;
92             virtual bool removeAttribute(const AttributeName& name) = 0;
93 
94             virtual bool convertEntityColorRange(const AttributeName& name, Assets::ColorRange::Type range) = 0;
95         public: // brush resizing
96             virtual bool resizeBrushes(const BrushFaceList& faces, const Vec3& delta) = 0;
97         public: // modifying face attributes
98             virtual bool setTexture(Assets::Texture* texture) = 0;
99             virtual bool setFaceAttributes(const BrushFaceAttributes& attributes) = 0;
100             virtual bool setFaceAttributes(const ChangeBrushFaceAttributesRequest& request) = 0;
101             virtual bool moveTextures(const Vec3f& cameraUp, const Vec3f& cameraRight, const Vec2f& delta) = 0;
102             virtual bool rotateTextures(float angle) = 0;
103             virtual bool shearTextures(const Vec2f& factors) = 0;
104         public: // modifying vertices
105             virtual void rebuildBrushGeometry(const BrushList& brushes) = 0;
106             bool snapVertices(size_t snapTo);
107             virtual bool snapVertices(const VertexToBrushesMap& vertices, size_t snapTo) = 0;
108             virtual bool findPlanePoints() = 0;
109 
110             struct MoveVerticesResult {
111                 bool success;
112                 bool hasRemainingVertices;
113                 MoveVerticesResult(bool i_success, bool i_hasRemainingVertices);
114             };
115 
116             virtual MoveVerticesResult moveVertices(const VertexToBrushesMap& vertices, const Vec3& delta) = 0;
117             virtual bool moveEdges(const VertexToEdgesMap& edges, const Vec3& delta) = 0;
118             virtual bool moveFaces(const VertexToFacesMap& faces, const Vec3& delta) = 0;
119             virtual bool splitEdges(const VertexToEdgesMap& edges, const Vec3& delta) = 0;
120             virtual bool splitFaces(const VertexToFacesMap& faces, const Vec3& delta) = 0;
121         };
122 
123         class PushSelection {
124         private:
125             MapFacade* m_facade;
126             NodeList m_nodes;
127             BrushFaceList m_faces;
128         public:
129             PushSelection(MapFacade* facade);
130             ~PushSelection();
131         };
132     }
133 }
134 
135 #endif /* defined(TrenchBroom_MapFacade) */
136