//разбор меша void ParseMesh (Parser::Iterator mesh_iter) { static const char* METHOD_NAME = "media::geometry::XmlMeshLibraryLoader::ParseMesh"; //чтение имён: меша, индексного буфера (если есть) const char *id = get<const char*> (*mesh_iter, "id"), *name = get<const char*> (*mesh_iter, "name", id), *ib_id = ""; try_read (*mesh_iter, "index_buffer", ib_id); //создание меша Mesh mesh; mesh.Rename (name); //поиск вершинных буферов for (Parser::AttributeIterator vb_iter=make_attribute_iterator (*mesh_iter, "vertex_buffers.#text"); vb_iter; ++vb_iter) { VertexBufferMap::iterator iter = vertex_buffers.find (*vb_iter); if (iter == vertex_buffers.end ()) throw xtl::make_argument_exception (METHOD_NAME, "vertex_buffers[i]", *vb_iter, "Vertex buffer not found"); mesh.Attach (iter->second); } //поиск индексного буфера IndexBuffer* ib = 0; if (*ib_id) { IndexBufferMap::iterator ib_iter = index_buffers.find (ib_id); if (ib_iter == index_buffers.end ()) throw xtl::make_argument_exception (METHOD_NAME, "index_buffer", ib_id, "Index buffer not found"); ib = &ib_iter->second; } if (ib) mesh.Attach (*ib); //чтение примитивов for_each_child (*mesh_iter, "primitives.primitive", xtl::bind (&XmlMeshLibraryLoader::ParsePrimitive, this, _1, xtl::ref (mesh))); //присоединение меша к модели library.Attach (id, mesh); }