Coverage Report

Created: 2024-09-08 06:41

/src/alembic/lib/Alembic/AbcGeom/IPoints.h
Line
Count
Source (jump to first uncovered line)
1
//-*****************************************************************************
2
//
3
// Copyright (c) 2009-2012,
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_IPoints_h
38
#define Alembic_AbcGeom_IPoints_h
39
40
#include <Alembic/Util/Export.h>
41
#include <Alembic/AbcGeom/Foundation.h>
42
#include <Alembic/AbcGeom/SchemaInfoDeclarations.h>
43
#include <Alembic/AbcGeom/IGeomParam.h>
44
#include <Alembic/AbcGeom/IGeomBase.h>
45
46
namespace Alembic {
47
namespace AbcGeom {
48
namespace ALEMBIC_VERSION_NS {
49
50
//-*****************************************************************************
51
class ALEMBIC_EXPORT IPointsSchema : public IGeomBaseSchema<PointsSchemaInfo>
52
{
53
public:
54
    class Sample
55
    {
56
    public:
57
        typedef Sample this_type;
58
59
        // Users don't ever create this data directly.
60
0
        Sample() { reset(); }
61
62
0
        Abc::P3fArraySamplePtr getPositions() const { return m_positions; }
63
0
        Abc::UInt64ArraySamplePtr getIds() const { return m_ids; }
64
0
        Abc::V3fArraySamplePtr getVelocities() const { return m_velocities; }
65
66
0
        Abc::Box3d getSelfBounds() const { return m_selfBounds; }
67
68
        bool valid() const
69
0
        {
70
0
            return m_positions && m_ids;
71
0
        }
72
73
        void reset()
74
0
        {
75
0
            m_positions.reset();
76
0
            m_velocities.reset();
77
0
            m_ids.reset();
78
0
            m_selfBounds.makeEmpty();
79
0
        }
80
81
        ALEMBIC_OPERATOR_BOOL( valid() );
82
83
    protected:
84
        friend class IPointsSchema;
85
        Abc::P3fArraySamplePtr m_positions;
86
        Abc::UInt64ArraySamplePtr m_ids;
87
        Abc::V3fArraySamplePtr m_velocities;
88
89
        Abc::Box3d m_selfBounds;
90
    };
91
92
    //-*************************************************************************
93
    // POINTS SCHEMA
94
    //-*************************************************************************
95
public:
96
    //! By convention we always define this_type in AbcGeom classes.
97
    //! Used by unspecified-bool-type conversion below
98
    typedef IPointsSchema this_type;
99
100
    //-*************************************************************************
101
    // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
102
    //-*************************************************************************
103
104
    //! The default constructor creates an empty OPointsSchema
105
    //! ...
106
0
    IPointsSchema() {}
107
108
    //! This constructor creates a new points reader.
109
    //! The first argument is the parent ICompoundProperty, from which the
110
    //! error handler policy for is derived.  The second argument is the name
111
    //! of the ICompoundProperty that contains this schemas properties.  The
112
    //! remaining optional arguments can be used to override the
113
    //! ErrorHandlerPolicy and to specify schema interpretation matching.
114
    IPointsSchema( const ICompoundProperty &iParent,
115
                   const std::string &iName,
116
117
                   const Abc::Argument &iArg0 = Abc::Argument(),
118
                   const Abc::Argument &iArg1 = Abc::Argument() )
119
      : IGeomBaseSchema<PointsSchemaInfo>( iParent, iName, iArg0, iArg1 )
120
0
    {
121
0
        init( iArg0, iArg1 );
122
0
    }
123
124
    //! This constructor wraps an existing ICompoundProperty as the points
125
    //! reader, and the error handler policy is derived from it.
126
    //! The  remaining optional arguments can be used to override the
127
    //! ErrorHandlerPolicy and to specify schema interpretation matching.
128
    IPointsSchema( const ICompoundProperty iProp,
129
                   const Abc::Argument &iArg0 = Abc::Argument(),
130
                   const Abc::Argument &iArg1 = Abc::Argument() )
131
      : IGeomBaseSchema<PointsSchemaInfo>( iProp, iArg0, iArg1 )
132
0
    {
133
0
        init( iArg0, iArg1 );
134
0
    }
135
136
    //! Default assignment and copy operator used.
137
138
    //-*************************************************************************
139
    // SCALAR PROPERTY READER FUNCTIONALITY
140
    //-*************************************************************************
141
142
    //! Return the number of samples contained in the property.
143
    //! This can be any number, including zero.
144
    //! This returns the number of samples that were written, independently
145
    //! of whether or not they were constant.
146
    size_t getNumSamples() const
147
0
    { return std::max( m_positionsProperty.getNumSamples(),
148
0
                       m_idsProperty.getNumSamples() ); }
149
150
    //! Ask if we're constant - no change in value amongst samples,
151
    //! regardless of the time sampling.
152
0
    bool isConstant() const { return m_positionsProperty.isConstant() && m_idsProperty.isConstant(); }
153
154
    //! Time sampling Information.
155
    //!
156
    AbcA::TimeSamplingPtr getTimeSampling() const
157
0
    {
158
0
        if ( m_positionsProperty.valid() )
159
0
        {
160
0
            return m_positionsProperty.getTimeSampling();
161
0
        }
162
0
        return getObject().getArchive().getTimeSampling(0);
163
0
    }
164
165
    //-*************************************************************************
166
    void get( Sample &oSample,
167
              const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const
168
0
    {
169
0
        ALEMBIC_ABC_SAFE_CALL_BEGIN( "IPointsSchema::get()" );
170
0
171
0
        m_positionsProperty.get( oSample.m_positions, iSS );
172
0
        m_idsProperty.get( oSample.m_ids, iSS );
173
0
174
0
        m_selfBoundsProperty.get( oSample.m_selfBounds, iSS );
175
0
176
0
        if ( m_velocitiesProperty && m_velocitiesProperty.getNumSamples() > 0 )
177
0
        { m_velocitiesProperty.get( oSample.m_velocities, iSS ); }
178
0
179
0
        // Could error check here.
180
0
181
0
        ALEMBIC_ABC_SAFE_CALL_END();
182
0
    }
183
184
    Sample getValue( const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const
185
0
    {
186
0
        Sample smp;
187
0
        get( smp, iSS );
188
0
        return smp;
189
0
    }
190
191
    Abc::IP3fArrayProperty getPositionsProperty() const
192
0
    {
193
0
        return m_positionsProperty;
194
0
    }
195
196
    Abc::IV3fArrayProperty getVelocitiesProperty() const
197
0
    {
198
0
        return m_velocitiesProperty;
199
0
    }
200
201
    Abc::IUInt64ArrayProperty getIdsProperty() const
202
0
    {
203
0
        return m_idsProperty;
204
0
    }
205
206
    IFloatGeomParam getWidthsParam() const
207
0
    {
208
0
        return m_widthsParam;
209
0
    }
210
211
    //-*************************************************************************
212
    // ABC BASE MECHANISMS
213
    // These functions are used by Abc to deal with errors, rewrapping,
214
    // and so on.
215
    //-*************************************************************************
216
217
    //! Reset returns this function set to an empty, default
218
    //! state.
219
    void reset()
220
0
    {
221
0
        m_positionsProperty.reset();
222
0
        m_velocitiesProperty.reset();
223
0
        m_idsProperty.reset();
224
0
        m_widthsParam.reset();
225
0
226
0
        IGeomBaseSchema<PointsSchemaInfo>::reset();
227
0
    }
228
229
    //! Valid returns whether this function set is
230
    //! valid.
231
    bool valid() const
232
0
    {
233
0
        return ( IGeomBaseSchema<PointsSchemaInfo>::valid() &&
234
0
                 m_positionsProperty.valid() &&
235
0
                 m_idsProperty.valid() );
236
0
    }
237
238
    //! unspecified-bool-type operator overload.
239
    //! ...
240
    ALEMBIC_OVERRIDE_OPERATOR_BOOL( IPointsSchema::valid() );
241
242
protected:
243
    void init( const Abc::Argument &iArg0,
244
               const Abc::Argument &iArg1 );
245
246
    Abc::IP3fArrayProperty m_positionsProperty;
247
    Abc::IUInt64ArrayProperty m_idsProperty;
248
    Abc::IV3fArrayProperty m_velocitiesProperty;
249
    IFloatGeomParam m_widthsParam;
250
};
251
252
//-*****************************************************************************
253
typedef Abc::ISchemaObject<IPointsSchema> IPoints;
254
255
typedef Util::shared_ptr< IPoints > IPointsPtr;
256
257
} // End namespace ALEMBIC_VERSION_NS
258
259
using namespace ALEMBIC_VERSION_NS;
260
261
} // End namespace AbcGeom
262
} // End namespace Alembic
263
264
#endif