Mesh::Mesh (const VertexFormat &format, boost::weak_ptr<VertexDataBufferManager> weak_mgr, boost::shared_ptr<GLExtensionProxy> proxy, VertexFormat::DataType index_type, bool dynamic_indices) : priv (new Private (proxy, format)) { if (std::find_if (format.begin (), format.end (), vfspec_role_is_pos) == format.end()) throw std::logic_error ("incomplete vertex format passed"); std::vector<VertexFormat::DataMemberSpec> static_format; std::vector<VertexFormat::DataMemberSpec> dynamic_format (format.begin (), format.end ()); std::remove_copy_if (dynamic_format.begin (), dynamic_format.end (), std::back_inserter (static_format), vfspec_suggests_dynamic); dynamic_format.erase (std::remove_if (dynamic_format.begin(), dynamic_format.end(), vfspec_suggests_static), dynamic_format.end ()); priv->static_size = std::accumulate (static_format.begin (), static_format.end (), size_t (0), sum_sizes); priv->dynamic_size = std::accumulate (dynamic_format.begin (), dynamic_format.end (), size_t (0), sum_sizes); boost::shared_ptr<VertexDataBufferManager> mgr = weak_mgr.lock (); if (!mgr) throw std::logic_error ("Invalid manager point"); if (priv->static_size) priv->static_buf = mgr->create_vertex_data_buffer (priv->static_size, false); if (priv->dynamic_size) priv->dynamic_buf = mgr->create_vertex_data_buffer (priv->dynamic_size, true); priv->index_type = index_type; priv->indices = mgr->create_element_data_buffer (index_type, dynamic_indices); }