public object Clone() { var container = new SceneContainer(); container.AddRange(this); container.Header = Header; return(container); }
public static SceneContainer ReadFrom(Stream stream) { var container = new SceneContainer(); using (var r = new BinaryReader(stream)) { container.Header.Deserialize(stream); // CoreLib::Scene::CSceneGroup uint chunkCount = r.ReadUInt32(); if (container.Header.Unk2 >= 0.2000000029802322f) { r.ReadByte(); // ToDo ReadString } for (int i = 0; i < chunkCount; i++) { var type = r.ReadEnum <ChunkType>(); string name = r.ReadCString(); string subName = r.ReadCString(); SceneChunk chunk; switch (type) { case ChunkType.ModelData: chunk = new ModelChunk(container) { Name = name, SubName = subName, Image = Properties.Resources.model }; chunk.Deserialize(stream); container.Add(chunk); break; case ChunkType.Box: chunk = new BoxChunk(container) { Name = name, SubName = subName, Image = Properties.Resources.box }; chunk.Deserialize(stream); container.Add(chunk); break; case ChunkType.Bone: chunk = new BoneChunk(container) { Name = name, SubName = subName, Image = Properties.Resources.bone }; chunk.Deserialize(stream); container.Add(chunk); break; case ChunkType.BoneSystem: chunk = new BoneSystemChunk(container) { Name = name, SubName = subName, Image = Properties.Resources.bone_system }; chunk.Deserialize(stream); container.Add(chunk); break; case ChunkType.Shape: chunk = new ShapeChunk(container) { Name = name, SubName = subName, Image = Properties.Resources.shape }; chunk.Deserialize(stream); container.Add(chunk); break; case ChunkType.SkyDirect1: chunk = new SkyDirect1Chunk(container) { Name = name, SubName = subName, Image = Properties.Resources.sky }; chunk.Deserialize(stream); container.Add(chunk); break; default: throw new Exception($"Unknown chunk type: 0x{(int)type:X4} StreamPosition: {r.BaseStream.Position}"); } } } return(container); }