math.glslv 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #ifndef MATH_GLSLV
  2. #define MATH_GLSLV
  3. /*==============================================================================
  4. VARS
  5. ==============================================================================*/
  6. #var EPSILON 0.000001
  7. #var REFLECTION_TYPE REFL_NONE
  8. #var REFRACTIVE 0
  9. #var SHADOW_USAGE NO_SHADOWS
  10. #var USE_POSITION_CLIP 0
  11. #var SOFT_PARTICLES 0
  12. /*============================================================================*/
  13. #include <std.glsl>
  14. struct vertex
  15. {
  16. vec3 position;
  17. vec3 center;
  18. vec3 tangent;
  19. vec3 shade_tang;
  20. vec3 binormal;
  21. vec3 normal;
  22. vec3 color;
  23. };
  24. /*
  25. bool is_equalf(float a, float b) {
  26. return abs(a - b) < EPSILON;
  27. }
  28. */
  29. bool is_equal3f(vec3 a, vec3 b) {
  30. return any(lessThan(abs(a - b), vec3(EPSILON)));
  31. }
  32. vec3 qrot(in vec4 q, in vec3 v)
  33. {
  34. return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
  35. }
  36. vec4 qinv(in vec4 quat) {
  37. // NOTE: input quaternions should be always in normalized form
  38. //return vec4(-quat.xyz, quat.w) / dot(quat, quat);
  39. return vec4(-quat.xyz, quat.w);
  40. }
  41. vec4 qmult(in vec4 a, in vec4 b) {
  42. vec4 dest;
  43. dest.x = a.x * b.w + a.w * b.x + a.y * b.z - a.z * b.y;
  44. dest.y = a.y * b.w + a.w * b.y + a.z * b.x - a.x * b.z;
  45. dest.z = a.z * b.w + a.w * b.z + a.x * b.y - a.y * b.x;
  46. dest.w = a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z;
  47. return dest;
  48. }
  49. vec4 qsetAxisAngle(in vec3 axis, in float rad) {
  50. vec4 dest;
  51. rad = rad * 0.5;
  52. float s = sin(rad);
  53. dest.x = s * axis[0];
  54. dest.y = s * axis[1];
  55. dest.z = s * axis[2];
  56. dest.w = cos(rad);
  57. return dest;
  58. }
  59. vec4 qfrom_dir(in vec3 dir, in vec3 ident) {
  60. vec4 dest;
  61. float d = dot(ident, dir);
  62. vec3 cr = cross(ident, dir);
  63. dest.xyz = cr.xyz;
  64. dest.w = 1.0 + d;
  65. return normalize(dest);
  66. }
  67. vec3 tsr_transform(vec4 trans, vec4 quat, vec3 vec)
  68. {
  69. // scale
  70. vec3 dest = vec * trans.w;
  71. // quat * vec
  72. dest = qrot(quat, dest);
  73. // translate
  74. dest += trans.xyz;
  75. return dest;
  76. }
  77. vec3 tsr9_transform(mat3 tsr, vec3 vec)
  78. {
  79. // scale
  80. vec3 dest = vec * tsr[1][0];
  81. // quat * vec
  82. vec4 quat = vec4(tsr[1][1], tsr[1][2], tsr[2][0], tsr[2][1]);
  83. dest = qrot(quat, dest);
  84. // translate
  85. dest += tsr[0];
  86. return dest;
  87. }
  88. vec3 tsr_transform_dir(vec4 trans, vec4 quat, vec3 dir)
  89. {
  90. // scale
  91. vec3 dest = dir * trans.w;
  92. // quat * dir
  93. dest = qrot(quat, dest);
  94. return dest;
  95. }
  96. vec3 tsr9_transform_dir(mat3 tsr, vec3 dir)
  97. {
  98. // scale
  99. vec3 dest = dir * tsr[1][0];
  100. // quat * dir
  101. vec4 quat = vec4(tsr[1][1], tsr[1][2], tsr[2][0], tsr[2][1]);
  102. dest = qrot(quat, dest);
  103. return dest;
  104. }
  105. // translate vector with tsr in inverse direction
  106. vec3 tsr_transform_inv(vec4 trans, vec4 quat, vec3 vec)
  107. {
  108. // translate
  109. vec3 dest = vec - trans.xyz;
  110. // inverse quat * vec
  111. dest = qrot(qinv(quat), dest);
  112. // scale
  113. dest /= trans.w;
  114. return dest;
  115. }
  116. // translate directional vector with tsr in inverse direction
  117. vec3 tsr_transform_inv_dir(vec4 trans, vec4 quat, vec3 dir)
  118. {
  119. return qrot(qinv(quat), dir) / trans.w;
  120. }
  121. /*
  122. vec3 qrot(in vec4 quat, in vec3 vec)
  123. {
  124. float x = vec[0], y = vec[1], z = vec[2],
  125. qx = quat[0], qy = quat[1], qz = quat[2], qw = quat[3];
  126. // calculate quat * vec
  127. float ix = qw * x + qy * z - qz * y;
  128. float iy = qw * y + qz * x - qx * z;
  129. float iz = qw * z + qx * y - qy * x;
  130. float iw = -qx * x - qy * y - qz * z;
  131. vec3 dest;
  132. // calculate result * inverse quat
  133. dest[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;
  134. dest[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;
  135. dest[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;
  136. return dest;
  137. }
  138. */
  139. /*
  140. mat3 mat3_transpose(mat3 m) {
  141. mat3 m_out = m;
  142. m_out[0][1] = m[1][0];
  143. m_out[0][2] = m[2][0];
  144. m_out[1][0] = m[0][1];
  145. m_out[1][2] = m[2][1];
  146. m_out[2][0] = m[0][2];
  147. m_out[2][1] = m[1][2];
  148. return m_out;
  149. }
  150. */
  151. mat4 identity() {
  152. return mat4(_1_0, _0_0, _0_0, _0_0,
  153. _0_0, _1_0, _0_0, _0_0,
  154. _0_0, _0_0, _1_0, _0_0,
  155. _0_0, _0_0, _0_0, _1_0);
  156. }
  157. mat4 rotation_x(float angle) {
  158. return mat4(_1_0, _0_0, _0_0, _0_0,
  159. _0_0, cos(angle), sin(angle), _0_0,
  160. _0_0,-sin(angle), cos(angle), _0_0,
  161. _0_0, _0_0, _0_0, _1_0);
  162. }
  163. mat4 rotation_y(float angle) {
  164. return mat4(cos(angle), _0_0,-sin(angle), _0_0,
  165. _0_0, _1_0, _0_0, _0_0,
  166. sin(angle), _0_0, cos(angle), _0_0,
  167. _0_0, _0_0, _0_0, _1_0);
  168. }
  169. mat4 rotation_z(float angle) {
  170. return mat4(cos(angle), sin(angle), _0_0, _0_0,
  171. -sin(angle), cos(angle), _0_0, _0_0,
  172. _0_0, _0_0, _1_0, _0_0,
  173. _0_0, _0_0, _0_0, _1_0);
  174. }
  175. vertex tbn_norm(in vertex v) {
  176. return vertex(v.position, v.center, normalize(v.tangent),
  177. normalize(v.shade_tang), normalize(v.binormal), normalize(v.normal), v.color);
  178. }
  179. #if SOFT_PARTICLES || REFLECTION_TYPE == REFL_PLANE || SHADOW_USAGE == SHADOW_MAPPING_OPAQUE \
  180. || REFRACTIVE || USE_POSITION_CLIP
  181. vec3 clip_to_tex(vec4 pos_clip) {
  182. float xc = pos_clip.x;
  183. float yc = pos_clip.y;
  184. float wc = pos_clip.w;
  185. vec3 tex_pos_clip;
  186. tex_pos_clip.x = (xc + wc) / 2.0;
  187. tex_pos_clip.y = (yc + wc) / 2.0;
  188. tex_pos_clip.z = wc;
  189. return tex_pos_clip;
  190. }
  191. #endif
  192. mat3 tsr_identity() {
  193. return mat3(_0_0, _0_0, _0_0,
  194. _1_0, _0_0, _0_0,
  195. _0_0, _1_0, _0_0);
  196. }
  197. mat4 tsr_to_mat4(mat3 t) {
  198. mat4 matrix;
  199. // NOTE: for IPad compatibility
  200. matrix[0][0] = (_1_0 - (t[1][2] * (t[1][2] + t[1][2]) + t[2][0] * (t[2][0] + t[2][0]))) * t[1][0];
  201. matrix[0][1] = (t[1][1] * (t[1][2] + t[1][2]) + t[2][1] * (t[2][0] + t[2][0])) * t[1][0];
  202. matrix[0][2] = (t[1][1] * (t[2][0] + t[2][0]) - t[2][1] * (t[1][2] + t[1][2])) * t[1][0];
  203. matrix[0][3] = _0_0;
  204. matrix[1][0] = (t[1][1] * (t[1][2] + t[1][2]) - t[2][1] * (t[2][0] + t[2][0])) * t[1][0];
  205. matrix[1][1] = (_1_0 - (t[1][1] * (t[1][1] + t[1][1]) + t[2][0] * (t[2][0] + t[2][0]))) * t[1][0];
  206. matrix[1][2] = (t[1][2] * (t[2][0] + t[2][0]) + t[2][1] * (t[1][1] + t[1][1])) * t[1][0];
  207. matrix[1][3] = _0_0;
  208. matrix[2][0] = (t[1][1] * (t[2][0] + t[2][0]) + t[2][1] * (t[1][2] + t[1][2])) * t[1][0];
  209. matrix[2][1] = (t[1][2] * (t[2][0] + t[2][0]) - t[2][1] * (t[1][1] + t[1][1])) * t[1][0];
  210. matrix[2][2] = (_1_0 - (t[1][1] * (t[1][1] + t[1][1]) + t[1][2] * (t[1][2] + t[1][2]))) * t[1][0];
  211. matrix[2][3] = _0_0;
  212. matrix[3][0] = t[0][0];
  213. matrix[3][1] = t[0][1];
  214. matrix[3][2] = t[0][2];
  215. // NOTE: for IPad3. _1_0 doesn't work
  216. matrix[3][3] = 1.0;
  217. return matrix;
  218. }
  219. mat3 tsr_multiply(in mat3 tsr, in mat3 tsr2) {
  220. mat3 dest;
  221. // translate
  222. vec3 vec = tsr2[0];
  223. vec4 trans = vec4(tsr[0], tsr[1][0]);
  224. vec4 quat = vec4(tsr[1][1], tsr[1][2], tsr[2][0], tsr[2][1]);
  225. dest[0] = tsr_transform(trans, quat, vec);
  226. // scale
  227. dest[1][0] = tsr[1][0] * tsr2[1][0];
  228. // quat
  229. dest[1][1] = tsr[1][1] * tsr2[2][1] + tsr[2][1] * tsr2[1][1] + tsr[1][2] * tsr2[2][0] - tsr[2][0] * tsr2[1][2];
  230. dest[1][2] = tsr[1][2] * tsr2[2][1] + tsr[2][1] * tsr2[1][2] + tsr[2][0] * tsr2[1][1] - tsr[1][1] * tsr2[2][0];
  231. dest[2][0] = tsr[2][0] * tsr2[2][1] + tsr[2][1] * tsr2[2][0] + tsr[1][1] * tsr2[1][2] - tsr[1][2] * tsr2[1][1];
  232. dest[2][1] = tsr[2][1] * tsr2[2][1] - tsr[1][1] * tsr2[1][1] - tsr[1][2] * tsr2[1][2] - tsr[2][0] * tsr2[2][0];
  233. return dest;
  234. }
  235. mat3 tsr_set_quat(in vec4 quat, in mat3 tsr) {
  236. mat3 dest;
  237. // translation
  238. dest[0] = tsr[0];
  239. // scale
  240. dest[1][0] = tsr[1][0];
  241. // quat
  242. dest[1][1] = quat[0];
  243. dest[1][2] = quat[1];
  244. dest[2][0] = quat[2];
  245. dest[2][1] = quat[3];
  246. return dest;
  247. }
  248. #endif