in UVAtlasTool/Mesh.cpp [241:391]
HRESULT Mesh::SetVertexData(_Inout_ DirectX::VBReader& reader, _In_ size_t nVerts) noexcept
{
if (!nVerts)
return E_INVALIDARG;
// Release vertex data
mnVerts = 0;
mPositions.reset();
mNormals.reset();
mTangents.reset();
mBiTangents.reset();
mTexCoords.reset();
mTexCoords2.reset();
mColors.reset();
mBlendIndices.reset();
mBlendWeights.reset();
// Load positions (required)
std::unique_ptr<XMFLOAT3[]> pos(new (std::nothrow) XMFLOAT3[nVerts]);
if (!pos)
return E_OUTOFMEMORY;
HRESULT hr = reader.Read(pos.get(), "SV_Position", 0, nVerts);
if (FAILED(hr))
return hr;
// Load normals
std::unique_ptr<XMFLOAT3[]> norms;
auto e = reader.GetElement11("NORMAL", 0);
if (e)
{
norms.reset(new (std::nothrow) XMFLOAT3[nVerts]);
if (!norms)
return E_OUTOFMEMORY;
hr = reader.Read(norms.get(), "NORMAL", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Load tangents
std::unique_ptr<XMFLOAT4[]> tans1;
e = reader.GetElement11("TANGENT", 0);
if (e)
{
tans1.reset(new (std::nothrow) XMFLOAT4[nVerts]);
if (!tans1)
return E_OUTOFMEMORY;
hr = reader.Read(tans1.get(), "TANGENT", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Load bi-tangents
std::unique_ptr<XMFLOAT3[]> tans2;
e = reader.GetElement11("BINORMAL", 0);
if (e)
{
tans2.reset(new (std::nothrow) XMFLOAT3[nVerts]);
if (!tans2)
return E_OUTOFMEMORY;
hr = reader.Read(tans2.get(), "BINORMAL", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Load texture coordinates
std::unique_ptr<XMFLOAT2[]> texcoord;
e = reader.GetElement11("TEXCOORD", 0);
if (e)
{
texcoord.reset(new (std::nothrow) XMFLOAT2[nVerts]);
if (!texcoord)
return E_OUTOFMEMORY;
hr = reader.Read(texcoord.get(), "TEXCOORD", 0, nVerts);
if (FAILED(hr))
return hr;
}
std::unique_ptr<XMFLOAT2[]> texcoord2;
e = reader.GetElement11("TEXCOORD", 1);
if (e)
{
texcoord2.reset(new (std::nothrow) XMFLOAT2[nVerts]);
if (!texcoord2)
return E_OUTOFMEMORY;
hr = reader.Read(texcoord2.get(), "TEXCOORD", 1, nVerts);
if (FAILED(hr))
return hr;
}
// Load vertex colors
std::unique_ptr<XMFLOAT4[]> colors;
e = reader.GetElement11("COLOR", 0);
if (e)
{
colors.reset(new (std::nothrow) XMFLOAT4[nVerts]);
if (!colors)
return E_OUTOFMEMORY;
hr = reader.Read(colors.get(), "COLOR", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Load skinning bone indices
std::unique_ptr<XMFLOAT4[]> blendIndices;
e = reader.GetElement11("BLENDINDICES", 0);
if (e)
{
blendIndices.reset(new (std::nothrow) XMFLOAT4[nVerts]);
if (!blendIndices)
return E_OUTOFMEMORY;
hr = reader.Read(blendIndices.get(), "BLENDINDICES", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Load skinning bone weights
std::unique_ptr<XMFLOAT4[]> blendWeights;
e = reader.GetElement11("BLENDWEIGHT", 0);
if (e)
{
blendWeights.reset(new (std::nothrow) XMFLOAT4[nVerts]);
if (!blendWeights)
return E_OUTOFMEMORY;
hr = reader.Read(blendWeights.get(), "BLENDWEIGHT", 0, nVerts);
if (FAILED(hr))
return hr;
}
// Return values
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 = nVerts;
return S_OK;
}