Beispiel #1
0
        private void Read(DataReader r)
        {
            Magic        = r.ReadUInt32();
            VersionMajor = r.ReadByte();
            VersionMinor = r.ReadByte();
            Pad          = r.ReadUInt16();
            Compressed   = r.ReadUInt32();
            Width        = r.ReadUInt16();
            Height       = r.ReadUInt16();
            BBMin        = r.ReadVector3();
            BBMax        = r.ReadVector3();
            Length       = r.ReadUInt32();


            if (Length != (r.Length - r.Position))
            {
            }


            var dlen = (int)Length;

            if (Compressed > 0)
            {
                CompHeaders = new CompHeader[Height];
                for (int i = 0; i < Height; i++)
                {
                    CompHeaders[i].Read(r);
                }
                dlen -= (Height * 8);
            }

            if ((r.Length - r.Position) != dlen)
            {
            }

            var d = r.ReadBytes(dlen);

            if ((r.Length - r.Position) != 0)
            {
            }

            if (Compressed > 0)
            {
                MaxHeights = new byte[Width * Height];
                MinHeights = new byte[Width * Height];
                var h2off = dlen / 2; //is this right?
                for (int y = 0; y < Height; y++)
                {
                    var h = CompHeaders[y];
                    for (int i = 0; i < h.Count; i++)
                    {
                        int x = h.Start + i;
                        int o = h.DataOffset + x;
                        MaxHeights[y * Width + x] = d[o];
                        MinHeights[y * Width + x] = d[o + h2off];
                    }
                    for (int x = 0; x < Width; x++)
                    {
                        var hm1v = MaxHeights[y * Width + x];
                        var hm2v = MinHeights[y * Width + x];
                        var diff = hm1v - hm2v;
                        if ((diff <= 0) && (hm1v != 0))
                        {
                        }
                    }
                }
            }
            else
            {
                MaxHeights = d; //no way to test this as vanilla heightmaps are compressed...
                MinHeights = d; //this won't work anyway.
            }
        }
Beispiel #2
0
        private void Write(DataWriter w)
        {
            var d = MaxHeights;

            if (Compressed > 0)
            {
                var ch = new CompHeader[Height];
                var d1 = new List <byte>();
                var d2 = new List <byte>();
                for (int y = 0; y < Height; y++)
                {
                    var start = 0;
                    var end   = 0;
                    for (int x = 0; x < Width; x++)
                    {
                        if (MaxHeights[y * Width + x] != 0)
                        {
                            start = x; break;
                        }
                    }
                    for (int x = Width - 1; x >= 0; x--)
                    {
                        if (MaxHeights[y * Width + x] != 0)
                        {
                            end = x + 1; break;
                        }
                    }
                    var count  = end - start;
                    var offset = (count > 0) ? d1.Count - start : 0;
                    for (int i = 0; i < count; i++)
                    {
                        var x = start + i;
                        var n = y * Width + x;
                        d1.Add(MaxHeights[n]);
                        d2.Add(MinHeights[n]);
                    }
                    var h = new CompHeader()
                    {
                        Start = (ushort)start, Count = (ushort)count, DataOffset = offset
                    };
                    ch[y] = h;
                }
                d1.AddRange(d2);//the 2 sets of compressed data are just smushed together
                d           = d1.ToArray();
                CompHeaders = ch;
                Length      = (uint)(d.Length + Height * 8);
            }
            else
            {
                Length = (uint)d.Length;
            }


            w.Write(Magic);
            w.Write(VersionMajor);
            w.Write(VersionMinor);
            w.Write(Pad);
            w.Write(Compressed);
            w.Write(Width);
            w.Write(Height);
            w.Write(BBMin);
            w.Write(BBMax);
            w.Write(Length);
            if (Compressed > 0)
            {
                for (int i = 0; i < Height; i++)
                {
                    CompHeaders[i].Write(w);
                }
            }
            w.Write(d);
        }
