in UVAtlasTool/Mesh.cpp [765:892]
HRESULT Mesh::VertexRemap(const uint32_t* remap, size_t nNewVerts) noexcept
{
if (!remap || !nNewVerts)
return E_INVALIDARG;
if (!mnVerts || !mPositions)
return E_UNEXPECTED;
if (nNewVerts < mnVerts)
return E_FAIL;
std::unique_ptr<XMFLOAT3[]> pos(new (std::nothrow) XMFLOAT3[nNewVerts]);
if (!pos)
return E_OUTOFMEMORY;
HRESULT hr = UVAtlasApplyRemap(mPositions.get(), sizeof(XMFLOAT3), mnVerts, nNewVerts, remap, pos.get());
if (FAILED(hr))
return hr;
std::unique_ptr<XMFLOAT3[]> norms;
if (mNormals)
{
norms.reset(new (std::nothrow) XMFLOAT3[nNewVerts]);
if (!norms)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mNormals.get(), sizeof(XMFLOAT3), mnVerts, nNewVerts, remap, norms.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT4[]> tans1;
if (mTangents)
{
tans1.reset(new (std::nothrow) XMFLOAT4[nNewVerts]);
if (!tans1)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mTangents.get(), sizeof(XMFLOAT4), mnVerts, nNewVerts, remap, tans1.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT3[]> tans2;
if (mBiTangents)
{
tans2.reset(new (std::nothrow) XMFLOAT3[nNewVerts]);
if (!tans2)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mBiTangents.get(), sizeof(XMFLOAT3), mnVerts, nNewVerts, remap, tans2.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT2[]> texcoord;
if (mTexCoords)
{
texcoord.reset(new (std::nothrow) XMFLOAT2[nNewVerts]);
if (!texcoord)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mTexCoords.get(), sizeof(XMFLOAT2), mnVerts, nNewVerts, remap, texcoord.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT2[]> texcoord2;
if (mTexCoords2)
{
texcoord2.reset(new (std::nothrow) XMFLOAT2[nNewVerts]);
if (!texcoord2)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mTexCoords2.get(), sizeof(XMFLOAT2), mnVerts, nNewVerts, remap, texcoord2.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT4[]> colors;
if (mColors)
{
colors.reset(new (std::nothrow) XMFLOAT4[nNewVerts]);
if (!colors)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mColors.get(), sizeof(XMFLOAT4), mnVerts, nNewVerts, remap, colors.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT4[]> blendIndices;
if (mBlendIndices)
{
blendIndices.reset(new (std::nothrow) XMFLOAT4[nNewVerts]);
if (!blendIndices)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mBlendIndices.get(), sizeof(XMFLOAT4), mnVerts, nNewVerts, remap, blendIndices.get());
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT4[]> blendWeights;
if (mBlendWeights)
{
blendWeights.reset(new (std::nothrow) XMFLOAT4[nNewVerts]);
if (!blendWeights)
return E_OUTOFMEMORY;
hr = UVAtlasApplyRemap(mBlendWeights.get(), sizeof(XMFLOAT4), mnVerts, nNewVerts, remap, blendWeights.get());
if (FAILED(hr))
return hr;
}
mPositions.swap(pos);
mNormals.swap(norms);
mTangents.swap(tans1);
mBiTangents.swap(tans2);
mTexCoords.swap(texcoord);
mTexCoords2.swap(texcoord2);
mColors.swap(colors);
mBlendIndices.swap(blendIndices);
mBlendWeights.swap(blendWeights);
mnVerts = nNewVerts;
return S_OK;
}