Advertisement
Guest User

Untitled

a guest
Dec 22nd, 2014
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1.     for (int i = 0; i < m_vertexCount; ++i)
  2.     {
  3.         m_pTangent[i] = dw::float3(0, 0, 0);
  4.         m_pBitangent[i] = dw::float3(0, 0, 0);
  5.     }
  6.  
  7.     for (int i = 0; i < m_indexCount; i += 3)
  8.     {
  9.         U32 i0 = m_pIndices[i];
  10.         U32 i1 = m_pIndices[i + 1];
  11.         U32 i2 = m_pIndices[i + 2];
  12.         // Shortcuts for vertices
  13.         const dw::float3 &v0 = m_pPosition[i0];
  14.         const dw::float3 &v1 = m_pPosition[i1];
  15.         const dw::float3 &v2 = m_pPosition[i2];
  16.  
  17.         // Shortcuts for UVs
  18.         dw::float2 uv0 = m_pTexCoords[i0];
  19.         dw::float2 uv1 = m_pTexCoords[i1];
  20.         dw::float2 uv2 = m_pTexCoords[i2];
  21.  
  22.         // Edges of the triangle : postion delta
  23.         dw::float3 deltaPos1 = v1 - v0;
  24.         dw::float3 deltaPos2 = v2 - v0;
  25.  
  26.         // UV delta
  27.         dw::float2 deltaUV1 = uv1 - uv0;
  28.         dw::float2 deltaUV2 = uv2 - uv0;
  29.  
  30.         F32 div = (deltaUV1.x * deltaUV2.y - deltaUV1.y * deltaUV2.x);
  31.         if (isnan(div))
  32.         {
  33.             div = 0.0f;
  34.         }
  35.  
  36.         F32 r = 0.0f;
  37.         F32 weight = 1.0f;
  38.         if (div != 0.0f)
  39.         {
  40.             r = 1.0f / div;
  41.         }
  42.  
  43.         dw::float3 tangent = dw::normalize(dw::float3(deltaPos1 * deltaUV2.y - deltaPos2 * deltaUV1.y) * r);
  44.         dw::float3 bitangent = dw::normalize(dw::float3(deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x) * r);
  45.  
  46.         m_pTangent[i0] += tangent;
  47.         m_pTangent[i1] += tangent;
  48.         m_pTangent[i2] += tangent;
  49.  
  50.         m_pBitangent[i0] += bitangent;
  51.         m_pBitangent[i1] += bitangent;
  52.         m_pBitangent[i2] += bitangent;
  53.     }
  54.  
  55.     for (U32 i = 0; i < m_vertexCount; ++i)
  56.     {
  57.         const dw::float3 n = m_pNormal[i];
  58.         dw::float3 t = (m_pTangent[i]);
  59.         auto b = dw::normalize(m_pBitangent[i]);
  60.  
  61.         t = dw::normalize(dw::float3(t - n * dw::dot(n, t)));
  62.  
  63.         float w = (dw::dot(dw::cross(n, t), b) < 0.0F) ? -1.0F : 1.0F;
  64.         if (w < 0.0f)
  65.         {
  66.             t = t * w;
  67.         }
  68.  
  69.         m_pTangent[i] = t;
  70.         m_pBitangent[i] = dw::normalize(dw::cross(n, t) * w);
  71.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement