HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OSubD.h
Go to the documentation of this file.
1 //-*****************************************************************************
2 //
3 // Copyright (c) 2009-2014,
4 // Sony Pictures Imageworks, Inc. and
5 // Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
6 //
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are
11 // met:
12 // * Redistributions of source code must retain the above copyright
13 // notice, this list of conditions and the following disclaimer.
14 // * Redistributions in binary form must reproduce the above
15 // copyright notice, this list of conditions and the following disclaimer
16 // in the documentation and/or other materials provided with the
17 // distribution.
18 // * Neither the name of Sony Pictures Imageworks, nor
19 // Industrial Light & Magic nor the names of their contributors may be used
20 // to endorse or promote products derived from this software without specific
21 // prior written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 //
35 //-*****************************************************************************
36 
37 #ifndef Alembic_AbcGeom_OSubD_h
38 #define Alembic_AbcGeom_OSubD_h
39 
40 #include <map>
41 #include <Alembic/Util/Export.h>
47 
48 namespace Alembic {
49 namespace AbcGeom {
50 namespace ALEMBIC_VERSION_NS {
51 
52 //-*****************************************************************************
53 // for default values for int scalar properties here (INT_MIN / 2)
55 int32_t ABC_GEOM_SUBD_NULL_INT_VALUE( -1073741824 );
56 
57 //-*****************************************************************************
58 class ALEMBIC_EXPORT OSubDSchema : public OGeomBaseSchema<SubDSchemaInfo>
59 {
60 public:
61  //-*************************************************************************
62  // SUBD SCHEMA SAMPLE TYPE
63  //-*************************************************************************
64  class Sample
65  {
66  public:
67  //! Creates a default sample with no data in it.
68  //! ...
69  Sample() { reset(); }
70 
71  //! Creates a sample with position data, index data, and count data.
72  //! For specifying samples with an explicit topology. The first
73  //! sample must be full like this. Subsequent samples may also
74  //! be full like this, which would indicate a change of topology
75  Sample( const Abc::P3fArraySample &iPositions,
76  const Abc::Int32ArraySample &iFaceIndices,
77  const Abc::Int32ArraySample &iFaceCounts,
78 
79  const Abc::Int32ArraySample &iCreaseIndices =
81  const Abc::Int32ArraySample &iCreaseLengths =
83  const Abc::FloatArraySample &iCreaseSharpnesses =
85 
86  const Abc::Int32ArraySample &iCornerIndices =
88  const Abc::FloatArraySample &iCornerSharpnesses =
90 
92  )
93 
94  : m_positions( iPositions )
95  , m_faceIndices( iFaceIndices )
96  , m_faceCounts( iFaceCounts )
97  , m_faceVaryingInterpolateBoundary( ABC_GEOM_SUBD_NULL_INT_VALUE )
98  , m_faceVaryingPropagateCorners( ABC_GEOM_SUBD_NULL_INT_VALUE )
99  , m_interpolateBoundary( ABC_GEOM_SUBD_NULL_INT_VALUE )
100  , m_creaseIndices ( iCreaseIndices )
101  , m_creaseLengths ( iCreaseLengths )
102  , m_creaseSharpnesses ( iCreaseSharpnesses )
103  , m_cornerIndices ( iCornerIndices )
104  , m_cornerSharpnesses ( iCornerSharpnesses )
105  , m_holes ( iHoles )
106  , m_subdScheme ( "catmull-clark" )
107  {}
108 
109  // main stuff
110  const Abc::P3fArraySample &getPositions() const { return m_positions; }
111  void setPositions( const Abc::P3fArraySample &iSmp )
112  { m_positions = iSmp; }
113 
114  const Abc::Int32ArraySample &getFaceIndices() const { return m_faceIndices; }
116  { m_faceIndices = iSmp; }
117 
118  const Abc::Int32ArraySample &getFaceCounts() const { return m_faceCounts; }
120  { m_faceCounts = iCnt; }
121 
122 
123  // misc subd stuff
125  { return m_faceVaryingInterpolateBoundary; }
127  { m_faceVaryingInterpolateBoundary = i; }
128 
130  { return m_faceVaryingPropagateCorners; }
132  { m_faceVaryingPropagateCorners = i; }
133 
134  int32_t getInterpolateBoundary() const
135  { return m_interpolateBoundary; }
136  void setInterpolateBoundary( int32_t i )
137  { m_interpolateBoundary = i; }
138 
139  // creases
141  { return m_creaseIndices; }
142  void setCreaseIndices( const Abc::Int32ArraySample &iCreaseIndices )
143  { m_creaseIndices = iCreaseIndices; }
144 
146  { return m_creaseLengths; }
147  void setCreaseLengths( const Abc::Int32ArraySample &iCreaseLengths )
148  { m_creaseLengths = iCreaseLengths; }
149 
151  { return m_creaseSharpnesses; }
153  &iCreaseSharpnesses )
154  { m_creaseSharpnesses = iCreaseSharpnesses; }
155 
156  void setCreases( const Abc::Int32ArraySample &iCreaseIndices,
157  const Abc::Int32ArraySample &iCreaseLengths )
158  {
159  m_creaseIndices = iCreaseIndices;
160  m_creaseLengths = iCreaseLengths;
161  }
162 
163  void setCreases( const Abc::Int32ArraySample &iCreaseIndices,
164  const Abc::Int32ArraySample &iCreaseLengths,
165  const Abc::FloatArraySample &iCreaseSharpnesses )
166  {
167  m_creaseIndices = iCreaseIndices;
168  m_creaseLengths = iCreaseLengths;
169  m_creaseSharpnesses = iCreaseSharpnesses;
170  }
171 
172  // corners
174  { return m_cornerIndices; }
175  void setCornerIndices( const Abc::Int32ArraySample &iCornerIndices )
176  { m_cornerIndices = iCornerIndices; }
177 
179  { return m_cornerSharpnesses; }
181  &iCornerSharpnesses )
182  { m_cornerSharpnesses = iCornerSharpnesses; }
183 
184  void setCorners( const Abc::Int32ArraySample &iCornerIndices,
185  const Abc::FloatArraySample &iCornerSharpnesses )
186  {
187  m_cornerIndices = iCornerIndices;
188  m_cornerSharpnesses = iCornerSharpnesses;
189  }
190 
191  // Holes
193  { return m_holes; }
194  void setHoles( const Abc::Int32ArraySample &iHoles )
195  { m_holes = iHoles; }
196 
197  // subdivision scheme
199  { return m_subdScheme; }
200  void setSubdivisionScheme( const std::string &iScheme )
201  { m_subdScheme = iScheme; }
202 
203  // bounding boxes
204  const Abc::Box3d &getSelfBounds() const { return m_selfBounds; }
205  void setSelfBounds( const Abc::Box3d &iBnds )
206  { m_selfBounds = iBnds; }
207 
208  // velocities accessor
209  const Abc::V3fArraySample &getVelocities() const { return m_velocities; }
210  void setVelocities( const Abc::V3fArraySample &iVelocities )
211  { m_velocities = iVelocities; }
212 
213  // UVs; need to set these outside the Sample constructor
214  const OV2fGeomParam::Sample &getUVs() const { return m_uvs; }
215  void setUVs( const OV2fGeomParam::Sample &iUVs )
216  { m_uvs = iUVs; }
217 
218  void reset()
219  {
220  m_positions.reset();
221  m_faceIndices.reset();
222  m_faceCounts.reset();
223 
224  m_faceVaryingInterpolateBoundary = ABC_GEOM_SUBD_NULL_INT_VALUE;
225  m_faceVaryingPropagateCorners = ABC_GEOM_SUBD_NULL_INT_VALUE;
226  m_interpolateBoundary = ABC_GEOM_SUBD_NULL_INT_VALUE;
227 
228  m_creaseIndices.reset();
229  m_creaseLengths.reset();
230  m_creaseSharpnesses.reset();
231 
232  m_cornerIndices.reset();
233  m_cornerSharpnesses.reset();
234 
235  m_holes.reset();
236 
237  m_subdScheme = "catmull-clark";
238 
239  m_velocities.reset();
240 
241  m_selfBounds.makeEmpty();
242 
243  m_uvs.reset();
244  }
245 
246  bool isPartialSample() const
247  {
248  if( !m_positions.getData() && !m_faceIndices.getData() && !m_faceCounts.getData() )
249  {
250  if( m_uvs.getVals() || m_velocities.getData() ||
251  (m_faceVaryingInterpolateBoundary != ABC_GEOM_SUBD_NULL_INT_VALUE) ||
252  (m_faceVaryingPropagateCorners != ABC_GEOM_SUBD_NULL_INT_VALUE) ||
253  (m_interpolateBoundary != ABC_GEOM_SUBD_NULL_INT_VALUE) ||
254  m_creaseIndices.getData() ||
255  m_creaseLengths.getData() || m_creaseSharpnesses.getData() ||
256  m_cornerIndices.getData() || m_cornerSharpnesses.getData() ||
257  m_holes.getData() )
258  {
259  return true;
260  }
261  }
262 
263  return false;
264  }
265 
266  protected:
267  friend class OSubDSchema;
268 
272 
276 
277  // Creases
281 
282  // Corners
285 
286  // Holes
288 
289  // subdivision scheme
291 
292  // bounds
294 
296 
297  // UVs
298  OV2fGeomParam::Sample m_uvs;
299 
300  }; // end OSubDSchema::Sample
301 
302  //-*************************************************************************
303  // SUBD SCHEMA
304  //-*************************************************************************
305 public:
306  //! By convention we always define this_type in AbcGeom classes.
307  //! Used by unspecified-bool-type conversion below
309 
310  //-*************************************************************************
311  // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
312  //-*************************************************************************
313 
314  //! The default constructor creates an empty OSubDSchema
315  //! ...
317  {
318  m_selectiveExport = false;
319  m_numSamples = 0;
320  m_timeSamplingIndex = 0;
321  }
322 
323  //! This constructor creates a new subd writer.
324  //! The first argument is an CompoundPropertyWriterPtr to use as a parent.
325  //! The next is the name to give the schema which is usually the default
326  //! name given by OSubD (.geom) The remaining optional arguments
327  //! can be used to override the ErrorHandlerPolicy, to specify
328  //! MetaData, specify sparse sampling and to set TimeSampling.
330  const std::string &iName,
331  const Abc::Argument &iArg0 = Abc::Argument(),
332  const Abc::Argument &iArg1 = Abc::Argument(),
333  const Abc::Argument &iArg2 = Abc::Argument(),
334  const Abc::Argument &iArg3 = Abc::Argument() );
335 
336  //! This constructor creates a new subd writer.
337  //! The first argument is an OCompundProperty to use as a parent, and from
338  //! which the ErrorHandlerPolicy is derived. The next is the name to give
339  //! the schema which is usually the default name given by OSubD (.geom)
340  //! The remaining optional arguments can be used to specify MetaData,
341  //! specify sparse sampling and to set TimeSampling.
343  const std::string &iName,
344  const Abc::Argument &iArg0 = Abc::Argument(),
345  const Abc::Argument &iArg1 = Abc::Argument(),
346  const Abc::Argument &iArg2 = Abc::Argument() );
347 
348  //! Copy constructor.
349  OSubDSchema(const OSubDSchema& iCopy)
350  : OGeomBaseSchema<SubDSchemaInfo>()
351  {
352  *this = iCopy;
353  }
354 
355  //! Default assignment operator used.
356 
357  //-*************************************************************************
358  // SCHEMA STUFF
359  //-*************************************************************************
360 
361  //! Return the time sampling, which is stored on each of the
362  //! sub properties.
364  {
365  if( m_positionsProperty.valid() )
366  {
367  return m_positionsProperty.getTimeSampling();
368  }
369  else
370  {
371  return getObject().getArchive().getTimeSampling( 0 );
372  }
373  }
374 
375  //-*************************************************************************
376  // SAMPLE STUFF
377  //-*************************************************************************
378 
379  //! Get number of samples written so far.
380  //! ...
381  size_t getNumSamples() const
382  { return m_numSamples; }
383 
384  //! Set a sample! Sample zero has to have non-degenerate
385  //! positions, indices and counts.
386  void set( const Sample &iSamp );
387 
388  //! Set from previous sample. Will apply to each of positions,
389  //! indices, and counts.
390  void setFromPrevious( );
391 
392  void setTimeSampling( uint32_t iIndex );
393  void setTimeSampling( AbcA::TimeSamplingPtr iTime );
394 
395  //-*************************************************************************
396  // ABC BASE MECHANISMS
397  // These functions are used by Abc to deal with errors, validity,
398  // and so on.
399  //-*************************************************************************
400 
401  //! Reset returns this function set to an empty, default
402  //! state.
403  void reset()
404  {
405  m_positionsProperty.reset();
406  m_faceIndicesProperty.reset();
407  m_faceCountsProperty.reset();
408 
409  m_faceVaryingInterpolateBoundaryProperty.reset();
410  m_faceVaryingPropagateCornersProperty.reset();
411  m_interpolateBoundaryProperty.reset();
412 
413  m_creaseIndicesProperty.reset();
414  m_creaseLengthsProperty.reset();
415  m_creaseSharpnessesProperty.reset();
416 
417  m_cornerIndicesProperty.reset();
418  m_cornerSharpnessesProperty.reset();
419 
420  m_holesProperty.reset();
421 
422  m_subdSchemeProperty.reset();
423 
424  m_velocitiesProperty.reset();
425 
426  m_uvsParam.reset();
427 
428  m_faceSets.clear ();
429 
431  }
432 
433  //! Valid returns whether this function set is
434  //! valid.
435  bool valid() const
436  {
438  m_positionsProperty.valid() &&
439  m_faceIndicesProperty.valid() &&
440  m_faceCountsProperty.valid() ) ||
441  m_selectiveExport;
442  }
443 
444  // FaceSet stuff
445  OFaceSet & createFaceSet( const std::string &iFaceSetName );
446  //! Appends the names of any FaceSets for this SubD.
447  void getFaceSetNames( std::vector <std::string> & oFaceSetNames );
448  OFaceSet getFaceSet( const std::string &iFaceSetName );
449  bool hasFaceSet( const std::string &iFaceSetName );
450 
451 
452  //! Optional source name for the UV param.
453  //! Must be set before the first UV sample is set.
454  void setUVSourceName(const std::string & iName);
455 
456  //! unspecified-bool-type operator overload.
457  //! ...
459 
460 protected:
461  void init( uint32_t iTsIdx, bool isSparse );
462 
463  //! Set only some property data. Does not need to be a valid schema sample
464  //! This is to be used when created a file which will be layered in to
465  //! another file.
466  void selectiveSet( const Sample &iSamp );
467 
471 
472  // misc
476 
477  // Creases
481 
482  // Corners
485 
486  // Holes
488 
489  // subdivision scheme
491 
493 
494  // UVs
496 
497 
498  // optional source name for the UVs
500 
501 private:
502  void initCreases(uint32_t iNumSamples);
503  void initCorners(uint32_t iNumSamples);
504  void initHoles(uint32_t iNumSamples);
505 
506  // FaceSets created on this SubD
507  std::map <std::string, OFaceSet> m_faceSets;
508 
509  // Write out only some properties (UVs, normals).
510  // This is to export data to layer into another file later.
511  bool m_selectiveExport;
512 
513  // Number of times OSubDSchema::set() has been called
514  size_t m_numSamples;
515 
516  uint32_t m_timeSamplingIndex;
517 
518  void createSubDSchemeProperty();
519 
520  void createFaceVaryingInterpolateBoundaryProperty();
521 
522  void createFaceVaryingPropagateCornersProperty();
523 
524  void createInterpolateBoundaryProperty();
525 
526  void createVelocitiesProperty();
527 
528  void createUVsProperty( const Sample &iSamp );
529 
530  void createPositionsProperty();
531 
532  friend class OFaceSetSchema;;
533 };
534 
535 //-*****************************************************************************
536 // SCHEMA OBJECT
537 //-*****************************************************************************
539 
540 typedef Util::shared_ptr< OSubD > OSubDPtr;
541 
542 } // End namespace ALEMBIC_VERSION_NS
543 
544 using namespace ALEMBIC_VERSION_NS;
545 
546 } // End namespace AbcGeom
547 } // End namespace Alembic
548 
549 #endif
void setFaceCounts(const Abc::Int32ArraySample &iCnt)
Definition: OSubD.h:119
void setHoles(const Abc::Int32ArraySample &iHoles)
Definition: OSubD.h:194
GLsizei const GLchar *const * string
Definition: glcorearb.h:814
Abc::OV3fArrayProperty m_velocitiesProperty
Definition: OSubD.h:492
Util::shared_ptr< OSubD > OSubDPtr
Definition: OSubD.h:540
Abc::OInt32Property m_faceVaryingPropagateCornersProperty
Definition: OSubD.h:474
const Abc::FloatArraySample & getCornerSharpnesses() const
Definition: OSubD.h:178
Abc::OFloatArrayProperty m_creaseSharpnessesProperty
Definition: OSubD.h:480
#define ALEMBIC_EXPORT
Definition: Export.h:51
const Abc::V3fArraySample & getVelocities() const
Definition: OSubD.h:209
Sample(const Abc::P3fArraySample &iPositions, const Abc::Int32ArraySample &iFaceIndices, const Abc::Int32ArraySample &iFaceCounts, const Abc::Int32ArraySample &iCreaseIndices=Abc::Int32ArraySample(), const Abc::Int32ArraySample &iCreaseLengths=Abc::Int32ArraySample(), const Abc::FloatArraySample &iCreaseSharpnesses=Abc::FloatArraySample(), const Abc::Int32ArraySample &iCornerIndices=Abc::Int32ArraySample(), const Abc::FloatArraySample &iCornerSharpnesses=Abc::FloatArraySample(), const Abc::Int32ArraySample &iHoles=Abc::Int32ArraySample())
Definition: OSubD.h:75
Abc::OInt32ArrayProperty m_creaseIndicesProperty
Definition: OSubD.h:478
Abc::OInt32ArrayProperty m_faceCountsProperty
Definition: OSubD.h:470
const Abc::Int32ArraySample & getCreaseIndices() const
Definition: OSubD.h:140
void setUVs(const OV2fGeomParam::Sample &iUVs)
Definition: OSubD.h:215
const Abc::P3fArraySample & getPositions() const
Definition: OSubD.h:110
const Abc::Int32ArraySample & getHoles() const
Definition: OSubD.h:192
const Abc::Int32ArraySample & getCornerIndices() const
Definition: OSubD.h:173
Alembic::Util::shared_ptr< TimeSampling > TimeSamplingPtr
Definition: TimeSampling.h:137
GLboolean reset
Definition: glad.h:5138
void setFaceIndices(const Abc::Int32ArraySample &iSmp)
Definition: OSubD.h:115
Abc::OInt32ArrayProperty m_faceIndicesProperty
Definition: OSubD.h:469
Abc::OFloatArrayProperty m_cornerSharpnessesProperty
Definition: OSubD.h:484
void setCreases(const Abc::Int32ArraySample &iCreaseIndices, const Abc::Int32ArraySample &iCreaseLengths)
Definition: OSubD.h:156
Abc::OP3fArrayProperty m_positionsProperty
Definition: OSubD.h:468
void setCorners(const Abc::Int32ArraySample &iCornerIndices, const Abc::FloatArraySample &iCornerSharpnesses)
Definition: OSubD.h:184
void setCornerIndices(const Abc::Int32ArraySample &iCornerIndices)
Definition: OSubD.h:175
#define ALEMBIC_EXPORT_CONST
Definition: Export.h:53
#define ALEMBIC_OVERRIDE_OPERATOR_BOOL(PASS_COND)
Definition: OperatorBool.h:56
void setSubdivisionScheme(const std::string &iScheme)
Definition: OSubD.h:200
AbcA::TimeSamplingPtr getTimeSampling() const
Default assignment operator used.
Definition: OSubD.h:363
void setCreaseIndices(const Abc::Int32ArraySample &iCreaseIndices)
Definition: OSubD.h:142
const Abc::Int32ArraySample & getCreaseLengths() const
Definition: OSubD.h:145
Box< V3d > Box3d
3D box of base type double.
Definition: ImathBox.h:167
void setVelocities(const Abc::V3fArraySample &iVelocities)
Definition: OSubD.h:210
Abc::OInt32ArrayProperty m_creaseLengthsProperty
Definition: OSubD.h:479
void setCreases(const Abc::Int32ArraySample &iCreaseIndices, const Abc::Int32ArraySample &iCreaseLengths, const Abc::FloatArraySample &iCreaseSharpnesses)
Definition: OSubD.h:163
const Abc::Int32ArraySample & getFaceCounts() const
Definition: OSubD.h:118
void setCreaseSharpnesses(const Abc::FloatArraySample &iCreaseSharpnesses)
Definition: OSubD.h:152
Abc::OInt32Property m_interpolateBoundaryProperty
Definition: OSubD.h:475
Abc::OInt32Property m_faceVaryingInterpolateBoundaryProperty
Definition: OSubD.h:473
const Abc::FloatArraySample & getCreaseSharpnesses() const
Definition: OSubD.h:150
Abc::OSchemaObject< OSubDSchema > OSubD
Definition: OSubD.h:538
void setPositions(const Abc::P3fArraySample &iSmp)
Definition: OSubD.h:111
void setCornerSharpnesses(const Abc::FloatArraySample &iCornerSharpnesses)
Definition: OSubD.h:180
void setCreaseLengths(const Abc::Int32ArraySample &iCreaseLengths)
Definition: OSubD.h:147
OSubDSchema(const OSubDSchema &iCopy)
Copy constructor.
Definition: OSubD.h:349
Abc::OInt32ArrayProperty m_cornerIndicesProperty
Definition: OSubD.h:483
const Abc::Int32ArraySample & getFaceIndices() const
Definition: OSubD.h:114
Abc::OInt32ArrayProperty m_holesProperty
Definition: OSubD.h:487
const OV2fGeomParam::Sample & getUVs() const
Definition: OSubD.h:214
#define ALEMBIC_VERSION_NS
Definition: Foundation.h:88
Alembic::Util::shared_ptr< CompoundPropertyWriter > CompoundPropertyWriterPtr