void ResourceVertexAttributeSet::update()
          {
            /** copy over vertex data **/
            dp::rix::core::Renderer *renderer = m_resourceManager->getRenderer();

            std::vector<dp::rix::core::VertexFormatInfo>  vertexInfos;
            dp::rix::core::VertexDataSharedHandle vertexData = renderer->vertexDataCreate();

            unsigned int numVertices = m_vertexAttributeSet->getVertexAttribute( 0 ).getVertexDataCount();

            std::vector<ResourceBufferSharedPtr> resourceBuffers;

            unsigned int currentStream = 0;

            std::vector<dp::sg::core::BufferSharedPtr> streams;
      
            for ( unsigned int i = 0; i < 16; ++i ) // FIXME Must match MAX_ATTRIBUTES, but that is only defined in inc\RendererAPI\RendererGL.h
            {
              dp::sg::core::VertexAttribute va = m_vertexAttributeSet->getVertexAttribute( i );

              if ( va.getBuffer() && va.getVertexDataCount() == numVertices )
              {
                ResourceBufferSharedPtr resourceBuffer = ResourceBuffer::get(va.getBuffer(), m_resourceManager );
                //resourceVertexAttributeSet->m_resourceBuffers.push_back( resourceBuffer );
                resourceBuffers.push_back( resourceBuffer );
          
                std::vector<dp::sg::core::BufferSharedPtr>::iterator it = std::find( streams.begin(), streams.end(), va.getBuffer() );
                if ( it == streams.end() )
                {
                  currentStream = static_cast<unsigned int>(streams.size());
                  streams.push_back( va.getBuffer() );
                }
                else
                {
                  currentStream = static_cast<unsigned int>(std::distance( streams.begin(), it ));
                }

                vertexInfos.push_back( dp::rix::core::VertexFormatInfo( i, va.getVertexDataType(), va.getVertexDataSize(), false, currentStream, va.getVertexDataOffsetInBytes(), va.getVertexDataStrideInBytes()));

                renderer->vertexDataSet( vertexData, currentStream, resourceBuffer->m_bufferHandle, 0, numVertices );
              }

            }
            dp::rix::core::VertexFormatDescription vertexFormatDescription(vertexInfos.empty() ? nullptr : &vertexInfos[0], vertexInfos.size());
            dp::rix::core::VertexFormatSharedHandle vertexFormat = renderer->vertexFormatCreate( vertexFormatDescription );

            renderer->vertexAttributesSet( m_vertexAttributesHandle, vertexData, vertexFormat );
            // keep a reference to the new resourceBuffers and remove reference to the old ones
            m_resourceBuffers.swap( resourceBuffers );
          }
GeometrySharedHandle generateGeometry( dp::util::generator::SmartGeometryData& meshIn, dp::rix::core::Renderer* m_rix )
{
    unsigned int attrMask = 0;

    for( map<dp::util::generator::AttributeID, dp::util::generator::AttributeData>::iterator it = meshIn->m_attributes.begin(); it != meshIn->m_attributes.end(); ++it )
    {
        attrMask |= it->first;
    }

    map<dp::util::generator::AttributeID, BufferSharedHandle> vbuffers;
    vector<VertexFormatInfo> vfis;

    BufferSharedHandle ibuffer;
    if( !meshIn->m_indices.empty() )
    {
        ibuffer = m_rix->bufferCreate();
        size_t bufferSize = meshIn->m_indices.size() * sizeof(unsigned int);
        m_rix->bufferSetSize( ibuffer, bufferSize );
        m_rix->bufferUpdateData( ibuffer, 0, &meshIn->m_indices[0], bufferSize );
    }

    VertexDataSharedHandle vertexData = m_rix->vertexDataCreate();
    for(unsigned int i = 0; i < NUM_ATTRIBS; i++)
    {
        dp::util::generator::AttributeID curAttr = (dp::util::generator::AttributeID)(1 << i);
        if( attrMask & curAttr )
        {
            vbuffers[curAttr] = m_rix->bufferCreate();
            m_rix->bufferSetSize( vbuffers[curAttr], meshIn->m_attributes[curAttr].m_data.size() * sizeof(float) );
            m_rix->bufferUpdateData( vbuffers[curAttr], 0, &meshIn->m_attributes[curAttr].m_data[0], meshIn->m_attributes[curAttr].m_data.size() * sizeof(float) );

            dp::util::Uint8 streamId = dp::util::checked_cast<dp::util::Uint8>( vfis.size() );

            vfis.push_back( VertexFormatInfo( i, dp::util::DT_FLOAT_32, meshIn->m_attributes[curAttr].m_dimensionality, false,
                                              streamId, 0, meshIn->m_attributes[curAttr].m_dimensionality * sizeof(float)) );

            m_rix->vertexDataSet( vertexData, streamId, vbuffers[curAttr], 0, meshIn->m_attributes[curAttr].m_data.size() / meshIn->m_attributes[curAttr].m_dimensionality );
        }
    }

    VertexFormatDescription vertexFormatDescription( &vfis[0], vfis.size() );
    VertexFormatSharedHandle vertexFormat = m_rix->vertexFormatCreate( vertexFormatDescription );

    VertexAttributesSharedHandle vertexAttributes = m_rix->vertexAttributesCreate();
    m_rix->vertexAttributesSet( vertexAttributes, vertexData, vertexFormat );

    IndicesSharedHandle indices = 0;
    if( !meshIn->m_indices.empty() )
    {
        indices = m_rix->indicesCreate();
        m_rix->indicesSetData( indices, dp::util::DT_UNSIGNED_INT_32, ibuffer, 0, meshIn->m_indices.size() );
    }

    GeometryDescriptionSharedHandle geometryDescription = m_rix->geometryDescriptionCreate();
    m_rix->geometryDescriptionSet( geometryDescription, meshIn->m_gpt );

    GeometrySharedHandle geometry = m_rix->geometryCreate();
    m_rix->geometrySetData( geometry, geometryDescription, vertexAttributes, indices );

    return geometry;

}