particle-common.chunk 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #pragma define-meta CC_RENDER_MODE range([0, 4])
  2. #pragma define RENDER_MODE_BILLBOARD 0
  3. #pragma define RENDER_MODE_STRETCHED_BILLBOARD 1
  4. #pragma define RENDER_MODE_HORIZONTAL_BILLBOARD 2
  5. #pragma define RENDER_MODE_VERTICAL_BILLBOARD 3
  6. #pragma define RENDER_MODE_MESH 4
  7. uniform Constants {
  8. vec4 mainTiling_Offset;
  9. vec4 frameTile_velLenScale;
  10. vec4 scale;
  11. vec4 nodeRotation;
  12. };
  13. #include <builtin/uniforms/cc-global>
  14. #include <builtin/uniforms/cc-local>
  15. #include <common/math/transform>
  16. out mediump vec2 uv;
  17. out mediump vec4 color;
  18. void computeVertPos (inout vec4 pos, vec2 vertOffset, vec4 q, vec3 s
  19. #if CC_RENDER_MODE == RENDER_MODE_BILLBOARD || CC_RENDER_MODE == RENDER_MODE_VERTICAL_BILLBOARD
  20. , mat4 viewInv
  21. #endif
  22. #if CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  23. , vec3 eye
  24. , vec4 velocity
  25. , float velocityScale
  26. , float lengthScale
  27. , float xIndex
  28. #endif
  29. ) {
  30. #if CC_RENDER_MODE == RENDER_MODE_BILLBOARD
  31. vec3 viewSpaceVert = vec3(vertOffset.x * s.x, vertOffset.y * s.y, 0.);
  32. vec3 camX = normalize(vec3(viewInv[0][0], viewInv[1][0], viewInv[2][0]));
  33. vec3 camY = normalize(vec3(viewInv[0][1], viewInv[1][1], viewInv[2][1]));
  34. vec3 camZ = normalize(vec3(viewInv[0][2], viewInv[1][2], viewInv[2][2]));
  35. pos.xyz += rotateInLocalSpace(viewSpaceVert, camX, camY, camZ, q);
  36. #elif CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  37. vec3 camRight = normalize(cross(pos.xyz - eye, velocity.xyz)) * s.x;
  38. vec3 camUp = velocity.xyz * velocityScale + normalize(velocity.xyz) * lengthScale * s.y;
  39. pos.xyz += (camRight * abs(vertOffset.x) * sign(vertOffset.y)) - camUp * xIndex;
  40. #elif CC_RENDER_MODE == RENDER_MODE_HORIZONTAL_BILLBOARD
  41. vec3 viewSpaceVert = vec3(vertOffset.x * s.x, vertOffset.y * s.y, 0.);
  42. vec3 camX = vec3(1, 0, 0);
  43. vec3 camY = vec3(0, 0, -1);
  44. pos.xyz += rotateInLocalSpace(viewSpaceVert, camX, camY, cross(camX, camY), q);
  45. #elif CC_RENDER_MODE == RENDER_MODE_VERTICAL_BILLBOARD
  46. vec3 viewSpaceVert = vec3(vertOffset.x * s.x, vertOffset.y * s.y, 0.);
  47. rotateVecFromQuat(viewSpaceVert, q);
  48. vec3 camX = normalize(vec3(cc_matView[0][0], cc_matView[1][0], cc_matView[2][0]));
  49. vec3 camY = vec3(0, 1, 0);
  50. vec3 offset = camX * viewSpaceVert.x + camY * viewSpaceVert.y;
  51. pos.xyz += offset;
  52. #else
  53. pos.x += vertOffset.x;
  54. pos.y += vertOffset.y;
  55. #endif
  56. }
  57. vec2 computeUV (float frameIndex, vec2 vertIndex, vec2 frameTile){
  58. vec2 aniUV = vec2(0, floor(frameIndex * frameTile.y));
  59. aniUV.x = floor(frameIndex * frameTile.x * frameTile.y - aniUV.y * frameTile.x);
  60. #if CC_RENDER_MODE != RENDER_MODE_MESH
  61. vertIndex.y = 1. - vertIndex.y; // if using billboard ,y must be flipped.but mesh does not,why?
  62. #endif
  63. return (aniUV.xy + vertIndex) / vec2(frameTile.x, frameTile.y);
  64. }