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
55 int32_t ABC_GEOM_SUBD_NULL_INT_VALUE( INT_MIN / 2 );
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 != 0) || (m_faceVaryingPropagateCorners != 0) ||
252  (m_interpolateBoundary != 0) || m_creaseIndices.getData() ||
253  m_creaseLengths.getData() || m_creaseSharpnesses.getData() ||
254  m_cornerIndices.getData() || m_cornerSharpnesses.getData() ||
255  m_holes.getData() )
256  {
257  return true;
258  }
259  }
260 
261  return false;
262  }
263 
264  protected:
265  friend class OSubDSchema;
266 
270 
274 
275  // Creases
279 
280  // Corners
283 
284  // Holes
286 
287  // subdivision scheme
289 
290  // bounds
292 
294 
295  // UVs
296  OV2fGeomParam::Sample m_uvs;
297 
298  }; // end OSubDSchema::Sample
299 
300  //-*************************************************************************
301  // SUBD SCHEMA
302  //-*************************************************************************
303 public:
304  //! By convention we always define this_type in AbcGeom classes.
305  //! Used by unspecified-bool-type conversion below
307 
308  //-*************************************************************************
309  // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
310  //-*************************************************************************
311 
312  //! The default constructor creates an empty OSubDSchema
313  //! ...
315  {
316  m_selectiveExport = false;
317  m_numSamples = 0;
318  m_timeSamplingIndex = 0;
319  }
320 
321  //! This constructor creates a new subd writer.
322  //! The first argument is an CompoundPropertyWriterPtr to use as a parent.
323  //! The next is the name to give the schema which is usually the default
324  //! name given by OSubD (.geom) The remaining optional arguments
325  //! can be used to override the ErrorHandlerPolicy, to specify
326  //! MetaData, specify sparse sampling and to set TimeSampling.
328  const std::string &iName,
329  const Abc::Argument &iArg0 = Abc::Argument(),
330  const Abc::Argument &iArg1 = Abc::Argument(),
331  const Abc::Argument &iArg2 = Abc::Argument(),
332  const Abc::Argument &iArg3 = Abc::Argument() );
333 
334  //! This constructor creates a new subd writer.
335  //! The first argument is an OCompundProperty to use as a parent, and from
336  //! which the ErrorHandlerPolicy is derived. The next is the name to give
337  //! the schema which is usually the default name given by OSubD (.geom)
338  //! The remaining optional arguments can be used to specify MetaData,
339  //! specify sparse sampling and to set TimeSampling.
341  const std::string &iName,
342  const Abc::Argument &iArg0 = Abc::Argument(),
343  const Abc::Argument &iArg1 = Abc::Argument(),
344  const Abc::Argument &iArg2 = Abc::Argument() );
345 
346  //! Copy constructor.
347  OSubDSchema(const OSubDSchema& iCopy)
348  : OGeomBaseSchema<SubDSchemaInfo>()
349  {
350  *this = iCopy;
351  }
352 
353  //! Default assignment operator used.
354 
355  //-*************************************************************************
356  // SCHEMA STUFF
357  //-*************************************************************************
358 
359  //! Return the time sampling, which is stored on each of the
360  //! sub properties.
362  {
363  if( m_positionsProperty.valid() )
364  {
365  return m_positionsProperty.getTimeSampling();
366  }
367  else
368  {
369  return getObject().getArchive().getTimeSampling( 0 );
370  }
371  }
372 
373  //-*************************************************************************
374  // SAMPLE STUFF
375  //-*************************************************************************
376 
377  //! Get number of samples written so far.
378  //! ...
379  size_t getNumSamples() const
380  { return m_numSamples; }
381 
382  //! Set a sample! Sample zero has to have non-degenerate
383  //! positions, indices and counts.
384  void set( const Sample &iSamp );
385 
386  //! Set from previous sample. Will apply to each of positions,
387  //! indices, and counts.
388  void setFromPrevious( );
389 
390  void setTimeSampling( uint32_t iIndex );
391  void setTimeSampling( AbcA::TimeSamplingPtr iTime );
392 
393  //-*************************************************************************
394  // ABC BASE MECHANISMS
395  // These functions are used by Abc to deal with errors, validity,
396  // and so on.
397  //-*************************************************************************
398 
399  //! Reset returns this function set to an empty, default
400  //! state.
401  void reset()
402  {
403  m_positionsProperty.reset();
404  m_faceIndicesProperty.reset();
405  m_faceCountsProperty.reset();
406 
407  m_faceVaryingInterpolateBoundaryProperty.reset();
408  m_faceVaryingPropagateCornersProperty.reset();
409  m_interpolateBoundaryProperty.reset();
410 
411  m_creaseIndicesProperty.reset();
412  m_creaseLengthsProperty.reset();
413  m_creaseSharpnessesProperty.reset();
414 
415  m_cornerIndicesProperty.reset();
416  m_cornerSharpnessesProperty.reset();
417 
418  m_holesProperty.reset();
419 
420  m_subdSchemeProperty.reset();
421 
422  m_velocitiesProperty.reset();
423 
424  m_uvsParam.reset();
425 
426  m_faceSets.clear ();
427 
429  }
430 
431  //! Valid returns whether this function set is
432  //! valid.
433  bool valid() const
434  {
436  m_positionsProperty.valid() &&
437  m_faceIndicesProperty.valid() &&
438  m_faceCountsProperty.valid() ) ||
439  m_selectiveExport;
440  }
441 
442  // FaceSet stuff
443  OFaceSet & createFaceSet( const std::string &iFaceSetName );
444  //! Appends the names of any FaceSets for this SubD.
445  void getFaceSetNames( std::vector <std::string> & oFaceSetNames );
446  OFaceSet getFaceSet( const std::string &iFaceSetName );
447  bool hasFaceSet( const std::string &iFaceSetName );
448 
449 
450  //! Optional source name for the UV param.
451  //! Must be set before the first UV sample is set.
452  void setUVSourceName(const std::string & iName);
453 
454  //! unspecified-bool-type operator overload.
455  //! ...
457 
458 protected:
459  void init( uint32_t iTsIdx, bool isSparse );
460 
461  //! Set only some property data. Does not need to be a valid schema sample
462  //! This is to be used when created a file which will be layered in to
463  //! another file.
464  void selectiveSet( const Sample &iSamp );
465 
469 
470  // misc
474 
475  // Creases
479 
480  // Corners
483 
484  // Holes
486 
487  // subdivision scheme
489 
491 
492  // UVs
494 
495 
496  // optional source name for the UVs
498 
499 private:
500  void initCreases(uint32_t iNumSamples);
501  void initCorners(uint32_t iNumSamples);
502  void initHoles(uint32_t iNumSamples);
503 
504  // FaceSets created on this SubD
505  std::map <std::string, OFaceSet> m_faceSets;
506 
507  // Write out only some properties (UVs, normals).
508  // This is to export data to layer into another file later.
509  bool m_selectiveExport;
510 
511  // Number of times OSubDSchema::set() has been called
512  size_t m_numSamples;
513 
514  uint32_t m_timeSamplingIndex;
515 
516  void createSubDSchemeProperty();
517 
518  void createFaceVaryingInterpolateBoundaryProperty();
519 
520  void createFaceVaryingPropagateCornersProperty();
521 
522  void createInterpolateBoundaryProperty();
523 
524  void createVelocitiesProperty();
525 
526  void createUVsProperty( const Sample &iSamp );
527 
528  void createPositionsProperty();
529 
530  friend class OFaceSetSchema;;
531 };
532 
533 //-*****************************************************************************
534 // SCHEMA OBJECT
535 //-*****************************************************************************
537 
538 typedef Util::shared_ptr< OSubD > OSubDPtr;
539 
540 } // End namespace ALEMBIC_VERSION_NS
541 
542 using namespace ALEMBIC_VERSION_NS;
543 
544 } // End namespace AbcGeom
545 } // End namespace Alembic
546 
547 #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:813
Abc::OV3fArrayProperty m_velocitiesProperty
Definition: OSubD.h:490
Util::shared_ptr< OSubD > OSubDPtr
Definition: OSubD.h:538
Abc::OInt32Property m_faceVaryingPropagateCornersProperty
Definition: OSubD.h:472
const Abc::FloatArraySample & getCornerSharpnesses() const
Definition: OSubD.h:178
Abc::OFloatArrayProperty m_creaseSharpnessesProperty
Definition: OSubD.h:478
const Abc::V3fArraySample & getVelocities() const
Definition: OSubD.h:209
png_uint_32 i
Definition: png.h:2877
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:476
Abc::OInt32ArrayProperty m_faceCountsProperty
Definition: OSubD.h:468
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
void setFaceIndices(const Abc::Int32ArraySample &iSmp)
Definition: OSubD.h:115
Abc::OInt32ArrayProperty m_faceIndicesProperty
Definition: OSubD.h:467
Abc::OFloatArrayProperty m_cornerSharpnessesProperty
Definition: OSubD.h:482
void setCreases(const Abc::Int32ArraySample &iCreaseIndices, const Abc::Int32ArraySample &iCreaseLengths)
Definition: OSubD.h:156
Abc::OP3fArrayProperty m_positionsProperty
Definition: OSubD.h:466
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_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:361
void setCreaseIndices(const Abc::Int32ArraySample &iCreaseIndices)
Definition: OSubD.h:142
const Abc::Int32ArraySample & getCreaseLengths() const
Definition: OSubD.h:145
Box< V3d > Box3d
Definition: ImathBox.h:139
void setVelocities(const Abc::V3fArraySample &iVelocities)
Definition: OSubD.h:210
#define ALEMBIC_EXPORT_CONST
Definition: Export.h:53
Abc::OInt32ArrayProperty m_creaseLengthsProperty
Definition: OSubD.h:477
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:473
Abc::OInt32Property m_faceVaryingInterpolateBoundaryProperty
Definition: OSubD.h:471
const Abc::FloatArraySample & getCreaseSharpnesses() const
Definition: OSubD.h:150
Abc::OSchemaObject< OSubDSchema > OSubD
Definition: OSubD.h:536
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:347
Abc::OInt32ArrayProperty m_cornerIndicesProperty
Definition: OSubD.h:481
#define ALEMBIC_EXPORT
Definition: Export.h:51
const Abc::Int32ArraySample & getFaceIndices() const
Definition: OSubD.h:114
Abc::OInt32ArrayProperty m_holesProperty
Definition: OSubD.h:485
const OV2fGeomParam::Sample & getUVs() const
Definition: OSubD.h:214
#define ALEMBIC_VERSION_NS
Definition: Foundation.h:105
Alembic::Util::shared_ptr< CompoundPropertyWriter > CompoundPropertyWriterPtr