OpenSubdiv
patchTableFactory.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_TABLE_FACTORY_H
26 #define OPENSUBDIV3_FAR_PATCH_TABLE_FACTORY_H
27 
28 #include "../version.h"
29 
30 #include "../far/topologyRefiner.h"
31 #include "../far/patchTable.h"
32 
33 namespace OpenSubdiv {
34 namespace OPENSUBDIV_VERSION {
35 
36 namespace Far {
37 
41 public:
42 
45  struct Options {
46 
55  enum EndCapType {
61  };
62 
63  Options(unsigned int maxIsolation=10) :
64  generateAllLevels(false),
67  triangulateQuads(false),
68  useSingleCreasePatch(false),
69  useInfSharpPatch(false),
70  maxIsolationLevel(maxIsolation & 0xf),
75  generateFVarTables(false),
76  patchPrecisionDouble(false),
80  numFVarChannels(-1),
82  { }
83 
86 
88  void SetEndCapType(EndCapType e) { endCapType = e & 0x7; }
89 
91  void SetMaxIsolationLevel(unsigned int level) { maxIsolationLevel = level & 0xf; }
92 
94  template <typename REAL> void SetPatchPrecision();
95 
97  template <typename REAL> void SetFVarPatchPrecision();
98 
102 
103  adaptiveOptions.useInfSharpPatch = useInfSharpPatch;
104  adaptiveOptions.useSingleCreasePatch = useSingleCreasePatch;
105  adaptiveOptions.considerFVarChannels = generateFVarTables &&
107  return adaptiveOptions;
108  }
109 
110  unsigned int generateAllLevels : 1,
113  triangulateQuads : 1,
114 
116  useInfSharpPatch : 1,
117  maxIsolationLevel : 4,
118 
119  // end-capping
120  endCapType : 3,
122 
124  // varying
127 
128  // face-varying
129  generateFVarTables : 1,
130 
131  // precision
134 
135  // legacy behaviors (default to true)
138 
140  int const * fvarChannelIndices;
141  };
142 
175  static PatchTable * Create(TopologyRefiner const & refiner,
176  Options options = Options(),
177  ConstIndexArray selectedFaces = ConstIndexArray());
178 
179 public:
180  // PatchFaceTag
181  //
182  // This simple struct was previously used within the factory to take inventory of
183  // various kinds of patches to fully allocate buffers prior to populating them. It
184  // was not intended to be exposed as part of the public interface.
185  //
186  // It is no longer used internally and is being kept here to respect preservation
187  // of the public interface, but it will be deprecated at the earliest opportunity.
188  //
191  //
192  struct PatchFaceTag {
193  public:
194  unsigned int _hasPatch : 1;
195  unsigned int _isRegular : 1;
196  unsigned int _transitionMask : 4;
197  unsigned int _boundaryMask : 4;
198  unsigned int _boundaryIndex : 2;
199  unsigned int _boundaryCount : 3;
200  unsigned int _hasBoundaryEdge : 3;
201  unsigned int _isSingleCrease : 1;
202 
203  void clear();
204  void assignBoundaryPropertiesFromEdgeMask(int boundaryEdgeMask);
205  void assignBoundaryPropertiesFromVertexMask(int boundaryVertexMask);
206  void assignTransitionPropertiesFromEdgeMask(int boundaryVertexMask);
207  };
208  typedef std::vector<PatchFaceTag> PatchTagVector;
209 };
210 
211 
212 template <> inline void PatchTableFactory::Options::SetPatchPrecision<float>() {
213  patchPrecisionDouble = false;
214 }
215 template <> inline void PatchTableFactory::Options::SetFVarPatchPrecision<float>() {
216  fvarPatchPrecisionDouble = false;
217 }
218 
219 template <> inline void PatchTableFactory::Options::SetPatchPrecision<double>() {
220  patchPrecisionDouble = true;
221 }
222 template <> inline void PatchTableFactory::Options::SetFVarPatchPrecision<double>() {
223  fvarPatchPrecisionDouble = true;
224 }
225 
226 
227 } // end namespace Far
228 
229 } // end namespace OPENSUBDIV_VERSION
230 using namespace OPENSUBDIV_VERSION;
231 
232 } // end namespace OpenSubdiv
233 
234 
235 #endif /* OPENSUBDIV3_FAR_PATCH_TABLE_FACTORY_H */
void SetPatchPrecision()
Set precision of vertex patches.
Container for arrays of parametric patches.
Definition: patchTable.h:55
void SetMaxIsolationLevel(unsigned int level)
Set maximum isolation level.
unsigned int generateLegacySharpCornerPatches
Generate sharp regular patches at smooth corners (legacy)
TopologyRefiner::AdaptiveOptions GetRefineAdaptiveOptions() const
Determine adaptive refinement options to match assigned patch options.
unsigned int includeBaseLevelIndices
Include base level in patch point indices (Uniform mode only)
unsigned int generateAllLevels
Generate levels from 'firstLevel' to 'maxLevel' (Uniform mode only)
unsigned int includeFVarBaseLevelIndices
Include base level in face-varying patch point indices (Uniform mode only)
unsigned int generateFVarLegacyLinearPatches
Generate all linear face-varying patches (legacy)
unsigned int generateVaryingLocalPoints
Generate local points with varying patches.
Factory for constructing a PatchTable from a TopologyRefiner.
int const * fvarChannelIndices
List containing the indices of the channels selected for the factory.
EndCapType
Choice for approximating irregular patches (end-caps)
Vtr::ConstIndexArray ConstIndexArray
Definition: types.h:47
Obsolete internal struct not intended for public use – due to be deprecated.
static PatchTable * Create(TopologyRefiner const &refiner, Options options=Options(), ConstIndexArray selectedFaces=ConstIndexArray())
Instantiates a PatchTable from a client-provided TopologyRefiner.
unsigned int fvarPatchPrecisionDouble
Generate double-precision stencils for face-varying patches.
unsigned int generateFVarTables
Generate face-varying patch tables.
unsigned int generateVaryingTables
Generate varying patch tables.
Stores topology data for a specified set of refinement options.
int numFVarChannels
Number of channel indices and interpolation modes passed.
void SetFVarPatchPrecision()
Set precision of face-varying patches.
unsigned int triangulateQuads
Triangulate 'QUADS' primitives (Uniform mode only)
unsigned int patchPrecisionDouble
Generate double-precision stencils for vertex patches.
unsigned int maxIsolationLevel
Cap adaptive feature isolation to the given level (max. 10)