world-transform.chunk 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. #include <builtin/uniforms/cc-local-batched>
  2. void CCGetWorldMatrix(out mat4 matWorld)
  3. {
  4. #if USE_INSTANCING
  5. matWorld = mat4(
  6. vec4(a_matWorld0.xyz, 0.0),
  7. vec4(a_matWorld1.xyz, 0.0),
  8. vec4(a_matWorld2.xyz, 0.0),
  9. vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)
  10. );
  11. #else
  12. matWorld = cc_matWorld;
  13. #endif
  14. }
  15. void CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)
  16. {
  17. #if USE_INSTANCING
  18. matWorld = mat4(
  19. vec4(a_matWorld0.xyz, 0.0),
  20. vec4(a_matWorld1.xyz, 0.0),
  21. vec4(a_matWorld2.xyz, 0.0),
  22. vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)
  23. );
  24. // non-uniform scaling for normals
  25. vec3 scale = 1.0 / vec3(length(a_matWorld0.xyz), length(a_matWorld1.xyz), length(a_matWorld2.xyz));
  26. vec3 scale2 = scale * scale;
  27. matWorldIT = mat4(
  28. vec4(a_matWorld0.xyz * scale2.x, 0.0),
  29. vec4(a_matWorld1.xyz * scale2.y, 0.0),
  30. vec4(a_matWorld2.xyz * scale2.z, 0.0),
  31. vec4(0.0, 0.0, 0.0, 1.0)
  32. );
  33. #else
  34. matWorld = cc_matWorld;
  35. matWorldIT = cc_matWorldIT;
  36. #endif
  37. }