Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- for (int i = 0; i < m_vertexCount; ++i)
- {
- m_pTangent[i] = dw::float3(0, 0, 0);
- m_pBitangent[i] = dw::float3(0, 0, 0);
- }
- for (int i = 0; i < m_indexCount; i += 3)
- {
- U32 i0 = m_pIndices[i];
- U32 i1 = m_pIndices[i + 1];
- U32 i2 = m_pIndices[i + 2];
- // Shortcuts for vertices
- const dw::float3 &v0 = m_pPosition[i0];
- const dw::float3 &v1 = m_pPosition[i1];
- const dw::float3 &v2 = m_pPosition[i2];
- // Shortcuts for UVs
- dw::float2 uv0 = m_pTexCoords[i0];
- dw::float2 uv1 = m_pTexCoords[i1];
- dw::float2 uv2 = m_pTexCoords[i2];
- // Edges of the triangle : postion delta
- dw::float3 deltaPos1 = v1 - v0;
- dw::float3 deltaPos2 = v2 - v0;
- // UV delta
- dw::float2 deltaUV1 = uv1 - uv0;
- dw::float2 deltaUV2 = uv2 - uv0;
- F32 div = (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
- if (isnan(div))
- {
- div = 0.0f;
- }
- F32 r = 0.0f;
- F32 weight = 1.0f;
- if (div != 0.0f)
- {
- r = 1.0f / div;
- }
- dw::float3 tangent = dw::normalize(dw::float3(deltaPos1 * deltaUV2.y - deltaPos2 * deltaUV1.y) * r);
- dw::float3 bitangent = dw::normalize(dw::float3(deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x) * r);
- m_pTangent[i0] += tangent;
- m_pTangent[i1] += tangent;
- m_pTangent[i2] += tangent;
- m_pBitangent[i0] += bitangent;
- m_pBitangent[i1] += bitangent;
- m_pBitangent[i2] += bitangent;
- }
- for (U32 i = 0; i < m_vertexCount; ++i)
- {
- const dw::float3 n = m_pNormal[i];
- dw::float3 t = (m_pTangent[i]);
- auto b = dw::normalize(m_pBitangent[i]);
- t = dw::normalize(dw::float3(t - n * dw::dot(n, t)));
- float w = (dw::dot(dw::cross(n, t), b) < 0.0F) ? -1.0F : 1.0F;
- if (w < 0.0f)
- {
- t = t * w;
- }
- m_pTangent[i] = t;
- m_pBitangent[i] = dw::normalize(dw::cross(n, t) * w);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement