private void PersistLookupTexture()
    {
        ShinyShadingLookupTexture l = target as ShinyShadingLookupTexture;

        if (!l)
        {
            return;
        }

        string assetName = (l.gameObject.name) + kLookupTexturePropertyName;

        // Dr Paranoia, featuring his sidekick, Punk Patch.
        assetName = assetName.Replace(":", "_");

        Texture2D persistentTexture = PersistLookupTexture(assetName, l.lookupTexture);

        foreach (Material m in l.GetComponent <Renderer>().sharedMaterials)
        {
            if (HasLookupTextureSlot(m))
            {
                m.SetTexture(kLookupTexturePropertyName, persistentTexture);
                l.SetParameters(m);
            }
        }
    }
    public override void OnInspectorGUI()
    {
        ShinyShadingLookupTexture l = target as ShinyShadingLookupTexture;

        EditorGUI.indentLevel++;

        //l.diffuseIntensity = EditorGUILayout.Slider ("Diffuse", l.diffuseIntensity, 0f, 2f);
        {
            EditorGUILayout.Space();
            GUILayout.Label("FRESNEL", EditorStyles.miniBoldLabel);
            l.reflectivityAt0     = EditorGUILayout.Slider(" Reflectivity (0 degrees)", l.reflectivityAt0, 0f, 1f);
            l.reflectivityAt90    = EditorGUILayout.Slider(" Reflectivity (90 degrees)", l.reflectivityAt90, 0f, 1f);
            l.reflectivityFalloff = EditorGUILayout.Slider(" Falloff", l.reflectivityFalloff, 0f, 20.0f);
        }

        EditorGUI.indentLevel--;

        EditorGUILayout.Space();

        GUILayout.Label("SPECULAR", EditorStyles.miniBoldLabel);
        EditorGUI.indentLevel++;

        l.specularIntensity = EditorGUILayout.Slider("Specular 1", l.specularIntensity, 0f, 10f);
        if (l.specularIntensity > 1e-6)
        {
            EditorGUI.indentLevel++;
            l.specularShininess = EditorGUILayout.Slider(" Roughness", l.specularShininess, 0f, 1f);
            EditorGUI.indentLevel--;
        }
        l.specularIntensity2 = EditorGUILayout.Slider("Specular 2", l.specularIntensity2, 0f, 10f);
        if (l.specularIntensity2 > 1e-6)
        {
            EditorGUI.indentLevel++;
            l.specularShininess2 = EditorGUILayout.Slider(" Roughness", l.specularShininess2, 0f, 1f);
            EditorGUI.indentLevel--;
        }
        EditorGUI.indentLevel--;

        EditorGUILayout.Space();

        GUILayout.Label("MISC", EditorStyles.miniBoldLabel);

        GUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Lookup Texture", "MiniPopup");
        l.lookupTextureWidth = EditorGUILayout.IntPopup(l.lookupTextureWidth, kTextureSizes, kTextureSizesValues, GUILayout.MinWidth(40));
        GUILayout.Label("x");
        l.lookupTextureHeight = EditorGUILayout.IntPopup(l.lookupTextureHeight, kTextureSizes, kTextureSizesValues, GUILayout.MinWidth(40));
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();

        if (GUI.changed)
        {
            EditorUtility.SetDirty(l);
            Undo.RegisterUndo(l, "BRDFTexture Params Change");
            baked = false;
        }

        // preview
        GUILayout.BeginHorizontal();
        lowResPreview = EditorGUILayout.Toggle("Low Res Preview", lowResPreview);
        GUILayout.FlexibleSpace();
        if (GUILayout.Button(previewRGB? "RGB": "Alpha", "MiniButton", GUILayout.MinWidth(38)))
        {
            previewRGB = !previewRGB;
        }
        GUILayout.EndHorizontal();

        if (lowResPreview && !baked)
        {
            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Bake", GUILayout.MinWidth(64)))
            {
                l.Bake();
                baked = true;
            }
            GUILayout.EndHorizontal();
        }

        if (GUI.changed || !l.lookupTexture)
        {
            if (lowResPreview)
            {
                if (!baked)
                {
                    l.Preview();
                }
            }
            else
            {
                l.Bake();
            }

            PersistLookupTexture();
        }

        Rect r = GUILayoutUtility.GetAspectRect(1.0f);

        r.x      += kTexturePreviewBorder;
        r.y      += kTexturePreviewBorder;
        r.width  -= kTexturePreviewBorder * 2;
        r.height -= kTexturePreviewBorder * 2;
        if (previewRGB)
        {
            EditorGUI.DrawPreviewTexture(r, l.lookupTexture);
        }
        else
        {
            EditorGUI.DrawTextureAlpha(r, l.lookupTexture);
        }

        // persist lookup-texture on Undo
        if (Event.current.type == EventType.ValidateCommand)
        {
            switch (Event.current.commandName)
            {
            case "UndoRedoPerformed":
            {
                l.Bake();
                PersistLookupTexture();
                baked = false;
            }
            break;
            }
        }
    }