All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
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 
143  void RefineUniform(UniformOptions options);
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 
183  void RefineAdaptive(AdaptiveOptions options,
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:
223  TopologyRefiner(TopologyRefiner const & source);
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 */
Vtr::internal::Refinement & getRefinement(int l)
void Unrefine()
Unrefine the topology, keeping only the base level.
AdaptiveOptions GetAdaptiveOptions() const
Returns the options specified on refinement.
Private base class of Factories for constructing TopologyRefiners.
Sdc::SchemeType GetSchemeType() const
Returns the subdivision scheme.
int GetNumVerticesTotal() const
Returns the total number of vertices in all levels.
void RefineAdaptive(AdaptiveOptions options, ConstIndexArray selectedFaces=ConstIndexArray())
Feature Adaptive topology refinement.
int GetMaxLevel() const
Returns the highest level of refinement.
Object used to compute and query ptex face indices.
Definition: ptexIndices.h:46
int GetNumLevels() const
Returns the number of refinement levels.
Stores topology data for a specified set of refinement options.
int GetNumFVarValuesTotal(int channel=0) const
Returns the total number of face-varying values in all levels.
unsigned int refinementLevel
Number of refinement iterations.
Factory for constructing TopologyRefiners from specific mesh classes.
Applies refinement operations to generic primvar data.
TopologyLevel const & GetLevel(int level) const
Returns a handle to access data specific to a particular level.
bool HasHoles() const
Returns true if faces have been tagged as holes.
int GetMaxValence() const
Returns the maximum vertex valence in all levels.
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.
All supported options applying to subdivision scheme.
Definition: options.h:51
void RefineUniform(UniformOptions options)
Refine the topology uniformly.
Vtr::ConstIndexArray ConstIndexArray
Definition: types.h:47
An interface for accessing data in a specific level of a refined topology hierarchy.
Definition: topologyLevel.h:49
Sdc::Options GetSchemeOptions() const
Returns the subdivision options.
SchemeType
Enumerated type for all subdivision schemes supported by OpenSubdiv.
Definition: types.h:37
UniformOptions GetUniformOptions() const
Returns the options specified on refinement.
int GetNumFVarChannels() const
Returns the number of face-varying channels in the tables.
Sdc::Options::FVarLinearInterpolation GetFVarLinearInterpolation(int channel=0) const
Returns the face-varying interpolation rule set for a given channel.
Vtr::internal::Refinement const & getRefinement(int l) const
bool IsUniform() const
Returns true if uniform refinement has been applied.
Vtr::internal::Level const & getLevel(int l) const
int GetNumEdgesTotal() const
Returns the total number of edges in all levels.