using Sandbox; using Sandbox.Utility; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; public sealed class TerrainManager : Component { [Property] [Category( "LoadConfig" ), Description( "Enable/Disable Load Config Settings From File" ) ] public bool LoadConfigFromFile { get; set; } [Property] [Category( "LoadConfig" ), ShowIf( "LoadConfigFromFile", true ), Description( "Config File Name" )] public string ConfigFileName { get; set; } [Property] [Category( "Debug" ), Description( "Show/Hide Configuration Settings" )] public bool ConfigureMode { get; set; } [Property] [Category( "Debug" ), ShowIf( "ConfigureMode", true ), Description( "Regenerates the terrain with current config settings ! Important when used will desync the surrounding area with newly generated chunks !\r\n" ) ] public bool RegenNoise { get; set; } [Space] [Property] [Category( "Noise" ), ShowIf( "ConfigureMode", true ), Description( "Controls the height of the terrain relative to the noise's sample value" ) ] public Curve HeightCurve { get; set; } [Property] [Category("Noise"), ShowIf("ConfigureMode", true), Description("Controls how fast the height should falloff 0 = no falloff ")] public int FalloffMapSize { get; set; } [Space] [Property] [Category( "Noise" ), Range( 0, 2, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the governing noise algorithm ( 0 = Perlin Noise, 1 = Simplex Noise, 2 = Value Noise )" ) ] public int Noise1Type { get; set; } [Property] [Category( "Noise" ), Range( 0, 5000, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Sets the noise base seed" )] public int Noise1Seed { get; set; } [Property] [Category( "Noise" ), ShowIf( "ConfigureMode", true ), Description( "Controls the weight of this noise's values relative to the other noise's values" ) ] public Curve Noise1Weight { get; set; } [Property] [Category( "Noise" ), Range( 0, .25f, 0.001f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the noise's frequency" ) ] public float Noise1Frequency { get; set; } public int Resolution = 256; public int Octaves; [Space] [Property] [Category( "Noise" ), Range( 0, 2, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the governing noise algorithm ( 0 = Perlin Noise, 1 = Simplex Noise, 2 = Value Noise )" )] public int Noise2Type { get; set; } [Property] [Category( "Noise" ), Range( 0, 5000, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Sets the noise base seed" )] public int Noise2Seed { get; set; } [Property] [Category( "Noise" ), ShowIf( "ConfigureMode", true ), Description( "Controls the weight of this noise's values relative to the other noise's values" )] public Curve Noise2Weight { get; set; } [Property] [Category( "Noise" ), Range( 0, .25f, 0.001f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the noise's frequency" )] public float Noise2Frequency { get; set; } public float Gain; public float lacunarity; [Space] [Property] [Category( "Noise" ), Range( 0, 2, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the governing noise algorithm ( 0 = Perlin Noise, 1 = Simplex Noise, 2 = Value Noise )" )] public int Noise3Type { get; set; } [Property] [Category( "Noise" ), Range( 0, 5000, 1f, true ), ShowIf( "ConfigureMode", true ), Description( "Sets the noise base seed" )] public int Noise3Seed { get; set; } [Property] [Category( "Noise" ), ShowIf( "ConfigureMode", true ), Description( "Controls the weight of this noise's values relative to the other noise's values" )] public Curve Noise3Weight { get; set; } [Property] [Category( "Noise" ), Range( 0, .25f, 0.001f, true ), ShowIf( "ConfigureMode", true ), Description( "Controls the noise's frequency" )] public float Noise3Frequency { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ConfigureMode", true ), Description( "Show/Hide Export Option's" )] public bool ExportOptions { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportOptions", true), Description( "Show/Hide Export to config file option's" )] public bool ExportToConfigFileOptions { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportToConfigFileOptions", true ), Description( "Exported file's name" )] public string ExportConfigName { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportToConfigFileOptions", true ), Description( "Export Now" )] public bool ExportToConfigFileNow { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportOptions", true ), Description( "Show/Hide Export to height map option's" )] public bool ExportAsHeightMapOptions { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportAsHeightMapOptions", true ), Description( "Size of the exported height map ( In Chunk Scale )" )] public int ExportHeightMapSize { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportAsHeightMapOptions", true ), Description( "Exported file's name" )] public string ExportHeightMapName { get; set; } [Property] [Category( "ExportNoise" ), ShowIf( "ExportAsHeightMapOptions", true ), Description( "Export Now" ) ] public bool ExportAsHeightMapNow { get; set; } [Property] [Category( "Spawning" ), Description( "Material to set !Uses terrain material override!" )] public Material TerrainMat { get; set; } [Property] [Category( "Spawning" ), Description( "Terrain chunk prefab" )] public GameObject TerrainObj { get; set; } [Property] [Category( "Spawning" ), Description( "Space between chunks" )] public float ChunkSpaceing { get; set; } private INoiseField NoiseField; private INoiseField NoiseField1; private INoiseField NoiseField2; private LocalFile LocalFile; private List PlayerCameras = new List(); private List SpawnedChunks = new List(); private List LastChunkSpacePOS = new List(); private List HeightMapDataStorage = new List(); private List MaterialMapDataStorage = new List(); private List VoidDataStorage = new List(); private int RenderDistance; private int DataStorageSize; private int FramesCount = 0; void WriteToFile() { LocalFile.Save( ExportConfigName, HeightCurve, Noise1Type, Noise1Seed, Noise1Weight, Noise1Frequency, Noise2Type, Noise2Seed, Noise2Weight, Noise2Frequency, Noise3Type, Noise3Seed, Noise3Weight, Noise3Frequency, FalloffMapSize ); ExportToConfigFileNow = false; } void LoadData() { if( LoadConfigFromFile ) { float[] NoiseFloats = new float[9]; Curve[] NoiseCurves = new Curve[4]; Log.Info( "PreLoad" ); LocalFile.Load( ConfigFileName, out NoiseFloats, out NoiseCurves ); Log.Info( "PostLoad" ); HeightCurve = NoiseCurves[0]; Noise1Weight = NoiseCurves[1]; Noise2Weight = NoiseCurves[2]; Noise3Weight = NoiseCurves[3]; Log.Info( "CurveLoad" ); Noise1Type = (int)NoiseFloats[0]; Noise1Seed = (int)NoiseFloats[1]; Noise1Frequency = NoiseFloats[2]; Noise2Type = (int)NoiseFloats[3]; Noise2Seed = (int)NoiseFloats[4]; Noise2Frequency = NoiseFloats[5]; Noise3Type = (int)NoiseFloats[6]; Noise3Seed = (int)NoiseFloats[7]; Noise3Frequency = NoiseFloats[8]; FalloffMapSize = (int)NoiseFloats[9]; Log.Info( "FloatLoad" ); } } Vector2 FindVector2( int pos ) { int Y = pos / Resolution; int X = pos % Resolution; return new Vector2( X, Y ); } Vector2 FindVector2ForExport( int pos ) { int Y = pos / (ExportHeightMapSize * 256); int X = pos % (ExportHeightMapSize * 256); return new Vector2( X, Y ); } int FindIntPosForDataSpace( Vector2 pos) { int temp = 0; temp += (int)pos.x; temp += (int)( pos.y * ((RenderDistance * 2) + 1 + 4 )); return temp; } Vector2 FindDataSpaceVector2FromInt( int pos ) { int Y = pos / ((RenderDistance * 2) + 1 + 4 ); int X = pos % ((RenderDistance * 2) + 1 + 4 ); return new Vector2( X, Y ); } Vector2 IntToChunkSpace( int Pos) { Vector2 temp = 0; int Y = Pos / (RenderDistance + RenderDistance + 1); int X = Pos % (RenderDistance + RenderDistance + 1); Vector2 DataPosCorrected = new Vector2( -((RenderDistance) ), -((RenderDistance) ) ) + new Vector2( X, Y); temp = DataPosCorrected; return temp; } Vector2 DataSpaceToChunkSpace( Vector2 DataPos, Vector2 CenterOfChunks ) { Vector2 temp = 0; Vector2 DataPosCorrected = new Vector2( -((RenderDistance) + 1 + 2), -((RenderDistance) + 1 + 2) ) + DataPos; temp = CenterOfChunks + DataPosCorrected; return temp; } Vector2 ChunkSpaceToDataSpace( Vector2 ChunkPos) { Vector2 Temp = 0; Temp = ChunkPos; Temp = new Vector2( ((RenderDistance) + 2), ((RenderDistance) + 2) ) + Temp; return Temp; } Vector2 FindChunkPOSFromWorldSpace( Vector3 WorldSpacePos ) { int Y = (int)Math.Ceiling( (WorldSpacePos.y - 2500) / ChunkSpaceing ); int X = (int)Math.Ceiling( (WorldSpacePos.x - 2500) / ChunkSpaceing ); return new Vector2( X, Y ); } Vector3 ConvertChunkSpaceToWorldSpace( Vector3 ChunkSpace ) { Vector3 Temp = 0; Temp = new Vector3( (ChunkSpace.x * ChunkSpaceing) - (ChunkSpaceing / 2), (ChunkSpace.y * ChunkSpaceing) - (ChunkSpaceing / 2), 0 ); return Temp; } GameObject CheckIfChunkExists( Vector2 ChunkSpacePos ) { GameObject temp = null; Vector3 WorldSpacePOS = new Vector3( ChunkSpacePos.x * ChunkSpaceing, ChunkSpacePos.y * ChunkSpaceing, 0 ); var Ray = Scene.Trace.Ray( new Vector3( WorldSpacePOS.x, WorldSpacePOS.y, -500 ), new Vector3( WorldSpacePOS.x, WorldSpacePOS.y, 1000 ) ) .WithTag( "terrain" ) .Size( 5f ) .Run(); if ( Ray.GameObject != null ) { temp = Ray.GameObject; } return temp; } void Sample16Pixels( int pos, Vector2 offset, out byte[] bytes, out byte[] MaterialBytes ) { float[] floats = new float[16]; bytes = new byte[16]; MaterialBytes = new byte[16]; Vector2 Vect2Pos = FindVector2( pos ); Vector2 Vect2Pos1 = FindVector2( pos + 1 ); Vector2 Vect2Pos2 = FindVector2( pos + 2 ); Vector2 Vect2Pos3 = FindVector2( pos + 3 ); Vector2 Vect2Pos4 = FindVector2( pos + 4 ); Vector2 Vect2Pos5 = FindVector2( pos + 5 ); Vector2 Vect2Pos6 = FindVector2( pos + 6 ); Vector2 Vect2Pos7 = FindVector2( pos + 7 ); Vector2 Vect2Pos8 = FindVector2( pos + 8 ); Vector2 Vect2Pos9 = FindVector2( pos + 9 ); Vector2 Vect2Pos10 = FindVector2( pos + 10 ); Vector2 Vect2Pos11 = FindVector2( pos + 11 ); Vector2 Vect2Pos12 = FindVector2( pos + 12 ); Vector2 Vect2Pos13 = FindVector2( pos + 13 ); Vector2 Vect2Pos14 = FindVector2( pos + 14 ); Vector2 Vect2Pos15 = FindVector2( pos + 15 ); Vect2Pos = new Vector2( Vect2Pos.x + offset.x, Vect2Pos.y + offset.y ); Vect2Pos1 = new Vector2( Vect2Pos1.x + offset.x, Vect2Pos1.y + offset.y ); Vect2Pos2 = new Vector2( Vect2Pos2.x + offset.x, Vect2Pos2.y + offset.y ); Vect2Pos3 = new Vector2( Vect2Pos3.x + offset.x, Vect2Pos3.y + offset.y ); Vect2Pos4 = new Vector2( Vect2Pos4.x + offset.x, Vect2Pos4.y + offset.y ); Vect2Pos5 = new Vector2( Vect2Pos5.x + offset.x, Vect2Pos5.y + offset.y ); Vect2Pos6 = new Vector2( Vect2Pos6.x + offset.x, Vect2Pos6.y + offset.y ); Vect2Pos7 = new Vector2( Vect2Pos7.x + offset.x, Vect2Pos7.y + offset.y ); Vect2Pos8 = new Vector2( Vect2Pos8.x + offset.x, Vect2Pos8.y + offset.y ); Vect2Pos9 = new Vector2( Vect2Pos9.x + offset.x, Vect2Pos9.y + offset.y ); Vect2Pos10 = new Vector2( Vect2Pos10.x + offset.x, Vect2Pos10.y + offset.y ); Vect2Pos11 = new Vector2( Vect2Pos11.x + offset.x, Vect2Pos11.y + offset.y ); Vect2Pos12 = new Vector2( Vect2Pos12.x + offset.x, Vect2Pos12.y + offset.y ); Vect2Pos13 = new Vector2( Vect2Pos13.x + offset.x, Vect2Pos13.y + offset.y ); Vect2Pos14 = new Vector2( Vect2Pos14.x + offset.x, Vect2Pos14.y + offset.y ); Vect2Pos15 = new Vector2( Vect2Pos15.x + offset.x, Vect2Pos15.y + offset.y ); floats[0] = (NoiseField.Sample( Vect2Pos ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos ))); floats[0] += (NoiseField1.Sample( Vect2Pos ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos )) ); floats[0] += (NoiseField2.Sample(Vect2Pos) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos)))); floats[1] = (NoiseField.Sample(Vect2Pos1) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos1))); floats[1] += (NoiseField1.Sample(Vect2Pos1) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos1))); floats[1] += (NoiseField2.Sample(Vect2Pos1) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos1)))); floats[2] = (NoiseField.Sample(Vect2Pos2) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos2))); floats[2] += (NoiseField1.Sample(Vect2Pos2) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos2))); floats[2] += (NoiseField2.Sample(Vect2Pos2) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos2)))); floats[3] = (NoiseField.Sample(Vect2Pos3) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos3))); floats[3] += (NoiseField1.Sample(Vect2Pos3) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos3))); floats[3] += (NoiseField2.Sample(Vect2Pos3) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos3)))); floats[4] = (NoiseField.Sample(Vect2Pos4) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos4))); floats[4] += (NoiseField1.Sample(Vect2Pos4) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos4))); floats[4] += (NoiseField2.Sample(Vect2Pos4) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos4)))); floats[5] = (NoiseField.Sample(Vect2Pos5) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos5))); floats[5] += (NoiseField1.Sample(Vect2Pos5) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos5))); floats[5] += (NoiseField2.Sample(Vect2Pos5) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos5)))); floats[6] = (NoiseField.Sample(Vect2Pos6) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos6))); floats[6] += (NoiseField1.Sample(Vect2Pos6) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos6))); floats[6] += (NoiseField2.Sample(Vect2Pos6) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos6)))); floats[7] = (NoiseField.Sample(Vect2Pos7) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos7))); floats[7] += (NoiseField1.Sample(Vect2Pos7) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos7))); floats[7] += (NoiseField2.Sample(Vect2Pos7) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos7)))); floats[8] = (NoiseField.Sample(Vect2Pos8) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos8))); floats[8] += (NoiseField1.Sample(Vect2Pos8) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos8))); floats[8] += (NoiseField2.Sample(Vect2Pos8) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos8)))); floats[9] = (NoiseField.Sample(Vect2Pos9) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos9))); floats[9] += (NoiseField1.Sample(Vect2Pos9) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos9))); floats[9] += (NoiseField2.Sample(Vect2Pos9) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos9)))); floats[10] = (NoiseField.Sample(Vect2Pos10) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos10))); floats[10] += (NoiseField1.Sample(Vect2Pos10) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos10))); floats[10] += (NoiseField2.Sample(Vect2Pos10) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos10)))); floats[11] = (NoiseField.Sample(Vect2Pos11) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos11))); floats[11] += (NoiseField1.Sample(Vect2Pos11) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos11))); floats[11] += (NoiseField2.Sample(Vect2Pos11) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos11)))); floats[12] = (NoiseField.Sample(Vect2Pos12) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos12))); floats[12] += (NoiseField1.Sample(Vect2Pos12) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos12))); floats[12] += (NoiseField2.Sample(Vect2Pos12) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos12)))); floats[13] = (NoiseField.Sample(Vect2Pos13) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos13))); floats[13] += (NoiseField1.Sample(Vect2Pos13) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos13))); floats[13] += (NoiseField2.Sample(Vect2Pos13) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos13)))); floats[14] = (NoiseField.Sample(Vect2Pos14) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos14))); floats[14] += (NoiseField1.Sample(Vect2Pos14) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos14))); floats[14] += (NoiseField2.Sample(Vect2Pos14) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos14)))); floats[15] = (NoiseField.Sample(Vect2Pos15) * Noise1Weight.Evaluate(NoiseField.Sample(Vect2Pos15))); floats[15] += (NoiseField1.Sample(Vect2Pos15) * Noise2Weight.Evaluate(NoiseField1.Sample(Vect2Pos15))); floats[15] += (NoiseField2.Sample(Vect2Pos15) * (Noise3Weight.Evaluate(NoiseField2.Sample(Vect2Pos15)))); if( FalloffMapSize != 0 ) { Vector2 zero = new Vector2( 128, 128 ); int multiAmount = 50000; floats[0] -= (Vector2.DistanceBetweenSquared(Vect2Pos, zero) / ( FalloffMapSize * multiAmount)); floats[1] -= (Vector2.DistanceBetweenSquared(Vect2Pos1, zero) / ( FalloffMapSize * multiAmount)); floats[2] -= (Vector2.DistanceBetweenSquared(Vect2Pos2, zero) / ( FalloffMapSize * multiAmount)); floats[3] -= (Vector2.DistanceBetweenSquared(Vect2Pos3, zero) / ( FalloffMapSize * multiAmount)); floats[4] -= (Vector2.DistanceBetweenSquared(Vect2Pos4, zero) / ( FalloffMapSize * multiAmount)); floats[5] -= (Vector2.DistanceBetweenSquared(Vect2Pos5, zero) / ( FalloffMapSize * multiAmount)); floats[6] -= (Vector2.DistanceBetweenSquared(Vect2Pos6, zero) / ( FalloffMapSize * multiAmount)); floats[7] -= (Vector2.DistanceBetweenSquared(Vect2Pos7, zero) / ( FalloffMapSize * multiAmount)); floats[8] -= (Vector2.DistanceBetweenSquared(Vect2Pos8, zero) / ( FalloffMapSize * multiAmount)); floats[9] -= (Vector2.DistanceBetweenSquared(Vect2Pos9, zero) / ( FalloffMapSize * multiAmount)); floats[10] -= (Vector2.DistanceBetweenSquared(Vect2Pos10, zero) / ( FalloffMapSize * multiAmount)); floats[11] -= (Vector2.DistanceBetweenSquared(Vect2Pos11, zero) / ( FalloffMapSize * multiAmount)); floats[12] -= (Vector2.DistanceBetweenSquared(Vect2Pos12, zero) / ( FalloffMapSize * multiAmount)); floats[13] -= (Vector2.DistanceBetweenSquared(Vect2Pos13, zero) / ( FalloffMapSize * multiAmount)); floats[14] -= (Vector2.DistanceBetweenSquared(Vect2Pos14, zero) / ( FalloffMapSize * multiAmount)); floats[15] -= (Vector2.DistanceBetweenSquared(Vect2Pos15, zero) / ( FalloffMapSize * multiAmount)); } bytes[0] = (byte)((Math.Clamp( floats[0] * HeightCurve.Evaluate( floats[0] ) * 255, 0, 255 ))); bytes[1] = (byte)((Math.Clamp( floats[1] * HeightCurve.Evaluate( floats[1] ) * 255, 0, 255 ))); bytes[2] = (byte)((Math.Clamp( floats[2] * HeightCurve.Evaluate( floats[2] ) * 255, 0, 255 ))); bytes[3] = (byte)((Math.Clamp( floats[3] * HeightCurve.Evaluate( floats[3] ) * 255, 0, 255 ))); bytes[4] = (byte)((Math.Clamp( floats[4] * HeightCurve.Evaluate( floats[4] ) * 255, 0, 255 ))); bytes[5] = (byte)((Math.Clamp( floats[5] * HeightCurve.Evaluate( floats[5] ) * 255, 0, 255 ))); bytes[6] = (byte)((Math.Clamp( floats[6] * HeightCurve.Evaluate( floats[6] ) * 255, 0, 255 ))); bytes[7] = (byte)((Math.Clamp( floats[7] * HeightCurve.Evaluate( floats[7] ) * 255, 0, 255 ))); bytes[8] = (byte)((Math.Clamp( floats[8] * HeightCurve.Evaluate( floats[8] ) * 255, 0, 255 ))); bytes[9] = (byte)((Math.Clamp( floats[9] * HeightCurve.Evaluate( floats[9] ) * 255, 0, 255 ))); bytes[10] = (byte)((Math.Clamp( floats[10] * HeightCurve.Evaluate( floats[10] ) * 255, 0, 255 ))); bytes[11] = (byte)((Math.Clamp( floats[11] * HeightCurve.Evaluate( floats[11] ) * 255, 0, 255 ))); bytes[12] = (byte)((Math.Clamp( floats[12] * HeightCurve.Evaluate( floats[12] ) * 255, 0, 255 ))); bytes[13] = (byte)((Math.Clamp( floats[13] * HeightCurve.Evaluate( floats[13] ) * 255, 0, 255 ))); bytes[14] = (byte)((Math.Clamp( floats[14] * HeightCurve.Evaluate( floats[14] ) * 255, 0, 255 ))); bytes[15] = (byte)((Math.Clamp( floats[15] * HeightCurve.Evaluate( floats[15] ) * 255, 0, 255 ))); MaterialBytes[0] = (byte)(Math.Clamp( floats[0] * 255, 0, 255 )); MaterialBytes[1] = (byte)(Math.Clamp( floats[1] * 255, 0, 255 )); MaterialBytes[2] = (byte)(Math.Clamp( floats[2] * 255, 0, 255 )); MaterialBytes[3] = (byte)(Math.Clamp( floats[3] * 255, 0, 255 )); MaterialBytes[4] = (byte)(Math.Clamp( floats[4] * 255, 0, 255 )); MaterialBytes[5] = (byte)(Math.Clamp( floats[5] * 255, 0, 255 )); MaterialBytes[6] = (byte)(Math.Clamp( floats[6] * 255, 0, 255 )); MaterialBytes[7] = (byte)(Math.Clamp( floats[7] * 255, 0, 255 )); MaterialBytes[8] = (byte)(Math.Clamp( floats[8] * 255, 0, 255 )); MaterialBytes[9] = (byte)(Math.Clamp( floats[9] * 255, 0, 255 )); MaterialBytes[10] = (byte)(Math.Clamp( floats[10] * 255, 0, 255 )); MaterialBytes[11] = (byte)(Math.Clamp( floats[11] * 255, 0, 255 )); MaterialBytes[12] = (byte)(Math.Clamp( floats[12] * 255, 0, 255 )); MaterialBytes[13] = (byte)(Math.Clamp( floats[13] * 255, 0, 255 )); MaterialBytes[14] = (byte)(Math.Clamp( floats[14] * 255, 0, 255 )); MaterialBytes[15] = (byte)(Math.Clamp( floats[15] * 255, 0, 255 )); } void Sample16PixelsForExport( int pos, Vector2 offset, out byte[] bytes, out byte[] MaterialBytes ) { float[] floats = new float[16]; bytes = new byte[16]; MaterialBytes = new byte[16]; Vector2 Vect2Pos = FindVector2ForExport( pos ); Vector2 Vect2Pos1 = FindVector2ForExport( pos + 1 ); Vector2 Vect2Pos2 = FindVector2ForExport( pos + 2 ); Vector2 Vect2Pos3 = FindVector2ForExport( pos + 3 ); Vector2 Vect2Pos4 = FindVector2ForExport( pos + 4 ); Vector2 Vect2Pos5 = FindVector2ForExport( pos + 5 ); Vector2 Vect2Pos6 = FindVector2ForExport( pos + 6 ); Vector2 Vect2Pos7 = FindVector2ForExport( pos + 7 ); Vector2 Vect2Pos8 = FindVector2ForExport( pos + 8 ); Vector2 Vect2Pos9 = FindVector2ForExport( pos + 9 ); Vector2 Vect2Pos10 = FindVector2ForExport( pos + 10 ); Vector2 Vect2Pos11 = FindVector2ForExport( pos + 11 ); Vector2 Vect2Pos12 = FindVector2ForExport( pos + 12 ); Vector2 Vect2Pos13 = FindVector2ForExport( pos + 13 ); Vector2 Vect2Pos14 = FindVector2ForExport( pos + 14 ); Vector2 Vect2Pos15 = FindVector2ForExport( pos + 15 ); Vect2Pos = new Vector2( Vect2Pos.x + offset.x, Vect2Pos.y + offset.y ); Vect2Pos1 = new Vector2( Vect2Pos1.x + offset.x, Vect2Pos1.y + offset.y ); Vect2Pos2 = new Vector2( Vect2Pos2.x + offset.x, Vect2Pos2.y + offset.y ); Vect2Pos3 = new Vector2( Vect2Pos3.x + offset.x, Vect2Pos3.y + offset.y ); Vect2Pos4 = new Vector2( Vect2Pos4.x + offset.x, Vect2Pos4.y + offset.y ); Vect2Pos5 = new Vector2( Vect2Pos5.x + offset.x, Vect2Pos5.y + offset.y ); Vect2Pos6 = new Vector2( Vect2Pos6.x + offset.x, Vect2Pos6.y + offset.y ); Vect2Pos7 = new Vector2( Vect2Pos7.x + offset.x, Vect2Pos7.y + offset.y ); Vect2Pos8 = new Vector2( Vect2Pos8.x + offset.x, Vect2Pos8.y + offset.y ); Vect2Pos9 = new Vector2( Vect2Pos9.x + offset.x, Vect2Pos9.y + offset.y ); Vect2Pos10 = new Vector2( Vect2Pos10.x + offset.x, Vect2Pos10.y + offset.y ); Vect2Pos11 = new Vector2( Vect2Pos11.x + offset.x, Vect2Pos11.y + offset.y ); Vect2Pos12 = new Vector2( Vect2Pos12.x + offset.x, Vect2Pos12.y + offset.y ); Vect2Pos13 = new Vector2( Vect2Pos13.x + offset.x, Vect2Pos13.y + offset.y ); Vect2Pos14 = new Vector2( Vect2Pos14.x + offset.x, Vect2Pos14.y + offset.y ); Vect2Pos15 = new Vector2( Vect2Pos15.x + offset.x, Vect2Pos15.y + offset.y ); floats[0] = (NoiseField.Sample( Vect2Pos ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos ) )); floats[0] += (NoiseField1.Sample( Vect2Pos ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos ) )); floats[0] += (NoiseField2.Sample( Vect2Pos ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos ) ))); floats[1] = (NoiseField.Sample( Vect2Pos1 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos1 ) )); floats[1] += (NoiseField1.Sample( Vect2Pos1 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos1 ) )); floats[1] += (NoiseField2.Sample( Vect2Pos1 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos1 ) ))); floats[2] = (NoiseField.Sample( Vect2Pos2 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos2 ) )); floats[2] += (NoiseField1.Sample( Vect2Pos2 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos2 ) )); floats[2] += (NoiseField2.Sample( Vect2Pos2 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos2 ) ))); floats[3] = (NoiseField.Sample( Vect2Pos3 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos3 ) )); floats[3] += (NoiseField1.Sample( Vect2Pos3 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos3 ) )); floats[3] += (NoiseField2.Sample( Vect2Pos3 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos3 ) ))); floats[4] = (NoiseField.Sample( Vect2Pos4 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos4 ) )); floats[4] += (NoiseField1.Sample( Vect2Pos4 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos4 ) )); floats[4] += (NoiseField2.Sample( Vect2Pos4 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos4 ) ))); floats[5] = (NoiseField.Sample( Vect2Pos5 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos5 ) )); floats[5] += (NoiseField1.Sample( Vect2Pos5 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos5 ) )); floats[5] += (NoiseField2.Sample( Vect2Pos5 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos5 ) ))); floats[6] = (NoiseField.Sample( Vect2Pos6 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos6 ) )); floats[6] += (NoiseField1.Sample( Vect2Pos6 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos6 ) )); floats[6] += (NoiseField2.Sample( Vect2Pos6 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos6 ) ))); floats[7] = (NoiseField.Sample( Vect2Pos7 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos7 ) )); floats[7] += (NoiseField1.Sample( Vect2Pos7 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos7 ) )); floats[7] += (NoiseField2.Sample( Vect2Pos7 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos7 ) ))); floats[8] = (NoiseField.Sample( Vect2Pos8 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos8 ) )); floats[8] += (NoiseField1.Sample( Vect2Pos8 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos8 ) )); floats[8] += (NoiseField2.Sample( Vect2Pos8 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos8 ) ))); floats[9] = (NoiseField.Sample( Vect2Pos9 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos9 ) )); floats[9] += (NoiseField1.Sample( Vect2Pos9 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos9 ) )); floats[9] += (NoiseField2.Sample( Vect2Pos9 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos9 ) ))); floats[10] = (NoiseField.Sample( Vect2Pos10 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos10 ) )); floats[10] += (NoiseField1.Sample( Vect2Pos10 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos10 ) )); floats[10] += (NoiseField2.Sample( Vect2Pos10 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos10 ) ))); floats[11] = (NoiseField.Sample( Vect2Pos11 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos11 ) )); floats[11] += (NoiseField1.Sample( Vect2Pos11 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos11 ) )); floats[11] += (NoiseField2.Sample( Vect2Pos11 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos11 ) ))); floats[12] = (NoiseField.Sample( Vect2Pos12 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos12 ) )); floats[12] += (NoiseField1.Sample( Vect2Pos12 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos12 ) )); floats[12] += (NoiseField2.Sample( Vect2Pos12 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos12 ) ))); floats[13] = (NoiseField.Sample( Vect2Pos13 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos13 ) )); floats[13] += (NoiseField1.Sample( Vect2Pos13 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos13 ) )); floats[13] += (NoiseField2.Sample( Vect2Pos13 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos13 ) ))); floats[14] = (NoiseField.Sample( Vect2Pos14 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos14 ) )); floats[14] += (NoiseField1.Sample( Vect2Pos14 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos14 ) )); floats[14] += (NoiseField2.Sample( Vect2Pos14 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos14 ) ))); floats[15] = (NoiseField.Sample( Vect2Pos15 ) * Noise1Weight.Evaluate( NoiseField.Sample( Vect2Pos15 ) )); floats[15] += (NoiseField1.Sample( Vect2Pos15 ) * Noise2Weight.Evaluate( NoiseField1.Sample( Vect2Pos15 ) )); floats[15] += (NoiseField2.Sample( Vect2Pos15 ) * (Noise3Weight.Evaluate( NoiseField2.Sample( Vect2Pos15 ) ))); if (FalloffMapSize != 0) { Vector2 zero = new Vector2(128, 128); int multiAmount = 50000; floats[0] -= (Vector2.DistanceBetweenSquared(Vect2Pos, zero) / (FalloffMapSize * multiAmount)); floats[1] -= (Vector2.DistanceBetweenSquared(Vect2Pos1, zero) / (FalloffMapSize * multiAmount)); floats[2] -= (Vector2.DistanceBetweenSquared(Vect2Pos2, zero) / (FalloffMapSize * multiAmount)); floats[3] -= (Vector2.DistanceBetweenSquared(Vect2Pos3, zero) / (FalloffMapSize * multiAmount)); floats[4] -= (Vector2.DistanceBetweenSquared(Vect2Pos4, zero) / (FalloffMapSize * multiAmount)); floats[5] -= (Vector2.DistanceBetweenSquared(Vect2Pos5, zero) / (FalloffMapSize * multiAmount)); floats[6] -= (Vector2.DistanceBetweenSquared(Vect2Pos6, zero) / (FalloffMapSize * multiAmount)); floats[7] -= (Vector2.DistanceBetweenSquared(Vect2Pos7, zero) / (FalloffMapSize * multiAmount)); floats[8] -= (Vector2.DistanceBetweenSquared(Vect2Pos8, zero) / (FalloffMapSize * multiAmount)); floats[9] -= (Vector2.DistanceBetweenSquared(Vect2Pos9, zero) / (FalloffMapSize * multiAmount)); floats[10] -= (Vector2.DistanceBetweenSquared(Vect2Pos10, zero) / (FalloffMapSize * multiAmount)); floats[11] -= (Vector2.DistanceBetweenSquared(Vect2Pos11, zero) / (FalloffMapSize * multiAmount)); floats[12] -= (Vector2.DistanceBetweenSquared(Vect2Pos12, zero) / (FalloffMapSize * multiAmount)); floats[13] -= (Vector2.DistanceBetweenSquared(Vect2Pos13, zero) / (FalloffMapSize * multiAmount)); floats[14] -= (Vector2.DistanceBetweenSquared(Vect2Pos14, zero) / (FalloffMapSize * multiAmount)); floats[15] -= (Vector2.DistanceBetweenSquared(Vect2Pos15, zero) / (FalloffMapSize * multiAmount)); } bytes[0] = (byte)((Math.Clamp( floats[0] * HeightCurve.Evaluate( floats[0] ) * 255, 0, 255))); bytes[1] = (byte)((Math.Clamp( floats[1] * HeightCurve.Evaluate( floats[1] ) * 255, 0, 255 ))); bytes[2] = (byte)((Math.Clamp( floats[2] * HeightCurve.Evaluate( floats[2] ) * 255, 0, 255 ))); bytes[3] = (byte)((Math.Clamp( floats[3] * HeightCurve.Evaluate( floats[3] ) * 255, 0, 255 ))); bytes[4] = (byte)((Math.Clamp( floats[4] * HeightCurve.Evaluate( floats[4] ) * 255, 0, 255 ))); bytes[5] = (byte)((Math.Clamp( floats[5] * HeightCurve.Evaluate( floats[5] ) * 255, 0, 255 ))); bytes[6] = (byte)((Math.Clamp( floats[6] * HeightCurve.Evaluate( floats[6] ) * 255, 0, 255 ))); bytes[7] = (byte)((Math.Clamp(floats[7] * HeightCurve.Evaluate(floats[7]) * 255, 0, 255))); bytes[8] = (byte)((Math.Clamp(floats[8] * HeightCurve.Evaluate(floats[8]) * 255, 0, 255))); bytes[9] = (byte)((Math.Clamp(floats[9] * HeightCurve.Evaluate(floats[9]) * 255, 0, 255))); bytes[10] = (byte)((Math.Clamp(floats[10] * HeightCurve.Evaluate(floats[10]) * 255, 0, 255))); bytes[11] = (byte)((Math.Clamp(floats[11] * HeightCurve.Evaluate(floats[11]) * 255, 0, 255))); bytes[12] = (byte)((Math.Clamp(floats[12] * HeightCurve.Evaluate(floats[12]) * 255, 0, 255))); bytes[13] = (byte)((Math.Clamp(floats[13] * HeightCurve.Evaluate(floats[13]) * 255, 0, 255))); bytes[14] = (byte)((Math.Clamp(floats[14] * HeightCurve.Evaluate(floats[14]) * 255, 0, 255))); bytes[15] = (byte)((Math.Clamp(floats[15] * HeightCurve.Evaluate(floats[15]) * 255, 0, 255))); MaterialBytes[0] = (byte)(Math.Clamp( floats[0] * 255 , 0, 255)); MaterialBytes[1] = (byte)(Math.Clamp( floats[1] * 255, 0, 255 )); MaterialBytes[2] = (byte)(Math.Clamp(floats[2] * 255, 0, 255)); MaterialBytes[3] = (byte)(Math.Clamp(floats[3] * 255, 0, 255)); MaterialBytes[4] = (byte)(Math.Clamp(floats[4] * 255, 0, 255)); MaterialBytes[5] = (byte)(Math.Clamp(floats[5] * 255, 0, 255)); MaterialBytes[6] = (byte)(Math.Clamp(floats[6] * 255, 0, 255)); MaterialBytes[7] = (byte)(Math.Clamp(floats[7] * 255, 0, 255)); MaterialBytes[8] = (byte)(Math.Clamp(floats[8] * 255, 0, 255)); MaterialBytes[9] = (byte)(Math.Clamp(floats[9] * 255, 0, 255)); MaterialBytes[10] = (byte)(Math.Clamp(floats[10] * 255, 0, 255)); MaterialBytes[11] = (byte)(Math.Clamp(floats[11] * 255, 0, 255)); MaterialBytes[12] = (byte)(Math.Clamp(floats[12] * 255, 0, 255)); MaterialBytes[13] = (byte)(Math.Clamp(floats[13] * 255, 0, 255)); MaterialBytes[14] = (byte)(Math.Clamp(floats[14] * 255, 0, 255)); MaterialBytes[15] = (byte)(Math.Clamp(floats[15] * 255, 0, 255)); } void Format16NoiseVariable( byte[] FuncOutput, byte[] MatFuncOutput, out byte[] NoiseDataSolo, out byte[] NoiseData ) { NoiseDataSolo = new byte[32]; NoiseData = new byte[64]; NoiseDataSolo[0] = FuncOutput[0]; NoiseDataSolo[1] = FuncOutput[0]; NoiseDataSolo[2] = FuncOutput[1]; NoiseDataSolo[3] = FuncOutput[1]; NoiseDataSolo[4] = FuncOutput[2]; NoiseDataSolo[5] = FuncOutput[2]; NoiseDataSolo[6] = FuncOutput[3]; NoiseDataSolo[7] = FuncOutput[3]; NoiseDataSolo[8] = FuncOutput[4]; NoiseDataSolo[9] = FuncOutput[4]; NoiseDataSolo[10] = FuncOutput[5]; NoiseDataSolo[11] = FuncOutput[5]; NoiseDataSolo[12] = FuncOutput[6]; NoiseDataSolo[13] = FuncOutput[6]; NoiseDataSolo[14] = FuncOutput[7]; NoiseDataSolo[15] = FuncOutput[7]; NoiseDataSolo[16] = FuncOutput[8]; NoiseDataSolo[17] = FuncOutput[8]; NoiseDataSolo[18] = FuncOutput[9]; NoiseDataSolo[19] = FuncOutput[9]; NoiseDataSolo[20] = FuncOutput[10]; NoiseDataSolo[21] = FuncOutput[10]; NoiseDataSolo[22] = FuncOutput[11]; NoiseDataSolo[23] = FuncOutput[11]; NoiseDataSolo[24] = FuncOutput[12]; NoiseDataSolo[25] = FuncOutput[12]; NoiseDataSolo[26] = FuncOutput[13]; NoiseDataSolo[27] = FuncOutput[13]; NoiseDataSolo[28] = FuncOutput[14]; NoiseDataSolo[29] = FuncOutput[14]; NoiseDataSolo[30] = FuncOutput[15]; NoiseDataSolo[31] = FuncOutput[15]; NoiseData[0] = MatFuncOutput[0]; NoiseData[1] = MatFuncOutput[0]; NoiseData[2] = MatFuncOutput[0]; NoiseData[3] = MatFuncOutput[0]; NoiseData[4] = MatFuncOutput[1]; NoiseData[5] = MatFuncOutput[1]; NoiseData[6] = MatFuncOutput[1]; NoiseData[7] = MatFuncOutput[1]; NoiseData[8] = MatFuncOutput[2]; NoiseData[9] = MatFuncOutput[2]; NoiseData[10] = MatFuncOutput[2]; NoiseData[11] = MatFuncOutput[2]; NoiseData[12] = MatFuncOutput[3]; NoiseData[13] = MatFuncOutput[3]; NoiseData[14] = MatFuncOutput[3]; NoiseData[15] = MatFuncOutput[3]; NoiseData[16] = MatFuncOutput[4]; NoiseData[17] = MatFuncOutput[4]; NoiseData[18] = MatFuncOutput[4]; NoiseData[19] = MatFuncOutput[4]; NoiseData[20] = MatFuncOutput[5]; NoiseData[21] = MatFuncOutput[5]; NoiseData[22] = MatFuncOutput[5]; NoiseData[23] = MatFuncOutput[5]; NoiseData[24] = MatFuncOutput[6]; NoiseData[25] = MatFuncOutput[6]; NoiseData[26] = MatFuncOutput[6]; NoiseData[27] = MatFuncOutput[6]; NoiseData[28] = MatFuncOutput[7]; NoiseData[29] = MatFuncOutput[7]; NoiseData[30] = MatFuncOutput[7]; NoiseData[31] = MatFuncOutput[7]; NoiseData[32] = MatFuncOutput[8]; NoiseData[33] = MatFuncOutput[8]; NoiseData[34] = MatFuncOutput[8]; NoiseData[35] = MatFuncOutput[8]; NoiseData[36] = MatFuncOutput[9]; NoiseData[37] = MatFuncOutput[9]; NoiseData[38] = MatFuncOutput[9]; NoiseData[39] = MatFuncOutput[9]; NoiseData[40] = MatFuncOutput[10]; NoiseData[41] = MatFuncOutput[10]; NoiseData[42] = MatFuncOutput[10]; NoiseData[43] = MatFuncOutput[10]; NoiseData[44] = MatFuncOutput[11]; NoiseData[45] = MatFuncOutput[11]; NoiseData[46] = MatFuncOutput[11]; NoiseData[47] = MatFuncOutput[11]; NoiseData[48] = MatFuncOutput[12]; NoiseData[49] = MatFuncOutput[12]; NoiseData[50] = MatFuncOutput[12]; NoiseData[51] = MatFuncOutput[12]; NoiseData[52] = MatFuncOutput[13]; NoiseData[53] = MatFuncOutput[13]; NoiseData[54] = MatFuncOutput[13]; NoiseData[55] = MatFuncOutput[13]; NoiseData[56] = MatFuncOutput[14]; NoiseData[57] = MatFuncOutput[14]; NoiseData[58] = MatFuncOutput[14]; NoiseData[59] = MatFuncOutput[14]; NoiseData[60] = MatFuncOutput[15]; NoiseData[61] = MatFuncOutput[15]; NoiseData[62] = MatFuncOutput[15]; NoiseData[63] = MatFuncOutput[15]; } void SampleAndFormat256( int i, Vector2 Offset, out byte[] NoiseData, out byte[] SoloNoiseData ) { List SoloNoiseList = new List(); List NoiseList = new List(); byte[] temp1 = new byte[32]; byte[] temp2 = new byte[64]; byte[] FuncOutput = new byte[32]; byte[] MatFuncOutput = new byte[64]; Sample16Pixels( i, Offset, out FuncOutput, out MatFuncOutput ); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels( i + 16, Offset, out FuncOutput, out MatFuncOutput ); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 32, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels( i + 48, Offset, out FuncOutput, out MatFuncOutput ); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 64, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels( i + 80, Offset, out FuncOutput, out MatFuncOutput ); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 96, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 112, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 128, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 144, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 160, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 176, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 192, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 208, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 224, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); Sample16Pixels(i + 240, Offset, out FuncOutput, out MatFuncOutput); Format16NoiseVariable( FuncOutput, MatFuncOutput, out temp1, out temp2 ); SoloNoiseList.AddRange( temp1 ); NoiseList.AddRange( temp2 ); NoiseData = NoiseList.ToArray(); SoloNoiseData = SoloNoiseList.ToArray(); } void SetSeed() { LoadData(); lacunarity = .5f; Octaves = 3; Gain = 1; if ( Noise1Type == 0 ) { NoiseField = Noise.PerlinField( new Noise.FractalParameters( Noise1Seed, Noise1Frequency, 1, Gain, lacunarity ) ); } if ( Noise1Type == 1 ) { NoiseField = Noise.SimplexField( new Noise.FractalParameters( Noise1Seed, Noise1Frequency, 1, Gain, lacunarity ) ); } if ( Noise1Type == 2 ) { NoiseField = Noise.ValueField( new Noise.FractalParameters( Noise1Seed, Noise1Frequency, 1, Gain, lacunarity ) ); } if ( Noise2Type == 0 ) { NoiseField1 = Noise.PerlinField( new Noise.FractalParameters( Noise2Seed, Noise2Frequency, 1, Gain, lacunarity ) ); } if ( Noise2Type == 1 ) { NoiseField1 = Noise.SimplexField( new Noise.FractalParameters( Noise2Seed, Noise2Frequency, 1, Gain, lacunarity ) ); } if ( Noise2Type == 2 ) { NoiseField1 = Noise.ValueField( new Noise.FractalParameters( Noise2Seed, Noise2Frequency, 1, Gain, lacunarity ) ); } if ( Noise3Type == 0 ) { NoiseField2 = Noise.PerlinField( new Noise.FractalParameters( Noise3Seed, Noise3Frequency, 1, Gain, lacunarity ) ); } if ( Noise3Type == 1 ) { NoiseField2 = Noise.SimplexField( new Noise.FractalParameters( Noise3Seed, Noise3Frequency, 1, Gain, lacunarity ) ); } if ( Noise3Type == 2 ) { NoiseField2 = Noise.ValueField( new Noise.FractalParameters( Noise3Seed, Noise3Frequency, 1, Gain, lacunarity ) ); } } public void SearchForPlayerCameras() { var players = Scene.GetAllObjects( true ).Where( go => go.Tags.Has( "player" ) ); foreach ( var player in players ) { if ( player.Components.Get() != null ) { PlayerCameras.Add( player.Components.Get() ); LastChunkSpacePOS.Add( FindChunkPOSFromWorldSpace( player.Components.Get().WorldPosition ) ); } } RenderDistance = 2; } void RegenChunks() { SetSeed(); FillCache(); foreach ( GameObject chunk in SpawnedChunks ) { Vector2 pos = FindChunkPOSFromWorldSpace(chunk.WorldPosition); pos += new Vector2( 1, 1 ); pos = ChunkSpaceToDataSpace( pos ); int DataSpaceIndex = FindIntPosForDataSpace( pos ); Terrain Chunk = chunk.Components.Get(); Chunk.SyncGPUTexture(); //Chunk.Storage.SetResolution( Resolution ); Chunk.HeightMap.Update( HeightMapDataStorage[DataSpaceIndex], 0, 0, Resolution, Resolution ); Chunk.SyncCPUTexture( new Terrain.SyncFlags(), new RectInt( new Vector2Int( 0, 0 ), new Vector2Int( Resolution, Resolution ) ) ); Texture2DBuilder temp = new Texture2DBuilder().WithSize( Resolution, Resolution ); temp.WithData( MaterialMapDataStorage[DataSpaceIndex] ); temp.WithMips( 3 ); Texture Final = temp.Finish(); Material MatCopy = TerrainMat.CreateCopy(); MatCopy.Set( "NoiseTexture", Final ); Chunk.MaterialOverride = MatCopy; Chunk.ClipMapLodLevels = 6; Chunk.ClipMapLodExtentTexels = 256; Chunk.UpdateMaterialsBuffer(); } } void FillCache() { DataStorageSize = ((RenderDistance * 2) + 1 + 4); for ( int i = 0; i < (DataStorageSize * DataStorageSize); i++ ) { List NoiseDataSoloList = new List(); List NoiseDataList = new List(); Vector2 DataSpaceVec2 = FindDataSpaceVector2FromInt( i ); Vector2 ChunkSpace = DataSpaceToChunkSpace( DataSpaceVec2, new Vector2( 1, 1 ) ); Log.Info( ChunkSpace ); Vector2 PosToScan = ChunkSpace * 256; Log.Info( PosToScan ); for ( int j = 0; j < (Resolution * Resolution); j += 256 ) { byte[] SoloNoiseData = new byte[ Resolution * 2 ]; byte[] NoiseData = new byte[ Resolution * 4 ]; SampleAndFormat256( j, PosToScan, out NoiseData, out SoloNoiseData ); NoiseDataList.AddRange( NoiseData ); NoiseDataSoloList.AddRange( SoloNoiseData ); } HeightMapDataStorage.Insert( i, NoiseDataSoloList.ToArray() ); MaterialMapDataStorage.Insert(i, NoiseDataList.ToArray() ); } } void SpawnChunkWithData(Vector2 ChunkPos, byte[] NoiseDataSolo, byte[] NoiseData ) { Vector3 POS = ConvertChunkSpaceToWorldSpace( ChunkPos ); GameObject NewChunk = TerrainObj.Clone( POS ); NewChunk.Components.Get().Storage.SetResolution( Resolution ); NewChunk.Components.Get().TerrainSize = 5007; NewChunk.Components.Get().TerrainHeight = 1000; SpawnedChunks.Add( NewChunk ); NewChunk.BreakFromPrefab(); Log.Info( "Making Terrain" + " ___ " + NoiseDataSolo.Length.ToString() + " ___ " + NoiseData.Length.ToString() + " ___ " + NoiseDataSolo[0].ToString() + " ___ " + NoiseDataSolo[(Resolution*Resolution) - 1].ToString() ); Terrain Chunk = NewChunk.Components.Get(); Chunk.SyncGPUTexture(); //Chunk.Storage.SetResolution( Resolution ); Chunk.HeightMap.Update( NoiseDataSolo, 0, 0, Resolution, Resolution ); Chunk.SyncCPUTexture( new Terrain.SyncFlags(), new RectInt( new Vector2Int( 0, 0 ), new Vector2Int( Resolution, Resolution ) ) ); Texture2DBuilder temp = new Texture2DBuilder().WithSize( Resolution, Resolution ); temp.WithData( NoiseData ); temp.WithMips( 3 ); Texture Final = temp.Finish(); Material MatCopy = TerrainMat.CreateCopy(); MatCopy.Set( "NoiseTexture", Final ); Chunk.MaterialOverride = MatCopy; Chunk.ClipMapLodLevels = 6; Chunk.ClipMapLodExtentTexels = 256; Chunk.UpdateMaterialsBuffer(); } void OffsetCache( Vector2 TravelDirection ) { Vector2 StartChunk = 0; bool XAxis = false; bool IntIncrease = true; Log.Info("Start Offset"); if( TravelDirection.y == -1 ) { StartChunk = new Vector2( 0, 0 ); XAxis = true; IntIncrease = true; } if ( TravelDirection.y == 1 ) { StartChunk = new Vector2( 0, DataStorageSize - 1 ); XAxis = true; IntIncrease = false; } if ( TravelDirection.x == 1 ) { StartChunk = new Vector2( DataStorageSize - 1, 0 ); XAxis = false; IntIncrease = false; } if ( TravelDirection.x == -1 ) { StartChunk = new Vector2( 0, 0 ); XAxis = false; IntIncrease = true; } for ( int i = 0; i < DataStorageSize; i++ ) { if ( XAxis ) { if( IntIncrease ) { if ( i != DataStorageSize - 1 ) { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 1, 0 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 2, 0 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 3, 0 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 4, 0 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 5, 0 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 6, 0 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 7, 0 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 8, 0 ); Vector2 Pos0CopyFrom = StartChunk + new Vector2( 0, 1 ); Vector2 Pos1CopyFrom = StartChunk + new Vector2( 1, 1 ); Vector2 Pos2CopyFrom = StartChunk + new Vector2( 2, 1 ); Vector2 Pos3CopyFrom = StartChunk + new Vector2( 3, 1 ); Vector2 Pos4CopyFrom = StartChunk + new Vector2( 4, 1 ); Vector2 Pos5CopyFrom = StartChunk + new Vector2( 5, 1 ); Vector2 Pos6CopyFrom = StartChunk + new Vector2( 6, 1 ); Vector2 Pos7CopyFrom = StartChunk + new Vector2( 7, 1 ); Vector2 Pos8CopyFrom = StartChunk + new Vector2( 8, 1 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; if( i == 0 ) { if ( VoidDataStorage.Contains( Pos0CopyTo ) ) { VoidDataStorage.Remove( Pos0CopyTo ); } if ( VoidDataStorage.Contains( Pos1CopyTo ) ) { VoidDataStorage.Remove( Pos1CopyTo ); } if ( VoidDataStorage.Contains( Pos2CopyTo ) ) { VoidDataStorage.Remove( Pos2CopyTo ); } if ( VoidDataStorage.Contains( Pos3CopyTo ) ) { VoidDataStorage.Remove( Pos3CopyTo ); } if ( VoidDataStorage.Contains( Pos4CopyTo ) ) { VoidDataStorage.Remove( Pos4CopyTo ); } if ( VoidDataStorage.Contains( Pos5CopyTo ) ) { VoidDataStorage.Remove( Pos5CopyTo ); } if ( VoidDataStorage.Contains( Pos6CopyTo ) ) { VoidDataStorage.Remove( Pos6CopyTo ); } if ( VoidDataStorage.Contains( Pos7CopyTo ) ) { VoidDataStorage.Remove( Pos7CopyTo ); } if ( VoidDataStorage.Contains( Pos8CopyTo ) ) { VoidDataStorage.Remove( Pos8CopyTo ); } } StartChunk += new Vector2( 0, 1 ); } else { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 1, 0 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 2, 0 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 3, 0 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 4, 0 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 5, 0 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 6, 0 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 7, 0 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 8, 0 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 2]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 4]; VoidDataStorage.Add( Pos0CopyTo ); VoidDataStorage.Add( Pos1CopyTo ); VoidDataStorage.Add( Pos2CopyTo ); VoidDataStorage.Add( Pos3CopyTo ); VoidDataStorage.Add( Pos4CopyTo ); VoidDataStorage.Add( Pos5CopyTo ); VoidDataStorage.Add( Pos6CopyTo ); VoidDataStorage.Add( Pos7CopyTo ); VoidDataStorage.Add( Pos8CopyTo ); } } else { if ( i != DataStorageSize - 1 ) { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 1, 0 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 2, 0 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 3, 0 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 4, 0 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 5, 0 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 6, 0 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 7, 0 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 8, 0 ); Vector2 Pos0CopyFrom = StartChunk + new Vector2( 0, -1 ); Vector2 Pos1CopyFrom = StartChunk + new Vector2( 1, -1 ); Vector2 Pos2CopyFrom = StartChunk + new Vector2( 2, -1 ); Vector2 Pos3CopyFrom = StartChunk + new Vector2( 3, -1 ); Vector2 Pos4CopyFrom = StartChunk + new Vector2( 4, -1 ); Vector2 Pos5CopyFrom = StartChunk + new Vector2( 5, -1 ); Vector2 Pos6CopyFrom = StartChunk + new Vector2( 6, -1 ); Vector2 Pos7CopyFrom = StartChunk + new Vector2( 7, -1 ); Vector2 Pos8CopyFrom = StartChunk + new Vector2( 8, -1 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; if ( i == 0 ) { if ( VoidDataStorage.Contains( Pos0CopyTo ) ) { VoidDataStorage.Remove( Pos0CopyTo ); } if ( VoidDataStorage.Contains( Pos1CopyTo ) ) { VoidDataStorage.Remove( Pos1CopyTo ); } if ( VoidDataStorage.Contains( Pos2CopyTo ) ) { VoidDataStorage.Remove( Pos2CopyTo ); } if ( VoidDataStorage.Contains( Pos3CopyTo ) ) { VoidDataStorage.Remove( Pos3CopyTo ); } if ( VoidDataStorage.Contains( Pos4CopyTo ) ) { VoidDataStorage.Remove( Pos4CopyTo ); } if ( VoidDataStorage.Contains( Pos5CopyTo ) ) { VoidDataStorage.Remove( Pos5CopyTo ); } if ( VoidDataStorage.Contains( Pos6CopyTo ) ) { VoidDataStorage.Remove( Pos6CopyTo ); } if ( VoidDataStorage.Contains( Pos7CopyTo ) ) { VoidDataStorage.Remove( Pos7CopyTo ); } if ( VoidDataStorage.Contains( Pos8CopyTo ) ) { VoidDataStorage.Remove( Pos8CopyTo ); } } StartChunk -= new Vector2( 0, 1 ); } else { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 1, 0 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 2, 0 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 3, 0 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 4, 0 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 5, 0 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 6, 0 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 7, 0 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 8, 0 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 2]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 4]; VoidDataStorage.Add( Pos0CopyTo ); VoidDataStorage.Add( Pos1CopyTo ); VoidDataStorage.Add( Pos2CopyTo ); VoidDataStorage.Add( Pos3CopyTo ); VoidDataStorage.Add( Pos4CopyTo ); VoidDataStorage.Add( Pos5CopyTo ); VoidDataStorage.Add( Pos6CopyTo ); VoidDataStorage.Add( Pos7CopyTo ); VoidDataStorage.Add( Pos8CopyTo ); } } } if ( !XAxis ) { if ( IntIncrease ) { if ( i != DataStorageSize - 1 ) { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 0, 1 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 0, 2 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 0, 3 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 0, 4 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 0, 5 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 0, 6 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 0, 7 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 0, 8 ); Vector2 Pos0CopyFrom = StartChunk + new Vector2( 1, 0 ); Vector2 Pos1CopyFrom = StartChunk + new Vector2( 1, 1 ); Vector2 Pos2CopyFrom = StartChunk + new Vector2( 1, 2 ); Vector2 Pos3CopyFrom = StartChunk + new Vector2( 1, 3 ); Vector2 Pos4CopyFrom = StartChunk + new Vector2( 1, 4 ); Vector2 Pos5CopyFrom = StartChunk + new Vector2( 1, 5 ); Vector2 Pos6CopyFrom = StartChunk + new Vector2( 1, 6 ); Vector2 Pos7CopyFrom = StartChunk + new Vector2( 1, 7 ); Vector2 Pos8CopyFrom = StartChunk + new Vector2( 1, 8 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; if ( i == 0 ) { if ( VoidDataStorage.Contains( Pos0CopyTo ) ) { VoidDataStorage.Remove( Pos0CopyTo ); } if ( VoidDataStorage.Contains( Pos1CopyTo ) ) { VoidDataStorage.Remove( Pos1CopyTo ); } if ( VoidDataStorage.Contains( Pos2CopyTo ) ) { VoidDataStorage.Remove( Pos2CopyTo ); } if ( VoidDataStorage.Contains( Pos3CopyTo ) ) { VoidDataStorage.Remove( Pos3CopyTo ); } if ( VoidDataStorage.Contains( Pos4CopyTo ) ) { VoidDataStorage.Remove( Pos4CopyTo ); } if ( VoidDataStorage.Contains( Pos5CopyTo ) ) { VoidDataStorage.Remove( Pos5CopyTo ); } if ( VoidDataStorage.Contains( Pos6CopyTo ) ) { VoidDataStorage.Remove( Pos6CopyTo ); } if ( VoidDataStorage.Contains( Pos7CopyTo ) ) { VoidDataStorage.Remove( Pos7CopyTo ); } if ( VoidDataStorage.Contains( Pos8CopyTo ) ) { VoidDataStorage.Remove( Pos8CopyTo ); } } StartChunk += new Vector2( 1, 0 ); } else { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 0, 1 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 0, 2 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 0, 3 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 0, 4 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 0, 5 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 0, 6 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 0, 7 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 0, 8 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 2]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 4]; VoidDataStorage.Add( Pos0CopyTo ); VoidDataStorage.Add( Pos1CopyTo ); VoidDataStorage.Add( Pos2CopyTo ); VoidDataStorage.Add( Pos3CopyTo ); VoidDataStorage.Add( Pos4CopyTo ); VoidDataStorage.Add( Pos5CopyTo ); VoidDataStorage.Add( Pos6CopyTo ); VoidDataStorage.Add( Pos7CopyTo ); VoidDataStorage.Add( Pos8CopyTo ); } } else { if ( i != DataStorageSize - 1 ) { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 0, 1 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 0, 2 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 0, 3 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 0, 4 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 0, 5 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 0, 6 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 0, 7 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 0, 8 ); Vector2 Pos0CopyFrom = StartChunk + new Vector2( -1, 0 ); Vector2 Pos1CopyFrom = StartChunk + new Vector2( -1, 1 ); Vector2 Pos2CopyFrom = StartChunk + new Vector2( -1, 2 ); Vector2 Pos3CopyFrom = StartChunk + new Vector2( -1, 3 ); Vector2 Pos4CopyFrom = StartChunk + new Vector2( -1, 4 ); Vector2 Pos5CopyFrom = StartChunk + new Vector2( -1, 5 ); Vector2 Pos6CopyFrom = StartChunk + new Vector2( -1, 6 ); Vector2 Pos7CopyFrom = StartChunk + new Vector2( -1, 7 ); Vector2 Pos8CopyFrom = StartChunk + new Vector2( -1, 8 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyFrom )]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyFrom )]; if ( i == 0 ) { if ( VoidDataStorage.Contains( Pos0CopyTo ) ) { VoidDataStorage.Remove( Pos0CopyTo ); } if ( VoidDataStorage.Contains( Pos1CopyTo ) ) { VoidDataStorage.Remove( Pos1CopyTo ); } if ( VoidDataStorage.Contains( Pos2CopyTo ) ) { VoidDataStorage.Remove( Pos2CopyTo ); } if ( VoidDataStorage.Contains( Pos3CopyTo ) ) { VoidDataStorage.Remove( Pos3CopyTo ); } if ( VoidDataStorage.Contains( Pos4CopyTo ) ) { VoidDataStorage.Remove( Pos4CopyTo ); } if ( VoidDataStorage.Contains( Pos5CopyTo ) ) { VoidDataStorage.Remove( Pos5CopyTo ); } if ( VoidDataStorage.Contains( Pos6CopyTo ) ) { VoidDataStorage.Remove( Pos6CopyTo ); } if ( VoidDataStorage.Contains( Pos7CopyTo ) ) { VoidDataStorage.Remove( Pos7CopyTo ); } if ( VoidDataStorage.Contains( Pos8CopyTo ) ) { VoidDataStorage.Remove( Pos8CopyTo ); } } StartChunk -= new Vector2( 1, 0 ); } else { Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 0, 1 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 0, 2 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 0, 3 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 0, 4 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 0, 5 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 0, 6 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 0, 7 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 0, 8 ); HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 2]; HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 2]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )] = new byte[(Resolution * Resolution) * 4]; MaterialMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )] = new byte[(Resolution * Resolution) * 4]; VoidDataStorage.Add( Pos0CopyTo ); VoidDataStorage.Add( Pos1CopyTo ); VoidDataStorage.Add( Pos2CopyTo ); VoidDataStorage.Add( Pos3CopyTo ); VoidDataStorage.Add( Pos4CopyTo ); VoidDataStorage.Add( Pos5CopyTo ); VoidDataStorage.Add( Pos6CopyTo ); VoidDataStorage.Add( Pos7CopyTo ); VoidDataStorage.Add( Pos8CopyTo ); } } } } for( int i = 0; i < VoidDataStorage.Count; i++ ) { Vector2 NewVal = new Vector2( VoidDataStorage[i].x, VoidDataStorage[i].y ) + TravelDirection; //Log.Info( VoidDataStorage[i].ToString() + " + " + TravelDirection.ToString() + " = " + NewVal.ToString() ); VoidDataStorage[i] = new Vector4(NewVal.x, NewVal.y, 0, 0); } Log.Info( "End Offset" ); } void LoadChunksFromCache( Vector2 OldChunkPos, Vector2 NewChunkPos, int PlayerIndex) { Vector2 TravelDirection = OldChunkPos - NewChunkPos; Vector2 MidPoint = new Vector2( 5, 5 ); Vector2 RowToSpawn = NewChunkPos - (TravelDirection * RenderDistance); Vector2 RowToCache = OldChunkPos + (TravelDirection * RenderDistance); Vector2 RowToData = (-TravelDirection * (RenderDistance + 1)); Vector2 RowToDataCache = (TravelDirection * (RenderDistance + 1)); bool XAxis = TravelDirection.x == 0; int AmountInRow = (RenderDistance * 2) + 1; for ( int i = 0; i < AmountInRow; i++ ) { Vector2 PosToSpawn = 0; Vector2 PosToCache = 0; Vector2 PosToData = 0; if ( XAxis ) { PosToSpawn = new Vector2( (-RenderDistance + i), 0 ) + RowToSpawn; PosToCache = new Vector2( (-RenderDistance + i), 0 ) + RowToCache; PosToData = new Vector2( (-RenderDistance + i), 0 ) + RowToData; }else { PosToSpawn = new Vector2( 0, (-RenderDistance + i) ) + RowToSpawn; PosToCache = new Vector2( 0, (-RenderDistance + i) ) + RowToCache; PosToData = new Vector2( 0, (-RenderDistance + i) ) + RowToData; } int DataIndex = FindIntPosForDataSpace( ChunkSpaceToDataSpace( PosToData )); GameObject ChunkToMove = CheckIfChunkExists( PosToCache ); ChunkToMove.WorldPosition = ConvertChunkSpaceToWorldSpace( PosToSpawn ); Terrain Chunk = ChunkToMove.Components.Get(); Chunk.SyncGPUTexture(); //Chunk.Storage.SetResolution( Resolution ); Chunk.HeightMap.Update( HeightMapDataStorage[DataIndex], 0, 0, Resolution, Resolution ); Chunk.SyncCPUTexture( new Terrain.SyncFlags(), new RectInt( new Vector2Int( 0, 0 ), new Vector2Int( Resolution, Resolution ) ) ); Texture2DBuilder temp = new Texture2DBuilder().WithSize( Resolution, Resolution ); temp.WithData( MaterialMapDataStorage[DataIndex] ); temp.WithMips( 3 ); Texture Final = temp.Finish(); Material MatCopy = TerrainMat.CreateCopy(); MatCopy.Set( "NoiseTexture", Final ); Chunk.MaterialOverride = MatCopy; Chunk.ClipMapLodLevels = 6; Chunk.ClipMapLodExtentTexels = 256; Chunk.UpdateMaterialsBuffer(); } Log.Info( TravelDirection ); OffsetCache( TravelDirection ); } void SetChunkSetting() { SpawnChunkWithData( new Vector2(0 ,0), HeightMapDataStorage[0], MaterialMapDataStorage[0] ); SpawnedChunks[0].DestroyImmediate(); SpawnedChunks.Clear(); } void StartGameSpawnChunksFromData() { FillCache(); SetChunkSetting(); for ( int i = 0; i < ((RenderDistance + RenderDistance + 1) * (RenderDistance + RenderDistance + 1)); i++) { Vector2 PosToSpawn = IntToChunkSpace( i ); Vector2 DataSpaceVec = ChunkSpaceToDataSpace( PosToSpawn ); int DataSpaceIndex = FindIntPosForDataSpace( DataSpaceVec ); Log.Info( PosToSpawn.ToString() + " ___ " + DataSpaceVec.ToString() + " ___ " + DataSpaceIndex.ToString() ); SpawnChunkWithData( PosToSpawn, HeightMapDataStorage[DataSpaceIndex], MaterialMapDataStorage[DataSpaceIndex] ); } } void DebugData() { Log.Info( "_________" ); for( int i = 0; i < DataStorageSize; i++ ) { Vector2 StartChunk = new Vector2( 0, i ); Vector2 Pos0CopyTo = StartChunk; Vector2 Pos1CopyTo = StartChunk + new Vector2( 1, 0 ); Vector2 Pos2CopyTo = StartChunk + new Vector2( 2, 0 ); Vector2 Pos3CopyTo = StartChunk + new Vector2( 3, 0 ); Vector2 Pos4CopyTo = StartChunk + new Vector2( 4, 0 ); Vector2 Pos5CopyTo = StartChunk + new Vector2( 5, 0 ); Vector2 Pos6CopyTo = StartChunk + new Vector2( 6, 0 ); Vector2 Pos7CopyTo = StartChunk + new Vector2( 7, 0 ); Vector2 Pos8CopyTo = StartChunk + new Vector2( 8, 0 ); int value0 = HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos0CopyTo )][1]; int value1 = HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos1CopyTo )][1]; int value2 = HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos2CopyTo )][1]; int value3 = HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos3CopyTo )][1]; int value4 = HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos4CopyTo )][1]; int value5 = HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos5CopyTo )][1]; int value6 = HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos6CopyTo )][1]; int value7 = HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos7CopyTo )][1]; int value8 = HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )][0] + HeightMapDataStorage[FindIntPosForDataSpace( Pos8CopyTo )][1]; Log.Info( value0.ToString() + "_" + value1.ToString() + "_" + value2.ToString() + "_" + value3.ToString() + "_" + value4.ToString() + "_" + value5.ToString() + "_" + value6.ToString() + "_" + value7.ToString() + "_" + value8.ToString()); } Log.Info( "_________" ); } Vector2 DataSpaceFromWorldSpace( Vector2 WorldSpacePOS, int PlayerIndex ) { Vector2 pos = new Vector2(); Vector2 CurrentMiddle = CheckIfChunkExists( new Vector2( PlayerCameras[PlayerIndex].WorldPosition.x / ChunkSpaceing, PlayerCameras[PlayerIndex].WorldPosition.y / ChunkSpaceing ) ).WorldPosition; CurrentMiddle = FindChunkPOSFromWorldSpace( CurrentMiddle ); Vector2 POSin = FindChunkPOSFromWorldSpace( WorldSpacePOS ); Vector2 ProperChunkSpacePOS = POSin - CurrentMiddle; pos = ChunkSpaceToDataSpace( ProperChunkSpacePOS ); return pos; } void CheckPlayerDistanceToVoidChunk(int PlayerIndex) { List IndexToCull = new List(); for( int i = 0; i < VoidDataStorage.Count; i++ ) { Vector2 PlayerPOS = PlayerCameras[PlayerIndex].WorldPosition; Vector2 PosA = 0; if ( VoidDataStorage[i].z == 0 && VoidDataStorage[i].w == 0 ) { Log.Info( "Start Check _ " + i.ToString()); Vector2 StorageVal = new Vector2( VoidDataStorage[i].x, VoidDataStorage[i].y ); Log.Info( "1" ); Vector2 tempPOS = ConvertChunkSpaceToWorldSpace( DataSpaceToChunkSpace( StorageVal, new Vector2( 1, 1 ) ) ); Log.Info( "2" ); Vector2 temp = FindChunkPOSFromWorldSpace( PlayerPOS ); Log.Info( temp ); Vector2 MidPoint = CheckIfChunkExists( temp ).WorldPosition; Log.Info( "3" ); tempPOS += MidPoint; PosA = tempPOS; VoidDataStorage[i] = new Vector4( VoidDataStorage[i].x, VoidDataStorage[i].y, tempPOS.x, tempPOS.y ); }else { PosA = new Vector2( VoidDataStorage[i].z, VoidDataStorage[i].w ); } float Distance = Vector2.Distance( PlayerPOS, PosA ); if ( Distance < 28000 ) { int temp = (int)VoidDataStorage[i].x; temp = (8 - temp); Vector2 Storage = new Vector2( VoidDataStorage[i].x, VoidDataStorage[i].y ); Vector2 PlayerPositon = PlayerCameras[PlayerIndex].WorldPosition; Vector2 ChunkSpace = DataSpaceToChunkSpace( new Vector2( VoidDataStorage[i].y, VoidDataStorage[i].x ), new Vector2( 1, 1 ) ); PlayerPositon = FindChunkPOSFromWorldSpace( PlayerPositon ); Vector2 DataSpaceChunkToLoad = ChunkSpace + new Vector2( PlayerPositon.y, PlayerPositon.x ); DataSpaceChunkToLoad = new Vector2( DataSpaceChunkToLoad.y, DataSpaceChunkToLoad.x ); //Log.Info( DataSpaceChunkToLoad.ToString() + "_ _" + VoidDataStorage[i].ToString() ); int DataIndex = FindIntPosForDataSpace( Storage ); List NoiseDataSoloList = new List(); List NoiseDataList = new List(); Vector2 PosToScan = DataSpaceChunkToLoad * 256; //Log.Info(PosToScan); for ( int j = 0; j < (Resolution * Resolution); j += 256 ) { byte[] SoloNoiseData = new byte[Resolution * 2]; byte[] NoiseData = new byte[Resolution * 4]; SampleAndFormat256( j, PosToScan, out NoiseData, out SoloNoiseData ); NoiseDataList.AddRange( NoiseData ); NoiseDataSoloList.AddRange( SoloNoiseData ); } HeightMapDataStorage[DataIndex] = NoiseDataSoloList.ToArray(); MaterialMapDataStorage[DataIndex] = NoiseDataList.ToArray(); IndexToCull.Add( VoidDataStorage[i] ); } if ( Distance > 35355f ) { IndexToCull.Add( VoidDataStorage[i] ); } } for( int j = 0; j < IndexToCull.Count(); j++ ) { VoidDataStorage.Remove( IndexToCull[j] ); Log.Info("Removed " + IndexToCull.ToString() ); } } void ExportHeightMap() { List NoiseDataSoloList = new List(); List NoiseDataList = new List(); Vector2 PosToScan = new Vector2( -(((ExportHeightMapSize / 2))* 256), -(((ExportHeightMapSize / 2)) * 256) ); for ( int i = 0; i < ((ExportHeightMapSize * 256) * (ExportHeightMapSize * 256)); i += 16 ) { byte[] SoloNoiseData = new byte[16 * 2]; byte[] NoiseData = new byte[16 * 4]; byte[] tempNoiseData = new byte[16]; byte[] tempSoloNoiseData = new byte[16]; Sample16PixelsForExport( i, PosToScan, out tempSoloNoiseData, out tempNoiseData ); Format16NoiseVariable( tempSoloNoiseData, tempNoiseData, out SoloNoiseData, out NoiseData ); NoiseDataList.AddRange( NoiseData ); NoiseDataSoloList.AddRange( SoloNoiseData ); } string HeightFileName = ExportHeightMapName; HeightFileName = HeightFileName + " HeightMap.raw"; BaseFileSystem baseFileSystem = FileSystem.Data; System.IO.Stream stream = baseFileSystem.OpenWrite( HeightFileName, FileMode.Create ); stream.Write( NoiseDataSoloList.ToArray(), 0, NoiseDataSoloList.Count() ); stream.Close(); Log.Info( "Written: " + HeightFileName + " DIR:" + FileSystem.Data.ToString() ); /* Texture2DBuilder textureBuilder = new Texture2DBuilder().WithSize( NoiseDataList.Count() ); textureBuilder.WithData( NoiseDataList.ToArray() ); Texture Texture = textureBuilder.Finish(); string TextureFileName = ExportHeightMapName + " TextureMap.png"; stream = baseFileSystem.OpenWrite( TextureFileName, FileMode.Create ); byte[] ByteArray = NoiseDataList.ToArray(); ByteStream bytestream = ByteStream.Create( ByteArray.Length ); stream.Close(); Log.Info( "Written: " + TextureFileName + " DIR:" + FileSystem.Data.ToString() ); */ ExportAsHeightMapNow = false; } protected override void OnStart() { LocalFile = GameObject.Components.Get(); SearchForPlayerCameras(); SetSeed(); StartGameSpawnChunksFromData(); } protected override void OnUpdate() { if ( ConfigureMode ) { if ( RegenNoise ) { RegenChunks(); RegenNoise = false; } if ( ExportToConfigFileNow ) { WriteToFile(); } if ( ExportAsHeightMapNow ) { ExportHeightMap(); } if ( ExportAsHeightMapOptions ) { ExportToConfigFileOptions = false; } if ( ExportToConfigFileOptions ) { ExportAsHeightMapOptions = false; } } for ( int i = 0; i < PlayerCameras.Count; i++ ) { Vector2 temp = FindChunkPOSFromWorldSpace( PlayerCameras[i].WorldPosition ); if ( LastChunkSpacePOS[i] != temp ) { LoadChunksFromCache( LastChunkSpacePOS[i], temp, i ); LastChunkSpacePOS[i] = temp; } } if ( FramesCount > 30 ) { CheckPlayerDistanceToVoidChunk( 0 ); FramesCount = 0; } FramesCount++; } protected override void OnDestroy() { VoidDataStorage.Clear(); SpawnedChunks.Clear(); PlayerCameras.Clear(); LastChunkSpacePOS.Clear(); MaterialMapDataStorage.Clear(); HeightMapDataStorage.Clear(); NoiseField = null; NoiseField1 = null; NoiseField2 = null; } }