File_ChCr_746 Load_ChCr_746_File(BinaryReader br) { File_ChCr_746 chCrFile = new File_ChCr_746(); chCrFile.signatureString = br.ReadUInt32(); chCrFile.version = br.ReadUInt32(); chCrFile.chunkCount = br.ReadUInt32(); chCrFile.chunkTableOffset = br.ReadUInt32(); br.BaseStream.Position = chCrFile.chunkTableOffset; for (int i = 0; i < chCrFile.chunkCount; i++) { Chunk chunk = new Chunk(); chunk.type = br.ReadUInt16(); chunk.version = br.ReadUInt16(); chunk.chunkId = br.ReadUInt32(); chunk.size = br.ReadUInt32(); chunk.pos = br.ReadUInt32(); chCrFile.chunks.Add(chunk); } for (int i = 0; i < chCrFile.chunkCount; i++) { br.BaseStream.Position = chCrFile.chunks[i].pos; chCrFile.chunks[i].content = new byte[chCrFile.chunks[i].size]; for (int j = 0; j < chCrFile.chunks[i].size; j++) { chCrFile.chunks[i].content[j] = br.ReadByte(); } } return(chCrFile); }
void LoadSecondaryFile(string path) { while (!MergerHelper.IsFileReady(path)) { } BinaryReader br = new BinaryReader(File.Open( path, FileMode.Open, FileAccess.Read)); secondaryFile = Load_ChCr_746_File(br); br.Close(); }
void Merge() { RecalculateSecondFileChunksIds(primaryFile.GetMaxId()); MergeNodes(); for (int i = 0; i < secondaryFile.chunkCount; i++) { primaryFile.chunks.Add(secondaryFile.chunks[i]); primaryFile.chunkCount++; } primaryFile.RecalculateChunksPositions(); mergedFile = primaryFile; }
public Fixer(string filePath) { if (File.Exists(filePath) && allowedFiles.Any(x => filePath.EndsWith(x))) { while (!FixerHelper.IsFileReady(filePath)) { } file = new File_ChCr_746(filePath); if (!file.HasConvertedFlag() && (!file.HasWrongSignature())) { FixFile(); } else { isFileConverted = true; Console.WriteLine(file.filePath); Console.WriteLine("FILE ALREADY CONVERTED - IGNORING"); } } }
//string DecodeCryXml(byte[] byteArray, int cryXmlHeaderOffset) //{ // string newXmlStr=""; // File.WriteAllBytes("temp", byteArray); // //Console.WriteLine("socpath {0}", socpakPath); // //Console.WriteLine("objcontainer {0}", name); // //Console.WriteLine("cryXmlHeaderOffset {0}", cryXmlHeaderOffset); // var xml = CryXmlSerializer.ReadFile("temp", ByteOrderEnum.AutoDetect, false, cryXmlHeaderOffset); // if (xml != null) // { // newXmlStr = xml.InnerXml; // //Console.WriteLine("newXmlStr size {0}", newXmlStr.Length); // //Console.WriteLine("newXmlStr |{0}|", newXmlStr); // } // else // { // //Console.WriteLine("error in DecodeCryXml"); // } // File.WriteAllText("tempDecoded", newXmlStr); // if(!Directory.Exists("logs/objectContainersXmls"))Directory.CreateDirectory("logs/objectContainersXmls"); // string dirName = new DirectoryInfo(socpakPath).Parent.Name; // File.WriteAllText("logs/objectContainersXmls/"+ dirName+"_"+ Path.GetFileNameWithoutExtension( name)+".xml", newXmlStr); // return newXmlStr; //} //void ExtractGeomEntityCryXml(byte[] byteArray, int cryXmlHeaderOffset = 0) //{ // ExtractGeomEntity(DecodeCryXml(byteArray, cryXmlHeaderOffset)); //} //void ExtractLightEntityCryXml(byte[] byteArray, int cryXmlHeaderOffset = 0) //{ // ExtractLightEntity(DecodeCryXml(byteArray, cryXmlHeaderOffset)); //} /// <summary> /// loading object container from socpak /// </summary> /// <param name="path">socpak path</param> void LoadSoc(string path, bool isExternal, string childPath = "") { Stream streamFile = new MemoryStream(); string zipPakPath = path; if (isExternal) { zipPakPath = childPath; } if (File.Exists(zipPakPath)) { using (ZipArchive zip = ZipFile.Open(zipPakPath, ZipArchiveMode.Read)) { //Console.WriteLine(path); string entryname = ""; foreach (ZipArchiveEntry entry in zip.Entries) { //Console.WriteLine("LoadSoc entry.FullName {0}", entry.FullName); if (entry.FullName == name.ToLower() + ".soc") { entryname = entry.FullName; } } if (entryname == "") { Console.WriteLine("entryname=null"); foreach (ZipArchiveEntry entry in zip.Entries) { Console.WriteLine(entry.FullName); } } byte[] asciiBytes = Encoding.ASCII.GetBytes(entryname); layerGUID = Guid.NewGuid().ToString(); prefabGUID = Guid.NewGuid().ToString(); //Console.WriteLine("name {0}", name); //Console.WriteLine("entryname {0}",entryname); //ZipArchiveEntry socfile = zip.GetEntry(entryname); ZipArchiveEntry socfile = zip.GetEntry(entryname); socfile.Open().CopyTo(streamFile); streamFile.Position = 0; //Console.WriteLine(socfile.Length); } //Console.WriteLine(streamFile.Length); //////////////////////// //layerGUID = "1" + RandomString(5); //prefabGUID = "1" + RandomString(5); id = "1" + RandomString(5); //////////////////////// socFile = new File_ChCr_746(streamFile, name.ToLower() + ".soc"); for (int i = 0; i < socFile.chunks.Count; i++) { switch (socFile.chunks[i].type) { //objects chunk case (ushort)Chunk_Objects.type: Chunk_Objects chunkObjects = new Chunk_Objects(socFile.chunks[i].content); objects.Add(new Objects(chunkObjects.objectsStream, chunkObjects.GetFilePaths())); break; case (ushort)Chunk_AreaShape.type: Chunk_AreaShape chunkAreaShape = new Chunk_AreaShape(socFile.chunks[i].content); areaShapes.Add(new AreaShapes(chunkAreaShape.areaShapesStream, chunkAreaShape.GetVisAreasCount(), chunkAreaShape.GetPortalsCount())); break; case (ushort)Chunk_XML.type: Chunk_XML chunkXML = new Chunk_XML(socFile.chunks[i].content); SCOC_Entities SCOCEntities = new SCOC_Entities(chunkXML.xmlStream); string xmlSCOCEntities = SCOCEntities.GetXML(); ExtractSCOCEntities(xmlSCOCEntities); //save soc xml chunk string folder = Path.GetFileName(Path.GetDirectoryName(path)); Directory.CreateDirectory("logs/objectContainersXmls/"); File.WriteAllText("logs/objectContainersXmls/" + folder + "-" + name.ToLower().Replace(@"/", "-") + ".xml", xmlSCOCEntities); break; default: break; } } MakePrefabObjects(); } else { Console.WriteLine("Not Found {0}", zipPakPath); } }
void RecompileMeshes() { File_ChCr_746 newFile = mergedFile; for (int i = 0; i < mergedFile.chunkCount; i++) { //find mesh compiled with p3s_c4b_t2s, nStreamChunkID [15]!=0 if (mergedFile.chunks[i].type == 0x00001000) { Chunk_Mesh_801 mergedFileMeshChunk = new Chunk_Mesh_801(mergedFile.chunks[i].content); if (mergedFileMeshChunk.nStreamChunkID[15] != 0) { uint p3s_c4b_t2sChunkId = mergedFileMeshChunk.nStreamChunkID[15]; uint maxChunkId = newFile.GetMaxId(); maxChunkId++; Chunk p3s_c4b_t2sChunk = mergedFile.GetChunkById(mergedFileMeshChunk.nStreamChunkID[15]); Chunk_DataStream_800 p3s_c4b_t2sDataStreamChunk = new Chunk_DataStream_800(p3s_c4b_t2sChunk.content); DataStream_p3s_c4b_t2s p3s_c4b_t2sDataStream = new DataStream_p3s_c4b_t2s(p3s_c4b_t2sDataStreamChunk.nCount, p3s_c4b_t2sDataStreamChunk.dataStream); MeshRecompiler meshRecompiler = new MeshRecompiler(p3s_c4b_t2sDataStreamChunk.nCount, p3s_c4b_t2sDataStream); Chunk_DataStream_800 positionsDataStreamChunk = meshRecompiler.GetPositionsChunk(); Chunk_DataStream_800 texoordDataStreamChunk = meshRecompiler.GetTexcoordsChunk(); Chunk_DataStream_800 colorsDataStreamChunk = meshRecompiler.GetColorsChunk(); positionsDataStreamChunk.Serialize(); Chunk positionsChunk = new Chunk(); positionsChunk.type = 0x00001016; positionsChunk.version = 0x00000800; positionsChunk.chunkId = maxChunkId; positionsChunk.size = positionsDataStreamChunk.GetSize(); positionsChunk.content = positionsDataStreamChunk.serialized; maxChunkId++; texoordDataStreamChunk.Serialize(); Chunk texcoordsChunk = new Chunk(); texcoordsChunk.type = 0x00001016; texcoordsChunk.version = 0x00000800; texcoordsChunk.chunkId = maxChunkId; texcoordsChunk.size = texoordDataStreamChunk.GetSize(); texcoordsChunk.content = texoordDataStreamChunk.serialized; maxChunkId++; colorsDataStreamChunk.Serialize(); Chunk colorsChunk = new Chunk(); colorsChunk.type = 0x00001016; colorsChunk.version = 0x00000800; colorsChunk.chunkId = maxChunkId; colorsChunk.size = colorsDataStreamChunk.GetSize(); colorsChunk.content = colorsDataStreamChunk.serialized; maxChunkId++; newFile.chunks.Add(positionsChunk); newFile.chunkCount++; newFile.chunks.Add(texcoordsChunk); newFile.chunkCount++; newFile.chunks.Add(colorsChunk); newFile.chunkCount++; Chunk_Mesh_801 newFileMeshChunk = mergedFileMeshChunk; newFileMeshChunk.nStreamChunkID[1] = 0; newFileMeshChunk.nStreamChunkID[15] = 0; newFileMeshChunk.nStreamChunkID[0] = positionsChunk.chunkId; newFileMeshChunk.nStreamChunkID[2] = texcoordsChunk.chunkId; newFileMeshChunk.nStreamChunkID[3] = colorsChunk.chunkId; newFileMeshChunk.Serialize(); newFile.chunks[i].content = newFileMeshChunk.serialized; } } } newFile.RecalculateChunksPositions(); mergedFile = newFile; }
File_ChCr_746 FixMeshes(File_ChCr_746 chCrFile) { Console.WriteLine(chCrFile.filePath); //fix mesh for (int i = 0; i < chCrFile.chunks.Count; i++) { if (chCrFile.chunks[i].type == 0x00001000) { Chunk_Mesh_801 chunkMesh = new Chunk_Mesh_801(chCrFile.chunks[i].content); //fix p3s_c4b_t2s int p3s_c4b_t2s_ChunkID = chunkMesh.Get_p3s_c4b_t2s_ChunkID(); if (p3s_c4b_t2s_ChunkID != 0) { Console.Write("."); Chunk_DataStream_800 dataStreamChunk = new Chunk_DataStream_800(chCrFile.GetChunkById((uint)p3s_c4b_t2s_ChunkID).content); if (dataStreamChunk.nElementSize == 16) { DataStream_p3s_c4b_t2s p3s_c4b_t2sDataStream = new DataStream_p3s_c4b_t2s(dataStreamChunk.nCount, dataStreamChunk.dataStream); p3s_c4b_t2sDataStream = Fix_p3s_c4b_t2s(p3s_c4b_t2sDataStream, chunkMesh.GetBboxMin(), chunkMesh.GetBboxMax()); p3s_c4b_t2sDataStream.Serialize(); dataStreamChunk.dataStream = p3s_c4b_t2sDataStream.serialized; dataStreamChunk.Serialize(); for (int j = 0; j < chCrFile.chunks.Count; j++) { if (chCrFile.chunks[j].chunkId == (uint)p3s_c4b_t2s_ChunkID) { chCrFile.chunks[j].content = dataStreamChunk.serialized; } } } //skins since alpha 3.1 use p3f_c4b_t2s if (dataStreamChunk.nElementSize == 20) { DataStream_p3f_c4b_t2s p3f_c4b_t2sDataStream = new DataStream_p3f_c4b_t2s(dataStreamChunk.nCount, dataStreamChunk.dataStream); DataStream_p3s_c4b_t2s p3s_c4b_t2sDataStream = new DataStream_p3s_c4b_t2s(); p3s_c4b_t2sDataStream = Fix_p3f_c4b_t2s(p3f_c4b_t2sDataStream); p3s_c4b_t2sDataStream.Serialize(); dataStreamChunk.dataStream = p3s_c4b_t2sDataStream.serialized; dataStreamChunk.nElementSize = p3s_c4b_t2sDataStream.GetElementSize(); dataStreamChunk.Serialize(); for (int j = 0; j < chCrFile.chunks.Count; j++) { if (chCrFile.chunks[j].chunkId == (uint)p3s_c4b_t2s_ChunkID) { chCrFile.chunks[j].content = dataStreamChunk.serialized; chCrFile.chunks[j].size = dataStreamChunk.GetSize(); } } } //fix tangents int tangents_ChunkID = chunkMesh.GetTangentsChunkID(); if (tangents_ChunkID != 0) { Console.Write("."); dataStreamChunk = new Chunk_DataStream_800(chCrFile.GetChunkById((uint)tangents_ChunkID).content); DataStream_Tangents_SC tangentsDataStream_SC = new DataStream_Tangents_SC(dataStreamChunk.nCount, dataStreamChunk.dataStream); DataStream_Tangents tangentsDataStream = new DataStream_Tangents(); tangentsDataStream = FixTangents(tangentsDataStream_SC); tangentsDataStream.Serialize(); dataStreamChunk.dataStream = tangentsDataStream.serialized; dataStreamChunk.nElementSize = tangentsDataStream.GetElementSize(); dataStreamChunk.Serialize(); for (int j = 0; j < chCrFile.chunks.Count; j++) { if (chCrFile.chunks[j].chunkId == (uint)tangents_ChunkID) { chCrFile.chunks[j].content = dataStreamChunk.serialized; chCrFile.chunks[j].size = dataStreamChunk.GetSize(); } } } //erase normals chunkMesh.nStreamChunkID[1] = 0; } chunkMesh.Serialize(); chCrFile.chunks[i].content = chunkMesh.serialized; } } //fix datastreams chunks elemsizes for (int i = 0; i < chCrFile.chunks.Count; i++) { if (chCrFile.chunks[i].type == 0x00001016) { Chunk_DataStream_800 dataStreamChunk = new Chunk_DataStream_800(chCrFile.chunks[i].content); dataStreamChunk.Serialize(); chCrFile.chunks[i].content = dataStreamChunk.serialized; } } Console.WriteLine(); chCrFile.RecalculateChunksPositions(); return(chCrFile); }
void FixFile() { file = FixMeshes(file); }