Пример #1
0
      //разбор меша
    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);
    }