public void UpdateTerrain() { init(); updateParams(); // do the thing Debug.Log("[TerrainCreatorScript] About to render Terrain."); MaskMethod mask = null; if (mask_island) { mask = Mask.MaskMethods [(int)mask_type]; } t.renderTerrain(mask, coloring); transform.GetComponent <MeshCollider> ().sharedMesh = t.Mesh; Debug.Log("Set shared mesh"); // for (int i = 0; i < coloring.colorKeys.Length; i++) { // Debug.Log ("COLOR value : " + coloring.colorKeys [i].color); // Debug.Log ("COLOR time : " + coloring.colorKeys [i].time); // // } // // for (int i = 0; i < coloring.alphaKeys.Length; i++) { // Debug.Log ("ALPHA value : " + coloring.alphaKeys [i].alpha); // Debug.Log ("ALPHA time : " + coloring.alphaKeys [i].time); // // } // // Debug.Log ("MODE: " + coloring.mode.ToString ()); }
public void SetHeights() { _terrain = GetComponent <Terrain>(); _terrainData = _terrain.terrainData; var resolution = _terrainData.heightmapResolution; var size = _terrainData.size * scale; // remember: y is height var point00 = transform.TransformPoint(new Vector3(0, 0, zOffset)); var point10 = transform.TransformPoint(new Vector3(size.x, 0, zOffset)); var point01 = transform.TransformPoint(new Vector3(0, size.z, zOffset)); var point11 = transform.TransformPoint(new Vector3(size.x, size.z, zOffset)); float maxDistance = Vector3.Distance(point00, point11) * 0.5f; var center = transform.TransformPoint(new Vector3(size.x * 0.5f, size.z * 0.5f, zOffset)); // 3D noise NoiseMethod method = NoiseHelper.noiseMethods[(int)type][2]; MaskMethod lowerMaskMethod = Masks.maskMethods[(int)lowerMask]; MaskMethod upperMaskMethod = Masks.maskMethods[(int)upperMask]; var heightArray = new float[resolution, resolution]; var stepSize = 1f / resolution; for (int y = 0; y < resolution; y++) { Vector3 point0 = Vector3.Lerp(point00, point01, (y + 0.5f) * stepSize); Vector3 point1 = Vector3.Lerp(point10, point11, (y + 0.5f) * stepSize); for (int x = 0; x < resolution; x++) { Vector3 point = Vector3.Lerp(point0, point1, (x + 0.5f) * stepSize); float sample = NoiseHelper.Sum(method, point, perlinNoiseSettings); if (type != NoiseMethodType.Value) { sample = sample * 0.5f + 0.5f; } // Apply mask(s) float distance = Vector3.Distance(point, center); distance /= maxDistance; //sample = upperMaskMethod(distance) * sample; sample = lowerMaskMethod(distance) + sample * (upperMaskMethod(distance) - lowerMaskMethod(distance)); heightArray[x, y] = sample * heightScale; } } _terrainData.SetHeights(0, 0, heightArray); }
//============================================== // DELEGATE FUNCTION public static float Transform(Vector3 p, float noise, MaskMethod m, float size = 1f) { if (m == null) { return(noise); } float distance = m(p, size); float max_width = size * 0.5f; float delta = distance / max_width; float gradient = delta * delta; noise *= Mathf.Max(0.0f, 1.0f - gradient); return(noise); }
//============================================== // Originally taken from TerrainCreatorScript public void renderTerrain(MaskMethod mask = null, Gradient coloring = null) { if (this.Mesh == null) { Debug.LogError("[GenericTerrain] Mesh should not be null!!!"); return; } _debug("[renderTerrain] about to determine the vertices and colors for the terrain."); // get constants Vector3[] vecs = MeshUtil.Constants.UnitVectors2D; // extract parameters float dx = 1f / resolution; if (coloring == null) { coloring = Coloring; } // counter for vertices int v = 0; Colors = this.Mesh.colors; Vertices = this.Mesh.vertices; for (int i = 0; i <= resolution; i++) { Vector3 p0 = Vector3.Lerp(vecs [0], vecs [2], i * dx); Vector3 p1 = Vector3.Lerp(vecs [1], vecs [3], i * dx); for (int j = 0; j <= resolution; j++) { // localposition Vector3 p = Vector3.Lerp(p0, p1, j * dx); NoiseParams par = new NoiseParams { p = p, v = v, mask = mask, }; if (optimize) { OptController.RegisterTask(new Job { func = noiseAsyncFunc, par = par, }); } else { noiseAsyncFunc(par); } v++; } } Debug.Log("Registered all tasks: " + OptController.jobQueue.Count.ToString()); this.Texture.fill(); }
public static float ApplyMask(MaskMethod method, float distance) { return(method(distance)); }