3dproject.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /* Projekcni funkce
  2. */
  3. #ifndef __3D_PROJECT_H_
  4. #define __3D_PROJECT_H_
  5. int transf_3d_2d(float p_x, float p_y, float p_z, int *p_tx, int *p_ty,
  6. float *p_tz, GLMATRIX * p_word, GLMATRIX * p_cam, GLMATRIX * p_proj,
  7. int x_c, int y_c, int xs, int ys, float z_near, float z_far);
  8. int transf_3d_2d_word(float p_x, float p_y, float p_z, int *p_tx, int *p_ty,
  9. float *p_tz, GLMATRIX * p_cam, GLMATRIX * p_proj, int x_c, int y_c, int xs,
  10. int ys, float z_near, float z_far);
  11. inline int transf_3d_2d_matrix(float p_x, float p_y, float p_z, int *p_tx,
  12. int *p_ty, float *p_tz, GLMATRIX * p_mat, int x_c, int y_c, int xs, int ys,
  13. float z_near, float z_far);
  14. void transf_2d_3d(float p_x, float p_y, float p_z, float *p_tx, float *p_ty,
  15. float *p_tz, GLMATRIX * p_cam, GLMATRIX * p_proj, dword x_c, dword y_c,
  16. dword xs, dword ys);
  17. void transf_2d_3d_world(float p_x, float p_y, float p_z, float *p_tx,
  18. float *p_ty, float *p_tz, GLMATRIX * p_world, GLMATRIX * p_cam,
  19. GLMATRIX * p_proj, dword x_c, dword y_c, dword xs, dword ys);
  20. inline void transf_2d_3d_matrix(float p_x, float p_y, float p_z, float *p_tx,
  21. float *p_ty, float *p_tz, GLMATRIX * p_m, dword x_c, dword y_c, dword xs,
  22. dword ys);
  23. void transf_2d_3d_z(float p_x, float p_y, float p_z, float *p_tx, float *p_ty,
  24. float *p_tz, GLMATRIX * p_cam, GLMATRIX * p_proj, dword x_c, dword y_c,
  25. dword xs, dword ys, float z_near, float z_far);
  26. void transf_2d_3d_z_world(float p_x, float p_y, float p_z, float *p_tx,
  27. float *p_ty, float *p_tz, GLMATRIX * p_world, GLMATRIX * p_cam,
  28. GLMATRIX * p_proj, dword x_c, dword y_c, dword xs, dword ys, float z_near,
  29. float z_far);
  30. inline void transf_2d_3d_z_matrix(float p_x, float p_y, float p_z,
  31. float *p_tx, float *p_ty, float *p_tz, GLMATRIX * p_m, dword x_c, dword y_c,
  32. dword xs, dword ys, float z_near, float z_far);
  33. //void transf_2d_3d_z_matrix(float p_x, float p_y, float p_z, float *p_tx, float *p_ty, float *p_tz, GLMATRIX *p_mat, dword x_c, dword y_c, dword xs, dword ys, float z_near, float z_far)
  34. //void calc_2d_3d_z_matrix(GLMATRIX *p_cam, GLMATRIX *p_proj, GLMATRIX *p_vysl)
  35. inline int transf_3d_2d_matrix(float p_x, float p_y, float p_z, int *p_tx,
  36. int *p_ty, float *p_tz, GLMATRIX * p_mat, int x_c, int y_c, int xs, int ys,
  37. float z_near, float z_far)
  38. {
  39. float x, y, z, w;
  40. x_c >>= 1;
  41. y_c >>= 1;
  42. x =
  43. p_mat->_11 * (p_x) + p_mat->_21 * (p_y) + p_mat->_31 * (p_z) + p_mat->_41;
  44. y =
  45. p_mat->_12 * (p_x) + p_mat->_22 * (p_y) + p_mat->_32 * (p_z) + p_mat->_42;
  46. z =
  47. p_mat->_13 * (p_x) + p_mat->_23 * (p_y) + p_mat->_33 * (p_z) + p_mat->_43;
  48. w =
  49. p_mat->_14 * (p_x) + p_mat->_24 * (p_y) + p_mat->_34 * (p_z) + p_mat->_44;
  50. if (w == 0.0f)
  51. return (FALSE);
  52. if (-w <= z && z <= w && -w <= x && x <= w && -w < y && y <= w) {
  53. *p_tx = ftoi(x_c * (x / w + 1)) + xs;
  54. *p_ty = ftoi(y_c * (1 - y / w)) + ys;
  55. *p_tz = z_near + ((z / w + 1) * 0.5f) * (z_far - z_near);
  56. return (TRUE);
  57. }
  58. else {
  59. return (FALSE);
  60. }
  61. }
  62. inline void transf_2d_3d_matrix(float p_x, float p_y, float p_z,
  63. float *p_tx, float *p_ty, float *p_tz,
  64. GLMATRIX * p_m, dword x_c, dword y_c, dword xs, dword ys)
  65. {
  66. float x, y, z;
  67. float x3, y3, z3, w3;
  68. x_c >>= 1;
  69. y_c >>= 1;
  70. p_x -= xs;
  71. p_y -= ys;
  72. x = p_x / x_c - 1;
  73. y = 1 - p_y / y_c;
  74. z = 2 * p_z - 1;
  75. x3 = p_m->_11 * x + p_m->_21 * y + p_m->_31 * z + p_m->_41;
  76. y3 = p_m->_12 * x + p_m->_22 * y + p_m->_32 * z + p_m->_42;
  77. z3 = p_m->_13 * x + p_m->_23 * y + p_m->_33 * z + p_m->_43;
  78. w3 = p_m->_14 * x + p_m->_24 * y + p_m->_34 * z + p_m->_44;
  79. *p_tx = x3 / w3;
  80. *p_ty = y3 / w3;
  81. *p_tz = z3 / w3;
  82. }
  83. inline void transf_2d_3d_z_matrix(float p_x, float p_y, float p_z,
  84. float *p_tx, float *p_ty, float *p_tz,
  85. GLMATRIX * p_m,
  86. dword x_c, dword y_c, dword xs, dword ys, float z_near, float z_far)
  87. {
  88. float a, b, c;
  89. float x, y, z;
  90. float x3, y3, z3, w3;
  91. x_c >>= 1;
  92. y_c >>= 1;
  93. p_x -= xs;
  94. p_y -= ys;
  95. x = p_x / x_c - 1;
  96. y = 1 - p_y / y_c;
  97. c = z_far - z_near;
  98. a = (z_near + z_far) / c;
  99. b = -(z_near * z_far) / c;
  100. z = a + b / p_z;
  101. x3 = p_m->_11 * x + p_m->_21 * y + p_m->_31 * z + p_m->_41;
  102. y3 = p_m->_12 * x + p_m->_22 * y + p_m->_32 * z + p_m->_42;
  103. z3 = p_m->_13 * x + p_m->_23 * y + p_m->_33 * z + p_m->_43;
  104. w3 = p_m->_14 * x + p_m->_24 * y + p_m->_34 * z + p_m->_44;
  105. *p_tx = x3 / w3;
  106. *p_ty = y3 / w3;
  107. *p_tz = z3 / w3;
  108. }
  109. inline void transf_3d_2d_matrix_float_text(float p_x, float p_y, float p_z,
  110. float *p_tx, float *p_ty, float *p_tz, GLMATRIX * p_mat, float faktor)
  111. {
  112. float x, y, z, w;
  113. x =
  114. p_mat->_11 * (p_x) + p_mat->_21 * (p_y) + p_mat->_31 * (p_z) + p_mat->_41;
  115. y =
  116. p_mat->_12 * (p_x) + p_mat->_22 * (p_y) + p_mat->_32 * (p_z) + p_mat->_42;
  117. z =
  118. p_mat->_13 * (p_x) + p_mat->_23 * (p_y) + p_mat->_33 * (p_z) + p_mat->_43;
  119. w =
  120. p_mat->_14 * (p_x) + p_mat->_24 * (p_y) + p_mat->_34 * (p_z) + p_mat->_44;
  121. *p_tx = (x / w) * faktor;
  122. *p_ty = (y / w) * faktor;
  123. *p_tz = (z / w) * faktor;
  124. }
  125. inline void transf_2d_3d_matrix_float_text(float p_tx, float p_ty, float p_tz,
  126. float *p_x, float *p_y, float *p_z, GLMATRIX * p_mat, float faktor)
  127. {
  128. float x, y, z, w;
  129. w = 1;
  130. x = (p_tx * w) / faktor;
  131. y = (p_ty * w) / faktor;
  132. z = (p_tz * w) / faktor;
  133. *p_x = p_mat->_11 * x + p_mat->_21 * y + p_mat->_31 * z + p_mat->_41;
  134. *p_y = p_mat->_12 * x + p_mat->_22 * y + p_mat->_32 * z + p_mat->_42;
  135. *p_z = p_mat->_13 * x + p_mat->_23 * y + p_mat->_33 * z + p_mat->_43;
  136. //*p_w = p_mat->_14*x + p_mat->_24*y + p_mat->_34*z + p_mat->_44;
  137. }
  138. #endif