Glsl VS 3D.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "Glsl 3D.h"
  2. #define MAX_MATRIX 60
  3. PAR HP Vec2 GrassRangeMulAdd; // must be HP
  4. PAR HP Vec2 SkyFracMulAdd; // better do HP because we can operate on large view ranges
  5. PAR HP Vec2 VertexFogMulAdd; // must be HP
  6. PAR LP Vec VertexFogColor;
  7. PAR MP Vec4 FogColor_Density;
  8. PAR HP Vec4 ClipPlane;
  9. //PAR Matrix ViewMatrix[MAX_MATRIX]; Adreno 220 Android 2.3 complains about insufficient vertex uniform vectors, this also causes bug in Windows Nvidia GeForce GTX 460 where full array of matrixes is not always detected as used in the shader when skinning is present
  10. PAR HP Vec4 ViewMatrix[MAX_MATRIX*3];
  11. PAR MP Vec ObjVel[MAX_MATRIX];
  12. PAR MP Vec ObjAngVel;
  13. PAR MP Vec CamAngVel;
  14. PAR HP Matrix4(ProjMatrix);
  15. MP Vec ViewMatrixY () {MP Int i=gl_InstanceID*3; return Vec(ViewMatrix[i].y, ViewMatrix[i+1].y, ViewMatrix[i+2].y);}
  16. HP Vec ViewMatrixPos() {MP Int i=gl_InstanceID*3; return Vec(ViewMatrix[i].w, ViewMatrix[i+1].w, ViewMatrix[i+2].w);}
  17. LP Vec FogColor () {return FogColor_Density.rgb;}
  18. MP Flt FogDensity() {return FogColor_Density.a ;}
  19. /*#if 0
  20. HP Vec TransformPos(HP Vec v) {return Transform (v, ViewMatrix[0]);}
  21. MP Vec TransformDir(MP Vec v) {return Transform3(v, ViewMatrix[0]);}
  22. HP Vec TransformPos(HP Vec v, MP VecI bone, HP Vec weight) {return weight.x*Transform (v, ViewMatrix[bone.x]) + weight.y*Transform (v, ViewMatrix[bone.y]) + weight.z*Transform (v, ViewMatrix[bone.z]);}
  23. MP Vec TransformDir(MP Vec v, MP VecI bone, MP Vec weight) {return weight.x*Transform3(v, ViewMatrix[bone.x]) + weight.y*Transform3(v, ViewMatrix[bone.y]) + weight.z*Transform3(v, ViewMatrix[bone.z]);}
  24. #else*/
  25. HP Vec TransformPos(HP Vec v) // main matrix
  26. {
  27. return Vec(Dot(v, ViewMatrix[0].xyz) + ViewMatrix[0].w,
  28. Dot(v, ViewMatrix[1].xyz) + ViewMatrix[1].w,
  29. Dot(v, ViewMatrix[2].xyz) + ViewMatrix[2].w);
  30. }
  31. MP Vec TransformDir(MP Vec v) // main matrix
  32. {
  33. MP Vec m0=ViewMatrix[0].xyz, m1=ViewMatrix[1].xyz, m2=ViewMatrix[2].xyz;
  34. return Vec(Dot(v, m0),
  35. Dot(v, m1),
  36. Dot(v, m2));
  37. }
  38. HP Vec TransformPos(HP Vec v, MP Int i) // i-th matrix
  39. {
  40. i*=3;
  41. return Vec(Dot(v, ViewMatrix[i ].xyz) + ViewMatrix[i ].w,
  42. Dot(v, ViewMatrix[i+1].xyz) + ViewMatrix[i+1].w,
  43. Dot(v, ViewMatrix[i+2].xyz) + ViewMatrix[i+2].w);
  44. }
  45. MP Vec TransformDir(MP Vec v, MP Int i) // i-th matrix
  46. {
  47. i*=3;
  48. MP Vec m0=ViewMatrix[i].xyz, m1=ViewMatrix[i+1].xyz, m2=ViewMatrix[i+2].xyz;
  49. return Vec(Dot(v, m0),
  50. Dot(v, m1),
  51. Dot(v, m2));
  52. }
  53. #ifdef GL_ES // GLSL may not support "#if GL_ES" if GL_ES is not defined
  54. HP Vec TransformPos(HP Vec v, MP VecI bone, HP Vec weight) {return weight.x*TransformPos(v, bone.x) + weight.y*TransformPos(v, bone.y);} // use only 2 weights on OpenGL ES
  55. MP Vec TransformDir(MP Vec v, MP VecI bone, MP Vec weight) {return weight.x*TransformDir(v, bone.x) + weight.y*TransformDir(v, bone.y);} // use only 2 weights on OpenGL ES
  56. MP Vec GetBoneVel ( MP VecI bone, MP Vec weight) {return weight.x* ObjVel[ bone.x] + weight.y* ObjVel[ bone.y];} // use only 2 weights on OpenGL ES
  57. #else
  58. HP Vec TransformPos(HP Vec v, MP VecI bone, HP Vec weight) {return weight.x*TransformPos(v, bone.x) + weight.y*TransformPos(v, bone.y) + weight.z*TransformPos(v, bone.z);}
  59. MP Vec TransformDir(MP Vec v, MP VecI bone, MP Vec weight) {return weight.x*TransformDir(v, bone.x) + weight.y*TransformDir(v, bone.y) + weight.z*TransformDir(v, bone.z);}
  60. MP Vec GetBoneVel ( MP VecI bone, MP Vec weight) {return weight.x* ObjVel[ bone.x] + weight.y* ObjVel[ bone.y] + weight.z* ObjVel[ bone.z];}
  61. #endif
  62. //#endif
  63. HP Vec4 Project(HP Vec v) {return Transform(v, ProjMatrix);}
  64. HP Vec ObjWorldPos() {return Transform(ViewMatrixPos(), CamMatrix);} // MatrixPos(ViewMatrix[])
  65. PAR MP Vec4 BendFactor;
  66. #define GrassBendFreq 1.0
  67. #define GrassBendScale 0.18
  68. #define LeafBendFreq 2.0
  69. #define LeafBendScale 0.13
  70. #define LeafsBendScale (LeafBendScale/2.0)
  71. MP Vec2 GetGrassBend(MP Vec center)
  72. {
  73. MP Flt offset=Sum(center.xz*(Vec2(0.7, 0.9)*GrassBendFreq));
  74. return Vec2((0.28*GrassBendScale)*Sin(offset+BendFactor.x) + (0.32*GrassBendScale)*Sin(offset+BendFactor.y),
  75. (0.18*GrassBendScale)*Sin(offset+BendFactor.z) + (0.24*GrassBendScale)*Sin(offset+BendFactor.w));
  76. }
  77. MP Vec2 GetLeafBend(MP Vec center)
  78. {
  79. MP Flt offset=Sum(center.xy*(Vec2(0.7, 0.8)*LeafBendFreq));
  80. return Vec2((0.28*LeafBendScale)*Sin(offset+BendFactor.x) + (0.32*LeafBendScale)*Sin(offset+BendFactor.y),
  81. (0.18*LeafBendScale)*Sin(offset+BendFactor.z) + (0.24*LeafBendScale)*Sin(offset+BendFactor.w));
  82. }
  83. MP Vec2 GetLeafsBend(MP Vec center)
  84. {
  85. MP Flt offset=Sum(center.xy*(Vec2(0.7, 0.8)*LeafBendFreq));
  86. return Vec2((0.28*LeafsBendScale)*Sin(offset+BendFactor.x) + (0.32*LeafsBendScale)*Sin(offset+BendFactor.y),
  87. (0.18*LeafsBendScale)*Sin(offset+BendFactor.z) + (0.24*LeafsBendScale)*Sin(offset+BendFactor.w));
  88. }
  89. MP Flt GrassFadeOut()
  90. {
  91. return Sat(Length2(ViewMatrixPos())*GrassRangeMulAdd.x+GrassRangeMulAdd.y); // - fade_out // MatrixPos(ViewMatrix[])
  92. }
  93. MP Vec BendGrass(MP Vec local_pos)
  94. {
  95. HP Vec world_pos=ObjWorldPos();
  96. MP Flt b =Cube(Sat(local_pos.y));
  97. MP Vec2 bend =GetGrassBend(world_pos)*(b*Length(ViewMatrixY())); // MatrixY(ViewMatrix[])
  98. MP Vec mc0=CamMatrix[0].xyz, mc1=CamMatrix[1].xyz;
  99. return mc0*bend.x
  100. +mc1*bend.y;
  101. }
  102. HP Vec BendLeaf(MP Vec center, HP Vec pos)
  103. {
  104. pos-=center;
  105. MP Vec2 bend=GetLeafBend(center);
  106. pos.xy=Rotate(pos.xy, Vec2(Cos(bend.x), Sin(bend.x)));
  107. pos.zy=Rotate(pos.zy, Vec2(Cos(bend.y), Sin(bend.y)));
  108. pos+=center;
  109. return pos;
  110. }
  111. HP Vec BendLeafs(MP Vec center, MP Flt offset, HP Vec pos)
  112. {
  113. pos-=center;
  114. MP Vec2 bend=GetLeafsBend(center+offset);
  115. pos.xy=Rotate(pos.xy, Vec2(Cos(bend.x), Sin(bend.x)));
  116. pos.zy=Rotate(pos.zy, Vec2(Cos(bend.y), Sin(bend.y)));
  117. pos+=center;
  118. return pos;
  119. }
  120. void UpdateVelocities_VS(inout MP Vec vel, HP Vec local_pos, HP Vec view_space_pos)
  121. {
  122. vel-=TransformDir(Cross(local_pos , ObjAngVel), gl_InstanceID);
  123. vel+= Cross( view_space_pos, CamAngVel);
  124. }