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. Sample()60 Sample() { reset(); } 61 getPositions()62 Abc::P3fArraySamplePtr getPositions() const { return m_positions; } getIds()63 Abc::UInt64ArraySamplePtr getIds() const { return m_ids; } getVelocities()64 Abc::V3fArraySamplePtr getVelocities() const { return m_velocities; } 65 getSelfBounds()66 Abc::Box3d getSelfBounds() const { return m_selfBounds; } 67 valid()68 bool valid() const 69 { 70 return m_positions && m_ids; 71 } 72 reset()73 void reset() 74 { 75 m_positions.reset(); 76 m_velocities.reset(); 77 m_ids.reset(); 78 m_selfBounds.makeEmpty(); 79 } 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 //! ... IPointsSchema()106 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 { 121 init( iArg0, iArg1 ); 122 } 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 { 133 init( iArg0, iArg1 ); 134 } 135 136 //! Copy constructor. IPointsSchema(const IPointsSchema & iCopy)137 IPointsSchema(const IPointsSchema& iCopy) 138 : IGeomBaseSchema<PointsSchemaInfo>() 139 { 140 *this = iCopy; 141 } 142 143 //! Default assignment operator used. 144 145 //-************************************************************************* 146 // SCALAR PROPERTY READER FUNCTIONALITY 147 //-************************************************************************* 148 149 //! Return the number of samples contained in the property. 150 //! This can be any number, including zero. 151 //! This returns the number of samples that were written, independently 152 //! of whether or not they were constant. getNumSamples()153 size_t getNumSamples() const 154 { return std::max( m_positionsProperty.getNumSamples(), 155 m_idsProperty.getNumSamples() ); } 156 157 //! Ask if we're constant - no change in value amongst samples, 158 //! regardless of the time sampling. isConstant()159 bool isConstant() const { return m_positionsProperty.isConstant() && m_idsProperty.isConstant(); } 160 161 //! Time sampling Information. 162 //! getTimeSampling()163 AbcA::TimeSamplingPtr getTimeSampling() const 164 { 165 if ( m_positionsProperty.valid() ) 166 { 167 return m_positionsProperty.getTimeSampling(); 168 } 169 return getObject().getArchive().getTimeSampling(0); 170 } 171 172 //-************************************************************************* 173 void get( Sample &oSample, 174 const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const 175 { 176 ALEMBIC_ABC_SAFE_CALL_BEGIN( "IPointsSchema::get()" ); 177 178 m_positionsProperty.get( oSample.m_positions, iSS ); 179 m_idsProperty.get( oSample.m_ids, iSS ); 180 181 m_selfBoundsProperty.get( oSample.m_selfBounds, iSS ); 182 183 if ( m_velocitiesProperty && m_velocitiesProperty.getNumSamples() > 0 ) 184 { m_velocitiesProperty.get( oSample.m_velocities, iSS ); } 185 186 // Could error check here. 187 188 ALEMBIC_ABC_SAFE_CALL_END(); 189 } 190 191 Sample getValue( const Abc::ISampleSelector &iSS = Abc::ISampleSelector() ) const 192 { 193 Sample smp; 194 get( smp, iSS ); 195 return smp; 196 } 197 getPositionsProperty()198 Abc::IP3fArrayProperty getPositionsProperty() const 199 { 200 return m_positionsProperty; 201 } 202 getVelocitiesProperty()203 Abc::IV3fArrayProperty getVelocitiesProperty() const 204 { 205 return m_velocitiesProperty; 206 } 207 getIdsProperty()208 Abc::IUInt64ArrayProperty getIdsProperty() const 209 { 210 return m_idsProperty; 211 } 212 getWidthsParam()213 IFloatGeomParam getWidthsParam() const 214 { 215 return m_widthsParam; 216 } 217 218 //-************************************************************************* 219 // ABC BASE MECHANISMS 220 // These functions are used by Abc to deal with errors, rewrapping, 221 // and so on. 222 //-************************************************************************* 223 224 //! Reset returns this function set to an empty, default 225 //! state. reset()226 void reset() 227 { 228 m_positionsProperty.reset(); 229 m_velocitiesProperty.reset(); 230 m_idsProperty.reset(); 231 m_widthsParam.reset(); 232 233 IGeomBaseSchema<PointsSchemaInfo>::reset(); 234 } 235 236 //! Valid returns whether this function set is 237 //! valid. valid()238 bool valid() const 239 { 240 return ( IGeomBaseSchema<PointsSchemaInfo>::valid() && 241 m_positionsProperty.valid() && 242 m_idsProperty.valid() ); 243 } 244 245 //! unspecified-bool-type operator overload. 246 //! ... 247 ALEMBIC_OVERRIDE_OPERATOR_BOOL( IPointsSchema::valid() ); 248 249 protected: 250 void init( const Abc::Argument &iArg0, 251 const Abc::Argument &iArg1 ); 252 253 Abc::IP3fArrayProperty m_positionsProperty; 254 Abc::IUInt64ArrayProperty m_idsProperty; 255 Abc::IV3fArrayProperty m_velocitiesProperty; 256 IFloatGeomParam m_widthsParam; 257 }; 258 259 //-***************************************************************************** 260 typedef Abc::ISchemaObject<IPointsSchema> IPoints; 261 262 typedef Util::shared_ptr< IPoints > IPointsPtr; 263 264 } // End namespace ALEMBIC_VERSION_NS 265 266 using namespace ALEMBIC_VERSION_NS; 267 268 } // End namespace AbcGeom 269 } // End namespace Alembic 270 271 #endif 272