Skip to content

Commit

Permalink
uvatlastool: added -m option to write out remapping text file
Browse files Browse the repository at this point in the history
  • Loading branch information
walbourn committed Nov 5, 2022
1 parent acf451e commit 4a16541
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 8 deletions.
4 changes: 2 additions & 2 deletions UVAtlasTool/Mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -404,12 +404,12 @@ HRESULT Mesh::Validate(DirectX::VALIDATE_FLAGS flags, std::wstring* msgs) const


//--------------------------------------------------------------------------------------
HRESULT Mesh::Clean(_In_ bool breakBowties) noexcept
HRESULT Mesh::Clean(std::vector<uint32_t>& dups, _In_ bool breakBowties) noexcept
{
if (!mnFaces || !mIndices || !mnVerts || !mPositions)
return E_UNEXPECTED;

std::vector<uint32_t> dups;
dups.clear();
HRESULT hr = DirectX::Clean(mIndices.get(), mnFaces, mnVerts, mAdjacency.get(), mAttributes.get(), dups, breakBowties);
if (FAILED(hr))
return hr;
Expand Down
2 changes: 1 addition & 1 deletion UVAtlasTool/Mesh.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class Mesh

HRESULT Validate(_In_ DirectX::VALIDATE_FLAGS flags, _In_opt_ std::wstring* msgs) const noexcept;

HRESULT Clean(_In_ bool breakBowties = false) noexcept;
HRESULT Clean(std::vector<uint32_t>& dups, _In_ bool breakBowties = false) noexcept;

HRESULT GenerateAdjacency(_In_ float epsilon) noexcept;

Expand Down
71 changes: 66 additions & 5 deletions UVAtlasTool/UVAtlas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ namespace
OPT_VERT_COLOR_FORMAT,
OPT_SECOND_UV,
OPT_VIZ_NORMALS,
OPT_OUTPUT_REMAPPING,
OPT_NOLOGO,
OPT_FILELIST,
OPT_MAX
Expand Down Expand Up @@ -188,6 +189,7 @@ namespace
{ L"fc", OPT_VERT_COLOR_FORMAT },
{ L"uv2", OPT_SECOND_UV },
{ L"vn", OPT_VIZ_NORMALS },
{ L"m", OPT_OUTPUT_REMAPPING },
{ L"nologo", OPT_NOLOGO },
{ L"flist", OPT_FILELIST },
{ nullptr, 0 }
Expand Down Expand Up @@ -505,6 +507,7 @@ namespace
L" -c generate mesh with colors showing charts\n"
L" -t generates a separate mesh with uvs - (*_texture)\n"
L" -vn with -t creates per vertex colors from normals\n"
L" -m generates a text file with vertex remapping (*_map)\n"
L" -it <filename> calculate IMT for the mesh using this texture map\n"
L" -iv <channel> calculate IMT using per-vertex data\n"
L" NORMAL, COLOR, TEXCOORD\n"
Expand Down Expand Up @@ -1079,6 +1082,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}

// Prepare mesh for processing
const size_t nVertsOriginal = nVerts;
std::vector<uint32_t> dups;
{
// Adjacency
const float epsilon = (dwOptions & (uint64_t(1) << OPT_GEOMETRIC_ADJ)) ? 1e-5f : 0.f;
Expand All @@ -1101,7 +1106,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}

// Clean
hr = inMesh->Clean(true);
hr = inMesh->Clean(dups, true);
if (FAILED(hr))
{
wprintf(L"\nERROR: Failed mesh clean (%08X%ls)\n",
Expand All @@ -1110,11 +1115,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])
}
else
{
const size_t nNewVerts = inMesh->GetVertexCount();
if (nVerts != nNewVerts)
nVerts = inMesh->GetVertexCount();
if (nVerts != nVertsOriginal)
{
wprintf(L" [%zu vertex dups] ", nNewVerts - nVerts);
nVerts = nNewVerts;
wprintf(L" [%zu vertex dups] ", nVerts - nVertsOriginal);
}
}
}
Expand Down Expand Up @@ -1598,6 +1602,63 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[])

wprintf(L" %zu vertices, %zu faces written:\n'%ls'\n", nVerts, nFaces, outputPath);

// Write out vertex remapping from original mesh
if (dwOptions & (uint64_t(1) << OPT_OUTPUT_REMAPPING))
{
wchar_t mapFilename[_MAX_FNAME] = {};
wcscpy_s(mapFilename, fname);
wcscat_s(mapFilename, L"_map");

_wmakepath_s(outputPath, nullptr, nullptr, mapFilename, L"txt");

if (dwOptions & (uint64_t(1) << OPT_TOLOWER))
{
std::ignore = _wcslwr_s(outputPath);
}

if (~dwOptions & (uint64_t(1) << OPT_OVERWRITE))
{
if (GetFileAttributesW(outputPath) != INVALID_FILE_ATTRIBUTES)
{
wprintf(L"\nERROR: vertex remapping file already exists, use -y to overwrite:\n'%ls'\n", outputPath);
return 1;
}
}

std::wofstream os;
os.open(outputPath);
if (!os)
{
wprintf(L"\nERROR: Failed to create vertex remapping file\n");
return 1;
}

std::locale system_locale("C");
os.imbue(system_locale);

for (size_t j = 0; j < nVerts; ++j)
{
uint32_t oldIndex = vertexRemapArray[j];
if (oldIndex == uint32_t(-1))
continue;

if (oldIndex >= nVertsOriginal)
{
oldIndex = dups[oldIndex - nVertsOriginal];
}

os << j << L"," << oldIndex << std::endl;
}

os.close();

if (os.bad())
{
wprintf(L"\nERROR: Failed to write vertex remapping file\n");
return 1;
}
}

// Write out UV mesh visualization
if (dwOptions & (uint64_t(1) << OPT_UV_MESH))
{
Expand Down

0 comments on commit 4a16541

Please sign in to comment.