mat.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #pragma once
  2. typedef struct vec3 {
  3. float v[3];
  4. } vec3;
  5. typedef struct vec4 {
  6. float v[4];
  7. } vec4;
  8. typedef struct mat3 {
  9. float v[3*3];
  10. } mat3;
  11. typedef struct mat4 {
  12. float v[4*4];
  13. } mat4;
  14. static inline mat3 matmul3(const mat3 &a, const mat3 &b) {
  15. mat3 ret = {{0.0}};
  16. for (int r=0; r<3; r++) {
  17. for (int c=0; c<3; c++) {
  18. float v = 0.0;
  19. for (int k=0; k<3; k++) {
  20. v += a.v[r*3+k] * b.v[k*3+c];
  21. }
  22. ret.v[r*3+c] = v;
  23. }
  24. }
  25. return ret;
  26. }
  27. static inline vec3 matvecmul3(const mat3 &a, const vec3 &b) {
  28. vec3 ret = {{0.0}};
  29. for (int r=0; r<3; r++) {
  30. for (int c=0; c<3; c++) {
  31. ret.v[r] += a.v[r*3+c] * b.v[c];
  32. }
  33. }
  34. return ret;
  35. }
  36. static inline mat4 matmul(const mat4 &a, const mat4 &b) {
  37. mat4 ret = {{0.0}};
  38. for (int r=0; r<4; r++) {
  39. for (int c=0; c<4; c++) {
  40. float v = 0.0;
  41. for (int k=0; k<4; k++) {
  42. v += a.v[r*4+k] * b.v[k*4+c];
  43. }
  44. ret.v[r*4+c] = v;
  45. }
  46. }
  47. return ret;
  48. }
  49. static inline vec4 matvecmul(const mat4 &a, const vec4 &b) {
  50. vec4 ret = {{0.0}};
  51. for (int r=0; r<4; r++) {
  52. for (int c=0; c<4; c++) {
  53. ret.v[r] += a.v[r*4+c] * b.v[c];
  54. }
  55. }
  56. return ret;
  57. }
  58. // scales the input and output space of a transformation matrix
  59. // that assumes pixel-center origin.
  60. static inline mat3 transform_scale_buffer(const mat3 &in, float s) {
  61. // in_pt = ( transform(out_pt/s + 0.5) - 0.5) * s
  62. mat3 transform_out = {{
  63. 1.0f/s, 0.0f, 0.5f,
  64. 0.0f, 1.0f/s, 0.5f,
  65. 0.0f, 0.0f, 1.0f,
  66. }};
  67. mat3 transform_in = {{
  68. s, 0.0f, -0.5f*s,
  69. 0.0f, s, -0.5f*s,
  70. 0.0f, 0.0f, 1.0f,
  71. }};
  72. return matmul3(transform_in, matmul3(in, transform_out));
  73. }