You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 line
2.3 KiB

  1. vec4 _skinnedPosition;
  2. void skinPosition(float blendWeight, int matrixIndex)
  3. {
  4. vec4 tmp;
  5. tmp.x = dot(a_position, u_matrixPalette[matrixIndex]);
  6. tmp.y = dot(a_position, u_matrixPalette[matrixIndex + 1]);
  7. tmp.z = dot(a_position, u_matrixPalette[matrixIndex + 2]);
  8. tmp.w = a_position.w;
  9. _skinnedPosition += blendWeight * tmp;
  10. }
  11. vec4 getPosition()
  12. {
  13. _skinnedPosition = vec4(0.0);
  14. float blendWeight = a_blendWeights[0];
  15. int matrixIndex = int (a_blendIndices[0]) * 3;
  16. skinPosition(blendWeight, matrixIndex);
  17. blendWeight = a_blendWeights[1];
  18. matrixIndex = int(a_blendIndices[1]) * 3;
  19. skinPosition(blendWeight, matrixIndex);
  20. blendWeight = a_blendWeights[2];
  21. matrixIndex = int(a_blendIndices[2]) * 3;
  22. skinPosition(blendWeight, matrixIndex);
  23. blendWeight = a_blendWeights[3];
  24. matrixIndex = int(a_blendIndices[3]) * 3;
  25. skinPosition(blendWeight, matrixIndex);
  26. return _skinnedPosition;
  27. }
  28. #if defined(LIGHTING)
  29. vec3 _skinnedNormal;
  30. void skinTangentSpaceVector(vec3 vector, float blendWeight, int matrixIndex)
  31. {
  32. vec3 tmp;
  33. tmp.x = dot(vector, u_matrixPalette[matrixIndex].xyz);
  34. tmp.y = dot(vector, u_matrixPalette[matrixIndex + 1].xyz);
  35. tmp.z = dot(vector, u_matrixPalette[matrixIndex + 2].xyz);
  36. _skinnedNormal += blendWeight * tmp;
  37. }
  38. vec3 getTangentSpaceVector(vec3 vector)
  39. {
  40. _skinnedNormal = vec3(0.0);
  41. // Transform normal to view space using matrix palette with four matrices used to transform a vertex.
  42. float blendWeight = a_blendWeights[0];
  43. int matrixIndex = int (a_blendIndices[0]) * 3;
  44. skinTangentSpaceVector(vector, blendWeight, matrixIndex);
  45. blendWeight = a_blendWeights[1];
  46. matrixIndex = int(a_blendIndices[1]) * 3;
  47. skinTangentSpaceVector(vector, blendWeight, matrixIndex);
  48. blendWeight = a_blendWeights[2];
  49. matrixIndex = int(a_blendIndices[2]) * 3;
  50. skinTangentSpaceVector(vector, blendWeight, matrixIndex);
  51. blendWeight = a_blendWeights[3];
  52. matrixIndex = int(a_blendIndices[3]) * 3;
  53. skinTangentSpaceVector(vector, blendWeight, matrixIndex);
  54. return _skinnedNormal;
  55. }
  56. vec3 getNormal()
  57. {
  58. return getTangentSpaceVector(a_normal);
  59. }
  60. #if defined(BUMPED)
  61. vec3 getTangent()
  62. {
  63. return getTangentSpaceVector(a_tangent);
  64. }
  65. vec3 getBinormal()
  66. {
  67. return getTangentSpaceVector(a_binormal);
  68. }
  69. #endif
  70. #endif