コード例 #1
0
        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);
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
 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);
         }
     }
 }
コード例 #4
0
        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);
        }