Skip to content
This repository was archived by the owner on Dec 11, 2025. It is now read-only.

Commit 9f82487

Browse files
committed
Add support to search for textures in output file.
1 parent 9a8f00c commit 9f82487

2 files changed

Lines changed: 119 additions & 29 deletions

File tree

Model Exporter/Model Exporter.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,11 @@
8787
</PropertyGroup>
8888
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
8989
<LinkIncremental>true</LinkIncremental>
90+
<IncludePath>D:\Sources\SDmodding\SDK Development\SDK Development;$(IncludePath)</IncludePath>
9091
</PropertyGroup>
9192
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
9293
<LinkIncremental>false</LinkIncremental>
94+
<IncludePath>D:\Sources\SDmodding\SDK Development\SDK Development;$(IncludePath)</IncludePath>
9395
</PropertyGroup>
9496
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
9597
<ClCompile>

Model Exporter/main.cxx

Lines changed: 117 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#define _CRT_SECURE_NO_WARNINGS
22
#include <array>
3+
#include <algorithm>
34
#include <iostream>
45
#include <Windows.h>
56
#include <string>
@@ -9,13 +10,14 @@
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

2022
namespace 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

345389
int 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\tDiffuse: %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\tDiffuse: %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\tBump: %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\tNormal: %s\n", m_NormalResource->m_DebugName);
550-
fprintf(m_MtlFile, "# Normal Name: %s\n", m_NormalResource->m_DebugName);
626+
printf("\t\t\tBump: %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\tSpecular: %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

Comments
 (0)