HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
OCurves.h
Go to the documentation of this file.
1 //-*****************************************************************************
2 //
3 // Copyright (c) 2009-2013,
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_OCurves_h
38 #define Alembic_AbcGeom_OCurves_h
39 
40 #include <Alembic/Util/Export.h>
42 #include <Alembic/AbcGeom/Basis.h>
47 
48 namespace Alembic {
49 namespace AbcGeom {
50 namespace ALEMBIC_VERSION_NS {
51 
52 //-*****************************************************************************
53 // Curves definition - Similar in form to the Geometric primitive used to
54 // specify curves in renderman.
55 // "type" - linear or cubic, one type for all curves
56 // "wrap" - periodic or nonperiodic, one mode for all curves
57 // ---
58 // "P" - vertexes for the curves being written
59 // "width" - can be constant or can vary
60 // "N" - (just like PolyMesh, via a geom parameter) Normals
61 // "uv" - (just like PolyMesh, via a geom parameter) u-v coordinates
62 class ALEMBIC_EXPORT OCurvesSchema : public OGeomBaseSchema<CurvesSchemaInfo>
63 {
64 public:
65  //-*************************************************************************
66  // CURVE SCHEMA SAMPLE TYPE
67  //-*************************************************************************
68  class Sample
69  {
70  public:
71  //! Creates a default sample with no data in it.
72  //! ...
74  {
75  // even though this might not be written out
76  // (unless curvesNumVertices and points is set) give some reasonable
77  // and predictable defaults
78  reset();
79  m_type = kCubic;
80  m_wrap = kNonPeriodic;
81  m_basis = kBezierBasis;
82  }
83 
84  //! Creates a sample with position data but no index
85  //! or count data. For specifying samples after the first one
86  Sample( const Abc::P3fArraySample &iPos )
87  : m_positions( iPos )
88  {
89  // even though this might not be written out
90  // (unless curvesNumVertices is set) give some reasonable
91  // and predictable defaults
92  m_type = kCubic;
93  m_wrap = kNonPeriodic;
94  m_basis = kBezierBasis;
95  }
96 
97 
98  //! Creates a sample with position data, index data, count data,
99  //! and optional UV and Normals data.
100  //! For specifying samples with an explicit topology. The first
101  //! sample must be full like this. Subsequent samples may also
102  //! be full like this, which would indicate a change of topology
104  const Abc::P3fArraySample &iPos,
105  const Abc::Int32ArraySample &iNVertices,
106  const CurveType &iType = kCubic,
107  const CurvePeriodicity iWrap = kNonPeriodic,
108  const OFloatGeomParam::Sample &iWidths = \
109  OFloatGeomParam::Sample(),
110  const OV2fGeomParam::Sample &iUVs = OV2fGeomParam::Sample(),
111  const ON3fGeomParam::Sample &iNormals = ON3fGeomParam::Sample(),
112  const BasisType &iBasis = kBezierBasis,
113  const Abc::FloatArraySample &iPosWeight = \
115  const Abc::UcharArraySample &iOrders = Abc::UcharArraySample(),
117  ): m_positions( iPos ),
118  m_nVertices( iNVertices ),
119  m_type( iType ),
120  m_wrap( iWrap ),
121  m_widths( iWidths ),
122  m_uvs( iUVs ),
123  m_normals( iNormals ),
124  m_basis( iBasis ),
125  m_positionWeights( iPosWeight ),
126  m_orders( iOrders ),
127  m_knots( iKnots ) {}
128 
129  // widths accessor
130  const OFloatGeomParam::Sample &getWidths() const { return m_widths; }
131  void setWidths( const OFloatGeomParam::Sample &iWidths )
132  { m_widths = iWidths; }
133 
134  // positions accessor
135  const Abc::P3fArraySample &getPositions() const { return m_positions; }
136  void setPositions( const Abc::P3fArraySample &iSmp )
137  { m_positions = iSmp; }
138 
139  // position weights, if it isn't set, it's 1 for every point
141  { return m_positionWeights; }
143  { m_positionWeights = iSmp; }
144 
145  // type accessors
146  void setType( const CurveType &iType )
147  { m_type = iType; }
148  CurveType getType() const { return m_type; }
149 
150  // wrap accessors
151  void setWrap( const CurvePeriodicity &iWrap )
152  { m_wrap = iWrap; }
153  CurvePeriodicity getWrap() const { return m_wrap; }
154 
155  std::size_t getNumCurves() const { return m_nVertices.size(); }
156 
157  //! an array of ints that corresponds to the number
158  //! of vertices per curve
160  { m_nVertices = iNVertices; }
162  { return m_nVertices; }
163 
164  // UVs
165  const OV2fGeomParam::Sample &getUVs() const { return m_uvs; }
166  void setUVs( const OV2fGeomParam::Sample &iUVs )
167  { m_uvs = iUVs; }
168 
169  // bounding box accessors
170  const Abc::Box3d &getSelfBounds() const { return m_selfBounds; }
171  void setSelfBounds( const Abc::Box3d &iBnds )
172  { m_selfBounds = iBnds; }
173 
174  // velocities accessor
175  const Abc::V3fArraySample &getVelocities() const { return m_velocities; }
176  void setVelocities( const Abc::V3fArraySample &iVelocities )
177  { m_velocities = iVelocities; }
178 
179  // normal accessors
180  const ON3fGeomParam::Sample &getNormals() const { return m_normals; }
181  void setNormals( const ON3fGeomParam::Sample &iNormals )
182  { m_normals = iNormals; }
183 
184  // basis accessors
185  BasisType getBasis() const { return m_basis; }
186  void setBasis( const BasisType &iBasis )
187  { m_basis = iBasis; }
188 
189  // orders accessors
190  const Abc::UcharArraySample &getOrders() const { return m_orders; }
191  void setOrders( const Abc::UcharArraySample &iOrders)
192  { m_orders = iOrders; }
193 
194  // knot accessors
195  const Abc::FloatArraySample &getKnots() const { return m_knots; }
196  void setKnots( const Abc::FloatArraySample &iKnots)
197  { m_knots = iKnots; }
198 
199  void reset()
200  {
201  m_positions.reset();
202  m_positionWeights.reset();
203  m_velocities.reset();
204  m_uvs.reset();
205  m_normals.reset();
206  m_widths.reset();
207 
208  m_nVertices.reset();
209 
210  m_orders.reset();
211  m_knots.reset();
212 
213  m_selfBounds.makeEmpty();
214 
215  m_type = kCubic;
216  m_wrap = kNonPeriodic;
217  m_basis = kBezierBasis;
218  }
219 
220  bool isPartialSample() const
221  {
222  if( !m_positions.getData() )
223  {
224  if( m_uvs.getVals() || m_normals.getVals() || m_velocities.getData() )
225  {
226  return true;
227  }
228  }
229 
230  return false;
231  }
232 
233  protected:
234 
235  // properties
239 
242 
243  OFloatGeomParam::Sample m_widths;
244  OV2fGeomParam::Sample m_uvs;
245  ON3fGeomParam::Sample m_normals;
246 
248 
249  // optional properties
253 
254  // bounding box attributes
256 
257  };
258 
259  //-*************************************************************************
260  // CURVE SCHEMA
261  //-*************************************************************************
262 
263 public:
264 
265  //! By convention we always define this_type in AbcGeom classes.
266  //! Used by unspecified-bool-type conversion below
269 
270  //-*************************************************************************
271  // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
272  //-*************************************************************************
273 
274  //! The default constructor creates an empty OCurvesSchema
275  //! ...
277  {
278  m_selectiveExport = false;
279  m_numSamples = 0;
280  m_timeSamplingIndex = 0;
281  }
282 
283 
284  //! This constructor creates a new curves writer.
285  //! The first argument is the compound property to use as a parent
286  //! The remaining optional arguments are the parents ErrorHandlerPolicy,
287  //! an override to the ErrorHandlerPolicy, MetaData, and TimeSampling info.
289  const std::string &iName,
290  const Abc::Argument &iArg0 = Abc::Argument(),
291  const Abc::Argument &iArg1 = Abc::Argument(),
292  const Abc::Argument &iArg2 = Abc::Argument(),
293  const Abc::Argument &iArg3 = Abc::Argument() )
294  : OGeomBaseSchema<CurvesSchemaInfo>( iParent, iName,
295  iArg0, iArg1, iArg2, iArg3)
296  {
297  // Meta data and error handling are eaten up by
298  // the super type, so all that's left is time sampling.
299  AbcA::TimeSamplingPtr tsPtr =
300  Abc::GetTimeSampling( iArg0, iArg1, iArg2, iArg3 );
301 
302  AbcA::index_t tsIndex =
303  Abc::GetTimeSamplingIndex( iArg0, iArg1, iArg2, iArg3 );
304 
305  if ( tsPtr )
306  {
307  tsIndex = GetCompoundPropertyWriterPtr( iParent )->getObject(
308  )->getArchive()->addTimeSampling( *tsPtr );
309  }
310 
311  init( tsIndex, Abc::IsSparse( iArg0, iArg1, iArg2, iArg3 ) );
312  }
313 
314  OCurvesSchema( const OCurvesSchema& iCopy )
315  : OGeomBaseSchema<CurvesSchemaInfo>()
316  {
317  *this = iCopy;
318  }
319 
320  //! Default assignment operator used.
321 
322  //-*************************************************************************
323  // SCHEMA STUFF
324  //-*************************************************************************
325 
326  //! Return the time sampling type, which is stored on each of the
327  //! sub properties.
329  {
330  if( m_positionsProperty.valid() )
331  {
332  return m_positionsProperty.getTimeSampling();
333  }
334  else
335  {
336  return getObject().getArchive().getTimeSampling( 0 );
337  }
338  }
339 
340  void setTimeSampling( uint32_t iIndex );
341  void setTimeSampling( AbcA::TimeSamplingPtr iTime );
342 
343  //-*************************************************************************
344  // SAMPLE STUFF
345  //-*************************************************************************
346 
347  //! Get number of samples written so far.
348  //! ...
349  size_t getNumSamples() const { return m_numSamples; }
350 
351  //! Set a sample! Sample zero has to have non-degenerate
352  //! positions, indices and counts.
353  void set( const sample_type &iSamp );
354 
355  //! Set from previous sample. Will apply to each of positions,
356  //! indices, and counts.
357  void setFromPrevious();
358 
359  //-*************************************************************************
360  // ABC BASE MECHANISMS
361  // These functions are used by Abc to deal with errors, validity,
362  // and so on.
363  //-*************************************************************************
364 
365  //! Reset returns this function set to an empty, default
366  //! state.
367  void reset()
368  {
369  m_positionsProperty.reset();
370  m_positionWeightsProperty.reset();
371  m_uvsParam.reset();
372  m_normalsParam.reset();
373  m_widthsParam.reset();
374  m_nVerticesProperty.reset();
375  m_ordersProperty.reset();
376  m_knotsProperty.reset();
377 
378  m_basisAndTypeProperty.reset();
379 
381  }
382 
383  //! Valid returns whether this function set is
384  //! valid.
385  bool valid() const
386  {
388  m_positionsProperty.valid() )
389  || m_selectiveExport );
390  }
391 
392  //! unspecified-bool-type operator overload.
393  //! ...
394  ALEMBIC_OVERRIDE_OPERATOR_BOOL( this_type::valid() );
395 
396 private:
397  void init( const AbcA::index_t iTsIdx, bool isSparse );
398 
399  //! Set only some property data. Does not need to be a valid schema sample
400  //! This is to be used when created a file which will be layered in to
401  //! another file.
402  void selectiveSet( const Sample &iSamp );
403 
404  // point data
405  Abc::OP3fArrayProperty m_positionsProperty;
406  Abc::OInt32ArrayProperty m_nVerticesProperty;
407 
408  // Write out only some properties (UVs, normals).
409  // This is to export data to layer into another file later.
410  bool m_selectiveExport;
411 
412  // Number of times OPolyMeshSchema::set() has been called
413  size_t m_numSamples;
414 
415  uint32_t m_timeSamplingIndex;
416 
417  void createPositionProperty();
418  void createVertexProperties();
419  void createVelocityProperty();
420  void createUVsProperty( const Sample &iSamp );
421  void createNormalsProperty( const Sample &iSamp );
422  void createWidthProperty( const Sample &iSamp );
423  void createPositionWeightsProperty();
424  void createOrdersProperty();
425  void createKnotsProperty();
426  void calcBasisAndType(Alembic::Util::uint8_t (&basisAndType)[4], const Sample &iSamp);
427 
428  // optional data
429  OV2fGeomParam m_uvsParam;
430  ON3fGeomParam m_normalsParam;
431  OFloatGeomParam m_widthsParam;
432  Abc::OV3fArrayProperty m_velocitiesProperty;
433  Abc::OFloatArrayProperty m_positionWeightsProperty;
434  Abc::OUcharArrayProperty m_ordersProperty;
435  Abc::OFloatArrayProperty m_knotsProperty;
436 
437  Abc::OScalarProperty m_basisAndTypeProperty;
438 };
439 
440 //-*****************************************************************************
441 // SCHEMA OBJECT
442 //-*****************************************************************************
444 
445 typedef Util::shared_ptr< OCurves > OCurvesPtr;
446 
447 } // End namespace ALEMBIC_VERSION_NS
448 
449 using namespace ALEMBIC_VERSION_NS;
450 
451 } // End namespace AbcGeom
452 } // End namespace Alembic
453 
454 #endif
void setKnots(const Abc::FloatArraySample &iKnots)
Definition: OCurves.h:196
const OV2fGeomParam::Sample & getUVs() const
Definition: OCurves.h:165
Abc::OSchemaObject< OCurvesSchema > OCurves
Definition: OCurves.h:443
GLsizei const GLchar *const * string
Definition: glcorearb.h:814
Util::shared_ptr< OCurves > OCurvesPtr
Definition: OCurves.h:445
void setOrders(const Abc::UcharArraySample &iOrders)
Definition: OCurves.h:191
#define ALEMBIC_EXPORT
Definition: Export.h:51
const Abc::V3fArraySample & getVelocities() const
Definition: OCurves.h:175
void setWidths(const OFloatGeomParam::Sample &iWidths)
Definition: OCurves.h:131
const Abc::Int32ArraySample & getCurvesNumVertices() const
Definition: OCurves.h:161
const ON3fGeomParam::Sample & getNormals() const
Definition: OCurves.h:180
const Abc::P3fArraySample & getPositions() const
Definition: OCurves.h:135
void setVelocities(const Abc::V3fArraySample &iVelocities)
Definition: OCurves.h:176
void setPositionWeights(const Abc::FloatArraySample &iSmp)
Definition: OCurves.h:142
OCurvesSchema(const OCurvesSchema &iCopy)
Definition: OCurves.h:314
Alembic::Util::shared_ptr< TimeSampling > TimeSamplingPtr
Definition: TimeSampling.h:137
GLboolean reset
Definition: glad.h:5138
void setUVs(const OV2fGeomParam::Sample &iUVs)
Definition: OCurves.h:166
const Abc::FloatArraySample & getKnots() const
Definition: OCurves.h:195
void setWrap(const CurvePeriodicity &iWrap)
Definition: OCurves.h:151
#define ALEMBIC_OVERRIDE_OPERATOR_BOOL(PASS_COND)
Definition: OperatorBool.h:56
bool IsSparse(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition: Argument.h:333
AbcA::TimeSamplingPtr GetTimeSampling(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition: Argument.h:288
Box< V3d > Box3d
3D box of base type double.
Definition: ImathBox.h:167
AbcA::TimeSamplingPtr getTimeSampling() const
Default assignment operator used.
Definition: OCurves.h:328
const Abc::FloatArraySample & getPositionWeights() const
Definition: OCurves.h:140
void setCurvesNumVertices(const Abc::Int32ArraySample &iNVertices)
Definition: OCurves.h:159
void setPositions(const Abc::P3fArraySample &iSmp)
Definition: OCurves.h:136
const OFloatGeomParam::Sample & getWidths() const
Definition: OCurves.h:130
void setNormals(const ON3fGeomParam::Sample &iNormals)
Definition: OCurves.h:181
OCurvesSchema(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())
Definition: OCurves.h:288
uint32_t GetTimeSamplingIndex(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition: Argument.h:303
AbcA::CompoundPropertyWriterPtr GetCompoundPropertyWriterPtr(AbcA::CompoundPropertyWriterPtr iPtr)
Definition: Foundation.h:174
const Abc::UcharArraySample & getOrders() const
Definition: OCurves.h:190
Sample(const Abc::P3fArraySample &iPos, const Abc::Int32ArraySample &iNVertices, const CurveType &iType=kCubic, const CurvePeriodicity iWrap=kNonPeriodic, const OFloatGeomParam::Sample &iWidths=OFloatGeomParam::Sample(), const OV2fGeomParam::Sample &iUVs=OV2fGeomParam::Sample(), const ON3fGeomParam::Sample &iNormals=ON3fGeomParam::Sample(), const BasisType &iBasis=kBezierBasis, const Abc::FloatArraySample &iPosWeight=Abc::FloatArraySample(), const Abc::UcharArraySample &iOrders=Abc::UcharArraySample(), const Abc::FloatArraySample &iKnots=Abc::FloatArraySample())
Definition: OCurves.h:103
#define ALEMBIC_VERSION_NS
Definition: Foundation.h:88
Alembic::Util::shared_ptr< CompoundPropertyWriter > CompoundPropertyWriterPtr