Beispiel #3
0
        private void Read(DataReader r)
        {
            Magic             = r.ReadUInt32(); //'WMAP'
            Version           = r.ReadUInt32(); //100 - version?
            DataLength        = r.ReadUInt32(); //59360 - data length (excluding last flags array!)
            CornerX           = r.ReadSingle(); //-4050.0f  - min XY?
            CornerY           = r.ReadSingle(); //8400.0f   - max XY?
            TileX             = r.ReadSingle(); //50.0f  - tile size X
            TileY             = r.ReadSingle(); //50.0f  - tile size Y
            Width             = r.ReadUInt16(); //183  - image Width
            Height            = r.ReadUInt16(); //249  - image Height
            WatermapIndsCount = r.ReadUInt32(); //10668
            WatermapRefsCount = r.ReadUInt32(); //11796
            RiverVecsCount    = r.ReadUInt16(); //99
            RiverCount        = r.ReadUInt16(); //13
            LakeVecsCount     = r.ReadUInt16(); //28
            LakeCount         = r.ReadUInt16(); //15
            PoolCount         = r.ReadUInt16(); //314
            ColoursOffset     = r.ReadUInt16(); //13316
            Unks1             = r.ReadBytes(8); //2,2,16,48,16,48,32,0      flags..?


            var shortslen = (int)((WatermapIndsCount + WatermapRefsCount) * 2) + (Height * 4); //offset from here to Zeros1
            var padcount  = (16 - (shortslen % 16)) % 16;                                      //12 .. is this right? all are zeroes.
            var strucslen = ((RiverVecsCount + LakeVecsCount) * 16) + ((RiverCount + LakeCount) * 48) + (PoolCount * 32);
            var datalen   = shortslen + padcount + strucslen;                                  //DataLength calculation
            var extoffs   = padcount + strucslen - 60 - 60;                                    //ExtraFlagsOffset calculation


            CompHeaders = new CompHeader[Height];//249 - image height
            for (int i = 0; i < Height; i++)
            {
                CompHeaders[i].Read(r);
            }

            CompWatermapInds = new short[WatermapIndsCount];//10668
            for (int i = 0; i < WatermapIndsCount; i++)
            {
                CompWatermapInds[i] = r.ReadInt16();
            }

            CompWatermapRefs = new WaterItemRef[WatermapRefsCount];//11796
            for (int i = 0; i < WatermapRefsCount; i++)
            {
                CompWatermapRefs[i] = new WaterItemRef(r.ReadUInt16());
            }

            Zeros1 = r.ReadBytes(padcount);          //align to 16 bytes (position:45984)

            RiverVecs = new Vector4[RiverVecsCount]; //99
            for (int i = 0; i < RiverVecsCount; i++)
            {
                RiverVecs[i] = r.ReadVector4();
            }

            Rivers = new WaterFlow[RiverCount];//13
            for (int i = 0; i < RiverCount; i++)
            {
                Rivers[i] = new WaterFlow(WaterItemType.River, r, RiverVecs);
            }

            LakeVecs = new Vector4[LakeVecsCount];//28
            for (int i = 0; i < LakeVecsCount; i++)
            {
                LakeVecs[i] = r.ReadVector4();
            }

            Lakes = new WaterFlow[LakeCount];//15
            for (int i = 0; i < LakeCount; i++)
            {
                Lakes[i] = new WaterFlow(WaterItemType.Lake, r, LakeVecs);
            }

            Pools = new WaterPool[PoolCount];//314
            for (int i = 0; i < PoolCount; i++)
            {
                Pools[i] = new WaterPool(r);
            }

            ColourCount = (uint)(RiverCount + LakeCount + PoolCount); //342
            Colours     = new Color[ColourCount];                     //342
            for (int i = 0; i < 342; i++)
            {
                Colours[i] = Color.FromAbgr(r.ReadUInt32());
            }


            var flagoff = 0; //assign extra colours out of the main array

            for (int i = 0; i < Rivers.Length; i++)
            {
                var river = Rivers[i];
                river.Colour = Colours[flagoff++];
            }
            for (int i = 0; i < Lakes.Length; i++)
            {
                var lake = Lakes[i];
                lake.Colour = Colours[flagoff++];
            }
            for (int i = 0; i < Pools.Length; i++)
            {
                var pool = Pools[i];
                pool.Colour = Colours[flagoff++];
            }



            for (int i = 0; i < CompWatermapRefs.Length; i++) //assign items to CompWatermapRefs
            {
                var ir = CompWatermapRefs[i];
                switch (ir.Type)
                {
                case WaterItemType.River: CompWatermapRefs[i].Item = Rivers[ir.ItemIndex]; break;

                case WaterItemType.Lake: CompWatermapRefs[i].Item = Lakes[ir.ItemIndex]; break;

                case WaterItemType.Pool: CompWatermapRefs[i].Item = Pools[ir.ItemIndex]; break;
                }
            }



            //decompress main data into grid form
            GridWatermapInds = new short[Width * Height];
            GridWatermapRefs = new WaterItemRef[Width * Height][];
            var reflist = new List <WaterItemRef>();

            for (int y = 0; y < Height; y++)
            {
                var ch = CompHeaders[y];
                for (int i = 0; i < ch.Count; i++)
                {
                    var x = ch.Start + i;
                    var n = CompWatermapInds[ch.Offset + i];
                    var o = y * Width + x;

                    reflist.Clear();
                    WaterItemRef[] refarr = null;
                    if (n >= 0)
                    {
                        var h = CompWatermapRefs[n];
                        reflist.Add(h);
                        var cn = n;
                        while (h.EndOfList == false)
                        {
                            cn++;
                            h = CompWatermapRefs[cn];
                            reflist.Add(h);
                        }

                        refarr = reflist.ToArray();
                    }

                    GridWatermapInds[o] = n;
                    GridWatermapRefs[o] = refarr;
                }
            }



            //var pgm = GetPGM();


            var rem = r.Length - r.Position;//60788

            if (rem != 0)
            {
            }



            //var sb = new StringBuilder();
            //for (int y = Height - 1; y >= 0; y--)
            //{
            //    for (int x = 0; x < Width; x++)
            //    {
            //        var v = GridWatermapVals[y * Width + x];
            //        sb.Append(Convert.ToString(v, 16).ToUpperInvariant().PadLeft(4, '0'));
            //        sb.Append(" ");
            //    }
            //    sb.AppendLine();
            //}
            //var hstr = sb.ToString();
        }