All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
patchDescriptor.h
Go to the documentation of this file.
1 //
2 // Copyright 2013 Pixar
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 
25 #ifndef OPENSUBDIV3_FAR_PATCH_DESCRIPTOR_H
26 #define OPENSUBDIV3_FAR_PATCH_DESCRIPTOR_H
27 
28 #include "../version.h"
29 
30 #include "../far/types.h"
31 #include "../sdc/types.h"
32 
33 #include <vector>
34 
35 namespace OpenSubdiv {
36 namespace OPENSUBDIV_VERSION {
37 
38 namespace Far {
39 
45 
46 public:
47 
48  enum Type {
49  NON_PATCH = 0,
50 
53 
56 
57  LOOP,
58 
64  };
65 
66 public:
67 
70  _type(NON_PATCH) { }
71 
73  PatchDescriptor(int type) :
74  _type(type) { }
75 
78  _type(d.GetType()) { }
79 
81  Type GetType() const {
82  return (Type)_type;
83  }
84 
86  static inline bool IsAdaptive(Type type) {
87  return type > TRIANGLES;
88  }
89 
91  bool IsAdaptive() const {
92  return IsAdaptive( this->GetType() );
93  }
94 
97  static inline short GetNumControlVertices( Type t );
98 
100  static inline short GetNumFVarControlVertices( Type t );
101 
104  short GetNumControlVertices() const {
105  return GetNumControlVertices( this->GetType() );
106  }
107 
110  return GetNumFVarControlVertices( this->GetType() );
111  }
112 
114  static short GetRegularPatchSize() { return 16; }
115 
117  static short GetGregoryPatchSize() { return 4; }
118 
120  static short GetGregoryBasisPatchSize() { return 20; }
121 
122 
126 
128  inline bool operator < ( PatchDescriptor const other ) const;
129 
131  inline bool operator == ( PatchDescriptor const other ) const;
132 
133  // debug helper
134  void print() const;
135 
136 private:
137  unsigned int _type;
138 };
139 
141 
142 // Returns the number of control vertices expected for a patch of this type
143 inline short
145  switch (type) {
146  case REGULAR : return GetRegularPatchSize();
147  case LOOP : return 12;
148  case QUADS : return 4;
149  case GREGORY :
150  case GREGORY_BOUNDARY : return GetGregoryPatchSize();
151  case GREGORY_BASIS : return GetGregoryBasisPatchSize();
152  case GREGORY_TRIANGLE : return 18;
153  case TRIANGLES : return 3;
154  case LINES : return 2;
155  case POINTS : return 1;
156  default : return -1;
157  }
158 }
159 
160 // Returns the number of face-varying control vertices expected for a patch of this type
161 inline short
164 }
165 
166 // Allows ordering of patches by type
167 inline bool
169  return (_type < other._type);
170 }
171 
172 // True if the descriptors are identical
173 inline bool
175  return _type == other._type;
176 }
177 
178 
179 
180 } // end namespace Far
181 
182 } // end namespace OPENSUBDIV_VERSION
183 using namespace OPENSUBDIV_VERSION;
184 
185 } // end namespace OpenSubdiv
186 
187 #endif /* OPENSUBDIV3_FAR_PATCH_DESCRIPTOR_H */
short GetNumControlVertices() const
Returns the number of control vertices expected for a patch of the type described.
Type GetType() const
Returns the type of the patch.
static bool IsAdaptive(Type type)
Returns true if the type is an adaptive (non-linear) patch.
regular B-Spline patch for the Catmark scheme
static short GetRegularPatchSize()
Number of control vertices of Regular Patches in table.
bool IsAdaptive() const
Returns true if the type is an adaptive patch.
static short GetGregoryBasisPatchSize()
Number of control vertices of Gregory patch basis (20)
PatchDescriptor(PatchDescriptor const &d)
Copy Constructor.
Vtr::ConstArray< PatchDescriptor > ConstPatchDescriptorArray
bool operator<(PatchDescriptor const other) const
Allows ordering of patches by type.
regular triangular patch for the Loop scheme
SchemeType
Enumerated type for all subdivision schemes supported by OpenSubdiv.
Definition: types.h:37
static Vtr::ConstArray< PatchDescriptor > GetAdaptivePatchDescriptors(Sdc::SchemeType type)
Returns a vector of all the legal patch descriptors for the given adaptive subdivision scheme...
static short GetGregoryPatchSize()
Number of control vertices of Gregory (and Gregory Boundary) Patches in table.
bool operator==(PatchDescriptor const other) const
True if the descriptors are identical.