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 
37 namespace OpenSubdiv {
38 namespace OPENSUBDIV_VERSION {
39 
40 namespace Vtr { namespace internal { class SparseSelector; } }
41 namespace Far { namespace internal { class FeatureMask; } }
42 
43 namespace Far {
44 
45 template <typename REAL> class PrimvarRefinerReal;
46 template <class MESH> class TopologyRefinerFactory;
47 
52 
53 public:
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 
101  //
102  // Uniform refinement
103  //
104 
118  struct UniformOptions {
119 
120  UniformOptions(int level) :
121  refinementLevel(level),
123  fullTopologyInLastLevel(false) { }
124 
125  unsigned int refinementLevel:4,
129  };
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),
158  useSingleCreasePatch(false),
159  useInfSharpPatch(false),
160  considerFVarChannels(false),
161  orderVerticesFromFacesFirst(false) { }
162 
163  unsigned int isolationLevel:4;
164  unsigned int secondaryLevel:4;
166  unsigned int useSingleCreasePatch:1;
168  unsigned int useInfSharpPatch:1;
170  unsigned int considerFVarChannels:1;
172  unsigned int orderVerticesFromFacesFirst:1;
174  };
176 
184  ConstIndexArray selectedFaces = ConstIndexArray());
185 
187  AdaptiveOptions GetAdaptiveOptions() const { return _adaptiveOptions; }
188 
190  void Unrefine();
191 
192 
194 
198  int GetNumFVarChannels() const;
199 
202 
204  int GetNumFVarValuesTotal(int channel = 0) const;
205 
207 
208 protected:
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 
231 private:
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 
249 private:
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 
281 inline 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
295 using namespace OPENSUBDIV_VERSION;
296 } // end namespace OpenSubdiv
297 
298 #endif /* OPENSUBDIV3_FAR_TOPOLOGY_REFINER_H */
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumEdgesTotal
int GetNumEdgesTotal() const
Returns the total number of edges in all levels.
Definition: topologyRefiner.h:86
OpenSubdiv
Definition: error.h:30
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyLevel
An interface for accessing data in a specific level of a refined topology hierarchy.
Definition: topologyLevel.h:49
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::TopologyRefiner
TopologyRefiner(TopologyRefiner const &source)
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::considerFVarChannels
unsigned int considerFVarChannels
Definition: topologyRefiner.h:171
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::IsUniform
bool IsUniform() const
Returns true if uniform refinement has been applied.
Definition: topologyRefiner.h:68
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::UniformOptions::fullTopologyInLastLevel
unsigned int fullTopologyInLastLevel
Definition: topologyRefiner.h:128
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::HasHoles
bool HasHoles() const
Returns true if faces have been tagged as holes.
Definition: topologyRefiner.h:80
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::getLevel
Vtr::internal::Level & getLevel(int l)
Definition: topologyRefiner.h:225
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::getLevel
Vtr::internal::Level const & getLevel(int l) const
Definition: topologyRefiner.h:226
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Options::FVarLinearInterpolation
FVarLinearInterpolation
Definition: options.h:60
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::PatchTableBuilder
friend class PatchTableBuilder
Definition: topologyRefiner.h:216
OpenSubdiv::OPENSUBDIV_VERSION::Far::PtexIndices
Object used to compute and query ptex face indices.
Definition: ptexIndices.h:46
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::UniformOptions::UniformOptions
UniformOptions(int level)
Definition: topologyRefiner.h:120
OpenSubdiv::OPENSUBDIV_VERSION::Far::PrimvarRefinerReal
Applies refinement operations to generic primvar data.
Definition: primvarRefiner.h:56
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::orderVerticesFromFacesFirst
unsigned int orderVerticesFromFacesFirst
Definition: topologyRefiner.h:173
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions
Adaptive refinement options.
Definition: topologyRefiner.h:153
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::UniformOptions::orderVerticesFromFacesFirst
unsigned int orderVerticesFromFacesFirst
Definition: topologyRefiner.h:127
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner
Stores topology data for a specified set of refinement options.
Definition: topologyRefiner.h:51
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::isolationLevel
unsigned int isolationLevel
Definition: topologyRefiner.h:163
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Options
All supported options applying to subdivision scheme.
Definition: options.h:51
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::getRefinement
Vtr::internal::Refinement const & getRefinement(int l) const
Definition: topologyRefiner.h:229
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetAdaptiveOptions
AdaptiveOptions GetAdaptiveOptions() const
Returns the options specified on refinement.
Definition: topologyRefiner.h:187
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetMaxValence
int GetMaxValence() const
Returns the maximum vertex valence in all levels.
Definition: topologyRefiner.h:77
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstArray< Index >
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::UniformOptions
Uniform refinement options.
Definition: topologyRefiner.h:118
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::RefineUniform
void RefineUniform(UniformOptions options)
Refine the topology uniformly.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::UniformOptions::refinementLevel
unsigned int refinementLevel
Number of refinement iterations.
Definition: topologyRefiner.h:125
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::RefineAdaptive
void RefineAdaptive(AdaptiveOptions options, ConstIndexArray selectedFaces=ConstIndexArray())
Feature Adaptive topology refinement.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefinerFactory
Factory for constructing TopologyRefiners from specific mesh classes.
Definition: topologyRefinerFactory.h:78
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::SparseSelector
Definition: sparseSelector.h:57
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumLevels
int GetNumLevels() const
Returns the number of refinement levels.
Definition: topologyRefiner.h:71
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::Unrefine
void Unrefine()
Unrefine the topology, keeping only the base level.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::~TopologyRefiner
~TopologyRefiner()
Destructor.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetSchemeType
Sdc::SchemeType GetSchemeType() const
Returns the subdivision scheme.
Definition: topologyRefiner.h:62
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetSchemeOptions
Sdc::Options GetSchemeOptions() const
Returns the subdivision options.
Definition: topologyRefiner.h:65
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::useSingleCreasePatch
unsigned int useSingleCreasePatch
Definition: topologyRefiner.h:167
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::AdaptiveOptions
AdaptiveOptions(int level)
Definition: topologyRefiner.h:155
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumFaceVerticesTotal
int GetNumFaceVerticesTotal() const
Returns the total number of face vertices in all levels.
Definition: topologyRefiner.h:92
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Refinement
Definition: refinement.h:69
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetFVarLinearInterpolation
Sdc::Options::FVarLinearInterpolation GetFVarLinearInterpolation(int channel=0) const
Returns the face-varying interpolation rule set for a given channel.
Definition: topologyRefiner.h:287
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::secondaryLevel
unsigned int secondaryLevel
Definition: topologyRefiner.h:165
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumFVarValuesTotal
int GetNumFVarValuesTotal(int channel=0) const
Returns the total number of face-varying values in all levels.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetUniformOptions
UniformOptions GetUniformOptions() const
Returns the options specified on refinement.
Definition: topologyRefiner.h:146
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetLevel
TopologyLevel const & GetLevel(int level) const
Returns a handle to access data specific to a particular level.
Definition: topologyRefiner.h:95
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::SchemeType
SchemeType
Enumerated type for all subdivision schemes supported by OpenSubdiv.
Definition: types.h:37
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumFacesTotal
int GetNumFacesTotal() const
Returns the total number of edges in all levels.
Definition: topologyRefiner.h:89
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumFVarChannels
int GetNumFVarChannels() const
Returns the number of face-varying channels in the tables.
Definition: topologyRefiner.h:282
OpenSubdiv::OPENSUBDIV_VERSION::Far::ConstIndexArray
Vtr::ConstIndexArray ConstIndexArray
Definition: types.h:47
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::PatchBuilder
friend class PatchBuilder
Definition: topologyRefiner.h:217
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::TopologyRefiner
TopologyRefiner(Sdc::SchemeType type, Sdc::Options options=Sdc::Options())
Constructor.
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefinerFactoryBase
Private base class of Factories for constructing TopologyRefiners.
Definition: topologyRefinerFactory.h:47
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::getRefinement
Vtr::internal::Refinement & getRefinement(int l)
Definition: topologyRefiner.h:228
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level
Definition: level.h:83
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetNumVerticesTotal
int GetNumVerticesTotal() const
Returns the total number of vertices in all levels.
Definition: topologyRefiner.h:83
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::AdaptiveOptions::useInfSharpPatch
unsigned int useInfSharpPatch
Definition: topologyRefiner.h:169
OpenSubdiv::OPENSUBDIV_VERSION::Far::TopologyRefiner::GetMaxLevel
int GetMaxLevel() const
Returns the highest level of refinement.
Definition: topologyRefiner.h:74