示例#1
0
        /// <summary>
        /// Converts the land bitmap to a packet friendly byte array
        /// </summary>
        /// <returns></returns>
        private byte[] ConvertLandBitmapToBytes()
        {
            byte[] tempConvertArr = new byte[LandBitmap.GetLength(0) * LandBitmap.GetLength(1) / 8];
            byte   tempByte       = 0;
            int    byteNum        = 0;
            int    i = 0;

            for (int y = 0; y < LandBitmap.GetLength(1); y++)
            {
                for (int x = 0; x < LandBitmap.GetLength(0); x++)
                {
                    tempByte = Convert.ToByte(tempByte | Convert.ToByte(LandBitmap[x, y]) << (i++ % 8));
                    if (i % 8 == 0)
                    {
                        tempConvertArr[byteNum] = tempByte;
                        tempByte = (byte)0;
                        i        = 0;
                        byteNum++;
                    }
                }
            }
            // m_log.DebugFormat("{0} ConvertLandBitmapToBytes. BitmapSize=<{1},{2}>",
            //                         LogHeader, LandBitmap.GetLength(0), LandBitmap.GetLength(1));
            return(tempConvertArr);
        }
示例#2
0
        public ILandObject Copy()
        {
            ILandObject newLand = new LandObject(LandData, m_scene);

            newLand.LandBitmap = (bool[, ])(LandBitmap.Clone());
            return(newLand);
        }
示例#3
0
        public ILandObject Copy()
        {
            ILandObject newLand = new LandObject(LandData.OwnerID, LandData.IsGroupOwned, m_scene);

            //Place all new variables here!
            newLand.LandBitmap = (bool[, ])(LandBitmap.Clone());
            newLand.LandData   = LandData.Copy();

            return(newLand);
        }
示例#4
0
        public void Init(int seed, int width, int height)
        {
            if (LandBitmap != null && width != LandBitmap.Width)
            {
                LandBitmap.ResizeImage(width, height, false);
            }

            if (MountainBitmap != null && width != MountainBitmap.Width)
            {
                MountainBitmap.ResizeImage(width, height, false);
            }
            float delta = width / 3072.0f;

            delta   *= ZoomMultiplier;
            DivNoise = delta;

            //   Rand.SetSeed(seed);
            baseWaterTerrain.Frequency = 2.0;
            baseLandTerrain.Frequency  = (2.0);
            ScaleBiasOutput flatTerrain = new ScaleBiasOutput(baseLandTerrain);

            flatTerrain.Scale = 0.005;
            flatTerrain.Bias  = seaLevel;//SeaLevel;
            MinLandFreq       = 0.2f;
            MaxLandFreq       = 1f;
            if (LandBitmap != null)
            {
                MinLandFreq = 0.7f;
            }

            ScaleBiasOutput hillTerrain = new ScaleBiasOutput(baseLandTerrain);

            hillTerrain.Scale = 0.09;
            hillTerrain.Bias  = seaLevel + 0.2;//SeaLevel;

            ScaleBiasOutput waterTerrain = new ScaleBiasOutput(baseWaterTerrain);

            waterTerrain.Bias  = -0.33f;//SeaLevel;
            waterTerrain.Scale = 0.001;

            Perlin waterLandType = new Perlin();
            float  landFreq      = Rand.Next((int)(MinLandFreq * 10000), (int)(MaxLandFreq * 10000)) / 10000.0f;

            waterLandType.Persistence = 0.45;
            waterLandType.Frequency   = landFreq;
            //waterLandType.OctaveCount = 12;
            waterLandType.Seed = Rand.Next(1000000);

            Select waterLandSelector = new Select(waterLandType, waterTerrain, flatTerrain);

            if (LandBitmap != null)
            {
                waterLandSelector = new BitmapSelect(waterLandType, waterTerrain, flatTerrain, DivNoise, LandBitmap);
            }
            waterLandSelector.EdgeFalloff = (0.145);
            waterLandSelector.SetBounds(-0.0, 1000);;


            Select landHillSelector = new Select(waterLandType, waterLandSelector, hillTerrain);

            if (LandBitmap != null)
            {
                landHillSelector = new BitmapSelect(waterLandType, waterLandSelector, hillTerrain, DivNoise, LandBitmap);
            }
            landHillSelector.EdgeFalloff = (0.45);
            landHillSelector.SetBounds(0.25f, 1000);;

            terrainType.Persistence = 0.3;
            terrainType.Frequency   = 0.3;
            terrainType.Seed        = Rand.Next(10000000);

            var clamp = new ClampOutput(terrainType);

            clamp.SetBounds(0, 1);
            //            mountainTerrain.Frequency /= 1.5f;
            mountainTerrain.Lacunarity = 35;
            mountainTerrain.Frequency  = 3.2;
            mountainTerrain.Seed       = Rand.Next(10000000);
            MultiplyPositive mul = new MultiplyPositive(waterLandType, waterLandType);

            ScaleOutput scaled = new ScaleOutput(mul, 0.00001);

            Add add = new Add(new BiasOutput(mountainTerrain, 0.8 + seaLevel), landHillSelector);

            MultiplyPositive mul2 = new MultiplyPositive(add, add);
            MultiplyPositive mul3 = new MultiplyPositive(clamp, mul);

            Select terrainSelector = new Select(mul3, landHillSelector, add);

            if (MountainBitmap != null)
            {
                terrainSelector = new BitmapSelect(mul3, landHillSelector, add, DivNoise, MountainBitmap);
            }
            terrainSelector.EdgeFalloff = (7.925);
            terrainSelector.SetBounds(0.3, 1000);

            Turbulence finalTerrain = new Turbulence(terrainSelector);

            finalTerrain.Frequency = 4;
            finalTerrain.Power     = 0.075;
            Width  = width;
            Height = height;
            //   ResultBitmap2 = new NoiseTexture(width, height, clamp);
            //   System.Console.Out.WriteLine("Left: " + ResultBitmap2.minRange + " - " + ResultBitmap2.maxRange);

            //   ResultBitmap2 = new NoiseTexture(width, height, finalTerrain, DivNoise, 1.25f, -0.66f);
            //    System.Console.Out.WriteLine("Left: " + ResultBitmap2.minRange + " - " + ResultBitmap2.maxRange);
            ResultBitmap = new NoiseTexture(width, height, finalTerrain, DivNoise, 1.25f, -0.66f);
            System.Console.Out.WriteLine("Right: " + ResultBitmap.minRange + " - " + ResultBitmap.maxRange);
        }
