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 #ifndef Alembic_Abc_OTypedArrayProperty_h
37 #define Alembic_Abc_OTypedArrayProperty_h
38 
39 #include <Alembic/Abc/Foundation.h>
40 #include <Alembic/Abc/OArrayProperty.h>
41 #include <Alembic/Abc/TypedPropertyTraits.h>
42 #include <Alembic/Abc/TypedArraySample.h>
43 
44 namespace Alembic {
45 namespace Abc {
46 namespace ALEMBIC_VERSION_NS {
47 
48 //-*****************************************************************************
49 template <class TRAITS>
50 class OTypedArrayProperty : public OArrayProperty
51 {
52 public:
53     //-*************************************************************************
54     // TYPEDEFS AND IDENTIFIERS
55     //-*************************************************************************
56     typedef TRAITS traits_type;
57     typedef OTypedArrayProperty<TRAITS> this_type;
58     typedef typename TRAITS::value_type value_type;
59     typedef TypedArraySample<TRAITS> sample_type;
60 
61     //! Return the interpretation expected of this
62     //! property. An empty interpretation matches everything
getInterpretation()63     static const char * getInterpretation()
64     {
65         return TRAITS::interpretation();
66     }
67 
68     //! This will check whether or not a given entity (as represented by
69     //! a metadata) strictly matches the interpretation of this
70     //! typed property
71     static bool matches( const AbcA::MetaData &iMetaData,
72                          SchemaInterpMatching iMatching = kStrictMatching )
73     {
74         return ( iMetaData.get( "interpretation" ) ==
75                  getInterpretation() );
76     }
77 
78     //! This will check whether or not a given object (as represented by
79     //! an property header) strictly matches the interpretation of this
80     //! typed property, as well as the data type.
81     static bool matches( const AbcA::PropertyHeader &iHeader,
82                          SchemaInterpMatching iMatching = kStrictMatching )
83     {
84         return ( iHeader.getDataType().getPod() ==
85                  TRAITS::dataType().getPod() &&
86                  ( iHeader.getDataType().getExtent() ==
87                    TRAITS::dataType().getExtent() ||
88                    std::string() == getInterpretation() ) ) &&
89                iHeader.isArray() &&
90                matches( iHeader.getMetaData(), iMatching );
91     }
92 
93     //-*************************************************************************
94     // CONSTRUCTION, DESTRUCTION, ASSIGNMENT
95     //-*************************************************************************
96 
97     //! Create a default (empty) TypedArrayProperty
98     //! ...
OTypedArrayProperty()99     OTypedArrayProperty() {}
100 
101 
102     //! Create a new TypedArrayProperty
103     //! as a child of the passed iParent
104     //! Arguments can specify metadata, timesampling, and error handling.
105     OTypedArrayProperty(
106         AbcA::CompoundPropertyWriterPtr iParent,
107         const std::string &iName,
108 
109         const Argument &iArg0 = Argument(),
110         const Argument &iArg1 = Argument(),
111         const Argument &iArg2 = Argument(),
112         const Argument &iArg3 = Argument() )
113     {
114         init( iParent, iName, iArg0, iArg1, iArg2, iArg3 );
115     }
116 
117     //! Create a new TypedArrayProperty
118     //! as a child of the passed iParent
119     //! Arguments can specify metadata, timesampling, and error handling.
120     OTypedArrayProperty(
121         OCompoundProperty iParent,
122         const std::string &iName,
123 
124         const Argument &iArg0 = Argument(),
125         const Argument &iArg1 = Argument(),
126         const Argument &iArg2 = Argument() )
127     {
128         init( iParent.getPtr(), iName, GetErrorHandlerPolicy( iParent ),
129               iArg0, iArg1, iArg2 );
130     }
131 
132     //! Wrap an existing property. This will check to make sure
133     //! it can wrap.
134     OTypedArrayProperty(
135         AbcA::ArrayPropertyWriterPtr iProp,
136         const Argument &iArg0 = Argument(),
137         const Argument &iArg1 = Argument() )
OArrayProperty(iProp,GetErrorHandlerPolicy (iProp,iArg0,iArg1))138     : OArrayProperty( iProp,
139                       GetErrorHandlerPolicy( iProp, iArg0, iArg1 ) )
140     {
141         init( iProp, iArg0, iArg1 );
142     }
143 
144 
145     // Deprecated in favor of constructor above
146     OTypedArrayProperty(
147         AbcA::ArrayPropertyWriterPtr iProp,
148         WrapExistingFlag iWrapFlag,
149         const Argument &iArg0 = Argument(),
150         const Argument &iArg1 = Argument() )
OArrayProperty(iProp,GetErrorHandlerPolicy (iProp,iArg0,iArg1))151     : OArrayProperty( iProp,
152                       GetErrorHandlerPolicy( iProp, iArg0, iArg1 ) )
153     {
154         init( iProp, iArg0, iArg1 );
155     }
156 
157     //-*************************************************************************
158     // ARRAY PROPERTY FEATURES
159     //-*************************************************************************
160 
161     //! Set a sample using a reference to a typed array sample-type,
162     //! instead of a void* ArraySample
set(const sample_type & iVal)163     void set( const sample_type &iVal )
164     {
165         OArrayProperty::set( iVal );
166     }
167 
168 private:
169 
init(AbcA::CompoundPropertyWriterPtr iParent,const std::string & iName,const Argument & iArg0,const Argument & iArg1,const Argument & iArg2,const Argument & iArg3)170     void init( AbcA::CompoundPropertyWriterPtr iParent,
171                const std::string &iName,
172 
173                const Argument &iArg0,
174                const Argument &iArg1,
175                const Argument &iArg2,
176                const Argument &iArg3 )
177     {
178         Arguments args;
179         iArg0.setInto( args );
180         iArg1.setInto( args );
181         iArg2.setInto( args );
182         iArg3.setInto( args );
183 
184         getErrorHandler().setPolicy( args.getErrorHandlerPolicy() );
185 
186         ALEMBIC_ABC_SAFE_CALL_BEGIN( "OTypedArrayProperty::init()" );
187 
188         // Get actual writer for parent.
189         ABCA_ASSERT( iParent, "NULL CompoundPropertyWriterPtr" );
190 
191         // Put interpretation into metadata.
192         AbcA::MetaData mdata = args.getMetaData();
193         if ( std::string() != getInterpretation() )
194         {
195             mdata.set( "interpretation", getInterpretation() );
196         }
197 
198         // Create property.
199         AbcA::TimeSamplingPtr tsPtr = args.getTimeSampling();
200         uint32_t tsIndex = args.getTimeSamplingIndex();
201 
202         // if we specified a valid TimeSamplingPtr, use it to determine the
203         // index otherwise we'll use the index, which defaults to the intrinsic
204         // 0 index
205         if (tsPtr)
206         {
207             tsIndex = iParent->getObject()->getArchive()->addTimeSampling(
208                 *tsPtr);
209         }
210 
211         m_property = iParent->createArrayProperty( iName, mdata,
212             TRAITS::dataType(), tsIndex );
213 
214         ALEMBIC_ABC_SAFE_CALL_END_RESET();
215     }
216 
init(AbcA::ArrayPropertyWriterPtr iProp,const Argument & iArg0,const Argument & iArg1)217     void init( AbcA::ArrayPropertyWriterPtr iProp,
218                const Argument &iArg0, const Argument &iArg1 )
219     {
220         ALEMBIC_ABC_SAFE_CALL_BEGIN(
221             "OTypedArrayProperty::init( ArrayPtr )" );
222 
223         const AbcA::PropertyHeader &pheader = iProp->getHeader();
224 
225         ABCA_ASSERT( matches( pheader, GetSchemaInterpMatching( iArg0,iArg1 ) ),
226                      "Incorrect match of header datatype: "
227                      << pheader.getDataType()
228                      << " to expected: "
229                      << TRAITS::dataType()
230                      << ",\n...or incorrect match of interpretation: "
231                      << pheader.getMetaData().get( "interpretation" )
232                      << " to expected: "
233                      << TRAITS::interpretation() );
234 
235         ALEMBIC_ABC_SAFE_CALL_END_RESET();
236     }
237 };
238 
239 //-*****************************************************************************
240 //-*****************************************************************************
241 //-*****************************************************************************
242 
243 typedef OTypedArrayProperty<BooleanTPTraits>         OBoolArrayProperty;
244 typedef OTypedArrayProperty<Uint8TPTraits>           OUcharArrayProperty;
245 typedef OTypedArrayProperty<Int8TPTraits>            OCharArrayProperty;
246 typedef OTypedArrayProperty<Uint16TPTraits>          OUInt16ArrayProperty;
247 typedef OTypedArrayProperty<Int16TPTraits>           OInt16ArrayProperty;
248 typedef OTypedArrayProperty<Uint32TPTraits>          OUInt32ArrayProperty;
249 typedef OTypedArrayProperty<Int32TPTraits>           OInt32ArrayProperty;
250 typedef OTypedArrayProperty<Uint64TPTraits>          OUInt64ArrayProperty;
251 typedef OTypedArrayProperty<Int64TPTraits>           OInt64ArrayProperty;
252 typedef OTypedArrayProperty<Float16TPTraits>         OHalfArrayProperty;
253 typedef OTypedArrayProperty<Float32TPTraits>         OFloatArrayProperty;
254 typedef OTypedArrayProperty<Float64TPTraits>         ODoubleArrayProperty;
255 typedef OTypedArrayProperty<StringTPTraits>          OStringArrayProperty;
256 typedef OTypedArrayProperty<WstringTPTraits>         OWstringArrayProperty;
257 
258 typedef OTypedArrayProperty<V2sTPTraits>             OV2sArrayProperty;
259 typedef OTypedArrayProperty<V2iTPTraits>             OV2iArrayProperty;
260 typedef OTypedArrayProperty<V2fTPTraits>             OV2fArrayProperty;
261 typedef OTypedArrayProperty<V2dTPTraits>             OV2dArrayProperty;
262 
263 typedef OTypedArrayProperty<V3sTPTraits>             OV3sArrayProperty;
264 typedef OTypedArrayProperty<V3iTPTraits>             OV3iArrayProperty;
265 typedef OTypedArrayProperty<V3fTPTraits>             OV3fArrayProperty;
266 typedef OTypedArrayProperty<V3dTPTraits>             OV3dArrayProperty;
267 
268 typedef OTypedArrayProperty<P2sTPTraits>             OP2sArrayProperty;
269 typedef OTypedArrayProperty<P2iTPTraits>             OP2iArrayProperty;
270 typedef OTypedArrayProperty<P2fTPTraits>             OP2fArrayProperty;
271 typedef OTypedArrayProperty<P2dTPTraits>             OP2dArrayProperty;
272 
273 typedef OTypedArrayProperty<P3sTPTraits>             OP3sArrayProperty;
274 typedef OTypedArrayProperty<P3iTPTraits>             OP3iArrayProperty;
275 typedef OTypedArrayProperty<P3fTPTraits>             OP3fArrayProperty;
276 typedef OTypedArrayProperty<P3dTPTraits>             OP3dArrayProperty;
277 
278 typedef OTypedArrayProperty<Box2sTPTraits>           OBox2sArrayProperty;
279 typedef OTypedArrayProperty<Box2iTPTraits>           OBox2iArrayProperty;
280 typedef OTypedArrayProperty<Box2fTPTraits>           OBox2fArrayProperty;
281 typedef OTypedArrayProperty<Box2dTPTraits>           OBox2dArrayProperty;
282 
283 typedef OTypedArrayProperty<Box3sTPTraits>           OBox3sArrayProperty;
284 typedef OTypedArrayProperty<Box3iTPTraits>           OBox3iArrayProperty;
285 typedef OTypedArrayProperty<Box3fTPTraits>           OBox3fArrayProperty;
286 typedef OTypedArrayProperty<Box3dTPTraits>           OBox3dArrayProperty;
287 
288 typedef OTypedArrayProperty<M33fTPTraits>            OM33fArrayProperty;
289 typedef OTypedArrayProperty<M33dTPTraits>            OM33dArrayProperty;
290 typedef OTypedArrayProperty<M44fTPTraits>            OM44fArrayProperty;
291 typedef OTypedArrayProperty<M44dTPTraits>            OM44dArrayProperty;
292 
293 typedef OTypedArrayProperty<QuatfTPTraits>           OQuatfArrayProperty;
294 typedef OTypedArrayProperty<QuatdTPTraits>           OQuatdArrayProperty;
295 
296 typedef OTypedArrayProperty<C3hTPTraits>             OC3hArrayProperty;
297 typedef OTypedArrayProperty<C3fTPTraits>             OC3fArrayProperty;
298 typedef OTypedArrayProperty<C3cTPTraits>             OC3cArrayProperty;
299 
300 typedef OTypedArrayProperty<C4hTPTraits>             OC4hArrayProperty;
301 typedef OTypedArrayProperty<C4fTPTraits>             OC4fArrayProperty;
302 typedef OTypedArrayProperty<C4cTPTraits>             OC4cArrayProperty;
303 
304 typedef OTypedArrayProperty<N2fTPTraits>             ON2fArrayProperty;
305 typedef OTypedArrayProperty<N2dTPTraits>             ON2dArrayProperty;
306 
307 typedef OTypedArrayProperty<N3fTPTraits>             ON3fArrayProperty;
308 typedef OTypedArrayProperty<N3dTPTraits>             ON3dArrayProperty;
309 
310 } // End namespace ALEMBIC_VERSION_NS
311 
312 using namespace ALEMBIC_VERSION_NS;
313 
314 } // End namespace Abc
315 } // End namespace Alembic
316 
317 #endif
318