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