Exemplo n.º 1
0
void PrimitiveReader::readGeomParam( const T &param, 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;
}