static void READ_VERTEX(float3& v, const std::vector<unsigned char>& fileBuf, int& curOffset) { unsigned int __tmp; unsigned short __isize = sizeof(unsigned int); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); v.x = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); v.y = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); v.z = (int)swabDWord(__tmp); }
void CSM3ReadMap::LoadFeatureData() { // returns MapFeatureInfo[GetNumFeatures()] std::string fd = GetMapDefParser().SGetValueDef(std::string(),"map\\featuredata"); if (!fd.empty()) { CFileHandler fh(fd); if (!fh.FileExists()) throw content_error("Failed to open feature data file: " + fd); unsigned char version; fh.Read(&version, 1); if (version > 0) throw content_error("Map feature data has incorrect version, you are probably using an outdated spring version."); unsigned int nf; fh.Read(&nf, 4); numFeatures = swabDWord(nf); featureInfo = new MapFeatureInfo[numFeatures]; for (unsigned int a=0;a<numFeatures;a++) { MapFeatureInfo& fi = featureInfo[a]; fh.Read(&fi.featureType, 4); fh.Read(&fi.pos, 12); fh.Read(&fi.rotation, 4); fi.featureType = swabDWord(fi.featureType); fi.pos.x = swabFloat(fi.pos.x); fi.pos.y = swabFloat(fi.pos.y); fi.pos.z = swabFloat(fi.pos.z); fi.rotation = swabFloat(fi.rotation); } }/* //testing features... else { featureTypes.push_back(new std::string("TreeType0")); numFeatures = 1000; featureInfo = new MapFeatureInfo[numFeatures]; for (int a=0;a<numFeatures;a++) { MapFeatureInfo& fi = featureInfo[a]; fi.featureType = featureTypes.size()-1; fi.pos.x = gs->randFloat() * mapDims.mapx * SQUARE_SIZE; fi.pos.z = gs->randFloat() * mapDims.mapy * SQUARE_SIZE; fi.rotation = 0.0f; } }*/ }
/** @brief Write the TeamStatistics at the current position in the file. */ void CDemoRecorder::WriteTeamStats() { if (fileHeader.numTeams == 0) return; int pos = demoStream.tellp(); // Write array of dwords indicating number of TeamStatistics per team. for (std::vector< std::vector< TeamStatistics > >::iterator it = teamStats.begin(); it != teamStats.end(); ++it) { unsigned int c = swabDWord(it->size()); demoStream.write((char*)&c, sizeof(unsigned int)); } // Write big array of TeamStatistics. for (std::vector< std::vector< TeamStatistics > >::iterator it = teamStats.begin(); it != teamStats.end(); ++it) { for (std::vector< TeamStatistics >::iterator it2 = it->begin(); it2 != it->end(); ++it2) { TeamStatistics& stats = *it2; stats.swab(); demoStream.write(reinterpret_cast<char*>(&stats), sizeof(TeamStatistics)); } } teamStats.clear(); fileHeader.teamStatSize = (int)demoStream.tellp() - pos; }
static void READ_PRIMITIVE(C3DOParser::_Primitive& p, const std::vector<unsigned char>& fileBuf, int& curOffset) { unsigned int __tmp; unsigned short __isize = sizeof(unsigned int); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.PaletteEntry = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.NumberOfVertexIndexes = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.Always_0 = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.OffsetToVertexIndexArray = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.OffsetToTextureName = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.Unknown_1 = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.Unknown_2 = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); p.Unknown_3 = (int)swabDWord(__tmp); }
/** @brief Write the TeamStatistics at the current position in the file. */ void CDemoRecorder::WriteTeamStats() { int pos = demoStream.tellp(); // Write array of dwords indicating number of TeamStatistics per team. for (std::vector<TeamStatistics>& history: teamStats) { unsigned int c = swabDWord(history.size()); demoStream.write((char*)&c, sizeof(unsigned int)); } // Write big array of TeamStatistics. for (std::vector<TeamStatistics>& history: teamStats) { for (TeamStatistics& stats: history) { stats.swab(); demoStream.write(reinterpret_cast<char*>(&stats), sizeof(TeamStatistics)); } } fileHeader.numTeams = teamStats.size(); fileHeader.teamStatSize = (int)demoStream.tellp() - pos; teamStats.clear(); }
static void READ_3DOBJECT(C3DOParser::_3DObject& o, const std::vector<unsigned char>& fileBuf, int& curOffset) { unsigned int __tmp; unsigned short __isize = sizeof(unsigned int); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.VersionSignature = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.NumberOfVertices = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.NumberOfPrimitives = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.SelectionPrimitive = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.XFromParent = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.YFromParent = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.ZFromParent = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.OffsetToObjectName = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.Always_0 = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.OffsetToVertexArray = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.OffsetToPrimitiveArray = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.OffsetToSiblingObject = (int)swabDWord(__tmp); STREAM_READ(&__tmp,__isize, fileBuf, curOffset); o.OffsetToChildObject = (int)swabDWord(__tmp); }
/// read an int from file (endian aware) static int ReadInt(CFileHandler& file) { unsigned int __tmpdw = 0; file.Read(&__tmpdw,sizeof(unsigned int)); return (int)swabDWord(__tmpdw); }
SS3OPiece* CS3OParser::LoadPiece(S3DModel* model, SS3OPiece* parent, unsigned char* buf, int offset) { model->numPieces++; Piece* fp = (Piece*)&buf[offset]; fp->swap(); // Does it matter we mess with the original buffer here? Don't hope so. SS3OPiece* piece = new SS3OPiece(); piece->type = MODELTYPE_S3O; piece->mins = DEF_MIN_SIZE; piece->maxs = DEF_MAX_SIZE; piece->offset.x = fp->xoffset; piece->offset.y = fp->yoffset; piece->offset.z = fp->zoffset; piece->primitiveType = fp->primitiveType; piece->name = (char*) &buf[fp->name]; piece->parent = parent; piece->vertices.reserve(fp->numVertices); piece->vertexDrawOrder.reserve((size_t)(fp->vertexTableSize * 1.1f)); //1.1f is just a guess (check below) // retrieve each vertex int vertexOffset = fp->vertices; for (int a = 0; a < fp->numVertices; ++a) { Vertex* v = reinterpret_cast<Vertex*>(&buf[vertexOffset]); v->swap(); SS3OVertex* sv = reinterpret_cast<SS3OVertex*>(&buf[vertexOffset]); sv->normal.SafeANormalize(); piece->vertices.push_back(*sv); vertexOffset += sizeof(Vertex); } // retrieve the draw order for the vertices int vertexTableOffset = fp->vertexTable; for (int a = 0; a < fp->vertexTableSize; ++a) { const int vertexDrawIdx = swabDWord(*(int*) &buf[vertexTableOffset]); piece->vertexDrawOrder.push_back(vertexDrawIdx); vertexTableOffset += sizeof(int); } piece->isEmpty = piece->vertexDrawOrder.empty(); piece->goffset = piece->offset + ((parent != NULL)? parent->goffset: ZeroVector); piece->SetVertexTangents(); piece->SetMinMaxExtends(); model->mins.x = std::min(piece->mins.x, model->mins.x); model->mins.y = std::min(piece->mins.y, model->mins.y); model->mins.z = std::min(piece->mins.z, model->mins.z); model->maxs.x = std::max(piece->maxs.x, model->maxs.x); model->maxs.y = std::max(piece->maxs.y, model->maxs.y); model->maxs.z = std::max(piece->maxs.z, model->maxs.z); const float3 cvScales = piece->maxs - piece->mins; const float3 cvOffset = (piece->maxs - piece->goffset) + (piece->mins - piece->goffset); piece->SetCollisionVolume(new CollisionVolume("box", cvScales, cvOffset * 0.5f, CollisionVolume::COLVOL_HITTEST_CONT)); int childTableOffset = fp->childs; for (int a = 0; a < fp->numChilds; ++a) { int childOffset = swabDWord(*(int*) &buf[childTableOffset]); SS3OPiece* childPiece = LoadPiece(model, piece, buf, childOffset); piece->childs.push_back(childPiece); childTableOffset += sizeof(int); } return piece; }
SS3OPiece* CS3OParser::LoadPiece(S3DModel* model, SS3OPiece* parent, unsigned char* buf, int offset) { model->numPieces++; // retrieve piece data Piece* fp = (Piece*)&buf[offset]; fp->swap(); // Does it matter we mess with the original buffer here? Don't hope so. Vertex* vertexList = reinterpret_cast<Vertex*>(&buf[fp->vertices]); int* indexList = reinterpret_cast<int*>(&buf[fp->vertexTable]); int* childList = reinterpret_cast<int*>(&buf[fp->children]); // create piece SS3OPiece* piece = new SS3OPiece(); piece->offset.x = fp->xoffset; piece->offset.y = fp->yoffset; piece->offset.z = fp->zoffset; piece->primType = fp->primitiveType; piece->name = (char*) &buf[fp->name]; piece->parent = parent; // retrieve vertices piece->SetVertexCount(fp->numVertices); for (int a = 0; a < fp->numVertices; ++a) { Vertex* v = (vertexList++); v->swap(); SS3OVertex sv; sv.pos = float3(v->xpos, v->ypos, v->zpos); sv.normal = float3(v->xnormal, v->ynormal, v->znormal).SafeANormalize(); sv.texCoords[0] = float2(v->texu, v->texv); sv.texCoords[1] = float2(v->texu, v->texv); piece->SetVertex(a, sv); } // retrieve draw indices piece->SetIndexCount(fp->vertexTableSize); for (int a = 0; a < fp->vertexTableSize; ++a) { const int vertexDrawIdx = swabDWord(*(indexList++)); piece->SetIndex(a, vertexDrawIdx); } // post process the piece { piece->goffset = piece->offset + ((parent != NULL)? parent->goffset: ZeroVector); piece->Trianglize(); piece->SetVertexTangents(); piece->SetMinMaxExtends(); model->mins = float3::min(piece->goffset + piece->mins, model->mins); model->maxs = float3::max(piece->goffset + piece->maxs, model->maxs); piece->SetCollisionVolume(CollisionVolume("box", piece->maxs - piece->mins, (piece->maxs + piece->mins) * 0.5f)); } // load children pieces piece->children.reserve(fp->numchildren); for (int a = 0; a < fp->numchildren; ++a) { int childOffset = swabDWord(*(childList++)); SS3OPiece* childPiece = LoadPiece(model, piece, buf, childOffset); piece->children.push_back(childPiece); } return piece; }
SS3OPiece* CS3OParser::LoadPiece(S3DModel* model, SS3OPiece* parent, unsigned char* buf, int offset) { model->numPieces++; Piece* fp = (Piece*)&buf[offset]; fp->swap(); // Does it matter we mess with the original buffer here? Don't hope so. SS3OPiece* piece = new SS3OPiece(); piece->offset.x = fp->xoffset; piece->offset.y = fp->yoffset; piece->offset.z = fp->zoffset; piece->primType = fp->primitiveType; piece->name = (char*) &buf[fp->name]; piece->parent = parent; if (parent != NULL) { piece->parentName = parent->name; } piece->SetVertexCount(fp->numVertices); piece->SetVertexDrawIndexCount(fp->vertexTableSize); // retrieve each vertex int vertexOffset = fp->vertices; for (int a = 0; a < fp->numVertices; ++a) { Vertex* v = reinterpret_cast<Vertex*>(&buf[vertexOffset]); v->swap(); SS3OVertex sv; sv.pos = float3(v->xpos, v->ypos, v->zpos); sv.normal = float3(v->xnormal, v->ynormal, v->znormal).SafeANormalize(); sv.texCoord = float2(v->texu, v->texv); piece->SetVertex(a, sv); vertexOffset += sizeof(Vertex); } // retrieve the draw order for the vertices int vertexTableOffset = fp->vertexTable; for (int a = 0; a < fp->vertexTableSize; ++a) { const int vertexDrawIdx = swabDWord(*(int*) &buf[vertexTableOffset]); piece->SetVertexDrawIndex(a, vertexDrawIdx); vertexTableOffset += sizeof(int); } piece->goffset = piece->offset + ((parent != NULL)? parent->goffset: ZeroVector); piece->SetHasGeometryData(piece->GetVertexDrawIndexCount() != 0); piece->SetVertexTangents(); piece->SetMinMaxExtends(); model->mins = std::min(piece->goffset + piece->mins, model->mins); model->maxs = std::max(piece->goffset + piece->maxs, model->maxs); piece->SetCollisionVolume(new CollisionVolume("box", piece->maxs - piece->mins, (piece->maxs + piece->mins) * 0.5f)); int childTableOffset = fp->children; for (int a = 0; a < fp->numchildren; ++a) { int childOffset = swabDWord(*(int*) &buf[childTableOffset]); SS3OPiece* childPiece = LoadPiece(model, piece, buf, childOffset); piece->children.push_back(childPiece); childTableOffset += sizeof(int); } return piece; }