11#define _CRT_SECURE_NO_WARNINGS
22#include < array>
3+ #include < algorithm>
34#include < iostream>
45#include < Windows.h>
56#include < string>
910#include " 3rdParty/umHalf.h"
1011
1112// Defines
12- #define PROJECT_VERSION " v1.0.2 "
13+ #define PROJECT_VERSION " v1.0.3 "
1314#define PROJECT_NAME " Model Exporter " PROJECT_VERSION
1415
1516// SDK Stuff
1617#define UFG_PAD_INSERT (x, y ) x ## y
1718#define UFG_PAD_DEFINE (x, y ) UFG_PAD_INSERT (x, y)
1819#define UFG_PAD (size ) char UFG_PAD_DEFINE (padding_, __LINE__)[size] = { 0x0 }
20+ #include < SDK/Optional/StringHash.hpp>
1921
2022namespace UFG
2123{
@@ -340,6 +342,48 @@ namespace Helper
340342
341343 return m_OpenFileName.lpstrFile ;
342344 }
345+
346+ namespace TextureFiles
347+ {
348+ std::unordered_map<uint32_t , std::string> m_Map;
349+ void Initialize (std::string p_Path)
350+ {
351+ std::vector<std::string> m_SupportedExtensions = { " .JPG" , " .JPEG" , " .PNG" , " .TIFF" , " .TIF" , " .BMP" , " .TGA" , " .GIF" , " .HDR" , " .EXR" , " .DDS" };
352+ try
353+ {
354+ for (auto & m_Entry : std::filesystem::directory_iterator (p_Path))
355+ {
356+ if (!m_Entry.is_regular_file ())
357+ continue ;
358+
359+ std::string m_Extension = m_Entry.path ().extension ().string ();
360+ std::transform (m_Extension.begin (), m_Extension.end (), m_Extension.begin (), ::toupper);
361+
362+ if (std::find (m_SupportedExtensions.begin (), m_SupportedExtensions.end (), m_Extension) == m_SupportedExtensions.end ())
363+ continue ;
364+
365+ std::string m_TextureName = m_Entry.path ().stem ().string ();
366+ m_Map[SDK::StringHashUpper32 (&m_TextureName[0 ])] = m_Entry.path ().filename ().string ();
367+ }
368+ }
369+ catch (...)
370+ {
371+ printf (" [ WARNING ] Failed to fetch texture files because 'directory_iterator' got IO Error.!\n " );
372+ }
373+
374+ if (m_Map.size ())
375+ printf (" [ ~ ] Found %zu textures in output folder.\n " , m_Map.size ());
376+ }
377+
378+ std::string TryGet (uint32_t p_NameUID)
379+ {
380+ auto m_Find = m_Map.find (p_NameUID);
381+ if (m_Find == m_Map.end ())
382+ return " " ;
383+
384+ return (*m_Find).second ;
385+ }
386+ }
343387}
344388
345389int g_Argc = 0 ;
@@ -459,6 +503,8 @@ int main(int p_Argc, char** p_Argv)
459503 std::filesystem::create_directory (m_OutputDir);
460504 }
461505
506+ Helper::TextureFiles::Initialize (m_OutputDir);
507+
462508 size_t m_ModelIndex = 0 ;
463509 size_t m_ModelsExported = 0 ;
464510
@@ -503,62 +549,103 @@ int main(int p_Argc, char** p_Argv)
503549 m_MtlBase.m_Illum = 0 ;
504550 }
505551
506- static uint32_t m_DiffuseHashes[] =
552+ enum eMapType : uint8_t
553+ {
554+ eMapType_Diffuse,
555+ eMapType_Bump,
556+ eMapType_Specular
557+ };
558+
559+ static std::vector<std::vector<uint32_t >> m_TextureMapUIDs =
507560 {
508- 0xDCE06689 , // texDiffuse
509- 0x19410F73 , // texDiffuse2
510- 0x5F95AF1 , // texDiffuseWorld
561+ // Diffuse
562+ {
563+ 0xDCE06689 , // texDiffuse
564+ 0x19410F73 , // texDiffuse2
565+ 0x5F95AF1 // texDiffuseWorld
566+ },
567+ // Bump
568+ {
569+ 0xECADC789 , // texNormal
570+ 0xADBE1A5A , // texBump
571+ 0xA348DC23 , // texBump2
572+ },
573+ // Specular
574+ {
575+ 0xCB460EC7 , // texSpecular
576+ 0xED7FCA06 // texSpecular2
577+ }
511578 };
512- for (uint32_t m_DiffuseNameUID : m_DiffuseHashes)
579+
580+ // Diffuse
581+ for (uint32_t m_NameUID : m_TextureMapUIDs[eMapType_Diffuse])
513582 {
514- Illusion::MaterialParam_t* m_Diffuse = m_Material->GetParam (m_DiffuseNameUID );
583+ Illusion::MaterialParam_t* m_Diffuse = m_Material->GetParam (m_NameUID );
515584 if (!m_Diffuse)
516585 continue ;
517586
587+ if (Helper::GetTextureColor (m_Diffuse->m_NameUID , m_MtlBase.m_Kd ))
588+ continue ; // The texture would use one pixel color so we don't include it...
589+
590+ m_MtlBase.m_MapKd = Helper::TextureFiles::TryGet (m_Diffuse->m_NameUID );
591+ if (!m_MtlBase.m_MapKd .empty ())
592+ {
593+ printf (" \t\t\t Diffuse: %s\n " , &m_MtlBase.m_MapKd [0 ]);
594+ break ;
595+ }
596+
518597 UFG ::ResourceData_t* m_DiffuseResource = m_PermFile.GetResourceData (m_Diffuse->m_NameUID );
519598 if (m_DiffuseResource)
520599 {
521600 printf (" \t\t\t Diffuse: %s\n " , m_DiffuseResource->m_DebugName );
522601 fprintf (m_MtlFile, " # Diffuse Name: %s\n " , m_DiffuseResource->m_DebugName );
523602 }
524603
525- if (!Helper::GetTextureColor (m_Diffuse->m_NameUID , m_MtlBase.m_Kd ))
526- {
527- sprintf_s (m_Format, sizeof (m_Format), " ../Textures/0x%X.png" , m_Diffuse->m_NameUID );
528- m_MtlBase.m_MapKd = m_Format;
529- }
530-
604+ sprintf_s (m_Format, sizeof (m_Format), " ../Textures/0x%X.png" , m_Diffuse->m_NameUID );
605+ m_MtlBase.m_MapKd = m_Format;
531606 break ;
532607 }
533608
534- static uint32_t m_NormalHashes[] =
609+ // Bump
610+ for (uint32_t m_NameUID : m_TextureMapUIDs[eMapType_Bump])
535611 {
536- 0xECADC789 , // texNormal
537- 0xADBE1A5A , // texBump
538- 0xA348DC23 , // texBump2
539- };
540- for (uint32_t m_NormalNameUID : m_NormalHashes)
541- {
542- Illusion::MaterialParam_t* m_Normal = m_Material->GetParam (m_NormalNameUID);
543- if (!m_Normal)
612+ Illusion::MaterialParam_t* m_Bump = m_Material->GetParam (m_NameUID);
613+ if (!m_Bump)
544614 continue ;
545615
546- UFG ::ResourceData_t* m_NormalResource = m_PermFile.GetResourceData (m_Normal->m_NameUID );
616+ m_MtlBase.m_MapBump = Helper::TextureFiles::TryGet (m_Bump->m_NameUID );
617+ if (!m_MtlBase.m_MapBump .empty ())
618+ {
619+ printf (" \t\t\t Bump: %s\n " , &m_MtlBase.m_MapBump [0 ]);
620+ break ;
621+ }
622+
623+ UFG ::ResourceData_t* m_NormalResource = m_PermFile.GetResourceData (m_Bump->m_NameUID );
547624 if (m_NormalResource)
548625 {
549- printf (" \t\t\t Normal : %s\n " , m_NormalResource->m_DebugName );
550- fprintf (m_MtlFile, " # Normal Name: %s\n " , m_NormalResource->m_DebugName );
626+ printf (" \t\t\t Bump : %s\n " , m_NormalResource->m_DebugName );
627+ fprintf (m_MtlFile, " # Bump Name: %s\n " , m_NormalResource->m_DebugName );
551628 }
552629
553- sprintf_s (m_Format, sizeof (m_Format), " ../Textures/0x%X.png" , m_Normal ->m_NameUID );
630+ sprintf_s (m_Format, sizeof (m_Format), " ../Textures/0x%X.png" , m_Bump ->m_NameUID );
554631 m_MtlBase.m_MapBump = m_Format;
555-
556632 break ;
557633 }
558634
559- Illusion::MaterialParam_t* m_Specular = m_Material-> GetParam ( 0xCB460EC7 ); // texSpecular
560- if (m_Specular )
635+ // Specular
636+ for ( uint32_t m_NameUID : m_TextureMapUIDs[eMapType_Specular] )
561637 {
638+ Illusion::MaterialParam_t* m_Specular = m_Material->GetParam (m_NameUID);
639+ if (!m_Specular)
640+ continue ;
641+
642+ m_MtlBase.m_MapKs = Helper::TextureFiles::TryGet (m_Specular->m_NameUID );
643+ if (!m_MtlBase.m_MapKs .empty ())
644+ {
645+ printf (" \t\t\t Specular: %s\n " , &m_MtlBase.m_MapKs [0 ]);
646+ break ;
647+ }
648+
562649 UFG ::ResourceData_t* m_SpecularResource = m_PermFile.GetResourceData (m_Specular->m_NameUID );
563650 if (m_SpecularResource)
564651 {
@@ -568,6 +655,7 @@ int main(int p_Argc, char** p_Argv)
568655
569656 sprintf_s (m_Format, sizeof (m_Format), " ../Textures/0x%X.png" , m_Specular->m_NameUID );
570657 m_MtlBase.m_MapKs = m_Format;
658+ break ;
571659 }
572660
573661 m_MtlBase.WriteToFile (m_MtlFile);
0 commit comments