spriteMap.fragment.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { Effect } from "../Materials/effect";
  2. let name = 'spriteMapPixelShader';
  3. let shader = `precision highp float;
  4. varying vec3 vPosition;
  5. varying vec2 vUV;
  6. varying vec2 tUV;
  7. uniform float time;
  8. uniform float spriteCount;
  9. uniform sampler2D spriteSheet;
  10. uniform vec2 spriteMapSize;
  11. uniform vec2 outputSize;
  12. uniform vec2 stageSize;
  13. uniform float maxAnimationFrames;
  14. uniform sampler2D frameMap;
  15. uniform sampler2D tileMaps[LAYERS];
  16. uniform sampler2D animationMap;
  17. uniform vec3 colorMul;
  18. float mt;
  19. float fdStep=1./4.;
  20. mat4 getFrameData(float frameID){
  21. float fX=frameID/spriteCount;
  22. return mat4(
  23. texture(frameMap,vec2(fX,0.),0.),
  24. texture(frameMap,vec2(fX,fdStep*1.),0.),
  25. texture(frameMap,vec2(fX,fdStep*2.),0.),
  26. vec4(0.)
  27. );
  28. }
  29. void main(){
  30. vec4 color=vec4(0.);
  31. vec2 tileUV=fract(tUV);
  32. #ifdef FLIPU
  33. tileUV.y=1.0-tileUV.y;
  34. #endif
  35. vec2 tileID=floor(tUV);
  36. vec2 sheetUnits=1./spriteMapSize;
  37. float spriteUnits=1./spriteCount;
  38. vec2 stageUnits=1./stageSize;
  39. for(int i=0; i<LAYERS; i++){
  40. float frameID=texture(tileMaps[i],(tileID+0.5)/stageSize,0.).x;
  41. vec4 animationData=texture(animationMap,vec2((frameID+0.5)/spriteCount,0.),0.);
  42. if(animationData.y>0.){
  43. mt=mod(time*animationData.z,1.0);
  44. float aFrameSteps=1./maxAnimationFrames;
  45. for(float f=0.; f<maxAnimationFrames; f++){
  46. if(animationData.y>mt){
  47. frameID=animationData.x;
  48. break;
  49. }
  50. animationData=texture(animationMap,vec2((frameID+0.5)/spriteCount,aFrameSteps*f),0.);
  51. }
  52. }
  53. mat4 frameData=getFrameData(frameID+0.5);
  54. vec2 frameSize=(frameData[0].wz)/spriteMapSize;
  55. vec2 offset=frameData[0].xy*sheetUnits;
  56. vec2 ratio=frameData[2].xy/frameData[0].wz;
  57. if(frameData[2].z == 1.){
  58. tileUV.xy=tileUV.yx;
  59. }
  60. if(i == 0){
  61. color=texture(spriteSheet,tileUV*frameSize+offset);
  62. } else {
  63. vec4 nc=texture(spriteSheet,tileUV*frameSize+offset);
  64. float alpha=min(color.a+nc.a,1.0);
  65. vec3 mixed=mix(color.xyz,nc.xyz,nc.a);
  66. color=vec4(mixed,alpha);
  67. }
  68. }
  69. color.xyz*=colorMul;
  70. gl_FragColor=color;
  71. }`;
  72. Effect.ShadersStore[name] = shader;
  73. /** @hidden */
  74. export var spriteMapPixelShader = { name, shader };