Spinning Topp Logo BlackTopp Studios
inc
multipath.h
1 // © Copyright 2010 - 2016 BlackTopp Studios Inc.
2 /* This file is part of The Mezzanine Engine.
3 
4  The Mezzanine Engine is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  The Mezzanine Engine is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with The Mezzanine Engine. If not, see <http://www.gnu.org/licenses/>.
16 */
17 /* The original authors have included a copy of the license specified above in the
18  'Docs' folder. See 'gpl.txt'
19 */
20 /* We welcome the use of the Mezzanine engine to anyone, including companies who wish to
21  Build professional software and charge for their product.
22 
23  However there are some practical restrictions, so if your project involves
24  any of the following you should contact us and we will try to work something
25  out:
26  - DRM or Copy Protection of any kind(except Copyrights)
27  - Software Patents You Do Not Wish to Freely License
28  - Any Kind of Linking to Non-GPL licensed Works
29  - Are Currently In Violation of Another Copyright Holder's GPL License
30  - If You want to change our code and not add a few hundred MB of stuff to
31  your distribution
32 
33  These and other limitations could cause serious legal problems if you ignore
34  them, so it is best to simply contact us or the Free Software Foundation, if
35  you have any questions.
36 
37  Joseph Toppi - toppij@gmail.com
38  John Blackwood - makoenergy02@gmail.com
39 */
40 /*
41  -----------------------------------------------------------------------------
42  This source file is part of ogre-procedural
43 
44  For the latest info, see http://code.google.com/p/ogre-procedural/
45 
46  Copyright (c) 2010-2013 Michael Broutin
47 
48  Permission is hereby granted, free of charge, to any person obtaining a copy
49  of this software and associated documentation files (the "Software"), to deal
50  in the Software without restriction, including without limitation the rights
51  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
52  copies of the Software, and to permit persons to whom the Software is
53  furnished to do so, subject to the following conditions:
54 
55  The above copyright notice and this permission notice shall be included in
56  all copies or substantial portions of the Software.
57 
58  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
59  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
60  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
61  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
62  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
63  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
64  THE SOFTWARE.
65  -----------------------------------------------------------------------------
66  */
67 #ifndef _graphicsproceduralmultipath_h
68 #define _graphicsproceduralmultipath_h
69 
70 #include "datatypes.h"
71 
72 namespace Mezzanine
73 {
74  namespace Graphics
75  {
76  namespace Procedural
77  {
78  class Path;
79  ///////////////////////////////////////////////////////////////////////////////
80  /// @brief A convenience class for tracking points in a MultiPath.
81  /// @details
82  ///////////////////////////////////////
84  {
85  ///////////////////////////////////////////////////////////////////////////////
86  // Data Members
87 
88  /// @brief The index of the path where this coordinate is located.
90  /// @brief The index of the point in the path where this coordinate is located.
92 
93  ///////////////////////////////////////////////////////////////////////////////
94  // Construction and Destruction
95 
96  /// @brief Blank constructor.
98  /// @brief Descriptive constructor.
99  /// @param Path The index of the path where this coordinate is located.
100  /// @param Point The index of the point in the path where this coordinate is located.
101  PathCoordinate(const Whole Path, const Whole Point);
102  /// @brief Class destructor.
103  ~PathCoordinate();
104 
105  ///////////////////////////////////////////////////////////////////////////////
106  // Comparison
107 
108  /// @brief Less-than comparison operator.
109  /// @param Other The other PathCoordinate to compare against.
110  /// @return Returns true if this PathCoordinate is considered less than the other PathCoordinate, false otherwise.
111  Boole operator<(const PathCoordinate& Other) const;
112  };//PathCoordinate
113 
114  ///////////////////////////////////////////////////////////////////////////////
115  /// @brief A grouping of individual 3D curves used to express complicated structures.
116  /// @details
117  ///////////////////////////////////////
119  {
120  public:
121  /// @brief Basic container type for Path storage in this class.
122  typedef std::vector< Path > PathContainer;
123  /// @brief Iterator type for Path instances being stored in this class.
124  typedef PathContainer::iterator PathIterator;
125  /// @brief Const Iterator type for Path instances being stored in this class.
126  typedef PathContainer::const_iterator ConstPathIterator;
127  /// @brief Convenience type used to represent the intersection of two or more paths.
128  typedef std::vector< PathCoordinate > PathIntersection;
129  /// @brief Container type for the storage of intersections.
130  typedef std::vector< PathIntersection > IntersectionVector;
131  /// @brief Container type for the storage of unique intersections.
132  typedef std::map<PathCoordinate,PathIntersection> IntersectionMap;
133  /// @brief Convenience type for a pair of indexes to express a segment of a Path.
134  typedef std::pair<Whole,Whole> PathSegment;
135  /// @brief Container type for segments in a Path.
136  typedef std::vector<PathSegment> PathSegmentContainer;
137  protected:
138  /// @internal
139  /// @brief Container storing all of the Paths that form this MultiPath.
140  PathContainer Paths;
141  /// @internal
142  /// @brief Container storing all known intersections.
143  IntersectionVector Intersections;
144  /// @internal
145  /// @brief Container storing all intersections based on their coordinate.
146  IntersectionMap UniqueIntersections;
147  public:
148  /// @brief Class constructor.
149  MultiPath();
150  /// @brief Class destructor.
151  ~MultiPath();
152 
153  ///////////////////////////////////////////////////////////////////////////////
154  // Utility
155 
156  /// @brief Sets a path at a specific index.
157  /// @remarks This does no bounds checking and may throw an out of bounds exception.
158  /// @param PathIndex The index to place the specified path at.
159  /// @param ToSet The path to be set at the specified index.
160  /// @return Returns a reference to this.
161  MultiPath& SetPath(const Whole PathIndex, const Path& ToSet);
162 
163  /// @brief Generates all the known intersections between the paths in this MultiPath.
164  /// @return Returns a reference to this.
165  MultiPath& CalculateIntersections();
166  /// @brief Gets segments from a specific sub-path that do not intersect other Paths of this MultiPath.
167  /// @remarks "CalculateIntersections" should be called prior to this to get valid results.
168  /// @param PathIndex The index of the path to get non-intersectings parts of.
169  /// @return Returns a vector of segments stored as indexes that are non-intersecting parts of the specified Path.
170  PathSegmentContainer GetNoIntersectionParts(const Whole PathIndex) const;
171 
172  ///////////////////////////////////////////////////////////////////////////////
173  // Path Management
174 
175  /// @brief Adds a path to this MultiPath.
176  /// @param ToAdd The path to be added.
177  /// @return Returns a reference to this.
178  MultiPath& AddPath(const Path& ToAdd);
179  /// @brief Append every path of another MultiShape to this MultiPath.
180  /// @param Other The other MultiShape to append.
181  /// @return Returns a reference to this.
182  MultiPath& AddMultiPath(const MultiPath& Other);
183  /// @brief Gets a path by index.
184  /// @param Index The index of the path to retrieve.
185  /// @return Returns a reference to the path at the specified index.
186  Path& GetPath(const Whole Index);
187  /// @brief Gets a path by index.
188  /// @param Index The index of the path to retrieve.
189  /// @return Returns a const reference to the path at the specified index.
190  const Path& GetPath(const Whole Index) const;
191  /// @brief Gets the number of shapes in this MultiPath.
192  /// @return Returns a Whole representing the number of paths currently stored in this MultiPath.
193  Whole GetNumPaths() const;
194  /// @brief Removes all shapes from this MultiPath.
195  void RemoveAllPaths();
196 
197  ///////////////////////////////////////////////////////////////////////////////
198  // Intersection Management
199 
200  /// @brief Gets the container storing all calculated intersections.
201  /// @return Returns a const reference to a vector storing all known intersections in this MultiPath.
202  const IntersectionVector& GetIntersections() const;
203  /// @brief Gets the container storing all calculated intersections based on their path coordinate.
204  /// @return Returns a const reference to a map storing all unique intersections in this MultiPath.
205  const IntersectionMap& GetIntersectionsMap() const;
206  };//MultiPath
207  }//Procedural
208  }//Graphics
209 }//Mezzanine
210 
211 #endif
bool Boole
Generally acts a single bit, true or false.
Definition: datatypes.h:173
IntersectionVector Intersections
Container storing all known intersections.
Definition: multipath.h:143
A convenience class for tracking points in a MultiPath.
Definition: multipath.h:83
All the definitions for datatypes as well as some basic conversion functions are defined here...
IntersectionMap UniqueIntersections
Container storing all intersections based on their coordinate.
Definition: multipath.h:146
std::vector< PathCoordinate > PathIntersection
Convenience type used to represent the intersection of two or more paths.
Definition: multipath.h:128
PathContainer Paths
Container storing all of the Paths that form this MultiPath.
Definition: multipath.h:140
Whole PathIndex
The index of the path where this coordinate is located.
Definition: multipath.h:89
Whole PointIndex
The index of the point in the path where this coordinate is located.
Definition: multipath.h:91
std::map< PathCoordinate, PathIntersection > IntersectionMap
Container type for the storage of unique intersections.
Definition: multipath.h:132
std::vector< PathSegment > PathSegmentContainer
Container type for segments in a Path.
Definition: multipath.h:136
std::vector< Path > PathContainer
Basic container type for Path storage in this class.
Definition: multipath.h:122
std::vector< PathIntersection > IntersectionVector
Container type for the storage of intersections.
Definition: multipath.h:130
PathContainer::iterator PathIterator
Iterator type for Path instances being stored in this class.
Definition: multipath.h:124
#define MEZZ_LIB
Some platforms require special decorations to denote what is exported/imported in a share library...
The bulk of the engine components go in this namspace.
Definition: actor.cpp:56
unsigned long Whole
Whole is an unsigned integer, it will be at least 32bits in size.
Definition: datatypes.h:151
A grouping of individual 3D curves used to express complicated structures.
Definition: multipath.h:118
std::pair< Whole, Whole > PathSegment
Convenience type for a pair of indexes to express a segment of a Path.
Definition: multipath.h:134
A collection of interconnected 3D points used to express path through 3D space.
Definition: path.h:93
PathContainer::const_iterator ConstPathIterator
Const Iterator type for Path instances being stored in this class.
Definition: multipath.h:126