Alembic Version 1.1
Loading...
Searching...
No Matches
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
48namespace Alembic {
49namespace AbcGeom {
50namespace ALEMBIC_VERSION_NS {
51
52//-*****************************************************************************
53// for default values for int scalar properties here
55int32_t ABC_GEOM_SUBD_NULL_INT_VALUE( INT_MIN / 2 );
56
57//-*****************************************************************************
58class ALEMBIC_EXPORT OSubDSchema : public OGeomBaseSchema<SubDSchemaInfo>
59{
60public:
61 //-*************************************************************************
62 // SUBD SCHEMA SAMPLE TYPE
63 //-*************************************************************************
64 class Sample
65 {
66 public:
69 Sample() { reset(); }
70
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; }
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
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
198 std::string getSubdivisionScheme() const
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
290 std::string m_subdScheme;
291
292 // bounds
293 Abc::Box3d m_selfBounds;
294
296
297 // UVs
298 OV2fGeomParam::Sample m_uvs;
299
300 }; // end OSubDSchema::Sample
301
302 //-*************************************************************************
303 // SUBD SCHEMA
304 //-*************************************************************************
305public:
309
310 //-*************************************************************************
311 // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
312 //-*************************************************************************
313
317 {
318 m_selectiveExport = false;
319 m_numSamples = 0;
320 m_timeSamplingIndex = 0;
321 }
322
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
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
350 : OGeomBaseSchema<SubDSchemaInfo>()
351 {
352 *this = iCopy;
353 }
354
356
357 //-*************************************************************************
358 // SCHEMA STUFF
359 //-*************************************************************************
360
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
381 size_t getNumSamples() const
382 { return m_numSamples; }
383
386 void set( const Sample &iSamp );
387
391
392 void setTimeSampling( uint32_t iIndex );
394
395 //-*************************************************************************
396 // ABC BASE MECHANISMS
397 // These functions are used by Abc to deal with errors, validity,
398 // and so on.
399 //-*************************************************************************
400
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
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 );
447 void getFaceSetNames( std::vector <std::string> & oFaceSetNames );
448 OFaceSet getFaceSet( const std::string &iFaceSetName );
449 bool hasFaceSet( const std::string &iFaceSetName );
450
451
454 void setUVSourceName(const std::string & iName);
455
458 ALEMBIC_OVERRIDE_OPERATOR_BOOL( OSubDSchema::valid() );
459
460protected:
461 void init( uint32_t iTsIdx, bool isSparse );
462
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
499 std::string m_uvSourceName;
500
501private:
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
540typedef Util::shared_ptr< OSubD > OSubDPtr;
541
542} // End namespace ALEMBIC_VERSION_NS
543
544using namespace ALEMBIC_VERSION_NS;
545
546} // End namespace AbcGeom
547} // End namespace Alembic
548
549#endif
#define ALEMBIC_EXPORT_CONST
Definition Export.h:53
#define ALEMBIC_EXPORT
Definition Export.h:51
#define ALEMBIC_VERSION_NS
Definition Foundation.h:105
const Abc::V3fArraySample & getVelocities() const
Definition OSubD.h:209
const Abc::Int32ArraySample & getCornerIndices() const
Definition OSubD.h:173
void setHoles(const Abc::Int32ArraySample &iHoles)
Definition OSubD.h:194
const Abc::Int32ArraySample & getCreaseIndices() const
Definition OSubD.h:140
void setPositions(const Abc::P3fArraySample &iSmp)
Definition OSubD.h:111
void setCornerSharpnesses(const Abc::FloatArraySample &iCornerSharpnesses)
Definition OSubD.h:180
const OV2fGeomParam::Sample & getUVs() const
Definition OSubD.h:214
const Abc::FloatArraySample & getCreaseSharpnesses() const
Definition OSubD.h:150
const Abc::Int32ArraySample & getCreaseLengths() const
Definition OSubD.h:145
void setVelocities(const Abc::V3fArraySample &iVelocities)
Definition OSubD.h:210
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
const Abc::Int32ArraySample & getFaceIndices() const
Definition OSubD.h:114
const Abc::P3fArraySample & getPositions() const
Definition OSubD.h:110
void setCreases(const Abc::Int32ArraySample &iCreaseIndices, const Abc::Int32ArraySample &iCreaseLengths)
Definition OSubD.h:156
void setCornerIndices(const Abc::Int32ArraySample &iCornerIndices)
Definition OSubD.h:175
void setCreaseIndices(const Abc::Int32ArraySample &iCreaseIndices)
Definition OSubD.h:142
const Abc::FloatArraySample & getCornerSharpnesses() const
Definition OSubD.h:178
void setFaceCounts(const Abc::Int32ArraySample &iCnt)
Definition OSubD.h:119
void setCreases(const Abc::Int32ArraySample &iCreaseIndices, const Abc::Int32ArraySample &iCreaseLengths, const Abc::FloatArraySample &iCreaseSharpnesses)
Definition OSubD.h:163
void setCorners(const Abc::Int32ArraySample &iCornerIndices, const Abc::FloatArraySample &iCornerSharpnesses)
Definition OSubD.h:184
const Abc::Int32ArraySample & getFaceCounts() const
Definition OSubD.h:118
void setFaceIndices(const Abc::Int32ArraySample &iSmp)
Definition OSubD.h:115
void setSubdivisionScheme(const std::string &iScheme)
Definition OSubD.h:200
const Abc::Int32ArraySample & getHoles() const
Definition OSubD.h:192
void setCreaseSharpnesses(const Abc::FloatArraySample &iCreaseSharpnesses)
Definition OSubD.h:152
void setCreaseLengths(const Abc::Int32ArraySample &iCreaseLengths)
Definition OSubD.h:147
void setUVs(const OV2fGeomParam::Sample &iUVs)
Definition OSubD.h:215
Abc::OInt32ArrayProperty m_faceCountsProperty
Definition OSubD.h:470
Abc::OInt32ArrayProperty m_creaseLengthsProperty
Definition OSubD.h:479
OSubDSchema(Abc::OCompoundProperty iParent, const std::string &iName, const Abc::Argument &iArg0=Abc::Argument(), const Abc::Argument &iArg1=Abc::Argument(), const Abc::Argument &iArg2=Abc::Argument())
Abc::OFloatArrayProperty m_creaseSharpnessesProperty
Definition OSubD.h:480
Abc::OInt32Property m_faceVaryingInterpolateBoundaryProperty
Definition OSubD.h:473
Abc::OInt32ArrayProperty m_creaseIndicesProperty
Definition OSubD.h:478
void setUVSourceName(const std::string &iName)
void init(uint32_t iTsIdx, bool isSparse)
void getFaceSetNames(std::vector< std::string > &oFaceSetNames)
Appends the names of any FaceSets for this SubD.
OSubDSchema(AbcA::CompoundPropertyWriterPtr iParent, const std::string &iName, const Abc::Argument &iArg0=Abc::Argument(), const Abc::Argument &iArg1=Abc::Argument(), const Abc::Argument &iArg2=Abc::Argument(), const Abc::Argument &iArg3=Abc::Argument())
OSubDSchema(const OSubDSchema &iCopy)
Copy constructor.
Definition OSubD.h:349
void setTimeSampling(AbcA::TimeSamplingPtr iTime)
OFaceSet & createFaceSet(const std::string &iFaceSetName)
Abc::OInt32ArrayProperty m_faceIndicesProperty
Definition OSubD.h:469
Abc::OFloatArrayProperty m_cornerSharpnessesProperty
Definition OSubD.h:484
Abc::OInt32Property m_faceVaryingPropagateCornersProperty
Definition OSubD.h:474
OFaceSet getFaceSet(const std::string &iFaceSetName)
bool hasFaceSet(const std::string &iFaceSetName)
AbcA::TimeSamplingPtr getTimeSampling() const
Default assignment operator used.
Definition OSubD.h:363
Abc::OInt32ArrayProperty m_cornerIndicesProperty
Definition OSubD.h:483
Alembic::Util::shared_ptr< CompoundPropertyWriter > CompoundPropertyWriterPtr
Alembic::Util::shared_ptr< TimeSampling > TimeSamplingPtr
Util::shared_ptr< OSubD > OSubDPtr
Definition OSubD.h:540
static ALEMBIC_EXPORT_CONST int32_t ABC_GEOM_SUBD_NULL_INT_VALUE(INT_MIN/2)
Alembic namespace ...
Definition ArchiveInfo.h:46