void CIrrMeshFileLoader::readMeshBuffer(io::IXMLReader* reader, int vertexCount, SMeshBufferLightMap* sbuffer) { core::stringc data = reader->getNodeData(); const c8* p = &data[0]; if (sbuffer) { video::S3DVertex2TCoords vtx; for (int i=0; i<vertexCount && *p; ++i) { // position findNextNoneWhiteSpace(&p); vtx.Pos.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Z = readFloat(&p); // normal findNextNoneWhiteSpace(&p); vtx.Normal.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Z = readFloat(&p); // color findNextNoneWhiteSpace(&p); sscanf(p, "%08x", &vtx.Color.color); skipCurrentNoneWhiteSpace(&p); // tcoord1 findNextNoneWhiteSpace(&p); vtx.TCoords.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords.Y = readFloat(&p); // tcoord2 findNextNoneWhiteSpace(&p); vtx.TCoords2.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords2.Y = readFloat(&p); sbuffer->Vertices.push_back(vtx); } } }
void CIrrMeshFileLoader::readMeshBuffer(io::IXMLReader* reader, int vertexCount, CDynamicMeshBuffer* sbuffer) { core::stringc data = reader->getNodeData(); const c8* p = &data[0]; scene::IVertexBuffer& Vertices = sbuffer->getVertexBuffer(); video::E_VERTEX_TYPE vType = Vertices.getType(); if (sbuffer) { for (int i=0; i<vertexCount && *p; ++i) { switch(vType) { case video::EVT_STANDARD: { video::S3DVertex vtx; // position findNextNoneWhiteSpace(&p); vtx.Pos.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Z = readFloat(&p); // normal findNextNoneWhiteSpace(&p); vtx.Normal.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Z = readFloat(&p); // color u32 col; findNextNoneWhiteSpace(&p); sscanf(p, "%08x", &col); vtx.Color.set(col); skipCurrentNoneWhiteSpace(&p); // tcoord1 findNextNoneWhiteSpace(&p); vtx.TCoords.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords.Y = readFloat(&p); Vertices.push_back(vtx); } break; case video::EVT_2TCOORDS: { video::S3DVertex2TCoords vtx; // position findNextNoneWhiteSpace(&p); vtx.Pos.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Z = readFloat(&p); // normal findNextNoneWhiteSpace(&p); vtx.Normal.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Z = readFloat(&p); // color u32 col; findNextNoneWhiteSpace(&p); sscanf(p, "%08x", &col); vtx.Color.set(col); skipCurrentNoneWhiteSpace(&p); // tcoord1 findNextNoneWhiteSpace(&p); vtx.TCoords.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords.Y = readFloat(&p); // tcoord2 findNextNoneWhiteSpace(&p); vtx.TCoords2.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords2.Y = readFloat(&p); Vertices.push_back(vtx); } break; case video::EVT_TANGENTS: { video::S3DVertexTangents vtx; // position findNextNoneWhiteSpace(&p); vtx.Pos.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Pos.Z = readFloat(&p); // normal findNextNoneWhiteSpace(&p); vtx.Normal.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Normal.Z = readFloat(&p); // color u32 col; findNextNoneWhiteSpace(&p); sscanf(p, "%08x", &col); vtx.Color.set(col); skipCurrentNoneWhiteSpace(&p); // tcoord1 findNextNoneWhiteSpace(&p); vtx.TCoords.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.TCoords.Y = readFloat(&p); // tangent findNextNoneWhiteSpace(&p); vtx.Tangent.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Tangent.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Tangent.Z = readFloat(&p); // binormal findNextNoneWhiteSpace(&p); vtx.Binormal.X = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Binormal.Y = readFloat(&p); findNextNoneWhiteSpace(&p); vtx.Binormal.Z = readFloat(&p); Vertices.push_back(vtx); } break; }; } } }