Exemplo n.º 1
0
        /// <summary>
        /// Creates a ModelPreviewMaterial that renders as close to what the given <see cref="MaterialInstanceConstant"/> looks like as possible.
        /// </summary>
        /// <param name="texcache">The texture cache to request textures from.</param>
        /// <param name="mat">The material that this ModelPreviewMaterial will try to look like.</param>
        protected ModelPreviewMaterial(PreviewTextureCache texcache, MaterialInstanceConstant mat, PackageCache assetCache, List <PreloadedTextureData> preloadedTextures = null)
        {
            if (mat == null)
            {
                return;
            }
            Properties.Add("Name", mat.Export.ObjectName);
            foreach (var textureEntry in mat.Textures)
            {
                if (!Textures.ContainsKey(textureEntry.FullPath) && textureEntry.ClassName == "Texture2D")  //Apparently some assets are cubemaps, we don't want these.
                {
                    if (preloadedTextures != null)
                    {
                        var preloadedInfo = preloadedTextures.FirstOrDefault(x => x.MaterialExport == mat.Export && x.Mip.Export.ObjectName.Name == textureEntry.ObjectName.Name); //i don't like matching on object name but its export vs import here.
                        if (preloadedInfo != null)
                        {
                            Textures.Add(textureEntry.FullPath, texcache.LoadTexture(preloadedInfo.Mip.Export, preloadedInfo.Mip, preloadedInfo.decompressedTextureData));
                        }
                        else
                        {
                            Debug.WriteLine("Preloading error");
                        }
                        //if (textureEntry is ExportEntry texPort && preloadedMipInfo.Export != texPort) throw new Exception();
                        continue; //Don't further parse
                    }

                    if (textureEntry is ImportEntry import)
                    {
                        var extAsset = EntryImporter.ResolveImport(import, null, assetCache);
                        if (extAsset != null)
                        {
                            Textures.Add(textureEntry.FullPath, texcache.LoadTexture(extAsset));
                        }
                    }
                    else
                    {
                        Textures.Add(textureEntry.FullPath, texcache.LoadTexture(textureEntry as ExportEntry));
                    }
                }
            }
        }
Exemplo n.º 2
0
        private PreviewTextureCache.PreviewTextureEntry FindTexture(PreviewTextureCache texcache, string FullTextureName, string ImportPCC)
        {
            string importfiledir  = System.IO.Path.GetDirectoryName(ImportPCC).ToLower();
            string importfilename = System.IO.Path.GetFileName(ImportPCC).ToLower();
            string pccpath        = "";
            int    id             = 0;

            // First, check the pcc that contains the material
            using (ME3Package pcc = MEPackageHandler.OpenME3Package(ImportPCC))
            {
                foreach (IExportEntry exp in pcc.Exports)
                {
                    if (exp.GetFullPath == FullTextureName && exp.ClassName == "Texture2D")
                    {
                        pccpath = ImportPCC;
                        id      = exp.Index;
                        break;
                    }
                }
            }
            // Next, split the filename by underscores
            string[] parts = System.IO.Path.GetFileNameWithoutExtension(importfilename).Split('_');
            if (pccpath == "" && (importfilename.StartsWith("bioa") || importfilename.StartsWith("biod")))
            {
                // Maybe go for the one with one less segment? ex. for input BioA_Nor_201CIC.pcc, look in BioA_Nor.pcc
                if (parts.Length == 3)
                {
                    string filename = importfiledir + "\\" + parts[0] + "_" + parts[1] + ".pcc";
                    if (System.IO.File.Exists(filename))
                    {
                        using (ME3Package pcc = MEPackageHandler.OpenME3Package(filename))
                        {
                            foreach (IExportEntry exp in pcc.Exports)
                            {
                                if (exp.GetFullPath == FullTextureName && exp.ClassName == "Texture2D")
                                {
                                    pccpath = importfiledir + "\\" + parts[0] + "_" + parts[1] + ".pcc";
                                    id      = exp.Index;
                                    break;
                                }
                            }
                        }
                    }
                }
                // Now go for the BioP one.
                if (pccpath == "" && parts.Length >= 2)
                {
                    string filename = importfiledir + "\\" + "BioP" + "_" + parts[1] + ".pcc";
                    if (System.IO.File.Exists(filename))
                    {
                        using (ME3Package pcc = MEPackageHandler.OpenME3Package(filename))
                        {
                            foreach (IExportEntry exp in pcc.Exports)
                            {
                                if (exp.GetFullPath == FullTextureName && exp.ClassName == "Texture2D")
                                {
                                    pccpath = importfiledir + "\\" + "BioP" + "_" + parts[1] + ".pcc";
                                    id      = exp.Index;
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (id > 0)
            {
                return(texcache.LoadTexture(pccpath, id));
            }
            else
            {
                Console.WriteLine("[TEXLOAD]: Could not find texture \"" + FullTextureName + "\", imported in \"" + ImportPCC + "\".");
                return(null);
            }
        }