Exemple #1
0
 public void Write(AssetsWriter writer)
 {
     writer.WriteBEInt32(MetadataSize);
     writer.WriteBEInt32(FileSize);
     writer.WriteBEInt32(Version);
     writer.WriteBEInt32(ObjectDataOffset);
     writer.Write(IsBigEndian);
     writer.AlignTo(4);
     //writer.Write(new byte[3]);
 }
Exemple #2
0
 public void Write(AssetsWriter writer)
 {
     writer.WriteCString(Version);
     writer.Write(Platform);
     writer.Write(HasTypeTrees);
     writer.Write(Types.Count());
     Types.ForEach(x => x.Write(writer));
     writer.Write(ObjectInfos.Count());
     ObjectInfos.ForEach(x => {
         writer.AlignTo(4);
         x.Write(writer);
     });
     writer.Write(Adds.Count());
     Adds.ForEach(x => {
         writer.AlignTo(4);
         x.Write(writer);
     });
     writer.Write(ExternalFiles.Count());
     ExternalFiles.ForEach(x => x.Write(writer));
     writer.WriteCString("");
 }
Exemple #3
0
 public void WritePtr(AssetsWriter writer)
 {
     if (isNull)
     {
         byte[] buf = new byte[12];
         writer.Write(buf);
         return;
     }
     writer.Write(FileID);
     writer.AlignTo(4);
     writer.Write(Target.ObjectID);
 }
Exemple #4
0
 public void Write(AssetsWriter writer)
 {
     Texture.Write(writer);
     AlphaTexture.Write(writer);
     writer.WriteArrayOf(SubMeshes, (o, w) => o.Write(w));
     writer.WriteArray(IndexBuffer);
     writer.AlignTo(4);
     VertexData.Write(writer);
     writer.WriteArrayOf(BindPose, (o, w) => w.Write(o));
     TextureRect.Write(writer);
     TextureRectOffset.Write(writer);
     AtlasRectOffset.Write(writer);
     writer.Write(SettingsRaw);
     UVTransform.Write(writer);
     writer.Write(DownscaleMultiplier);
 }
Exemple #5
0
 protected override void WriteBase(AssetsWriter writer)
 {
     base.WriteBase(writer);
     writer.Write(Name);
     Rect.Write(writer);
     Offset.Write(writer);
     Border.Write(writer);
     writer.Write(PixelsToUnits);
     Pivot.Write(writer);
     writer.Write(Extrude);
     writer.Write(IsPolygon);
     writer.AlignTo(4);
     writer.Write(RenderDataKey.First);
     writer.Write(RenderDataKey.Second);
     writer.WriteArrayOf(AtlasTags, (o, w) => w.Write(o));
     SpriteAtlas.Write(writer);
     RenderData.Write(writer);
     writer.WriteArrayOf(PhysicsShape, (o, w) => w.WriteArrayOf(o, (o2, w2) => o2.Write(w2)));
     writer.WriteArrayOf(Bones, (o, w) => o.Write(w));
 }
Exemple #6
0
 public void Write(AssetsWriter writer)
 {
     writer.Write(FileID);
     writer.AlignTo(4);
     writer.Write(PathID);
 }
