particle-vs-legacy.chunk 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. precision highp float;
  2. #include <common/math/transform>
  3. #include <builtin/internal/particle-common>
  4. #include <builtin/uniforms/cc-local>
  5. in vec3 a_texCoord1; // size
  6. in vec3 a_texCoord2; // rotation
  7. in vec4 a_color;
  8. in vec3 a_texCoord; // xy:vertex index,z:frame index
  9. #if !CC_INSTANCE_PARTICLE
  10. in vec3 a_position; // center position
  11. #endif
  12. #if CC_INSTANCE_PARTICLE
  13. in vec4 a_texCoord4; // xyz:position,z:frame index
  14. #endif
  15. #if CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  16. in vec3 a_color1; // velocity.x, velocity.y, velocity.z, scale
  17. #endif
  18. #if CC_RENDER_MODE == RENDER_MODE_MESH
  19. in vec3 a_texCoord3; // mesh vertices
  20. in vec3 a_normal; // mesh normal
  21. in vec4 a_color1; // mesh color
  22. #endif
  23. vec4 lpvs_main () {
  24. vec3 compScale = scale.xyz * a_texCoord1;
  25. #if !CC_INSTANCE_PARTICLE
  26. vec4 pos = vec4(a_position.xyz, 1);
  27. #endif
  28. #if CC_INSTANCE_PARTICLE
  29. vec4 pos = vec4(a_texCoord4.xyz, 1);
  30. #endif
  31. #if CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  32. vec4 velocity = vec4(a_color1.xyz, 0);
  33. #endif
  34. #if !CC_USE_WORLD_SPACE
  35. // simulate in world space. apply cc_matWorld matrix on CPU side.
  36. pos = cc_matWorld * pos;
  37. #if CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  38. velocity = cc_matWorld * velocity;
  39. #endif
  40. #endif
  41. #pragma define INDENTIFY_NEG_QUAT 10.0
  42. #if ROTATION_OVER_TIME_MODULE_ENABLE
  43. vec3 rotTmp = a_texCoord2;
  44. float mulFactor = 1.0;
  45. if (rotTmp.x > INDENTIFY_NEG_QUAT * 0.5) {
  46. rotTmp.x -= INDENTIFY_NEG_QUAT;
  47. mulFactor = -1.0;
  48. }
  49. vec4 rot = vec4(rotTmp, 0.0);
  50. rot.w = mulFactor * sqrt(abs(1.0 - rot.x * rot.x - rot.y * rot.y - rot.z * rot.z));
  51. #endif
  52. #if !ROTATION_OVER_TIME_MODULE_ENABLE
  53. #if CC_RENDER_MODE != RENDER_MODE_MESH
  54. #if CC_RENDER_MODE == RENDER_MODE_BILLBOARD
  55. vec3 rotEuler = a_texCoord2;
  56. #elif CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  57. vec3 rotEuler = vec3(0.);
  58. #endif
  59. #if CC_RENDER_MODE != RENDER_MODE_BILLBOARD && CC_RENDER_MODE != RENDER_MODE_STRETCHED_BILLBOARD
  60. vec3 rotEuler = vec3(0., 0., a_texCoord2.z);
  61. #endif
  62. vec4 rot = quaternionFromEuler(rotEuler);
  63. #endif
  64. #if CC_RENDER_MODE == RENDER_MODE_MESH
  65. vec4 rot = quaternionFromEuler(a_texCoord2);
  66. #endif
  67. #endif
  68. #if CC_RENDER_MODE != RENDER_MODE_MESH
  69. vec2 cornerOffset = vec2((a_texCoord.xy - 0.5));
  70. #if CC_RENDER_MODE == RENDER_MODE_BILLBOARD || CC_RENDER_MODE == RENDER_MODE_VERTICAL_BILLBOARD
  71. computeVertPos(pos, cornerOffset, rot, compScale, cc_matViewInv);
  72. #elif CC_RENDER_MODE == RENDER_MODE_STRETCHED_BILLBOARD
  73. computeVertPos(pos, cornerOffset, rot, compScale, cc_cameraPos.xyz, velocity, frameTile_velLenScale.z, frameTile_velLenScale.w, a_texCoord.x);
  74. #elif RENDER_MODE_HORIZONTAL_BILLBOARD
  75. computeVertPos(pos, cornerOffset, rot, compScale);
  76. #endif
  77. color = a_color;
  78. #endif
  79. #if CC_RENDER_MODE == RENDER_MODE_MESH
  80. mat3 rotMat = quatToMat3(rot);
  81. mat3 nodeMat = quatToMat3(nodeRotation);
  82. rotMat = nodeMat * rotMat;
  83. rot = mat3ToQuat(rotMat);
  84. mat4 xformNoScale = matrixFromRT(rot, pos.xyz);
  85. mat4 xform = matFromRTS(rot, pos.xyz, compScale);
  86. pos = xform * vec4(a_texCoord3, 1);
  87. vec4 normal = xformNoScale * vec4(a_normal, 0);
  88. color = a_color * a_color1;
  89. #endif
  90. #if !CC_INSTANCE_PARTICLE
  91. uv = computeUV(a_texCoord.z, a_texCoord.xy, frameTile_velLenScale.xy) * mainTiling_Offset.xy + mainTiling_Offset.zw;
  92. #endif
  93. #if CC_INSTANCE_PARTICLE
  94. uv = computeUV(a_texCoord4.w, a_texCoord.xy, frameTile_velLenScale.xy) * mainTiling_Offset.xy + mainTiling_Offset.zw;
  95. #endif
  96. pos = cc_matViewProj * pos;
  97. return pos;
  98. }