private void OnGUI()
        {
            // Display any errors at the top of our GUI.
            // Error will have one frame of latency.
            ErrorDisplay();

            if (ErrorCapture(ComputeAndDisplayTexture3DSettings(ref texture3DSettings)))
            {
                return;
            }

            if (ErrorCapture(ComputeAndDisplayTextureSlices(ref textureSlices, ref textureSlicesData)))
            {
                return;
            }

            if (GUILayout.Button(SAVE_BUTTON_NAME))
            {
                Texture3D texture3D = null;
                if (ErrorCapture(Texture3DEditor.ComputeTexture3DFromTextureSlices(ref texture3D, textureSlices, textureSlicesData, texture3DSettings)))
                {
                    return;
                }

                if (ErrorCapture(Texture3DEditor.SaveAssetFromTexture3D(texture3DSettings, texture3D)))
                {
                    return;
                }
            }
        }
        private Texture3DEditorError ComputeAndDisplayTexture3DSettings(ref Texture3DSettings res)
        {
            isTexture3DSettingsDisplayed = EditorGUILayout.Foldout(isTexture3DSettingsDisplayed, GUI_NAME_IS_TEXTURE_3D_SETTINGS_DISPLAYED);
            if (isTexture3DSettingsDisplayed)
            {
                EditorGUILayout.BeginVertical();
                ++EditorGUI.indentLevel;

                res.name                 = EditorGUILayout.TextField(GUI_NAME_NAME, res.name);
                res.resampleMode         = (ResampleMode)EditorGUILayout.Popup(GUI_NAME_RESAMPLE_MODE, (int)res.resampleMode, RESAMPLE_MODE_NAMES);
                res.textureFormatValid   = (TextureFormatValid)EditorGUILayout.Popup(GUI_NAME_TEXTURE_FORMAT_VALID, (int)res.textureFormatValid, TEXTURE_FORMAT_VALID_NAMES);
                res.filterModeValid      = (FilterModeValid)EditorGUILayout.Popup(GUI_NAME_FILTER_MODE_VALID, (int)res.filterModeValid, FILTER_MODE_VALID_NAMES);
                res.textureWrapModeValid = (TextureWrapModeValid)EditorGUILayout.Popup(GUI_NAME_WRAP_MODE_VALID, (int)res.textureWrapModeValid, TEXTURE_WRAP_MODE_VALID_NAMES);

                res.isMipmapEnabled = EditorGUILayout.Toggle(GUI_NAME_IS_MIPMAP_ENABLED, res.isMipmapEnabled);
                res.anisoLevel      = EditorGUILayout.IntSlider(GUI_NAME_ANISO_LEVEL, res.anisoLevel, 1, 9);
                res.width           = Texture3DEditor.SanitizeResolution(EditorGUILayout.IntField(GUI_NAME_WIDTH, res.width));
                res.height          = Texture3DEditor.SanitizeResolution(EditorGUILayout.IntField(GUI_NAME_HEIGHT, res.height));
                res.depth           = Texture3DEditor.SanitizeResolution(EditorGUILayout.IntField(GUI_NAME_DEPTH, res.depth));

                --EditorGUI.indentLevel;
                EditorGUILayout.EndVertical();
            }

            return(Texture3DEditorError.None);
        }
        private static Texture3DEditorError ComputeTexture3DFromTextureSlices(ref Texture3D res, List <Texture2D> textureSlices, List <Color[]> textureSlicesData, Texture3DSettings settings)
        {
            if (textureSlices.Count == 0)
            {
                return(Texture3DEditorError.NoSlicesSpecified);
            }
            for (int i = 0, iLen = textureSlices.Count; i < iLen; ++i)
            {
                if (textureSlices[i] == null)
                {
                    return(Texture3DEditorError.NoTextureAssigned);
                }
            }

            Color[] data = new Color[settings.width * settings.height * settings.depth];
            res = new Texture3D(
                settings.width,
                settings.height,
                settings.depth,
                Texture3DEditor.GetTextureFormat(settings.textureFormatValid),
                settings.isMipmapEnabled
                );
            res.wrapMode   = Texture3DEditor.GetTextureWrapMode(settings.textureWrapModeValid);
            res.filterMode = Texture3DEditor.GetTextureFilterMode(settings.filterModeValid);
            res.anisoLevel = settings.anisoLevel;

            Debug.Assert((int)settings.resampleMode >= 0 && settings.resampleMode < ResampleMode.Count);
            Texture3DEditorError error = Texture3DEditorError.None;

            switch (settings.resampleMode)
            {
            case ResampleMode.Nearest:
                error = ResampleNearest(ref data, textureSlices, textureSlicesData, settings);
                break;

            case ResampleMode.Trilinear:
                error = ResampleTrilinear(ref data, textureSlices, textureSlicesData, settings);
                break;

            default:
                break;
            }
            if (error != Texture3DEditorError.None)
            {
                return(error);
            }
            res.SetPixels(data, 0);
            res.Apply(settings.isMipmapEnabled);
            return(Texture3DEditorError.None);
        }
        public static void ShowWindow()
        {
            Texture3DEditor window = EditorWindow.GetWindow <Texture3DEditor>();

            window.Show();
        }