void PrimitiveReader::readGeomParam( const T ¶m, const Alembic::Abc::ISampleSelector &sampleSelector, IECoreScene::Primitive *primitive ) const { typedef typename T::prop_type::sample_ptr_type SamplePtr; typedef typename IGeomParamTraits<T>::DataType DataType; typedef typename T::sample_type GeomParamSample; if( param.getArrayExtent() > 1 ) { IECore::msg( IECore::Msg::Warning, "FromAlembicGeomBaseConverter::convertArbGeomParam", boost::format( "Param \"%s\" has unsupported array extent" ) % param.getHeader().getName() ); return; } SamplePtr sample; Abc::UInt32ArraySamplePtr indices; if( param.isIndexed() ) { GeomParamSample geomParamSample = param.getIndexedValue( sampleSelector ); sample = geomParamSample.getVals(); indices = geomParamSample.getIndices(); } else { sample = param.getExpandedValue( sampleSelector ).getVals(); } typename DataType::Ptr data = new DataType(); data->writable().resize( sample->size() ); std::copy( sample->get(), sample->get() + sample->size(), data->writable().begin() ); ApplyGeometricInterpretation<DataType, T>::apply( data.get() ); PrimitiveVariable pv; pv.interpolation = interpolation( param.getScope() ); pv.data = data; if( param.isIndexed() ) { IntVectorDataPtr indexData = new IntVectorData(); indexData->writable().resize( indices->size() ); std::copy( indices->get(), indices->get() + indices->size(), indexData->writable().begin() ); pv.indices = indexData; } primitive->variables[param.getHeader().getName()] = pv; }