OpenSubdiv
Loading...
Searching...
No Matches
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
33namespace OpenSubdiv {
34namespace OPENSUBDIV_VERSION {
35
36namespace Far {
37
41public:
42
45 struct Options {
46
61 };
62
63 Options(unsigned int maxIsolation=10) :
64 generateAllLevels(false),
67 triangulateQuads(false),
69 useInfSharpPatch(false),
70 maxIsolationLevel(maxIsolation & 0xf),
75 generateFVarTables(false),
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;
105 adaptiveOptions.considerFVarChannels = generateFVarTables &&
107 return adaptiveOptions;
108 }
109
110 unsigned int generateAllLevels : 1,
114
118
119 // end-capping
123
124 // varying
127
128 // face-varying
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
179public:
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 //
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
212template <> inline void PatchTableFactory::Options::SetPatchPrecision<float>() {
213 patchPrecisionDouble = false;
214}
215template <> inline void PatchTableFactory::Options::SetFVarPatchPrecision<float>() {
216 fvarPatchPrecisionDouble = false;
217}
218
219template <> inline void PatchTableFactory::Options::SetPatchPrecision<double>() {
220 patchPrecisionDouble = true;
221}
222template <> inline void PatchTableFactory::Options::SetFVarPatchPrecision<double>() {
223 fvarPatchPrecisionDouble = true;
224}
225
226
227} // end namespace Far
228
229} // end namespace OPENSUBDIV_VERSION
230using namespace OPENSUBDIV_VERSION;
231
232} // end namespace OpenSubdiv
233
234
235#endif /* OPENSUBDIV3_FAR_PATCH_TABLE_FACTORY_H */
Vtr::ConstIndexArray ConstIndexArray
Definition: types.h:47
Container for arrays of parametric patches.
Definition: patchTable.h:55
Factory for constructing a PatchTable from a TopologyRefiner.
static PatchTable * Create(TopologyRefiner const &refiner, Options options=Options(), ConstIndexArray selectedFaces=ConstIndexArray())
Instantiates a PatchTable from a client-provided TopologyRefiner.
unsigned int generateVaryingTables
Generate varying patch tables.
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 maxIsolationLevel
Cap adaptive feature isolation to the given level (max. 10)
unsigned int generateFVarLegacyLinearPatches
Generate all linear face-varying patches (legacy)
void SetPatchPrecision()
Set precision of vertex patches.
unsigned int fvarPatchPrecisionDouble
Generate double-precision stencils for face-varying patches.
void SetMaxIsolationLevel(unsigned int level)
Set maximum isolation level.
int const * fvarChannelIndices
List containing the indices of the channels selected for the factory.
unsigned int generateVaryingLocalPoints
Generate local points with varying patches.
unsigned int includeFVarBaseLevelIndices
Include base level in face-varying patch point indices (Uniform mode only)
unsigned int generateAllLevels
Generate levels from 'firstLevel' to 'maxLevel' (Uniform mode only)
unsigned int patchPrecisionDouble
Generate double-precision stencils for vertex patches.
unsigned int generateFVarTables
Generate face-varying patch tables.
unsigned int includeBaseLevelIndices
Include base level in patch point indices (Uniform mode only)
void SetFVarPatchPrecision()
Set precision of face-varying patches.
int numFVarChannels
Number of channel indices and interpolation modes passed.
unsigned int triangulateQuads
Triangulate 'QUADS' primitives (Uniform mode only)
EndCapType
Choice for approximating irregular patches (end-caps)
@ ENDCAP_LEGACY_GREGORY
legacy option for 2.x style Gregory patches (Catmark only)
@ ENDCAP_GREGORY_BASIS
use Gregory patches (highest quality, recommended default)
@ ENDCAP_BILINEAR_BASIS
use linear patches (simple quads or tris)
@ ENDCAP_BSPLINE_BASIS
use BSpline-like patches (same patch type as regular)
Obsolete internal struct not intended for public use – due to be deprecated.
Stores topology data for a specified set of refinement options.