/// <summary> /// Loads a FBX scene and converts it (in the same folder) into its GCX equivalent /// </summary> /// <param name="_File"></param> public void LoadScene( FileInfo _SourceFile, FileInfo _TargetFile ) { FBX.SceneLoader.SceneLoader Loader = new FBX.SceneLoader.SceneLoader(); FBX.SceneLoader.MaterialsDatabase Materials = new FBX.SceneLoader.MaterialsDatabase(); // Materials.BuildFromM2( new DirectoryInfo( @"D:\Workspaces\Arkane\m2" ) ); FBX.Scene.Scene Scene = new FBX.Scene.Scene(); Loader.Load( _SourceFile, Scene, 1.0f, Materials ); // Start writing // FileInfo Target = new FileInfo( Path.Combine( Path.GetDirectoryName( _SourceFile.FullName ), Path.GetFileNameWithoutExtension( _SourceFile.FullName ) + ".gcx" ) ); using ( FileStream S = _TargetFile.OpenWrite() ) using ( BinaryWriter W = new BinaryWriter( S ) ) { GCXFormat.Scene GCX = new GCXFormat.Scene( Scene ); GCX.Save( W ); } // Write infos List<string> Infos = new List<string>(); Infos.Add( "Textures:" ); foreach ( FBX.Scene.Materials.Texture2D Texture in Scene.Textures ) Infos.Add( "ID #" + Texture.ID.ToString( "D3" ) + " URL=" + Texture.URL ); Infos.Add( "" ); // Here, I write an array mapping texture IDs to names, assuming textures have been converted to POM format using PNG2POM (or HDR2POM) // This way I can simply copy this "code friendly" list and paste it in my C++ code (e.g. const char* ppID2TextureName[] = { PasteHere }; ) Infos.Add( "Texture Flat Names:" ); Infos.Add( "" ); string DirectoryHeader = Path.GetDirectoryName( _SourceFile.ToString() ); DirectoryHeader = DirectoryHeader.Replace( "\\", "\\\\" ); // Double antislashes foreach ( FBX.Scene.Materials.Texture2D Texture in Scene.Textures ) // Infos.Add( "ID #" + Texture.ID.ToString( "D3" ) + " URL=" + Path.GetFileNameWithoutExtension( Texture.URL ) ); Infos.Add( "\"" + DirectoryHeader + @"\\TexturesPOM\\" + Path.GetFileNameWithoutExtension( Texture.URL ) + ".pom\"," ); Infos.Add( "" ); Infos.Add( "=============================" ); Infos.Add( "Materials:" ); foreach ( FBX.Scene.Materials.MaterialParameters Mat in Scene.MaterialParameters ) Infos.Add( "ID #" + Mat.ID + " => " + Mat.Name + " (shader=" + Mat.ShaderURL + ")" ); Infos.Add( "" ); Infos.Add( "=============================" ); Infos.Add( "Meshes:" ); foreach ( FBX.Scene.Nodes.Mesh Mesh in Scene.Meshes ) Infos.Add( "ID #" + Mesh.ID + " => " + Mesh.Name + " (primsCount=" + Mesh.PrimitivesCount + ")" ); Infos.Add( "" ); Infos.Add( "=============================" ); Infos.Add( "Lights:" ); foreach ( FBX.Scene.Nodes.Light Light in Scene.Lights ) Infos.Add( "ID #" + Light.ID + " => " + Light.Name + " (type=" + Light.Type + ")" ); Infos.Add( "" ); Infos.Add( "=============================" ); Infos.Add( "Cameras:" ); foreach ( FBX.Scene.Nodes.Camera Camera in Scene.Cameras ) Infos.Add( "ID #" + Camera.ID + " => " + Camera.Name + " (FOV=" + (Camera.FOV * 180.0f / Math.PI) + ")" ); Infos.Add( "" ); if ( Materials != null ) { FBX.SceneLoader.MaterialsDatabase.Material[] QueriedMaterials = Materials.QueriedMaterials; List<string> QueriedTextures = new List<string>(); // Here I'm generating the XCOPY batch commands to copy original textures from a complex directory structure // into a flattened directory where they'll further be converted into POM files using PNG2POM Infos.Add( "=============================" ); Infos.Add( "Queried database materials:" ); foreach ( FBX.SceneLoader.MaterialsDatabase.Material M in QueriedMaterials ) { Infos.Add( M.Name ); if ( M.TextureDiffuse != null ) QueriedTextures.Add( "xcopy \"" + M.TextureDiffuse.Replace( '/', '\\' ) + "\" \"..\\POMTextures\\\" /Y/U/S" ); if ( M.TextureNormal != null ) QueriedTextures.Add( "xcopy \"" + M.TextureNormal.Replace( '/', '\\' ) + "\" \"..\\POMTextures\\\" /Y/U/S" ); if ( M.TextureSpecular != null ) QueriedTextures.Add( "xcopy \"" + M.TextureSpecular.Replace( '/', '\\' ) + "\" \"..\\POMTextures\\\" /Y/U/S" ); } Infos.Add( "" ); Infos.Add( "=============================" ); Infos.Add( "Queried textures:" ); Infos.AddRange( QueriedTextures ); } textBoxReport.Lines = Infos.ToArray(); }
/// <summary> /// Loads a FBX scene and converts it (in the same folder) into its GCX equivalent /// </summary> /// <param name="_File"></param> public void LoadScene(FileInfo _SourceFile, FileInfo _TargetFile) { FBX.SceneLoader.SceneLoader Loader = new FBX.SceneLoader.SceneLoader(); FBX.SceneLoader.MaterialsDatabase Materials = new FBX.SceneLoader.MaterialsDatabase(); // Materials.BuildFromM2( new DirectoryInfo( @"D:\Workspaces\Arkane\m2" ) ); FBX.Scene.Scene Scene = new FBX.Scene.Scene(); Loader.Load(_SourceFile, Scene, 1.0f, Materials); // Start writing // FileInfo Target = new FileInfo( Path.Combine( Path.GetDirectoryName( _SourceFile.FullName ), Path.GetFileNameWithoutExtension( _SourceFile.FullName ) + ".gcx" ) ); using (FileStream S = _TargetFile.OpenWrite()) using (BinaryWriter W = new BinaryWriter(S)) { GCXFormat.Scene GCX = new GCXFormat.Scene(Scene); GCX.Save(W); } // Write infos List <string> Infos = new List <string>(); Infos.Add("Textures:"); foreach (FBX.Scene.Materials.Texture2D Texture in Scene.Textures) { Infos.Add("ID #" + Texture.ID.ToString("D3") + " URL=" + Texture.URL); } Infos.Add(""); // Here, I write an array mapping texture IDs to names, assuming textures have been converted to POM format using PNG2POM (or HDR2POM) // This way I can simply copy this "code friendly" list and paste it in my C++ code (e.g. const char* ppID2TextureName[] = { PasteHere }; ) Infos.Add("Texture Flat Names:"); Infos.Add(""); string DirectoryHeader = Path.GetDirectoryName(_SourceFile.ToString()); DirectoryHeader = DirectoryHeader.Replace("\\", "\\\\"); // Double antislashes foreach (FBX.Scene.Materials.Texture2D Texture in Scene.Textures) { // Infos.Add( "ID #" + Texture.ID.ToString( "D3" ) + " URL=" + Path.GetFileNameWithoutExtension( Texture.URL ) ); Infos.Add("\"" + DirectoryHeader + @"\\TexturesPOM\\" + Path.GetFileNameWithoutExtension(Texture.URL) + ".pom\","); } Infos.Add(""); Infos.Add("============================="); Infos.Add("Materials:"); foreach (FBX.Scene.Materials.MaterialParameters Mat in Scene.MaterialParameters) { Infos.Add("ID #" + Mat.ID + " => " + Mat.Name + " (shader=" + Mat.ShaderURL + ")"); } Infos.Add(""); Infos.Add("============================="); Infos.Add("Meshes:"); foreach (FBX.Scene.Nodes.Mesh Mesh in Scene.Meshes) { Infos.Add("ID #" + Mesh.ID + " => " + Mesh.Name + " (primsCount=" + Mesh.PrimitivesCount + ")"); } Infos.Add(""); Infos.Add("============================="); Infos.Add("Lights:"); foreach (FBX.Scene.Nodes.Light Light in Scene.Lights) { Infos.Add("ID #" + Light.ID + " => " + Light.Name + " (type=" + Light.Type + ")"); } Infos.Add(""); Infos.Add("============================="); Infos.Add("Cameras:"); foreach (FBX.Scene.Nodes.Camera Camera in Scene.Cameras) { Infos.Add("ID #" + Camera.ID + " => " + Camera.Name + " (FOV=" + (Camera.FOV * 180.0f / Math.PI) + ")"); } Infos.Add(""); if (Materials != null) { FBX.SceneLoader.MaterialsDatabase.Material[] QueriedMaterials = Materials.QueriedMaterials; List <string> QueriedTextures = new List <string>(); // Here I'm generating the XCOPY batch commands to copy original textures from a complex directory structure // into a flattened directory where they'll further be converted into POM files using PNG2POM Infos.Add("============================="); Infos.Add("Queried database materials:"); foreach (FBX.SceneLoader.MaterialsDatabase.Material M in QueriedMaterials) { Infos.Add(M.Name); if (M.TextureDiffuse != null) { QueriedTextures.Add("xcopy \"" + M.TextureDiffuse.Replace('/', '\\') + "\" \"..\\POMTextures\\\" /Y/U/S"); } if (M.TextureNormal != null) { QueriedTextures.Add("xcopy \"" + M.TextureNormal.Replace('/', '\\') + "\" \"..\\POMTextures\\\" /Y/U/S"); } if (M.TextureSpecular != null) { QueriedTextures.Add("xcopy \"" + M.TextureSpecular.Replace('/', '\\') + "\" \"..\\POMTextures\\\" /Y/U/S"); } } Infos.Add(""); Infos.Add("============================="); Infos.Add("Queried textures:"); Infos.AddRange(QueriedTextures); } textBoxReport.Lines = Infos.ToArray(); }