//-----------------------------------------------------------------------
 VertexDeclaration* HardwareBufferManagerBase::createVertexDeclarationImpl(void)
 {
     return OGRE_NEW VertexDeclaration();
 }
示例#2
0
      //разбор вершинного потока
    void ParseVertexStream (Parser::Iterator vs_iter)
    {     
        //чтение идентификатора потока
        
      const char* id = get<const char*> (*vs_iter, "id");

        //определение числа вершин и размера вершины
      
      unsigned int vertices_count = get<unsigned int> (*vs_iter, "vertices_count"),
                   vertex_size    = get<unsigned int> (*vs_iter, "vertex_size");

      VertexFormat vertex_format;

        //разбор вершинного формата

      for_each_child (*vs_iter, "channel", xtl::bind (&XmlMeshLibraryLoader::ParseVertexFormatChannel, this, _1, xtl::ref (vertex_format)));
      
        //создание вершинного потока
      
      VertexStream vs (vertices_count, VertexDeclaration (vertex_format, vertex_size));
      
        //чтение данных
        
      Parser::NamesakeIterator channel_iter = vs_iter->First ("channel");
        
      for (uint32_t i=0, channel_count=vertex_format.AttributesCount (); i<channel_count; i++, ++channel_iter)
      {
        const VertexAttribute& attribute = vertex_format.Attribute (i);

        for (;channel_iter && get<size_t> (*channel_iter, "offset", (size_t)-1) != attribute.offset; ++channel_iter);

        if (!channel_iter)
          return;

        switch (attribute.type)
        {
          case VertexAttributeType_Float2:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<math::vec2f> (vs, attribute.offset), vertices_count);
            break;
          case VertexAttributeType_Float3:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<math::vec3f> (vs, attribute.offset), vertices_count);
            break;                      
          case VertexAttributeType_Float4:
            read (*channel_iter,"#text", MakeVertexAttributeIterator<math::vec4f> (vs, attribute.offset), vertices_count);
            break;
          case VertexAttributeType_Short2:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<math::vec2s> (vs, attribute.offset), vertices_count);
            break;
          case VertexAttributeType_Short3:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<math::vec3s> (vs, attribute.offset), vertices_count);
            break;
          case VertexAttributeType_Short4:
            read (*channel_iter,"#text", MakeVertexAttributeIterator<math::vec4s> (vs, attribute.offset), vertices_count);
            break;
          case VertexAttributeType_UByte4:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<math::vec4ub> (vs, attribute.offset), vertices_count);
            break;          
          case VertexAttributeType_Influence:
            read (*channel_iter, "#text", MakeVertexAttributeIterator<VertexInfluence> (vs, attribute.offset), vertices_count);
            break;          
          default:
            return;
        }
      }

        //регистрация потока

      vertex_streams.insert_pair (id, vs);
    }