示例#5
0
        /// <summary>
        /// Updates the AABBMin and AABBMax values after area/shape modification of the land object
        /// </summary>
        private void UpdateAABBAndAreaValues()
        {
            int min_x = 10000;
            int min_y = 10000;
            int max_x = 0;
            int max_y = 0;
            int tempArea = 0;
            int x, y;

            for (x = 0; x < LandBitmap.GetLength(0); x++)
            {
                for (y = 0; y < LandBitmap.GetLength(1); y++)
                {
                    if (LandBitmap[x, y] == true)
                    {
                        if (min_x > x)
                        {
                            min_x = x;
                        }
                        if (min_y > y)
                        {
                            min_y = y;
                        }
                        if (max_x < x)
                        {
                            max_x = x;
                        }
                        if (max_y < y)
                        {
                            max_y = y;
                        }
                        tempArea += landUnit * landUnit; //16sqm peice of land
                    }
                }
            }
            int tx = min_x * landUnit;

            if (tx > ((int)m_scene.RegionInfo.RegionSizeX - 1))
            {
                tx = ((int)m_scene.RegionInfo.RegionSizeX - 1);
            }
            int ty = min_y * landUnit;

            if (ty > ((int)m_scene.RegionInfo.RegionSizeY - 1))
            {
                ty = ((int)m_scene.RegionInfo.RegionSizeY - 1);
            }

            LandData.AABBMin =
                new Vector3(
                    (float)(min_x * landUnit), (float)(min_y * landUnit), m_scene != null ? (float)m_scene.Heightmap[tx, ty] : 0);

            tx = max_x * landUnit;
            if (tx > ((int)m_scene.RegionInfo.RegionSizeX - 1))
            {
                tx = ((int)m_scene.RegionInfo.RegionSizeX - 1);
            }
            ty = max_y * landUnit;
            if (ty > ((int)m_scene.RegionInfo.RegionSizeY - 1))
            {
                ty = ((int)m_scene.RegionInfo.RegionSizeY - 1);
            }

            LandData.AABBMax
                = new Vector3(
                      (float)(max_x * landUnit), (float)(max_y * landUnit), m_scene != null ? (float)m_scene.Heightmap[tx, ty] : 0);

            LandData.Area = tempArea;
        }