Alembic Version 1.1
Loading...
Searching...
No Matches
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>
47
48namespace Alembic {
49namespace AbcGeom {
50namespace 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
62class ALEMBIC_EXPORT OCurvesSchema : public OGeomBaseSchema<CurvesSchemaInfo>
63{
64public:
65 //-*************************************************************************
66 // CURVE SCHEMA SAMPLE TYPE
67 //-*************************************************************************
68 class Sample
69 {
70 public:
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
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
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 = \
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; }
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
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
255 Abc::Box3d m_selfBounds;
256
257 };
258
259 //-*************************************************************************
260 // CURVE SCHEMA
261 //-*************************************************************************
262
263public:
264
269
270 //-*************************************************************************
271 // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
272 //-*************************************************************************
273
277 {
278 m_selectiveExport = false;
279 m_numSamples = 0;
280 m_timeSamplingIndex = 0;
281 }
282
283
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.
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
315 : OGeomBaseSchema<CurvesSchemaInfo>()
316 {
317 *this = iCopy;
318 }
319
321
322 //-*************************************************************************
323 // SCHEMA STUFF
324 //-*************************************************************************
325
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 );
342
343 //-*************************************************************************
344 // SAMPLE STUFF
345 //-*************************************************************************
346
349 size_t getNumSamples() const { return m_numSamples; }
350
353 void set( const sample_type &iSamp );
354
358
359 //-*************************************************************************
360 // ABC BASE MECHANISMS
361 // These functions are used by Abc to deal with errors, validity,
362 // and so on.
363 //-*************************************************************************
364
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
385 bool valid() const
386 {
388 m_positionsProperty.valid() )
389 || m_selectiveExport );
390 }
391
394 ALEMBIC_OVERRIDE_OPERATOR_BOOL( this_type::valid() );
395
396private:
397 void init( const AbcA::index_t iTsIdx, bool isSparse );
398
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
445typedef Util::shared_ptr< OCurves > OCurvesPtr;
446
447} // End namespace ALEMBIC_VERSION_NS
448
449using namespace ALEMBIC_VERSION_NS;
450
451} // End namespace AbcGeom
452} // End namespace Alembic
453
454#endif
#define ALEMBIC_EXPORT
Definition Export.h:51
#define ALEMBIC_VERSION_NS
Definition Foundation.h:105
const Abc::Int32ArraySample & getCurvesNumVertices() const
Definition OCurves.h:161
void setUVs(const OV2fGeomParam::Sample &iUVs)
Definition OCurves.h:166
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
const Abc::V3fArraySample & getVelocities() const
Definition OCurves.h:175
void setOrders(const Abc::UcharArraySample &iOrders)
Definition OCurves.h:191
void setWidths(const OFloatGeomParam::Sample &iWidths)
Definition OCurves.h:131
const OFloatGeomParam::Sample & getWidths() const
Definition OCurves.h:130
const ON3fGeomParam::Sample & getNormals() const
Definition OCurves.h:180
const Abc::P3fArraySample & getPositions() const
Definition OCurves.h:135
void setCurvesNumVertices(const Abc::Int32ArraySample &iNVertices)
Definition OCurves.h:159
const OV2fGeomParam::Sample & getUVs() const
Definition OCurves.h:165
void setWrap(const CurvePeriodicity &iWrap)
Definition OCurves.h:151
void setNormals(const ON3fGeomParam::Sample &iNormals)
Definition OCurves.h:181
const Abc::FloatArraySample & getKnots() const
Definition OCurves.h:195
void setPositionWeights(const Abc::FloatArraySample &iSmp)
Definition OCurves.h:142
void setVelocities(const Abc::V3fArraySample &iVelocities)
Definition OCurves.h:176
const Abc::FloatArraySample & getPositionWeights() const
Definition OCurves.h:140
void setPositions(const Abc::P3fArraySample &iSmp)
Definition OCurves.h:136
void setKnots(const Abc::FloatArraySample &iKnots)
Definition OCurves.h:196
AbcA::TimeSamplingPtr getTimeSampling() const
Default assignment operator used.
Definition OCurves.h:328
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
void setTimeSampling(AbcA::TimeSamplingPtr iTime)
Alembic::Util::shared_ptr< CompoundPropertyWriter > CompoundPropertyWriterPtr
Alembic::Util::shared_ptr< TimeSampling > TimeSamplingPtr
Util::shared_ptr< OCurves > OCurvesPtr
Definition OCurves.h:445
AbcA::TimeSamplingPtr GetTimeSampling(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition Argument.h:288
AbcA::CompoundPropertyWriterPtr GetCompoundPropertyWriterPtr(AbcA::CompoundPropertyWriterPtr iPtr)
Definition Foundation.h:174
uint32_t GetTimeSamplingIndex(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition Argument.h:303
bool IsSparse(const Argument &iArg0, const Argument &iArg1=Argument(), const Argument &iArg2=Argument(), const Argument &iArg3=Argument())
Definition Argument.h:333
Alembic namespace ...
Definition ArchiveInfo.h:46