My Project
topologyRefiner.h
Go to the documentation of this file.
1//
2// Copyright 2014 DreamWorks Animation LLC.
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#ifndef OPENSUBDIV3_FAR_TOPOLOGY_REFINER_H
25#define OPENSUBDIV3_FAR_TOPOLOGY_REFINER_H
26
27#include "../version.h"
28
29#include "../sdc/types.h"
30#include "../sdc/options.h"
31#include "../far/types.h"
32#include "../far/topologyLevel.h"
33
34#include <vector>
35
36
37namespace OpenSubdiv {
38namespace OPENSUBDIV_VERSION {
39
40namespace Vtr { namespace internal { class SparseSelector; } }
41namespace Far { namespace internal { class FeatureMask; } }
42
43namespace Far {
44
45template <typename REAL> class PrimvarRefinerReal;
46template <class MESH> class TopologyRefinerFactory;
47
52
53public:
54
57
60
62 Sdc::SchemeType GetSchemeType() const { return _subdivType; }
63
65 Sdc::Options GetSchemeOptions() const { return _subdivOptions; }
66
68 bool IsUniform() const { return _isUniform; }
69
71 int GetNumLevels() const { return (int)_farLevels.size(); }
72
74 int GetMaxLevel() const { return _maxLevel; }
75
77 int GetMaxValence() const { return _maxValence; }
78
80 bool HasHoles() const { return _hasHoles; }
81
83 int GetNumVerticesTotal() const { return _totalVertices; }
84
86 int GetNumEdgesTotal() const { return _totalEdges; }
87
89 int GetNumFacesTotal() const { return _totalFaces; }
90
92 int GetNumFaceVerticesTotal() const { return _totalFaceVertices; }
93
95 TopologyLevel const & GetLevel(int level) const { return _farLevels[level]; }
96
98
100
101 //
102 // Uniform refinement
103 //
104
119
120 UniformOptions(int level) :
121 refinementLevel(level),
123 fullTopologyInLastLevel(false) { }
124
125 unsigned int refinementLevel:4,
131 };
132
144
146 UniformOptions GetUniformOptions() const { return _uniformOptions; }
147
148 //
149 // Adaptive refinement
150 //
151
154
155 AdaptiveOptions(int level) :
156 isolationLevel(level),
157 secondaryLevel(15),
159 useInfSharpPatch(false),
162
163 unsigned int isolationLevel:4;
165 unsigned int secondaryLevel:4;
167 unsigned int useSingleCreasePatch:1;
169 unsigned int useInfSharpPatch:1;
171 unsigned int considerFVarChannels:1;
175 };
176
184 ConstIndexArray selectedFaces = ConstIndexArray());
185
187 AdaptiveOptions GetAdaptiveOptions() const { return _adaptiveOptions; }
188
190 void Unrefine();
191
192
194
196
198 int GetNumFVarChannels() const;
199
202
204 int GetNumFVarValuesTotal(int channel = 0) const;
205
207
208protected:
209
210 //
211 // Lower level protected methods intended strictly for internal use:
212 //
213 template <class MESH>
216 friend class PatchTableBuilder;
217 friend class PatchBuilder;
218 friend class PtexIndices;
219 template <typename REAL>
220 friend class PrimvarRefinerReal;
221
222 // Copy constructor exposed via the factory class:
224
225 Vtr::internal::Level & getLevel(int l) { return *_levels[l]; }
226 Vtr::internal::Level const & getLevel(int l) const { return *_levels[l]; }
227
228 Vtr::internal::Refinement & getRefinement(int l) { return *_refinements[l]; }
229 Vtr::internal::Refinement const & getRefinement(int l) const { return *_refinements[l]; }
230
231private:
232 // Not default constructible or copyable:
233 TopologyRefiner() : _uniformOptions(0), _adaptiveOptions(0) { }
234 TopologyRefiner & operator=(TopologyRefiner const &) { return *this; }
235
236 void selectFeatureAdaptiveComponents(Vtr::internal::SparseSelector& selector,
237 internal::FeatureMask const & mask,
238 ConstIndexArray selectedFaces);
239 void selectLinearIrregularFaces(Vtr::internal::SparseSelector& selector,
240 ConstIndexArray selectedFaces);
241
242 void initializeInventory();
243 void updateInventory(Vtr::internal::Level const & newLevel);
244
245 void appendLevel(Vtr::internal::Level & newLevel);
246 void appendRefinement(Vtr::internal::Refinement & newRefinement);
247 void assembleFarLevels();
248
249private:
250
251 Sdc::SchemeType _subdivType;
252 Sdc::Options _subdivOptions;
253
254 unsigned int _isUniform : 1;
255 unsigned int _hasHoles : 1;
256 unsigned int _hasIrregFaces : 1;
257 unsigned int _regFaceSize : 3;
258 unsigned int _maxLevel : 4;
259
260 // Options assigned on refinement:
261 UniformOptions _uniformOptions;
262 AdaptiveOptions _adaptiveOptions;
263
264 // Cumulative properties of all levels:
265 int _totalVertices;
266 int _totalEdges;
267 int _totalFaces;
268 int _totalFaceVertices;
269 int _maxValence;
270
271 // Note the base level may be shared with another instance
272 bool _baseLevelOwned;
273
274 std::vector<Vtr::internal::Level *> _levels;
275 std::vector<Vtr::internal::Refinement *> _refinements;
276
277 std::vector<TopologyLevel> _farLevels;
278};
279
280
281inline int
283
284 return _levels[0]->getNumFVarChannels();
285}
288
289 return _levels[0]->getFVarOptions(channel).GetFVarLinearInterpolation();
290}
291
292} // end namespace Far
293
294} // end namespace OPENSUBDIV_VERSION
295using namespace OPENSUBDIV_VERSION;
296} // end namespace OpenSubdiv
297
298#endif /* OPENSUBDIV3_FAR_TOPOLOGY_REFINER_H */
Vtr::ConstIndexArray ConstIndexArray
Definition: types.h:47
SchemeType
Enumerated type for all subdivision schemes supported by OpenSubdiv.
Definition: types.h:37
Applies refinement operations to generic primvar data.
Object used to compute and query ptex face indices.
Definition: ptexIndices.h:46
An interface for accessing data in a specific level of a refined topology hierarchy.
Definition: topologyLevel.h:49
Factory for constructing TopologyRefiners from specific mesh classes.
Stores topology data for a specified set of refinement options.
TopologyRefiner(TopologyRefiner const &source)
int GetMaxValence() const
Returns the maximum vertex valence in all levels.
Vtr::internal::Level const & getLevel(int l) const
bool HasHoles() const
Returns true if faces have been tagged as holes.
int GetNumLevels() const
Returns the number of refinement levels.
int GetNumFVarValuesTotal(int channel=0) const
Returns the total number of face-varying values in all levels.
Vtr::internal::Refinement const & getRefinement(int l) const
Sdc::Options GetSchemeOptions() const
Returns the subdivision options.
bool IsUniform() const
Returns true if uniform refinement has been applied.
Sdc::SchemeType GetSchemeType() const
Returns the subdivision scheme.
int GetMaxLevel() const
Returns the highest level of refinement.
TopologyRefiner(Sdc::SchemeType type, Sdc::Options options=Sdc::Options())
Constructor.
int GetNumEdgesTotal() const
Returns the total number of edges in all levels.
int GetNumFVarChannels() const
Returns the number of face-varying channels in the tables.
UniformOptions GetUniformOptions() const
Returns the options specified on refinement.
int GetNumFacesTotal() const
Returns the total number of edges in all levels.
int GetNumFaceVerticesTotal() const
Returns the total number of face vertices in all levels.
Vtr::internal::Refinement & getRefinement(int l)
void RefineUniform(UniformOptions options)
Refine the topology uniformly.
TopologyLevel const & GetLevel(int level) const
Returns a handle to access data specific to a particular level.
int GetNumVerticesTotal() const
Returns the total number of vertices in all levels.
void Unrefine()
Unrefine the topology, keeping only the base level.
AdaptiveOptions GetAdaptiveOptions() const
Returns the options specified on refinement.
Sdc::Options::FVarLinearInterpolation GetFVarLinearInterpolation(int channel=0) const
Returns the face-varying interpolation rule set for a given channel.
void RefineAdaptive(AdaptiveOptions options, ConstIndexArray selectedFaces=ConstIndexArray())
Feature Adaptive topology refinement.
unsigned int refinementLevel
Number of refinement iterations.
Private base class of Factories for constructing TopologyRefiners.
All supported options applying to subdivision scheme.
Definition: options.h:51