obbo.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /* OBB a jeho stromy
  2. */
  3. #ifndef __OBB_OLD_H__
  4. #define __OBB_OLD_H__
  5. void obb_body(OBB_OLD * p_obbs);
  6. int obb_intersect_obb(OBB_OLD * p_obb1, OBB_OLD * p_obb2);
  7. int obb_intersect_line(OBB_OLD * p_obb, BOD * p_orig, BOD * p_dir);
  8. int obb_intersect_line_dist(OBB_OLD * p_obb, BOD * p_orig, BOD * p_dir);
  9. void obb_obalka(GLMATRIX * p_mat, OBB_OLD * p_obb, BOD * p_min, BOD * p_max);
  10. void obb_slep(OBB_OLD * p_vys, OBB_OLD * p_list, int num);
  11. void obb_slep_aabb(OBB_OLD * p_vys, OBB_OLD * p_list, int num);
  12. float obb_calc_obalka_obj(EDIT_OBJEKT * p_obj, BOD * p_vx, BOD * p_vy,
  13. BOD * p_vz, BOD * p_dist, BOD * p_stred);
  14. void obb_calc_obj(EDIT_OBJEKT * p_obj);
  15. void obb_calc_obj_fast(EDIT_OBJEKT * p_obj);
  16. void obb_calc_kont(EDIT_KONTEJNER * p_kont_top, int precizne);
  17. float obb_calc_poly_obalka(EDIT_MESH_POLY * p_poly, BOD * p_vx, BOD * p_vy,
  18. BOD * p_vz, BOD * p_dist, BOD * p_stred);
  19. void obb_calc_poly(EDIT_MESH_POLY * p_poly);
  20. void obb_calc_item(OBB_OLD * p_vys, OBB_TREE_ITEM_OLD * p_item, int itemnum);
  21. void obbtree_vyrob(OBB_TREE_OLD * p_prvni, EDIT_MESH_POLY * p_poly,
  22. int polynum, GAME_MESH_OLD ** p_mesh, int meshnum, int *p_ind,
  23. EDIT_MATERIAL ** p_matlist);
  24. void obbtree_vyrob_rec(OBB_TREE_OLD * p_prvni, float max_vzdal);
  25. void obbtree_zrus(OBB_TREE_OLD * p_ob);
  26. void obbtree_kresli(OBB_TREE_OLD * p_prvni, dword barva);
  27. int obb_visibility(OBB_OLD * p_obb, GLMATRIX * p_m);
  28. inline float obb_vzdal_bod(OBB_OLD * p_obb, BOD * p_bod);
  29. void obb_kresli_obalku(OBB_OLD * p_obb, dword barva, GLMATRIX * p_mat);
  30. void obb_prvek(OBB_OLD * p_obb);
  31. inline float obb_vzdal_rovina_x(OBB_OLD * p_obb, float x)
  32. {
  33. float min = p_obb->aabb_min.x, max = p_obb->aabb_max.x;
  34. float vzdal1, vzdal2;
  35. if (min <= x && x <= max)
  36. return (0.0f);
  37. else {
  38. vzdal1 = fabsf(min - x);
  39. vzdal2 = fabsf(max - x);
  40. return (vzdal1 > vzdal2 ? vzdal1 : vzdal2);
  41. }
  42. }
  43. inline float obb_vzdal_rovina_y(OBB_OLD * p_obb, float y)
  44. {
  45. float min = p_obb->aabb_min.y, max = p_obb->aabb_max.y;
  46. float vzdal1, vzdal2;
  47. if (min <= y && y <= max)
  48. return (0.0f);
  49. else {
  50. vzdal1 = fabsf(min - y);
  51. vzdal2 = fabsf(max - y);
  52. return (vzdal1 > vzdal2 ? vzdal1 : vzdal2);
  53. }
  54. }
  55. inline float obb_vzdal_rovina_z(OBB_OLD * p_obb, float z)
  56. {
  57. float min = p_obb->aabb_min.z, max = p_obb->aabb_max.z;
  58. float vzdal1, vzdal2;
  59. if (min <= z && z <= max)
  60. return (0.0f);
  61. else {
  62. vzdal1 = fabsf(min - z);
  63. vzdal2 = fabsf(max - z);
  64. return (vzdal1 > vzdal2 ? vzdal1 : vzdal2);
  65. }
  66. }
  67. inline float obb_vzdal_bod(OBB_OLD * p_obb, BOD * p_bod)
  68. {
  69. BOD v, v1, v2;
  70. float len;
  71. vektor_sub(p_bod, &p_obb->obb_stred, &v1);
  72. v.x = vektor_dot_product(p_obb->obb, &v1);
  73. v.y = vektor_dot_product(p_obb->obb + 1, &v1);
  74. v.z = vektor_dot_product(p_obb->obb + 2, &v1);
  75. v2 = v1;
  76. len = vektor_norm_mult_vektor(&v2, &p_obb->obb_len);
  77. if (fabsf(v1.x) <= fabsf(v2.x) &&
  78. fabsf(v1.y) <= fabsf(v2.y) && fabsf(v1.z) <= fabsf(v2.z)) {
  79. return (0.0f);
  80. }
  81. else {
  82. return (vektor_velikost(vektor_sub(&v1, &v2, &v1)));
  83. }
  84. }
  85. inline float obb_vzdal_bod_aabb(OBB_OLD * p_obb, BOD * p_bod)
  86. {
  87. BOD v1, v2;
  88. float len;
  89. vektor_sub(p_bod, &p_obb->obb_stred, &v1);
  90. v2 = v1;
  91. len = vektor_norm_mult_vektor(&v2, &p_obb->obb_len);
  92. if (fabsf(v1.x) <= fabsf(v2.x) &&
  93. fabsf(v1.y) <= fabsf(v2.y) && fabsf(v1.z) <= fabsf(v2.z)) {
  94. return (0.0f);
  95. }
  96. else {
  97. return (vektor_velikost(vektor_sub(&v1, &v2, &v1)));
  98. }
  99. }
  100. inline int obb_je_bod_v_kostce(OBB_OLD * p_obb, BOD * p_bod)
  101. {
  102. BOD v, v1;
  103. BOD *p_len;
  104. vektor_sub(p_bod, &p_obb->obb_stred, &v1);
  105. v.x = vektor_dot_product(p_obb->obb, &v1);
  106. v.y = vektor_dot_product(p_obb->obb + 1, &v1);
  107. v.z = vektor_dot_product(p_obb->obb + 2, &v1);
  108. p_len = &p_obb->obb_len;
  109. if (fabsf(v.x) <= fabsf(p_len->x) &&
  110. fabsf(v.y) <= fabsf(p_len->y) && fabsf(v.z) <= fabsf(p_len->z))
  111. return (TRUE);
  112. else
  113. return (FALSE);
  114. }
  115. inline int obb_je_bod_v_kostce_aabb(OBB_OLD * p_obb, BOD * p_bod)
  116. {
  117. BOD *p_min = &p_obb->aabb_min;
  118. BOD *p_max = &p_obb->aabb_max;
  119. return (p_min->x <= p_bod->x && p_bod->x <= p_max->x &&
  120. p_min->y <= p_bod->y && p_bod->y <= p_max->y &&
  121. p_min->z <= p_bod->z && p_bod->z <= p_max->z);
  122. }
  123. inline void obb_aabb_obj(EDIT_OBJEKT * p_obj, OBB_OLD * p_obb)
  124. {
  125. objekt_obalka(p_obj, NULL, &p_obb->aabb_min, &p_obb->aabb_max);
  126. }
  127. inline void obb_aabb_poly(EDIT_MESH_POLY * p_poly, OBB_OLD * p_obb)
  128. {
  129. poly_obalka(p_poly, NULL, &p_obb->aabb_min, &p_obb->aabb_max);
  130. }
  131. inline void obb_aabb_kont(EDIT_KONTEJNER * p_kont, OBB_OLD * p_obb)
  132. {
  133. kontejner_obalka_aabb(p_kont, &p_obb->aabb_min, &p_obb->aabb_max);
  134. }
  135. inline void obb_aabb(OBB_OLD * p_obb)
  136. {
  137. obb_obalka(NULL, p_obb, &p_obb->aabb_min, &p_obb->aabb_max);
  138. }
  139. inline void obb_transformuj(OBB_OLD * p_src, GLMATRIX * p_mat,
  140. OBB_OLD * p_dest)
  141. {
  142. GLMATRIX m;
  143. BOD a1;
  144. float lx, ly, lz;
  145. transformuj_bod_matici_bod(&p_src->obb_stred, p_mat, &p_dest->obb_stred);
  146. lx = p_src->obb_len.x;
  147. ly = p_src->obb_len.y;
  148. lz = p_src->obb_len.z;
  149. m = *p_mat;
  150. m._41 = m._42 = m._43 = 0.0f;
  151. if (lx != 0.0f) {
  152. vektor_mult_skalar(p_src->obb, lx, &a1);
  153. p_dest->obb_len.x =
  154. vektor_norm(transformuj_bod_matici_bod(&a1, &m, p_dest->obb));
  155. }
  156. else {
  157. transformuj_bod_matici_bod(p_src->obb, &m, p_dest->obb);
  158. p_dest->obb_len.x = 0.0f;
  159. }
  160. if (ly != 0.0f) {
  161. vektor_mult_skalar(p_src->obb + 1, ly, &a1);
  162. p_dest->obb_len.y =
  163. vektor_norm(transformuj_bod_matici_bod(&a1, &m, p_dest->obb + 1));
  164. }
  165. else {
  166. transformuj_bod_matici_bod(p_src->obb + 1, &m, p_dest->obb + 1);
  167. p_dest->obb_len.y = 0.0f;
  168. }
  169. if (lz != 0.0f) {
  170. vektor_mult_skalar(p_src->obb + 2, lz, &a1);
  171. p_dest->obb_len.z =
  172. vektor_norm(transformuj_bod_matici_bod(&a1, &m, p_dest->obb + 2));
  173. }
  174. else {
  175. transformuj_bod_matici_bod(p_src->obb + 2, &m, p_dest->obb + 2);
  176. p_dest->obb_len.z = 0.0f;
  177. }
  178. obb_body(p_dest);
  179. obb_aabb(p_dest);
  180. }
  181. inline void obb_transformuj_aabb(OBB_OLD * p_src, GLMATRIX * p_mat,
  182. OBB_OLD * p_dest)
  183. {
  184. BOD *p_s1 = p_src->obb_hran, *p_s2 = p_dest->obb_hran;
  185. int i;
  186. for (i = 0; i < 8; i++)
  187. transformuj_bod_matici_bod(p_s1 + i, p_mat, p_s2 + i);
  188. obb_aabb(p_dest);
  189. }
  190. inline void obb_kresli_obalku_obj(EDIT_OBJEKT * p_obj, GLMATRIX * p_mat,
  191. dword barva)
  192. {
  193. obb_kresli_obalku(&p_obj->obb, barva, p_mat);
  194. }
  195. inline void obb_kresli_obalku_kont(EDIT_KONTEJNER * p_kont, GLMATRIX * p_mat,
  196. dword barva)
  197. {
  198. obb_kresli_obalku(&p_kont->obb, barva, p_mat);
  199. }
  200. #endif