private SceneryStruct LoadScenery(BinaryReader reader) { SceneryStruct scen = new SceneryStruct(); int[] sceneryTypes = new int[8]; scen.Model = LoadSceneryModel(reader); scen.Links = new object[8]; for (int i = 0; i < 8; i++) { sceneryTypes[i] = reader.ReadInt32(); } for (int i = 0; i < 8; i++) { if (sceneryTypes[i] == 0x1600) { scen.Links[i] = LoadScenery(reader); } else if (sceneryTypes[i] == 0x1605) { scen.Links[i] = LoadSceneryModel(reader); } else { // if type 3 - it's nothing scen.Links[i] = null; } } return(scen); }
private void SaveScenery(SceneryStruct ptr, BinaryWriter writer) { SaveSceneryModel(ptr.Model, writer); for (int i = 0; i < ptr.Links.Length; i++) { if (ptr.Links[i] is SceneryModelStruct) { writer.Write(0x1605); } else if (ptr.Links[i] is SceneryStruct) { writer.Write(0x1600); } else { writer.Write(3); } } for (int i = 0; i < ptr.Links.Length; i++) { if (ptr.Links[i] is SceneryModelStruct) { SaveSceneryModel((SceneryModelStruct)ptr.Links[i], writer); } else if (ptr.Links[i] is SceneryStruct) { SaveScenery((SceneryStruct)ptr.Links[i], writer); } } }
private void CountScenery(SceneryStruct ptr, ref int count) { CountSceneryModel(ptr.Model, ref count); for (int i = 0; i < ptr.Links.Length; i++) { count += 4; } for (int i = 0; i < ptr.Links.Length; i++) { if (ptr.Links[i] is SceneryModelStruct) { CountSceneryModel((SceneryModelStruct)ptr.Links[i], ref count); } else if (ptr.Links[i] is SceneryStruct) { CountScenery((SceneryStruct)ptr.Links[i], ref count); } } }
public override void Load(BinaryReader reader, int size) { //long start_pos = reader.BaseStream.Position; HeaderUnk1 = reader.ReadUInt32(); uint chunkNameLength = reader.ReadUInt32(); ChunkName = new string(reader.ReadChars((int)chunkNameLength)); HeaderUnk2 = reader.ReadUInt32(); HeaderUnk3 = reader.ReadUInt32(); HeaderUnk4 = reader.ReadByte(); if ((HeaderUnk1 & 0x10000) != 0) { SkydomeID = reader.ReadUInt32(); } LightsAmbient = new List <LightAmbient>(); LightsDirectional = new List <LightDirectional>(); LightsPoint = new List <LightPoint>(); LightsNegative = new List <LightNegative>(); if ((HeaderUnk1 & 0x20000) != 0) { HeaderBuffer = reader.ReadBytes(0x400); uint LightsNum = reader.ReadUInt32(); uint LightAmbientNum = reader.ReadUInt32(); uint LightDirectionalNum = reader.ReadUInt32(); uint LightPointNum = reader.ReadUInt32(); uint LightNegativeNum = reader.ReadUInt32(); if (LightAmbientNum > 0) { for (int i = 0; i < LightAmbientNum; i++) { LightAmbient light = new LightAmbient(); light.Flags = reader.ReadBytes(4); light.Radius = reader.ReadSingle(); light.Color_R = reader.ReadSingle(); light.Color_G = reader.ReadSingle(); light.Color_B = reader.ReadSingle(); light.Color_Unk = reader.ReadSingle(); light.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector1 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector2 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); LightsAmbient.Add(light); } } if (LightDirectionalNum > 0) { for (int i = 0; i < LightDirectionalNum; i++) { LightDirectional light = new LightDirectional(); light.Flags = reader.ReadBytes(4); light.Radius = reader.ReadSingle(); light.Color_R = reader.ReadSingle(); light.Color_G = reader.ReadSingle(); light.Color_B = reader.ReadSingle(); light.Color_Unk = reader.ReadSingle(); light.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector1 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector2 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector3 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.unkShort = reader.ReadUInt16(); LightsDirectional.Add(light); } } if (LightPointNum > 0) { for (int i = 0; i < LightPointNum; i++) { LightPoint light = new LightPoint(); light.Flags = reader.ReadBytes(4); light.Radius = reader.ReadSingle(); light.Color_R = reader.ReadSingle(); light.Color_G = reader.ReadSingle(); light.Color_B = reader.ReadSingle(); light.Color_Unk = reader.ReadSingle(); light.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector1 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector2 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.unkShort = reader.ReadUInt16(); LightsPoint.Add(light); } } if (LightNegativeNum > 0) { for (int i = 0; i < LightNegativeNum; i++) { LightNegative light = new LightNegative(); light.Flags = reader.ReadBytes(4); light.Radius = reader.ReadSingle(); light.Color_R = reader.ReadSingle(); light.Color_G = reader.ReadSingle(); light.Color_B = reader.ReadSingle(); light.Color_Unk = reader.ReadSingle(); light.Position = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector1 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector2 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.Vector3 = new Pos(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); light.unkFloat1 = reader.ReadSingle(); light.unkFloat2 = reader.ReadSingle(); light.unkUInt1 = reader.ReadUInt32(); light.unkUInt2 = reader.ReadUInt32(); light.unkUShort1 = reader.ReadUInt16(); light.unkUShort2 = reader.ReadUInt16(); LightsNegative.Add(light); } } } SceneryRoot = null; if (HeaderUnk3 == 0x160A) { unkVar5 = reader.ReadUInt32(); SceneryRoot = LoadScenery(reader); } else { //Console.WriteLine("no scenery!! bug?"); } //Console.WriteLine("end pos: " + (reader.BaseStream.Position - start_pos) + " target: " + size); }