Exemple #7
0
        public void Write()
        {
            try
            {
                using (Stream objectsMS = GetTempStream())
                {
                    using (Stream metaMS = GetTempStream())
                    {
                        using (AssetsWriter writer = new AssetsWriter(objectsMS))
                        {
                            int ctr = 0;
                            foreach (var obj in Metadata.ObjectInfos)
                            {
                                if (obj.IsNew)
                                {
                                    // Object is new here
                                    Console.WriteLine("Writing New object!");
                                }
                                ctr++;
                                var offset = (int)objectsMS.Position;
                                obj.GetObjectForWrite().Write(writer);
                                writer.Flush();
                                obj.DataOffset = offset;
                                var origSize = obj.DataSize;
                                obj.DataSize = (int)(objectsMS.Position - obj.DataOffset);
                                if (origSize != obj.DataSize)
                                {
                                    // TEMPORARY! MUST REMOVE!
                                    Console.WriteLine("MISMATCH!");
                                }
                                writer.AlignTo(8);
                            }
                        }
                        using (AssetsWriter writer = new AssetsWriter(metaMS))
                        {
                            // This is fine!
                            Metadata.Write(writer);
                        }
                        // objectMS is 8 bytes smaller than it should be here
                        Header.FileSize         = Header.HeaderSize + (int)objectsMS.Length + (int)metaMS.Length;
                        Header.ObjectDataOffset = Header.HeaderSize + (int)metaMS.Length;

                        int diff;
                        int alignment = 16; //or 32, I don't know which
                                            //data has to be at least 4096 inward from the start of the file
                        if (Header.ObjectDataOffset < 4096)
                        {
                            diff = 4096 - Header.ObjectDataOffset;
                        }
                        else
                        {
                            diff = alignment - (Header.ObjectDataOffset % alignment);
                            if (diff == alignment)
                            {
                                diff = 0;
                            }
                        }

                        if (diff > 0)
                        {
                            Header.ObjectDataOffset += diff;
                            Header.FileSize         += diff;
                        }
                        // According to parse, MetadataSize shrunk by 4
                        Header.MetadataSize = (int)metaMS.Length;
                        objectsMS.Seek(0, SeekOrigin.Begin);
                        metaMS.Seek(0, SeekOrigin.Begin);
                        lock (this)
                        {
                            try
                            {
                                CloseBaseStream();


                                FileProvider.DeleteFiles(AssetsRootPath.CombineFwdSlash(AssetsFilename + ".split*"));

                                using (Stream outputStream = GetTempStream())
                                {
                                    using (AssetsWriter writer = new AssetsWriter(outputStream))
                                    {
                                        Header.Write(writer);
                                    }
                                    metaMS.CopyTo(outputStream);
                                    metaMS.Close();


                                    if (diff > 0)
                                    {
                                        outputStream.Write(new byte[diff], 0, diff);
                                    }

                                    objectsMS.CopyTo(outputStream);
                                    objectsMS.Close();

                                    outputStream.Seek(0, SeekOrigin.Begin);
                                    if (FileWasSplit)
                                    {
                                        int    splitCtr = 0;
                                        byte[] buffer   = new byte[1024 * 1024];
                                        do
                                        {
                                            Stream outFile = FileProvider.GetWriteStream($"{AssetsRootPath.CombineFwdSlash(AssetsFilename)}.split{splitCtr}");
                                            var    readLen = (int)(outputStream.Length - outputStream.Position);
                                            if (readLen < buffer.Length)
                                            {
                                                outputStream.Read(buffer, 0, readLen);
                                                outFile.Write(buffer, 0, readLen);
                                                break;
                                            }
                                            outputStream.Read(buffer, 0, buffer.Length);
                                            outFile.Write(buffer, 0, buffer.Length);
                                            outFile.Close();
                                            splitCtr++;
                                        } while (true);
                                    }
                                    else
                                    {
                                        outputStream.Seek(0, SeekOrigin.Begin);
                                        var bts = outputStream.ReadBytes((int)outputStream.Length);
                                        FileProvider.Write(AssetsRootPath.CombineFwdSlash(AssetsFilename), bts);
                                    }
                                }
                                FileProvider.Save();
                                _hasChanges = false;
                                foreach (var ptr in _knownPointers.Where(x => x.Owner.ObjectInfo.ParentFile == this && x.IsNew))
                                {
                                    ptr.IsNew = false;
                                }
                                OpenBaseStream();
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("CRITICAL: writing and reopening the file failed, the file is possibly destroyed and this object is in an unknown state.", ex);
                            }
                        }
                    }
                }
            }
            finally
            {
                CleanupTempFiles();
            }
        }