Alembic 1.8.11
Loading...
Searching...
No Matches
OCurves.h
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>
41#include <Alembic/AbcGeom/Foundation.h>
42#include <Alembic/AbcGeom/Basis.h>
43#include <Alembic/AbcGeom/CurveType.h>
44#include <Alembic/AbcGeom/SchemaInfoDeclarations.h>
45#include <Alembic/AbcGeom/OGeomParam.h>
46#include <Alembic/AbcGeom/OGeomBase.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
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
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 = \
114 Abc::FloatArraySample(),
115 const Abc::UcharArraySample &iOrders = Abc::UcharArraySample(),
116 const Abc::FloatArraySample &iKnots = Abc::FloatArraySample()
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
140 const Abc::FloatArraySample &getPositionWeights() const
141 { return m_positionWeights; }
142 void setPositionWeights( const Abc::FloatArraySample &iSmp )
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
159 void setCurvesNumVertices( const Abc::Int32ArraySample &iNVertices)
160 { m_nVertices = iNVertices; }
161 const Abc::Int32ArraySample &getCurvesNumVertices() const
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
236 Abc::P3fArraySample m_positions;
237 Abc::V3fArraySample m_velocities;
238 Abc::Int32ArraySample m_nVertices;
239
240 CurveType m_type;
241 CurvePeriodicity m_wrap;
242
243 OFloatGeomParam::Sample m_widths;
244 OV2fGeomParam::Sample m_uvs;
245 ON3fGeomParam::Sample m_normals;
246
247 BasisType m_basis;
248
249 // optional properties
250 Abc::FloatArraySample m_positionWeights;
251 Abc::UcharArraySample m_orders;
252 Abc::FloatArraySample m_knots;
253
254 // bounding box attributes
255 Abc::Box3d m_selfBounds;
256
257 };
258
259 //-*************************************************************************
260 // CURVE SCHEMA
261 //-*************************************************************************
262
263public:
264
268 typedef OCurvesSchema::Sample sample_type;
269
270 //-*************************************************************************
271 // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
272 //-*************************************************************************
273
277 {
278 m_selectiveExport = false;
279 m_numSamples = 0;
280 m_timeSamplingIndex = 0;
281 }
282
283
288 OCurvesSchema( AbcA::CompoundPropertyWriterPtr iParent,
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
315
316 //-*************************************************************************
317 // SCHEMA STUFF
318 //-*************************************************************************
319
322 AbcA::TimeSamplingPtr getTimeSampling() const
323 {
324 if( m_positionsProperty.valid() )
325 {
326 return m_positionsProperty.getTimeSampling();
327 }
328 else
329 {
330 return getObject().getArchive().getTimeSampling( 0 );
331 }
332 }
333
334 void setTimeSampling( uint32_t iIndex );
335 void setTimeSampling( AbcA::TimeSamplingPtr iTime );
336
337 //-*************************************************************************
338 // SAMPLE STUFF
339 //-*************************************************************************
340
343 size_t getNumSamples() const { return m_numSamples; }
344
347 void set( const sample_type &iSamp );
348
351 void setFromPrevious();
352
353 //-*************************************************************************
354 // ABC BASE MECHANISMS
355 // These functions are used by Abc to deal with errors, validity,
356 // and so on.
357 //-*************************************************************************
358
361 void reset()
362 {
363 m_positionsProperty.reset();
364 m_positionWeightsProperty.reset();
365 m_uvsParam.reset();
366 m_normalsParam.reset();
367 m_widthsParam.reset();
368 m_nVerticesProperty.reset();
369 m_ordersProperty.reset();
370 m_knotsProperty.reset();
371
372 m_basisAndTypeProperty.reset();
373
374 OGeomBaseSchema<CurvesSchemaInfo>::reset();
375 }
376
379 bool valid() const
380 {
381 return ( ( OGeomBaseSchema<CurvesSchemaInfo>::valid() &&
382 m_positionsProperty.valid() )
383 || m_selectiveExport );
384 }
385
389
390private:
391 void init( const AbcA::index_t iTsIdx, bool isSparse );
392
396 void selectiveSet( const Sample &iSamp );
397
398 // point data
399 Abc::OP3fArrayProperty m_positionsProperty;
400 Abc::OInt32ArrayProperty m_nVerticesProperty;
401
402 // Write out only some properties (UVs, normals).
403 // This is to export data to layer into another file later.
404 bool m_selectiveExport;
405
406 // Number of times OPolyMeshSchema::set() has been called
407 size_t m_numSamples;
408
409 uint32_t m_timeSamplingIndex;
410
411 void createPositionProperty();
412 void createVertexProperties();
413 void createVelocityProperty();
414 void createUVsProperty( const Sample &iSamp );
415 void createNormalsProperty( const Sample &iSamp );
416 void createWidthProperty( const Sample &iSamp );
417 void createPositionWeightsProperty();
418 void createOrdersProperty();
419 void createKnotsProperty();
420 void calcBasisAndType(Alembic::Util::uint8_t (&basisAndType)[4], const Sample &iSamp);
421
422 // optional data
423 OV2fGeomParam m_uvsParam;
424 ON3fGeomParam m_normalsParam;
425 OFloatGeomParam m_widthsParam;
426 Abc::OV3fArrayProperty m_velocitiesProperty;
427 Abc::OFloatArrayProperty m_positionWeightsProperty;
428 Abc::OUcharArrayProperty m_ordersProperty;
429 Abc::OFloatArrayProperty m_knotsProperty;
430
431 Abc::OScalarProperty m_basisAndTypeProperty;
432};
433
434//-*****************************************************************************
435// SCHEMA OBJECT
436//-*****************************************************************************
438
439typedef Util::shared_ptr< OCurves > OCurvesPtr;
440
441} // End namespace ALEMBIC_VERSION_NS
442
443using namespace ALEMBIC_VERSION_NS;
444
445} // End namespace AbcGeom
446} // End namespace Alembic
447
448#endif
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
void setCurvesNumVertices(const Abc::Int32ArraySample &iNVertices)
Definition OCurves.h:159
Sample(const Abc::P3fArraySample &iPos)
Definition OCurves.h:86
AbcA::TimeSamplingPtr getTimeSampling() const
Default assignment and copy operator used.
Definition OCurves.h:322
OCurvesSchema this_type
Definition OCurves.h:267
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
size_t getNumSamples() const
Definition OCurves.h:343
bool valid() const
Definition OCurves.h:379
Alembic namespace ...
Definition ArchiveInfo.cpp:39