Example #1
0
        public override void OnInspectorGUI()
        {
            switch (inspectorType)
            {
            case InspectorType.Default:
                defaultEditor.OnInspectorGUI();
                break;

            case InspectorType.Failed:
                const string buttonName = "Import 3D texture";
                EditorGUILayout.HelpBox($"Importation has failed. If you are attempting to import a 3D texture, please select the \"{buttonName}\" button below.", MessageType.Warning);

                if (GUILayout.Button(buttonName))
                {
                    var texAsset = System.IO.Path.ChangeExtension(assetPath, ".asset");
                    if (!System.IO.File.Exists(texAsset))
                    {
                        var textureData = DirectXTexHelper.LoadDDS(assetPath);
                        var texture     = GrTextureUtils.CreateTexture3D(textureData.width, textureData.height, textureData.depth, GrTextureUtils.GetTextureFormat(textureData.format, textureData.depth), textureData.pixels);
                        AssetDatabase.CreateAsset(texture, texAsset);
                    }
                }
                break;

            default:
                EditorGUILayout.LabelField(((IHVImageFormatImporter)base.target).userData);

                EditorGUI.BeginChangeCheck();

                textureData.textureType = UnflattenTextureType((FlatTextureType)EditorGUILayout.EnumPopup(FlattenTextureType(textureData.textureType)));

                ((IHVImageFormatImporter)base.target).userData = CreateTextureData(textureData);

                if (EditorGUI.EndChangeCheck())
                {
                    SetColorSpace();

                    base.ApplyAndImport();
                }

                break;
            }
            return;
        }
Example #2
0
        public static Texture3D CreateTexture3D(uint width, uint height, uint depth, TextureFormat textureFormat, byte[] pixels)
        {
            var texture = new Texture3D((int)width, (int)height, (int)depth, /*textureFormat*/ TextureFormat.RGBA32, false);

            byte[] newPixelData = DirectXTexHelper.Flip3DImage(width, width, width, GrTextureUtils.GetDXGIFormat(textureFormat), pixels);

            var colours = new Color32[newPixelData.Length / 4];

            for (var i = 0; i < newPixelData.Length; i += 4)
            {
                // Another Unity quirk. Unity says that it wants either RGBA32 or BGRA32 as a format for volume textures if the BGRA32 format is passed in, so I have to correct for it here and in GrTextureUtils.GetTextureFormat().
                //var colour = new Color32(newPixelData[i + 2], newPixelData[i + 1], newPixelData[i + 0], newPixelData[i + 3]);
                var colour = new Color32(newPixelData[i + 2], newPixelData[i + 1], newPixelData[i + 0], newPixelData[i + 3]);
                colours[i / 4] = colour;
            }

            texture.SetPixels32(colours);
            texture.Apply();

            return(texture);
        }
Example #3
0
        private static void WriteToConvertedFormat(Texture target, uint width, uint height, uint depth, ushort format, uint mipmapCount, byte[] textureData, Func <string, string, string> getExportPath)
        {
            var assetPath             = AssetDatabase.GetAssetPath(target);
            var assetExtension        = System.IO.Path.GetExtension(assetPath);
            var inverseAssetExtension = assetExtension == ".ftex" ? ".dds" : ".ftex";

            var exportPath = getExportPath(assetPath, inverseAssetExtension);

            if (string.IsNullOrEmpty(exportPath))
            {
                return;
            }

            switch (assetExtension)
            {
            case ".dds":
                GrTextureExporter.ExportGrTexture(assetPath, (ushort)width, (ushort)height, (ushort)depth, format, (byte)mipmapCount, textureData, exportPath);
                break;

            default:
                DirectXTexHelper.SaveAsDDS(width, height, depth, GrTextureUtils.GetDXGIFormat(format), mipmapCount, textureData, exportPath);
                break;
            }
        }
