void GenerateNoise(NoiseTextureImageChannel channel, MaterialProperty scaleOffsetProperty, MaterialProperty strengthProperty, MaterialProperty amountOfBending = null) { Texture2D noiseTex = (Texture2D)noiseTexture.textureValue; if (noiseTex == null) { const int defaultNoiseTextureSize = 128; noiseTex = new Texture2D(defaultNoiseTextureSize, defaultNoiseTextureSize, TextureFormat.RGBAHalf, false, true); //Mirror Texture Wrap Mode is only supported in Unity 2017 and newer #if UNITY_2017_1_OR_NEWER noiseTex.wrapMode = TextureWrapMode.Mirror; #else noiseTex.wrapMode = TextureWrapMode.Repeat; #endif noiseTex.filterMode = FilterMode.Bilinear; noiseTexture.textureValue = noiseTex; } int noiseSize = noiseTex.width; int channelIndex = (int)channel; Texture2D noisePreviewTex = noiseTexturePreviews [channelIndex]; if (noisePreviewTex == null) { noisePreviewTex = new Texture2D(noiseSize, noiseSize, noiseTex.format, false, true); noiseTexturePreviews [channelIndex] = noisePreviewTex; } Vector4 scaleOffset = scaleOffsetProperty.vectorValue; Vector2 scale = new Vector2(scaleOffset.x, scaleOffset.y); Vector2 offset = new Vector2(scaleOffset.z, scaleOffset.w); float strength = strengthProperty.floatValue; float bending = amountOfBending != null ? amountOfBending.floatValue : 0f; Color[] noiseTexpixels = noiseTex.GetPixels(); Color[] previewTexPixels = noisePreviewTex.GetPixels(); for (int i = 0; i < noiseSize; i++) { for (int j = 0; j < noiseSize; j++) { float x = scale.x * (j / (float)(noiseSize - 1) + offset.x); float y = scale.y * (i / (float)(noiseSize - 1) + offset.y); int pixelIndex = i * noiseSize + j; float noise = Mathf.PerlinNoise(x, y); noiseTexpixels [pixelIndex] [channelIndex] = (noise - 0.5f) * strength + bending; previewTexPixels [pixelIndex] = new Color(noise, noise, noise); } } noiseTex.SetPixels(noiseTexpixels); noiseTex.Apply(); noisePreviewTex.SetPixels(previewTexPixels); noisePreviewTex.Apply(); noiseTexture.textureValue = noiseTex; }
void DrawNoisePreview(NoiseTextureImageChannel channel, MaterialProperty scaleOffsetProperty, MaterialProperty strengthProperty, MaterialProperty amountOfBending = null) { Vector4 scaleOffset = scaleOffsetProperty.vectorValue; Vector2 scale = new Vector2(scaleOffset.x, scaleOffset.y); Vector2 offset = new Vector2(scaleOffset.z, scaleOffset.w); Rect totalRect = EditorGUILayout.GetControlRect(true, MaterialEditor.GetDefaultPropertyHeight(noiseTexture), EditorStyles.layerMaskField); Rect previewRect = totalRect; previewRect.xMin = previewRect.xMax - EditorGUIUtility.fieldWidth; Rect fieldsRect = totalRect; fieldsRect.yMin += 16f; fieldsRect.xMax -= EditorGUIUtility.fieldWidth + 2f; Rect scaleFieldRect = new Rect(fieldsRect.x, fieldsRect.y, fieldsRect.width, 16f); Rect offsetFieldRect = new Rect(fieldsRect.x, scaleFieldRect.y + 16f, fieldsRect.width, 16f); Rect strengthFieldRect = new Rect(fieldsRect.x, offsetFieldRect.y + 16f, fieldsRect.width, 16f); GUI.DrawTexture(previewRect, noiseTexturePreviews [(int)channel], ScaleMode.ScaleToFit); EditorGUI.BeginChangeCheck(); EditorGUIUtility.labelWidth = 65f; scaleFieldRect = EditorGUI.PrefixLabel(scaleFieldRect, Styles.NoiseScaleLabel); Vector2 newScale = EditorGUI.Vector2Field(scaleFieldRect, GUIContent.none, scale); offsetFieldRect = EditorGUI.PrefixLabel(offsetFieldRect, Styles.NoiseOffsetLabel); Vector2 newOffset = EditorGUI.Vector2Field(offsetFieldRect, GUIContent.none, offset); strengthFieldRect = EditorGUI.PrefixLabel(strengthFieldRect, Styles.NoiseStrengthLabel); EditorGUI.showMixedValue = strengthProperty.hasMixedValue; float strength = EditorGUI.Slider(strengthFieldRect, strengthProperty.floatValue, strengthProperty.rangeLimits.x, strengthProperty.rangeLimits.y); EditorGUI.showMixedValue = false; EditorGUIUtility.labelWidth = 0f; if (EditorGUI.EndChangeCheck()) { scaleOffsetProperty.vectorValue = new Vector4(newScale.x, newScale.y, newOffset.x, newOffset.y); strengthProperty.floatValue = strength; GenerateNoise(channel, scaleOffsetProperty, strengthProperty, amountOfBending); } }