Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        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);
            }
        }