Example #4
0
        /// <summary>
        /// Import a .ftex file.
        /// </summary>
        /// <param name="ctx"></param>
        public override void OnImportAsset(AssetImportContext ctx)
        {
            #region Readers
            var filepathSansExtension = Path.GetDirectoryName(assetPath) + "\\" + Path.GetFileNameWithoutExtension(assetPath);

            List <BinaryReader> binaryReaders = new List <BinaryReader>();
            binaryReaders.Add(new BinaryReader(new FileStream(assetPath, FileMode.Open)));

            for (int i = 1; i < 7; i++)
            {
                var file = filepathSansExtension + "." + i + ".ftexs";

                if (!File.Exists(file))
                {
                    break;
                }

                var fileStream = new FileStream(file, FileMode.Open);
                binaryReaders.Add(new BinaryReader(fileStream));
            }
            #endregion

            try
            {
                var readFunctions = (from reader in binaryReaders select new FoxLib.GrTexture.ReadFunctions(reader.ReadUInt16, reader.ReadUInt32, reader.ReadUInt64, reader.ReadByte, reader.ReadBytes, (numberOfBytes => SkipBytes(reader, numberOfBytes)), (bytePos => MoveStream(reader, bytePos)))).ToArray();

                FoxLib.GrTexture.GrTexture grTexture = FoxLib.GrTexture.Read(readFunctions);

                var textureFormat = GrTextureUtils.GetTextureFormat(grTexture.PixelFormat, grTexture.Depth);
                var isLinear      = GrTextureUtils.GetLinear(grTexture.TextureType);

                if (grTexture.TextureType == FoxLib.GrTexture.TextureType.Cube)
                {
                    #region Cube
                    var texture = new Cubemap(grTexture.Width, UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SRGB, UnityEngine.Experimental.Rendering.TextureCreationFlags.MipChain);

                    var textureData = DirectXTexHelper.Decompress(grTexture.Width, grTexture.Height, GrTextureUtils.GetDXGIFormat(grTexture.PixelFormat), grTexture.MipMapCount, grTexture.DDSData);

                    for (int i = 0; i < textureData.Length; i++)
                    {
                        var faceData = textureData[i];

                        {
                            var colours = new Color[faceData.Length / 4];

                            for (int j = 0; j < faceData.Length / 4; j++)
                            {
                                var data = faceData.Skip(j * 4).Take(4).ToArray();

                                float R = data[0];
                                float G = data[1];
                                float B = data[2];
                                float A = data[3];

                                float nrmR = R / 255.0f;
                                float nrmG = G / 255.0f;
                                float nrmB = B / 255.0f;
                                float nrmA = A / 255.0f;

                                colours[j] = new Color(nrmR,
                                                       nrmG,
                                                       nrmB,
                                                       nrmA);
                            }

                            texture.SetPixels(colours, (CubemapFace)i);
                        }
                    }

                    texture.Apply(true);

                    ctx.AddObjectToAsset("ftex", texture);
                    ctx.SetMainObject(texture);

                    #endregion
                }
                else
                {
                    if (grTexture.Depth == 1)
                    {
                        #region 2D

                        var hasMipmaps = grTexture.MipMapCount > 1;
                        var texture    = new Texture2D(grTexture.Width, grTexture.Height, textureFormat, hasMipmaps, isLinear);

                        if (hasMipmaps)
                        {
                            if (texture.mipmapCount > grTexture.MipMapCount)
                            {
                                var    length      = grTexture.DDSData.Length;
                                IntPtr pixelBuffer = DirectXTexHelper.GenerateNecessaryMipMapsAndFlipImage(grTexture.Width, grTexture.Height, GrTextureUtils.GetDXGIFormat(grTexture.PixelFormat), grTexture.MipMapCount, grTexture.DDSData, ref length);
                                texture.LoadRawTextureData(pixelBuffer, length);
                            }
                            else
                            {
                                texture.LoadRawTextureData(grTexture.DDSData);
                            }
                        }
                        else
                        {
                            byte[] newPixelData = DirectXTexHelper.Flip2DImage(grTexture.Width, grTexture.Height, GrTextureUtils.GetDXGIFormat(grTexture.PixelFormat), grTexture.MipMapCount, grTexture.DDSData);
                            texture.LoadRawTextureData(newPixelData);
                            texture.Apply();
                        }

                        ctx.AddObjectToAsset("ftex", texture, texture);
                        ctx.SetMainObject(texture);

                        #endregion
                    }
                    else
                    {
                        #region 3D

                        var texture = GrTextureUtils.CreateTexture3D(grTexture.Width, grTexture.Height, grTexture.Depth, GrTextureUtils.GetTextureFormat(grTexture.PixelFormat, grTexture.Depth), grTexture.DDSData);

                        ctx.AddObjectToAsset("ftex", texture);
                        ctx.SetMainObject(texture);
                        #endregion
                    }
                }

                this.userData = "NrtFlag: " + grTexture.NrtFlag + ", TextureType: " + grTexture.TextureType + ", UnknownFlags: " + grTexture.UnknownFlags;
            }
            finally
            {
                foreach (var reader in binaryReaders)
                {
                    reader.Close();
                }
            }
        }