Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
        }
Beispiel #3
0
 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;
 }
Beispiel #4
0
        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");
                }
            }
        }
Beispiel #5
0
        //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);
            }
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
 void FixFile()
 {
     file = FixMeshes(file);
 }