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);
        }
Exemplo n.º 2
0
    public static void CreateTextureSettings()
    {
        var ts = Texture3DSettings.CreateInstance <Texture3DSettings>();

        string path = "Assets/Textures/new texture3D.asset";

        path = AssetDatabase.GenerateUniqueAssetPath(path);

        Debug.Log("Path: " + path);
        ProjectWindowUtil.CreateAsset(ts, path);
    }
        private static Texture3DEditorError SaveAssetFromTexture3D(Texture3DSettings settings, Texture3D texture3D)
        {
            string filename = (settings.name.Length > 0) ? (settings.name + "." + FILE_EXTENSION) : DEFAULT_FILENAME;

            // Returns path relative to project base directory.
            // Required for AssetDatabase.CreateAsset() which expects paths relative to project base.
            string path = EditorUtility.SaveFilePanelInProject(SAVE_DIALOGUE, filename, FILE_EXTENSION, "");

            if (path.Length == 0)
            {
                return(Texture3DEditorError.NoSavePathSpecified);
            }

            AssetDatabase.CreateAsset(texture3D, path);

            return(Texture3DEditorError.None);
        }
Exemplo n.º 4
0
    public void OnEnable()
    {
        settings           = target as Texture3DSettings;
        oldTextureSize     = settings.textureSize;
        preview            = new Texture2D(settings.textureSize, settings.textureSize, TextureFormat.RGBA32, false);
        preview.filterMode = FilterMode.Point;
        UpdatePreview();

        if (f == false)
        {
            inst = GetHashCode();
        }
        else
        {
            return;
        }
        f = true;
        SceneView.onSceneGUIDelegate += OnSceneGUI;
    }
        private static Texture3DEditorError ResampleTrilinear(ref Color[] data, List <Texture2D> textureSlices, List <Color[]> textureSlicesData, Texture3DSettings settings)
        {
            float wScale = 1.0f / (float)settings.depth;
            float wBias  = 0.5f / (float)settings.depth;

            // When computing the slice indices that straddle our interpolation interval we need to subtract off 0.5 pixels,
            // as interpolation happens between pixel centers, i.e: 0.5 and 1.5 pixels.
            float uScale  = 1.0f / (float)settings.width;
            float uBias   = 0.5f / (float)settings.width;
            float vScale  = 1.0f / (float)settings.height;
            float vBias   = 0.5f / (float)settings.height;
            float ziScale = (float)textureSlices.Count;
            float ziBias  = -0.5f;

            for (int z = 0; z < settings.depth; ++z)
            {
                float w = (float)z * wScale + wBias;
                float wSamplePositonSlices = w * ziScale + ziBias;
                float wSampleInterpolation = Frac(wSamplePositonSlices);
                int   iz0 = Mathf.FloorToInt(wSamplePositonSlices);
                int   iz1 = iz0 + 1;

                switch (settings.textureWrapModeValid)
                {
                case TextureWrapModeValid.Repeat:
                    iz0 = PixelWrap(iz0, textureSlices.Count);
                    iz1 = PixelWrap(iz1, textureSlices.Count);
                    break;

                case TextureWrapModeValid.Clamp:
                default:
                    iz0 = PixelClamp(iz0, textureSlices.Count);
                    iz1 = PixelClamp(iz1, textureSlices.Count);
                    break;
                }

                Texture2D textureSlice0 = textureSlices[iz0];
                Texture2D textureSlice1 = textureSlices[iz1];

                Color[] textureSliceData0 = textureSlicesData[iz0];
                Color[] textureSliceData1 = textureSlicesData[iz1];

                for (int y = 0; y < settings.height; ++y)
                {
                    for (int x = 0; x < settings.width; ++x)
                    {
                        int   i = z * settings.height * settings.width + y * settings.width + x;
                        float u = (float)x * uScale + uBias;
                        float v = (float)y * vScale + vBias;

                        float px0 = u * (float)textureSlice0.width;
                        float py0 = v * (float)textureSlice0.height;
                        float px1 = u * (float)textureSlice1.width;
                        float py1 = v * (float)textureSlice1.height;

                        int pxFloor0 = Mathf.FloorToInt(px0 - 0.5f);
                        int pyFloor0 = Mathf.FloorToInt(py0 - 0.5f);
                        int pxFloor1 = Mathf.FloorToInt(px1 - 0.5f);
                        int pyFloor1 = Mathf.FloorToInt(py1 - 0.5f);

                        float ax0 = px0 - ((float)pxFloor0 + 0.5f);
                        float ay0 = py0 - ((float)pyFloor0 + 0.5f);
                        float ax1 = px1 - ((float)pxFloor1 + 0.5f);
                        float ay1 = py1 - ((float)pyFloor1 + 0.5f);

                        int pxCeil0 = pxFloor0 + 1;
                        int pyCeil0 = pyFloor0 + 1;
                        int pxCeil1 = pxFloor1 + 1;
                        int pyCeil1 = pyFloor1 + 1;

                        switch (settings.textureWrapModeValid)
                        {
                        case TextureWrapModeValid.Repeat:
                            pxFloor0 = PixelWrap(pxFloor0, textureSlice0.width);
                            pyFloor0 = PixelWrap(pyFloor0, textureSlice0.height);
                            pxFloor1 = PixelWrap(pxFloor1, textureSlice1.width);
                            pyFloor1 = PixelWrap(pyFloor1, textureSlice1.height);

                            pxCeil0 = PixelWrap(pxCeil0, textureSlice0.width);
                            pyCeil0 = PixelWrap(pyCeil0, textureSlice0.height);
                            pxCeil1 = PixelWrap(pxCeil1, textureSlice1.width);
                            pyCeil1 = PixelWrap(pyCeil1, textureSlice1.height);
                            break;

                        case TextureWrapModeValid.Clamp:
                            pxFloor0 = PixelClamp(pxFloor0, textureSlice0.width);
                            pyFloor0 = PixelClamp(pyFloor0, textureSlice0.height);
                            pxFloor1 = PixelClamp(pxFloor1, textureSlice1.width);
                            pyFloor1 = PixelClamp(pyFloor1, textureSlice1.height);

                            pxCeil0 = PixelClamp(pxCeil0, textureSlice0.width);
                            pyCeil0 = PixelClamp(pyCeil0, textureSlice0.height);
                            pxCeil1 = PixelClamp(pxCeil1, textureSlice1.width);
                            pyCeil1 = PixelClamp(pyCeil1, textureSlice1.height);
                            break;
                        }

                        int   inw0 = pyCeil0 * textureSlice0.width + pxFloor0;
                        int   ine0 = pyCeil0 * textureSlice0.width + pxCeil0;
                        int   isw0 = pyFloor0 * textureSlice0.width + pxFloor0;
                        int   ise0 = pyFloor0 * textureSlice0.width + pxCeil0;
                        Color cn0  = Color.Lerp(textureSliceData0[inw0], textureSliceData0[ine0], ax0);
                        Color cs0  = Color.Lerp(textureSliceData0[isw0], textureSliceData0[ise0], ax0);
                        Color c0   = Color.Lerp(cs0, cn0, ay0);

                        int   inw1 = pyCeil1 * textureSlice1.width + pxFloor1;
                        int   ine1 = pyCeil1 * textureSlice1.width + pxCeil1;
                        int   isw1 = pyFloor1 * textureSlice1.width + pxFloor1;
                        int   ise1 = pyFloor1 * textureSlice1.width + pxCeil1;
                        Color cn1  = Color.Lerp(textureSliceData1[inw1], textureSliceData1[ine1], ax1);
                        Color cs1  = Color.Lerp(textureSliceData1[isw1], textureSliceData1[ise1], ax1);
                        Color c1   = Color.Lerp(cs1, cn1, ay1);

                        data[i] = Color.Lerp(c0, c1, wSampleInterpolation);
                    }
                }
            }

            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);
        }