//----------------------------------------------------------------------- VertexDeclaration* HardwareBufferManagerBase::createVertexDeclarationImpl(void) { return OGRE_NEW VertexDeclaration(); }
//разбор вершинного потока 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); }