- Array<iqmSt_t> iqmSt(header.num_vertexes);
- PointerInputStream stStream(buffer + ofs_st);
- for(Array<iqmSt_t>::iterator i = iqmSt.begin(); i != iqmSt.end(); ++i)
- {
- istream_read_iqmSt(stStream, *i);
- }
-
- PointerInputStream triangleStream(buffer + header.ofs_triangles);
- for(int i = 0; i < header.num_triangles; ++i)
- {
- iqmTriangle_t triangle;
- istream_read_iqmTriangle(triangleStream, triangle);
- for (int j = 0; j < 3; j++)
- surface.indices().insert(inserter.insert(IQMVertex_construct(
- &iqmPos[triangle.indices[j]],
- &iqmNorm[triangle.indices[j]],
- &iqmSt[triangle.indices[j]])));
+ UniqueVertexBuffer<ArbitraryMeshVertex> inserter(surface.vertices());
+ inserter.reserve(header.num_vertexes);
+
+ int ofs_position = -1, ofs_st = -1, ofs_normal = -1;
+ PointerInputStream vaStream(buffer + header.ofs_vertexarrays);
+ for (unsigned int i = 0; i < header.num_vertexarrays; i++) {
+ iqmvertexarray_t va;
+ istream_read_iqmVertexarray(vaStream, va);
+
+ switch (va.type) {
+ case IQM_POSITION:
+ if (va.format == IQM_FLOAT && va.size == 3) {
+ ofs_position = va.offset;
+ }
+ break;
+ case IQM_TEXCOORD:
+ if (va.format == IQM_FLOAT && va.size == 2) {
+ ofs_st = va.offset;
+ }
+ break;
+ case IQM_NORMAL:
+ if (va.format == IQM_FLOAT && va.size == 3) {
+ ofs_normal = va.offset;
+ }
+ break;
+ }
+ }
+
+ surface.indices().reserve(header.num_vertexes);
+
+ PointerInputStream posStream(buffer + ofs_position);
+ Array<iqmPos_t> iqmPos(header.num_vertexes);
+ for (Array<iqmPos_t>::iterator i = iqmPos.begin(); i != iqmPos.end(); ++i) {
+ istream_read_iqmPos(posStream, *i);
+ }
+
+ PointerInputStream normStream(buffer + ofs_normal);
+ Array<iqmPos_t> iqmNorm(header.num_vertexes);
+ for (Array<iqmPos_t>::iterator i = iqmNorm.begin(); i != iqmNorm.end(); ++i) {
+ istream_read_iqmPos(normStream, *i);
+ }
+
+ Array<iqmSt_t> iqmSt(header.num_vertexes);
+ PointerInputStream stStream(buffer + ofs_st);
+ for (Array<iqmSt_t>::iterator i = iqmSt.begin(); i != iqmSt.end(); ++i) {
+ istream_read_iqmSt(stStream, *i);
+ }
+
+ PointerInputStream triangleStream(buffer + header.ofs_triangles);
+ for (unsigned int i = 0; i < header.num_triangles; ++i) {
+ iqmTriangle_t triangle;
+ istream_read_iqmTriangle(triangleStream, triangle);
+ for (int j = 0; j < 3; j++) {
+ surface.indices().insert(inserter.insert(IQMVertex_construct(
+ &iqmPos[triangle.indices[j]],
+ &iqmNorm[triangle.indices[j]],
+ &iqmSt[triangle.indices[j]])));
+ }
+ }