/// <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); }
public ILandObject Copy() { ILandObject newLand = new LandObject(LandData, m_scene); newLand.LandBitmap = (bool[, ])(LandBitmap.Clone()); return(newLand); }
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); }
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); }
/// <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; }