PageRenderTime 55ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/berusky2-0.7/src/komat/Mat3d.cpp

#
C++ | 2537 lines | 2033 code | 378 blank | 126 comment | 261 complexity | 4d8842ecf87a1a3ab918f31c7565fe41 MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. Engine - samotna parba
  3. */
  4. #include "3d_all.h"
  5. GLMATRIX __kont_world_matrix;
  6. void transformuj_kontejner_matici(EDIT_KONTEJNER * p_kont, GLMATRIX * p_m)
  7. {
  8. OBJ_VERTEX *p_vert;
  9. BOD *p_kost;
  10. int i, j;
  11. int pocet;
  12. int celkem = 0;
  13. if (p_kont == NULL)
  14. return;
  15. for (j = 0; j < p_kont->max_objektu; j++) {
  16. if (!p_kont->p_obj[j])
  17. continue;
  18. p_vert = p_kont->p_obj[j]->p_vertex;
  19. pocet = p_kont->p_obj[j]->vertexnum;
  20. for (i = 0; i < pocet; i++) {
  21. transformuj_bod_matici(&p_vert[i].x, &p_vert[i].y, &p_vert[i].z, p_m);
  22. }
  23. p_kost = p_kont->p_obj[j]->p_vertex_kosti;
  24. if (p_kost) {
  25. for (i = 0; i < pocet; i++) {
  26. transformuj_bod_matici(&p_kost[i].x, &p_kost[i].y, &p_kost[i].z, p_m);
  27. }
  28. }
  29. }
  30. }
  31. // Vymaze key-frame!!!
  32. void transformuj_kontejner_keyframe(EDIT_KONTEJNER * p_kont)
  33. {
  34. EDIT_OBJEKT *p_obj;
  35. int i, o;
  36. if (p_kont->kflag & KONT_KEYFRAME) {
  37. oe_olist_reset(&o);
  38. while (p_obj = oe_olist_next(p_kont, &o)) {
  39. transformuj_objekt_matici(p_obj, &p_obj->m);
  40. init_matrix(&p_obj->m);
  41. }
  42. init_matrix(&p_kont->world);
  43. init_matrix(&p_kont->mpmatrix);
  44. p_kont->kflag &= ~KONT_KEYFRAME;
  45. for (i = 0; i < KONT_MAX_ANIM; i++) {
  46. key_sim_root_zrus(p_kont->sim + i);
  47. }
  48. }
  49. }
  50. void transformuj_kontejner(EDIT_KONTEJNER * p_kont)
  51. {
  52. if (!(p_kont->kflag & KONT_KEYFRAME)) {
  53. lo_transformuj_svetla_do_wordspace(p_kont);
  54. transformuj_kontejner_matici(p_kont, kont_world_matrix(p_kont));
  55. init_matrix(&p_kont->world);
  56. init_matrix(&p_kont->mpmatrix);
  57. }
  58. }
  59. void transformuj_mesh(GAME_MESH_OLD * p_mesh)
  60. {
  61. dword i;
  62. if (!(p_mesh->p_data->kflag & KONT_KEYFRAME)) {
  63. for (i = 0; i < p_mesh->vertexnum; i++) {
  64. transformuj_bod_bod_matici(p_mesh->p_vertex_pos + i, &p_mesh->m);
  65. }
  66. init_matrix(&p_mesh->m);
  67. }
  68. }
  69. void calc_norm_vec_inter_object(EDIT_OBJEKT * p_obj)
  70. {
  71. int j, i, v, v1, k;
  72. float p_x, p_y, p_z, p;
  73. ROVINA r;
  74. byte *p_hv = (byte *) mmalloc(p_obj->vertexnum);
  75. word *p_nasle = (word *) mmalloc(p_obj->vertexnum * sizeof(word));
  76. word naslych = 0;
  77. for (v = 0; v < p_obj->vertexnum; v++) {
  78. if (p_hv[v]) // pokud byl pouzit -> preskoc ho
  79. continue;
  80. else
  81. p_hv[v] = 1;
  82. p_nasle[0] = v;
  83. naslych = 1;
  84. for (v1 = 0; v1 < p_obj->vertexnum; v1++) {
  85. if (v == v1)
  86. continue;
  87. if (stejny_vertex(p_obj->p_vertex[v], p_obj->p_vertex[v1])) {
  88. p_nasle[naslych++] = v1;
  89. p_hv[v1] = 1;
  90. }
  91. }
  92. // mam seznam vsech stejnych vertexu -> najdu k nim facy
  93. p_x = p_y = p_z = p = 0;
  94. for (k = 0; k < naslych; k++) {
  95. j = p_nasle[k];
  96. for (i = 0; i < p_obj->facenum; i += 3) {
  97. if ((p_obj->p_face[i] == j) || (p_obj->p_face[i + 1] == j)
  98. || (p_obj->p_face[i + 2] == j)) {
  99. // spocitat rovinu
  100. calc_rovinu(p_obj->p_vertex + p_obj->p_face[i],
  101. p_obj->p_vertex + p_obj->p_face[i + 1],
  102. p_obj->p_vertex + p_obj->p_face[i + 2], &r);
  103. p_x += r.x;
  104. p_y += r.y;
  105. p_z += r.z;
  106. p++;
  107. }
  108. }
  109. }
  110. p_x /= p;
  111. p_y /= p;
  112. p_z /= p;
  113. norm_vect(&p_x, &p_y, &p_z);
  114. if (p) {
  115. for (k = 0; k < naslych; k++) {
  116. j = p_nasle[k];
  117. p_obj->p_vertex[j].nx = p_x;
  118. p_obj->p_vertex[j].ny = p_y;
  119. p_obj->p_vertex[j].nz = p_z;
  120. }
  121. }
  122. }
  123. free(p_hv);
  124. free(p_nasle);
  125. }
  126. void texturuj_zemi(EDIT_OBJEKT * p_obj, int rect_x, int rect_y, int c_text,
  127. int flag, int mat, float skok_u, float skok_v)
  128. {
  129. float *p_fl;
  130. int x, y, i;
  131. rect_x++;
  132. rect_y++;
  133. p_obj->material = mat;
  134. if (flag & T_MIRROR) {
  135. for (y = 0; y < rect_y - 1; y += 2) {
  136. for (x = 0; x < rect_x - 1; x += 2) {
  137. // spodni rada
  138. i = x + y * rect_x;
  139. p_fl = &p_obj->p_vertex[i].tu1;
  140. p_fl[0 + c_text * 2] = 0.0f; //text x
  141. p_fl[1 + c_text * 2] = 0.0f; //text y
  142. i = x + 1 + y * rect_x;
  143. p_fl = &p_obj->p_vertex[i].tu1;
  144. p_fl[0 + c_text * 2] = 1.0f;
  145. p_fl[1 + c_text * 2] = 0.0f;
  146. i = x + 2 + y * rect_x;
  147. p_fl = &p_obj->p_vertex[i].tu1;
  148. p_fl[0 + c_text * 2] = 0.0f;
  149. p_fl[1 + c_text * 2] = 0.0f;
  150. // stredni rada
  151. i = x + (y + 1) * rect_x;
  152. p_fl = &p_obj->p_vertex[i].tu1;
  153. p_fl[0 + c_text * 2] = 0.0f;
  154. p_fl[1 + c_text * 2] = 1.0f;
  155. i = x + 1 + (y + 1) * rect_x;
  156. p_fl = &p_obj->p_vertex[i].tu1;
  157. p_fl[0 + c_text * 2] = 1.0f;
  158. p_fl[1 + c_text * 2] = 1.0f;
  159. i = x + 2 + (y + 1) * rect_x;
  160. p_fl = &p_obj->p_vertex[i].tu1;
  161. p_fl[0 + c_text * 2] = 0.0f;
  162. p_fl[1 + c_text * 2] = 1.0f;
  163. // horni rada
  164. i = x + (y + 2) * rect_x;
  165. p_fl = &p_obj->p_vertex[i].tu1;
  166. p_fl[0 + c_text * 2] = 0.0f;
  167. p_fl[1 + c_text * 2] = 0.0f;
  168. i = x + 1 + (y + 2) * rect_x;
  169. p_fl = &p_obj->p_vertex[i].tu1;
  170. p_fl[0 + c_text * 2] = 1.0f;
  171. p_fl[1 + c_text * 2] = 0.0f;
  172. i = x + 2 + (y + 2) * rect_x;
  173. p_fl = &p_obj->p_vertex[i].tu1;
  174. p_fl[0 + c_text * 2] = 0.0f;
  175. p_fl[1 + c_text * 2] = 0.0f;
  176. }
  177. }
  178. }
  179. if (flag & T_WRAP) {
  180. for (y = 0; y < rect_y; y++) {
  181. for (x = 0; x < rect_x; x++) {
  182. i = x + y * rect_x;
  183. p_fl = &p_obj->p_vertex[i].tu1;
  184. p_fl[0 + c_text * 2] = ((float) x) * skok_u; //text x
  185. p_fl[1 + c_text * 2] = ((float) y) * skok_v; //text y
  186. }
  187. }
  188. }
  189. }
  190. EDIT_OBJEKT *vyrob_zemi(int rect_x, int rect_y, float skok)
  191. {
  192. return (vyrob_zemi_start(rect_x, rect_y, skok, 0.0f, 0.0f));
  193. }
  194. EDIT_OBJEKT *vyrob_zemi_start(int rect_x, int rect_y, float skok,
  195. float start_x, float start_y)
  196. {
  197. int num_x = rect_x + 1;
  198. int num_y = rect_y + 1;
  199. int vertexnum = num_x * num_y;
  200. int facenum = rect_x * rect_y * 2 * 3;
  201. EDIT_OBJEKT *p_obj = vyrob_objekt();
  202. int i, x, y;
  203. p_obj->vertexnum = vertexnum;
  204. if ((p_obj->p_vertex =
  205. (OBJ_VERTEX *) mmalloc(sizeof(p_obj->p_vertex[0]) *
  206. p_obj->vertexnum)) == NULL) {
  207. zrus_objekt(&p_obj);
  208. return (NULL);
  209. }
  210. p_obj->facenum = facenum;
  211. if ((p_obj->p_face =
  212. (word *) mmalloc(sizeof(p_obj->p_face[0]) * p_obj->facenum)) == NULL) {
  213. zrus_objekt(&p_obj);
  214. return (NULL);
  215. }
  216. for (y = 0, i = 0; y < num_y; y++) {
  217. for (x = 0; x < num_x; x++) {
  218. p_obj->p_vertex[i].x = ((float) x) * skok;
  219. p_obj->p_vertex[i].z = ((float) y) * skok;
  220. p_obj->p_vertex[i].y = 0.0f;
  221. p_obj->p_vertex[i].db = p_obj->p_vertex[i].dg =
  222. p_obj->p_vertex[i].dr = 1.0f;
  223. i++;
  224. }
  225. }
  226. for (y = 0, i = 0; y < rect_y; y++) {
  227. for (x = 0; x < rect_x; x++) {
  228. p_obj->p_face[i++] = x + y * num_x;
  229. p_obj->p_face[i++] = x + 1 + y * num_x;
  230. p_obj->p_face[i++] = x + 1 + (y + 1) * num_x;
  231. p_obj->p_face[i++] = x + (y + 1) * num_x;
  232. p_obj->p_face[i++] = x + y * num_x;
  233. p_obj->p_face[i++] = x + 1 + (y + 1) * num_x;
  234. }
  235. }
  236. return (p_obj);
  237. }
  238. void rozloz_zemi(EDIT_OBJEKT ** p_src, int ctvercu)
  239. {
  240. EDIT_OBJEKT *p_obj = *p_src;
  241. float skok;
  242. if (!p_obj->x_rect || !p_obj->y_rect)
  243. return;
  244. if (p_obj->x_rect != p_obj->y_rect != 1)
  245. return;
  246. skok = p_obj->p_vertex[1].x - p_obj->p_vertex[0].x;
  247. skok /= (float) ctvercu;
  248. p_obj =
  249. vyrob_zemi_start(ctvercu, ctvercu, skok, p_obj->p_vertex[0].x,
  250. p_obj->p_vertex[0].z);
  251. zrus_objekt(p_src);
  252. *p_src = p_obj;
  253. }
  254. /*
  255. mirror == 1 - v ose x
  256. == 2 - v ose y
  257. == 3 - v ose z
  258. */
  259. EDIT_OBJEKT *mirror_objekt(EDIT_OBJEKT * p_src, int st, int mx, int my,
  260. int mz)
  261. {
  262. EDIT_OBJEKT *p_dest = vyrob_objekt();
  263. int i;
  264. float stred = 0;
  265. *p_dest = *p_src;
  266. /* Skopiruju vertexy */
  267. if ((p_dest->p_vertex =
  268. (OBJ_VERTEX *) mmalloc(sizeof(OBJ_VERTEX) * p_dest->vertexnum)) ==
  269. NULL) {
  270. zrus_objekt(&p_dest);
  271. return (NULL);
  272. }
  273. memcpy(p_dest->p_vertex, p_src->p_vertex,
  274. sizeof(OBJ_VERTEX) * p_dest->vertexnum);
  275. if (st) {
  276. if (mx) {
  277. for (i = 0; i < p_dest->vertexnum; i++)
  278. stred += p_src->p_vertex[i].x;
  279. stred /= (float) p_dest->vertexnum;
  280. for (i = 0; i < p_dest->vertexnum; i++)
  281. p_dest->p_vertex[i].x = (stred - p_src->p_vertex[i].x);
  282. }
  283. if (my) {
  284. for (i = 0; i < p_dest->vertexnum; i++)
  285. stred += p_src->p_vertex[i].y;
  286. stred /= (float) p_dest->vertexnum;
  287. for (i = 0; i < p_dest->vertexnum; i++)
  288. p_dest->p_vertex[i].y = (stred - p_src->p_vertex[i].y);
  289. }
  290. if (mz) {
  291. for (i = 0; i < p_dest->vertexnum; i++)
  292. stred += p_src->p_vertex[i].z;
  293. stred /= (float) p_dest->vertexnum;
  294. for (i = 0; i < p_dest->vertexnum; i++)
  295. p_dest->p_vertex[i].z = (stred - p_src->p_vertex[i].z);
  296. }
  297. }
  298. else {
  299. for (i = 0; i < p_dest->vertexnum; i++) {
  300. if (mx)
  301. p_dest->p_vertex[i].x = -p_src->p_vertex[i].x;
  302. if (my)
  303. p_dest->p_vertex[i].y = -p_src->p_vertex[i].y;
  304. if (mz)
  305. p_dest->p_vertex[i].z = -p_src->p_vertex[i].z;
  306. }
  307. }
  308. /* Skopiruju facy */
  309. if ((p_dest->p_face =
  310. (FACE *) mmalloc(sizeof(FACE) * p_dest->facenum)) == NULL) {
  311. zrus_objekt(&p_dest);
  312. return (NULL);
  313. }
  314. memcpy(p_dest->p_face, p_src->p_face, sizeof(FACE) * p_dest->facenum);
  315. p_dest->p_line = NULL;
  316. return (p_dest);
  317. }
  318. /*
  319. mirror == 1 - v ose u
  320. == 2 - v ose v
  321. */
  322. void mirror_text(EDIT_OBJEKT * p_src, int t, int mu, int mv)
  323. {
  324. int i;
  325. float *p_fl;
  326. if (!mu && !mv)
  327. return;
  328. for (i = 0; i < p_src->vertexnum; i++) {
  329. p_fl = &p_src->p_vertex[i].tu1;
  330. if (mu)
  331. p_fl[0 + t * 2] = -p_fl[0 + t * 2];
  332. if (mv)
  333. p_fl[1 + t * 2] = -p_fl[1 + t * 2];
  334. }
  335. }
  336. /*
  337. rotace == 1 - 90
  338. == 2 - 180
  339. == 3 - 270
  340. */
  341. void rotuj_text(EDIT_OBJEKT * p_obj, int t, int uhel)
  342. {
  343. OBJ_VERTEX *p_vertex;
  344. int x, y, x_num = p_obj->x_rect + 1, y_num = p_obj->y_rect + 1;
  345. float *p_fls, *p_fld;
  346. if (!p_obj->x_rect || !p_obj->y_rect || !uhel
  347. || (p_obj->x_rect != p_obj->y_rect)) {
  348. return;
  349. }
  350. if ((p_vertex =
  351. (OBJ_VERTEX *) mmalloc(sizeof(OBJ_VERTEX) * p_obj->vertexnum)) ==
  352. NULL) {
  353. return;
  354. }
  355. memcpy(p_vertex, p_obj->p_vertex, sizeof(OBJ_VERTEX) * p_obj->vertexnum);
  356. if (uhel == 1) { // 90
  357. for (y = 0; y < x_num; y++) {
  358. for (x = 0; x < y_num; x++) {
  359. p_fld = &p_obj->p_vertex[(y_num - x - 1) * x_num + y].tu1;
  360. p_fls = &p_vertex[y * x_num + x].tu1;
  361. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  362. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  363. }
  364. }
  365. }
  366. else if (uhel == 2) { // 180
  367. for (y = 0; y < x_num; y++) {
  368. for (x = 0; x < y_num; x++) {
  369. p_fld =
  370. &p_obj->p_vertex[(y_num - y - 1) * x_num + (x_num - x - 1)].tu1;
  371. p_fls = &p_vertex[y * x_num + x].tu1;
  372. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  373. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  374. }
  375. }
  376. }
  377. else if (uhel == 3) { // 270
  378. for (y = 0; y < x_num; y++) {
  379. for (x = 0; x < y_num; x++) {
  380. p_fld = &p_obj->p_vertex[x * x_num + (y_num - y - 1)].tu1;
  381. p_fls = &p_vertex[y * x_num + x].tu1;
  382. p_fld[0 + t * 2] = p_fls[0 + t * 2];
  383. p_fld[1 + t * 2] = p_fls[1 + t * 2];
  384. }
  385. }
  386. }
  387. free(p_vertex);
  388. }
  389. void dopln_cary(EDIT_OBJEKT * p_obj)
  390. {
  391. word j, k, mf;
  392. word *p_line, *p_face;
  393. mf = p_obj->facenum;
  394. if (p_obj->p_line != NULL) {
  395. free(p_obj->p_line);
  396. p_obj->p_line = NULL;
  397. }
  398. if ((p_line = (word *) mmalloc(sizeof(word) * mf * 2)) == NULL)
  399. chyba("pamet");
  400. p_face = p_obj->p_face;
  401. for (j = 0, k = 0; j < p_obj->facenum; j += 3, k += 6) {
  402. p_line[k + 5] = p_line[k] = p_face[j];
  403. p_line[k + 2] = p_line[k + 1] = p_face[j + 1];
  404. p_line[k + 4] = p_line[k + 3] = p_face[j + 2];
  405. }
  406. p_obj->p_line = p_line;
  407. p_obj->linenum = mf * 2;
  408. }
  409. void kresli_ctverec_2d(int x1, int y1, int x2, int y2, float r, float g,
  410. float b)
  411. {
  412. glColor3f(r, g, b);
  413. glBegin(GL_LINE_STRIP);
  414. glVertex2d(x1, y1);
  415. glVertex2d(x2, y1);
  416. glVertex2d(x2, y2);
  417. glVertex2d(x1, y2);
  418. glVertex2d(x1, y1);
  419. glEnd();
  420. }
  421. void kresli_ctverec_2d_diff(int x1, int y1, int dx, int dy, float r, float g,
  422. float b)
  423. {
  424. kresli_ctverec_2d(x1 - dx, y1 - dy, x1 + dx, y1 + dy, r, g, b);
  425. }
  426. void kresli_ctverec_2d_plnej(int x1, int y1, int x2, int y2, float r, float g,
  427. float b)
  428. {
  429. glColor3f(r, g, b);
  430. glBegin(GL_QUADS);
  431. glVertex2d(x1, y1);
  432. glVertex2d(x1, y2);
  433. glVertex2d(x2, y2);
  434. glVertex2d(x2, y1);
  435. glEnd();
  436. }
  437. void kresli_caru(BOD * p_s, BOD * p_k, dword barva)
  438. {
  439. glColor4ubv((byte *) & barva);
  440. glBegin(GL_LINES);
  441. glVertex3f(p_s->x, p_s->y, p_s->z);
  442. glVertex3f(p_k->x, p_k->y, p_k->z);
  443. glEnd();
  444. }
  445. void kresli_kurzor_mysi_kriz(int xres, int yres)
  446. {
  447. glColor3f(1.0f, 1.0f, 1.0f);
  448. glBegin(GL_LINES);
  449. glVertex2i(mi.x, 0);
  450. glVertex2i(mi.x, yres);
  451. glVertex2i(0, mi.y);
  452. glVertex2i(xres, mi.y);
  453. glEnd();
  454. }
  455. /*
  456. Stredovy bod + dx,dy,dz
  457. */
  458. EDIT_OBJEKT *vyrob_krychli(BOD * p_bod, float x, float y, float z,
  459. dword barva)
  460. {
  461. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(8, 12 * 3);
  462. int i;
  463. x /= 2;
  464. y /= 2;
  465. z /= 2;
  466. p_obj->p_vertex[0].x = -x;
  467. p_obj->p_vertex[0].y = -y;
  468. p_obj->p_vertex[0].z = -z;
  469. p_obj->p_vertex[1].x = x;
  470. p_obj->p_vertex[1].y = -y;
  471. p_obj->p_vertex[1].z = -z;
  472. p_obj->p_vertex[2].x = x;
  473. p_obj->p_vertex[2].y = y;
  474. p_obj->p_vertex[2].z = -z;
  475. p_obj->p_vertex[3].x = -x;
  476. p_obj->p_vertex[3].y = y;
  477. p_obj->p_vertex[3].z = -z;
  478. p_obj->p_vertex[4].x = -x;
  479. p_obj->p_vertex[4].y = -y;
  480. p_obj->p_vertex[4].z = z;
  481. p_obj->p_vertex[5].x = x;
  482. p_obj->p_vertex[5].y = -y;
  483. p_obj->p_vertex[5].z = z;
  484. p_obj->p_vertex[6].x = x;
  485. p_obj->p_vertex[6].y = y;
  486. p_obj->p_vertex[6].z = z;
  487. p_obj->p_vertex[7].x = -x;
  488. p_obj->p_vertex[7].y = y;
  489. p_obj->p_vertex[7].z = z;
  490. for (i = 0; i < 8; i++) {
  491. p_obj->p_vertex[i].x += p_bod->x;
  492. p_obj->p_vertex[i].y += p_bod->y;
  493. p_obj->p_vertex[i].z += p_bod->z;
  494. rgb_float(barva, &p_obj->p_vertex[i].dr);
  495. }
  496. // predni strana
  497. p_obj->p_face[0] = 0;
  498. p_obj->p_face[1] = 1;
  499. p_obj->p_face[2] = 2;
  500. p_obj->p_face[3] = 2;
  501. p_obj->p_face[4] = 3;
  502. p_obj->p_face[5] = 0;
  503. //zadni strana
  504. p_obj->p_face[6] = 5;
  505. p_obj->p_face[7] = 6;
  506. p_obj->p_face[8] = 7;
  507. p_obj->p_face[9] = 7;
  508. p_obj->p_face[10] = 4;
  509. p_obj->p_face[11] = 5;
  510. // bok pravej
  511. p_obj->p_face[12] = 1;
  512. p_obj->p_face[13] = 5;
  513. p_obj->p_face[14] = 6;
  514. p_obj->p_face[15] = 6;
  515. p_obj->p_face[16] = 2;
  516. p_obj->p_face[17] = 1;
  517. // bok levej
  518. p_obj->p_face[18] = 4;
  519. p_obj->p_face[19] = 0;
  520. p_obj->p_face[20] = 3;
  521. p_obj->p_face[21] = 3;
  522. p_obj->p_face[22] = 7;
  523. p_obj->p_face[23] = 4;
  524. // vrsek
  525. p_obj->p_face[24] = 3;
  526. p_obj->p_face[25] = 2;
  527. p_obj->p_face[26] = 6;
  528. p_obj->p_face[27] = 6;
  529. p_obj->p_face[28] = 7;
  530. p_obj->p_face[29] = 3;
  531. // spodek
  532. p_obj->p_face[30] = 4;
  533. p_obj->p_face[31] = 0;
  534. p_obj->p_face[32] = 1;
  535. p_obj->p_face[33] = 1;
  536. p_obj->p_face[34] = 5;
  537. p_obj->p_face[35] = 4;
  538. return (p_obj);
  539. }
  540. EDIT_OBJEKT *vyrob_krychli_dratovou(BOD * p_bod, float x, float y, float z,
  541. dword barva)
  542. {
  543. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(8, 1);
  544. int i, mf;
  545. x /= 2;
  546. y /= 2;
  547. z /= 2;
  548. p_obj->p_vertex[0].x = -x;
  549. p_obj->p_vertex[0].y = -y;
  550. p_obj->p_vertex[0].z = -z;
  551. p_obj->p_vertex[1].x = x;
  552. p_obj->p_vertex[1].y = -y;
  553. p_obj->p_vertex[1].z = -z;
  554. p_obj->p_vertex[2].x = x;
  555. p_obj->p_vertex[2].y = y;
  556. p_obj->p_vertex[2].z = -z;
  557. p_obj->p_vertex[3].x = -x;
  558. p_obj->p_vertex[3].y = y;
  559. p_obj->p_vertex[3].z = -z;
  560. p_obj->p_vertex[4].x = -x;
  561. p_obj->p_vertex[4].y = -y;
  562. p_obj->p_vertex[4].z = z;
  563. p_obj->p_vertex[5].x = x;
  564. p_obj->p_vertex[5].y = -y;
  565. p_obj->p_vertex[5].z = z;
  566. p_obj->p_vertex[6].x = x;
  567. p_obj->p_vertex[6].y = y;
  568. p_obj->p_vertex[6].z = z;
  569. p_obj->p_vertex[7].x = -x;
  570. p_obj->p_vertex[7].y = y;
  571. p_obj->p_vertex[7].z = z;
  572. for (i = 0; i < 8; i++) {
  573. p_obj->p_vertex[i].x += p_bod->x;
  574. p_obj->p_vertex[i].y += p_bod->y;
  575. p_obj->p_vertex[i].z += p_bod->z;
  576. }
  577. p_obj->linenum = mf = 12 * 2;
  578. if ((p_obj->p_line = (word *) mmalloc(sizeof(word) * mf * 2)) == NULL)
  579. chyba("pamet");
  580. p_obj->p_line[0] = 0;
  581. p_obj->p_line[1] = 1;
  582. p_obj->p_line[2] = 1;
  583. p_obj->p_line[3] = 2;
  584. p_obj->p_line[4] = 2;
  585. p_obj->p_line[5] = 3;
  586. p_obj->p_line[6] = 3;
  587. p_obj->p_line[7] = 0;
  588. p_obj->p_line[8] = 4;
  589. p_obj->p_line[9] = 5;
  590. p_obj->p_line[10] = 5;
  591. p_obj->p_line[11] = 6;
  592. p_obj->p_line[12] = 6;
  593. p_obj->p_line[13] = 7;
  594. p_obj->p_line[14] = 7;
  595. p_obj->p_line[15] = 4;
  596. p_obj->p_line[16] = 0;
  597. p_obj->p_line[17] = 4;
  598. p_obj->p_line[18] = 1;
  599. p_obj->p_line[19] = 5;
  600. p_obj->p_line[20] = 2;
  601. p_obj->p_line[21] = 6;
  602. p_obj->p_line[22] = 3;
  603. p_obj->p_line[23] = 7;
  604. nastav_barvu_bodu_obj_dword(p_obj, barva);
  605. return (p_obj);
  606. }
  607. void krychli_dratovou_recalc(EDIT_OBJEKT * p_obj, BOD * p_bod, float x,
  608. float y, float z, dword barva)
  609. {
  610. int i;
  611. x /= 2;
  612. y /= 2;
  613. z /= 2;
  614. p_obj->p_vertex[0].x = -x;
  615. p_obj->p_vertex[0].y = -y;
  616. p_obj->p_vertex[0].z = -z;
  617. p_obj->p_vertex[1].x = x;
  618. p_obj->p_vertex[1].y = -y;
  619. p_obj->p_vertex[1].z = -z;
  620. p_obj->p_vertex[2].x = x;
  621. p_obj->p_vertex[2].y = y;
  622. p_obj->p_vertex[2].z = -z;
  623. p_obj->p_vertex[3].x = -x;
  624. p_obj->p_vertex[3].y = y;
  625. p_obj->p_vertex[3].z = -z;
  626. p_obj->p_vertex[4].x = -x;
  627. p_obj->p_vertex[4].y = -y;
  628. p_obj->p_vertex[4].z = z;
  629. p_obj->p_vertex[5].x = x;
  630. p_obj->p_vertex[5].y = -y;
  631. p_obj->p_vertex[5].z = z;
  632. p_obj->p_vertex[6].x = x;
  633. p_obj->p_vertex[6].y = y;
  634. p_obj->p_vertex[6].z = z;
  635. p_obj->p_vertex[7].x = -x;
  636. p_obj->p_vertex[7].y = y;
  637. p_obj->p_vertex[7].z = z;
  638. for (i = 0; i < 8; i++) {
  639. p_obj->p_vertex[i].x += p_bod->x;
  640. p_obj->p_vertex[i].y += p_bod->y;
  641. p_obj->p_vertex[i].z += p_bod->z;
  642. }
  643. nastav_barvu_bodu_obj_dword(p_obj, barva);
  644. }
  645. EDIT_OBJEKT *umisti_krychli_dratovou(EDIT_OBJEKT * p_obj, BOD * p_bod)
  646. {
  647. int i;
  648. for (i = 0; i < p_obj->vertexnum; i++) {
  649. p_obj->p_vertex[i].x += p_bod->x;
  650. p_obj->p_vertex[i].y += p_bod->y;
  651. p_obj->p_vertex[i].z += p_bod->z;
  652. }
  653. return (p_obj);
  654. }
  655. EDIT_OBJEKT *kameru_dratovou_calc(EDIT_OBJEKT * p_obj, BOD * p_p, BOD * p_t,
  656. float fov, float roll, dword barva)
  657. {
  658. BOD p;
  659. float z = vektor_velikost(vektor_sub(p_p, p_t, &p));
  660. float s = (float) tan(fov) * z / 2;
  661. p_obj->p_vertex[0].x = 0.0f;
  662. p_obj->p_vertex[0].y = 0.0f;
  663. p_obj->p_vertex[0].z = 0.0f;
  664. rgb_float(barva, &p_obj->p_vertex[0].dr);
  665. p_obj->p_vertex[1].x = s;
  666. p_obj->p_vertex[1].y = -s;
  667. p_obj->p_vertex[1].z = z;
  668. rgb_float(barva, &p_obj->p_vertex[1].dr);
  669. p_obj->p_vertex[2].x = s;
  670. p_obj->p_vertex[2].y = s;
  671. p_obj->p_vertex[2].z = z;
  672. rgb_float(barva, &p_obj->p_vertex[2].dr);
  673. p_obj->p_vertex[3].x = -s;
  674. p_obj->p_vertex[3].y = s;
  675. p_obj->p_vertex[3].z = z;
  676. rgb_float(barva, &p_obj->p_vertex[3].dr);
  677. p_obj->p_vertex[4].x = -s;
  678. p_obj->p_vertex[4].y = -s;
  679. p_obj->p_vertex[4].z = z;
  680. rgb_float(barva, &p_obj->p_vertex[4].dr);
  681. p_obj->linenum = 16;
  682. assert(p_obj->p_line);
  683. p_obj->p_line[0] = 0;
  684. p_obj->p_line[1] = 1;
  685. p_obj->p_line[2] = 0;
  686. p_obj->p_line[3] = 2;
  687. p_obj->p_line[4] = 0;
  688. p_obj->p_line[5] = 3;
  689. p_obj->p_line[6] = 0;
  690. p_obj->p_line[7] = 4;
  691. p_obj->p_line[8] = 4;
  692. p_obj->p_line[9] = 1;
  693. p_obj->p_line[10] = 1;
  694. p_obj->p_line[11] = 2;
  695. p_obj->p_line[12] = 2;
  696. p_obj->p_line[13] = 3;
  697. p_obj->p_line[14] = 3;
  698. p_obj->p_line[15] = 4;
  699. nastav_barvu_bodu_obj_dword(p_obj, barva);
  700. return (p_obj);
  701. }
  702. EDIT_OBJEKT *kameru_dratovou_vyrob(BOD * p_p, BOD * p_t, float fov,
  703. float roll)
  704. {
  705. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(5, 0);
  706. GLMATRIX m;
  707. if ((p_obj->p_line = (word *) mmalloc(sizeof(word) * 16)) == NULL)
  708. chyba("pamet");
  709. kameru_dratovou_calc(p_obj, p_p, p_t, fov, roll, DDRGB(0, 0, 1));
  710. calc_camera_3ds(&m, &p_obj->m, p_p, p_t, roll);
  711. return (p_obj);
  712. }
  713. int vyrob_kameru_indir(KAMERA * p_kam, char *p_jmeno, BOD * p_p, BOD * p_t,
  714. float fov, float roll)
  715. {
  716. BOD p(0, 0, 0);
  717. strcpy(p_kam->jmeno, p_jmeno);
  718. p_kam->p = *p_p;
  719. p_kam->t = *p_t;
  720. p_kam->roll = roll;
  721. p_kam->fov = fov;
  722. p_kam->p_objekt = kameru_dratovou_vyrob(p_p, p_t, fov, roll);
  723. p_kam->p_pos = vyrob_krychli_dratovou(&p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  724. p.z = vzdal_bodu_bod(&p_kam->p, &p_kam->t);
  725. p_kam->p_target = vyrob_krychli_dratovou(&p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  726. return (TRUE);
  727. }
  728. void kameru_dratovou_reanimuj(KAMERA * p_kam)
  729. {
  730. GLMATRIX m;
  731. BOD p(0, 0, 0);
  732. kameru_dratovou_calc(p_kam->p_objekt, &p_kam->p, &p_kam->t, p_kam->fov,
  733. 0.0f, 0xff0000);
  734. krychli_dratovou_recalc(p_kam->p_pos, &p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  735. p.z = vzdal_bodu_bod(&p_kam->p, &p_kam->t);
  736. krychli_dratovou_recalc(p_kam->p_target, &p, 0.2f, 0.2f, 0.2f, 0xffffffff);
  737. calc_camera_3ds(&m, &p_kam->p_objekt->m, &p_kam->p, &p_kam->t, p_kam->roll);
  738. }
  739. // invertuje poradi plosek
  740. void invertuj_face_objektu(EDIT_OBJEKT * p_obj)
  741. {
  742. word fcp[3];
  743. int f;
  744. for (f = 0; f < p_obj->facenum; f += 3) {
  745. fcp[0] = p_obj->p_face[f];
  746. fcp[1] = p_obj->p_face[f + 1];
  747. p_obj->p_face[f] = fcp[1];
  748. p_obj->p_face[f + 1] = fcp[0];
  749. }
  750. }
  751. void invertuj_face_kontejner(EDIT_KONTEJNER * p_kont)
  752. {
  753. int o;
  754. for (o = 0; o < p_kont->max_objektu; o++) {
  755. if (p_kont->p_obj[o])
  756. invertuj_face_objektu(p_kont->p_obj[o]);
  757. }
  758. }
  759. EDIT_KONTEJNER *vyrob_krychli_rozlozenou(BOD * p_bod, float x, float y,
  760. float z)
  761. {
  762. EDIT_KONTEJNER *p_kont = vyrob_kontejner();
  763. EDIT_OBJEKT *p_obj;
  764. int i;
  765. x /= 2;
  766. y /= 2;
  767. z /= 2;
  768. // predni strana
  769. p_obj = vyrob_objekt_komplet(4, 6);
  770. strcpy(p_obj->jmeno, "obj1");
  771. p_obj->x_rect = p_obj->y_rect = 1;
  772. p_obj->p_vertex[0].x = -x;
  773. p_obj->p_vertex[0].y = -y;
  774. p_obj->p_vertex[0].z = -z;
  775. p_obj->p_vertex[0].tu1 = 0;
  776. p_obj->p_vertex[0].tv1 = 0;
  777. p_obj->p_vertex[0].tu2 = 0;
  778. p_obj->p_vertex[0].tv2 = 0;
  779. p_obj->p_vertex[0].tu3 = 0;
  780. p_obj->p_vertex[0].tv3 = 0;
  781. p_obj->p_vertex[0].tu4 = 0;
  782. p_obj->p_vertex[0].tv4 = 0;
  783. p_obj->p_vertex[1].x = x;
  784. p_obj->p_vertex[1].y = -y;
  785. p_obj->p_vertex[1].z = -z;
  786. p_obj->p_vertex[1].tu1 = 1;
  787. p_obj->p_vertex[1].tv1 = 0;
  788. p_obj->p_vertex[1].tu2 = 1;
  789. p_obj->p_vertex[1].tv2 = 0;
  790. p_obj->p_vertex[1].tu3 = 1;
  791. p_obj->p_vertex[1].tv3 = 0;
  792. p_obj->p_vertex[1].tu4 = 1;
  793. p_obj->p_vertex[1].tv4 = 0;
  794. p_obj->p_vertex[2].x = -x;
  795. p_obj->p_vertex[2].y = y;
  796. p_obj->p_vertex[2].z = -z;
  797. p_obj->p_vertex[2].tu1 = 0;
  798. p_obj->p_vertex[2].tv1 = 1;
  799. p_obj->p_vertex[2].tu2 = 0;
  800. p_obj->p_vertex[2].tv2 = 1;
  801. p_obj->p_vertex[2].tu3 = 0;
  802. p_obj->p_vertex[2].tv3 = 1;
  803. p_obj->p_vertex[2].tu4 = 0;
  804. p_obj->p_vertex[2].tv4 = 1;
  805. p_obj->p_vertex[3].x = x;
  806. p_obj->p_vertex[3].y = y;
  807. p_obj->p_vertex[3].z = -z;
  808. p_obj->p_vertex[3].tu1 = 1;
  809. p_obj->p_vertex[3].tv1 = 1;
  810. p_obj->p_vertex[3].tu2 = 1;
  811. p_obj->p_vertex[3].tv2 = 1;
  812. p_obj->p_vertex[3].tu3 = 1;
  813. p_obj->p_vertex[3].tv3 = 1;
  814. p_obj->p_vertex[3].tu4 = 1;
  815. p_obj->p_vertex[3].tv4 = 1;
  816. p_obj->p_face[0] = 0;
  817. p_obj->p_face[1] = 1;
  818. p_obj->p_face[2] = 3;
  819. p_obj->p_face[3] = 3;
  820. p_obj->p_face[4] = 2;
  821. p_obj->p_face[5] = 0;
  822. for (i = 0; i < 4; i++) {
  823. p_obj->p_vertex[i].x += p_bod->x;
  824. p_obj->p_vertex[i].y += p_bod->y;
  825. p_obj->p_vertex[i].z += p_bod->z;
  826. }
  827. p_kont->p_obj[0] = p_obj;
  828. // Bocni strana
  829. p_obj = vyrob_objekt_komplet(4, 6);
  830. strcpy(p_obj->jmeno, "obj2");
  831. p_obj->x_rect = p_obj->y_rect = 1;
  832. p_obj->p_vertex[0].x = x;
  833. p_obj->p_vertex[0].y = -y;
  834. p_obj->p_vertex[0].z = -z;
  835. p_obj->p_vertex[0].tu1 = 0;
  836. p_obj->p_vertex[0].tv1 = 0;
  837. p_obj->p_vertex[0].tu2 = 0;
  838. p_obj->p_vertex[0].tv2 = 0;
  839. p_obj->p_vertex[0].tu3 = 0;
  840. p_obj->p_vertex[0].tv3 = 0;
  841. p_obj->p_vertex[0].tu4 = 0;
  842. p_obj->p_vertex[0].tv4 = 0;
  843. p_obj->p_vertex[1].x = x;
  844. p_obj->p_vertex[1].y = -y;
  845. p_obj->p_vertex[1].z = z;
  846. p_obj->p_vertex[1].tu1 = 1;
  847. p_obj->p_vertex[1].tv1 = 0;
  848. p_obj->p_vertex[1].tu2 = 1;
  849. p_obj->p_vertex[1].tv2 = 0;
  850. p_obj->p_vertex[1].tu3 = 1;
  851. p_obj->p_vertex[1].tv3 = 0;
  852. p_obj->p_vertex[1].tu4 = 1;
  853. p_obj->p_vertex[1].tv4 = 0;
  854. p_obj->p_vertex[3].x = x;
  855. p_obj->p_vertex[3].y = y;
  856. p_obj->p_vertex[3].z = z;
  857. p_obj->p_vertex[3].tu1 = 1;
  858. p_obj->p_vertex[3].tv1 = 1;
  859. p_obj->p_vertex[3].tu2 = 1;
  860. p_obj->p_vertex[3].tv2 = 1;
  861. p_obj->p_vertex[3].tu3 = 1;
  862. p_obj->p_vertex[3].tv3 = 1;
  863. p_obj->p_vertex[3].tu4 = 1;
  864. p_obj->p_vertex[3].tv4 = 1;
  865. p_obj->p_vertex[2].x = x;
  866. p_obj->p_vertex[2].y = y;
  867. p_obj->p_vertex[2].z = -z;
  868. p_obj->p_vertex[2].tu1 = 0;
  869. p_obj->p_vertex[2].tv1 = 1;
  870. p_obj->p_vertex[2].tu2 = 0;
  871. p_obj->p_vertex[2].tv2 = 1;
  872. p_obj->p_vertex[2].tu3 = 0;
  873. p_obj->p_vertex[2].tv3 = 1;
  874. p_obj->p_vertex[2].tu4 = 0;
  875. p_obj->p_vertex[2].tv4 = 1;
  876. p_obj->p_face[0] = 0;
  877. p_obj->p_face[1] = 1;
  878. p_obj->p_face[2] = 3;
  879. p_obj->p_face[3] = 3;
  880. p_obj->p_face[4] = 2;
  881. p_obj->p_face[5] = 0;
  882. for (i = 0; i < 4; i++) {
  883. p_obj->p_vertex[i].x += p_bod->x;
  884. p_obj->p_vertex[i].y += p_bod->y;
  885. p_obj->p_vertex[i].z += p_bod->z;
  886. }
  887. p_kont->p_obj[1] = p_obj;
  888. // Zadni strana
  889. p_obj = vyrob_objekt_komplet(4, 6);
  890. strcpy(p_obj->jmeno, "obj3");
  891. p_obj->x_rect = p_obj->y_rect = 1;
  892. p_obj->p_vertex[2].x = -x;
  893. p_obj->p_vertex[2].y = -y;
  894. p_obj->p_vertex[2].z = z;
  895. p_obj->p_vertex[2].tu1 = 1;
  896. p_obj->p_vertex[2].tv1 = 0;
  897. p_obj->p_vertex[2].tu2 = 1;
  898. p_obj->p_vertex[2].tv2 = 0;
  899. p_obj->p_vertex[2].tu3 = 1;
  900. p_obj->p_vertex[2].tv3 = 0;
  901. p_obj->p_vertex[2].tu4 = 1;
  902. p_obj->p_vertex[2].tv4 = 0;
  903. p_obj->p_vertex[3].x = x;
  904. p_obj->p_vertex[3].y = -y;
  905. p_obj->p_vertex[3].z = z;
  906. p_obj->p_vertex[3].tu1 = 0;
  907. p_obj->p_vertex[3].tv1 = 0;
  908. p_obj->p_vertex[3].tu2 = 0;
  909. p_obj->p_vertex[3].tv2 = 0;
  910. p_obj->p_vertex[3].tu3 = 0;
  911. p_obj->p_vertex[3].tv3 = 0;
  912. p_obj->p_vertex[3].tu4 = 0;
  913. p_obj->p_vertex[3].tv4 = 0;
  914. p_obj->p_vertex[1].x = x;
  915. p_obj->p_vertex[1].y = y;
  916. p_obj->p_vertex[1].z = z;
  917. p_obj->p_vertex[1].tu1 = 0;
  918. p_obj->p_vertex[1].tv1 = 1;
  919. p_obj->p_vertex[1].tu2 = 0;
  920. p_obj->p_vertex[1].tv2 = 1;
  921. p_obj->p_vertex[1].tu3 = 0;
  922. p_obj->p_vertex[1].tv3 = 1;
  923. p_obj->p_vertex[1].tu4 = 0;
  924. p_obj->p_vertex[1].tv4 = 1;
  925. p_obj->p_vertex[0].x = -x;
  926. p_obj->p_vertex[0].y = y;
  927. p_obj->p_vertex[0].z = z;
  928. p_obj->p_vertex[0].tu1 = 1;
  929. p_obj->p_vertex[0].tv1 = 1;
  930. p_obj->p_vertex[0].tu2 = 1;
  931. p_obj->p_vertex[0].tv2 = 1;
  932. p_obj->p_vertex[0].tu3 = 1;
  933. p_obj->p_vertex[0].tv3 = 1;
  934. p_obj->p_vertex[0].tu4 = 1;
  935. p_obj->p_vertex[0].tv4 = 1;
  936. p_obj->p_face[0] = 2;
  937. p_obj->p_face[1] = 0;
  938. p_obj->p_face[2] = 3;
  939. p_obj->p_face[3] = 3;
  940. p_obj->p_face[4] = 0;
  941. p_obj->p_face[5] = 1;
  942. for (i = 0; i < 4; i++) {
  943. p_obj->p_vertex[i].x += p_bod->x;
  944. p_obj->p_vertex[i].y += p_bod->y;
  945. p_obj->p_vertex[i].z += p_bod->z;
  946. }
  947. p_kont->p_obj[2] = p_obj;
  948. // Dalsi bocni strana
  949. p_obj = vyrob_objekt_komplet(4, 6);
  950. strcpy(p_obj->jmeno, "obj4");
  951. p_obj->x_rect = p_obj->y_rect = 1;
  952. p_obj->p_vertex[0].x = -x;
  953. p_obj->p_vertex[0].y = -y;
  954. p_obj->p_vertex[0].z = z;
  955. p_obj->p_vertex[0].tu1 = 0;
  956. p_obj->p_vertex[0].tv1 = 0;
  957. p_obj->p_vertex[0].tu2 = 0;
  958. p_obj->p_vertex[0].tv2 = 0;
  959. p_obj->p_vertex[0].tu3 = 0;
  960. p_obj->p_vertex[0].tv3 = 0;
  961. p_obj->p_vertex[0].tu4 = 0;
  962. p_obj->p_vertex[0].tv4 = 0;
  963. p_obj->p_vertex[1].x = -x;
  964. p_obj->p_vertex[1].y = y;
  965. p_obj->p_vertex[1].z = z;
  966. p_obj->p_vertex[1].tu1 = 0;
  967. p_obj->p_vertex[1].tv1 = 1;
  968. p_obj->p_vertex[1].tu2 = 0;
  969. p_obj->p_vertex[1].tv2 = 1;
  970. p_obj->p_vertex[1].tu3 = 0;
  971. p_obj->p_vertex[1].tv3 = 1;
  972. p_obj->p_vertex[1].tu4 = 0;
  973. p_obj->p_vertex[1].tv4 = 1;
  974. p_obj->p_vertex[3].x = -x;
  975. p_obj->p_vertex[3].y = y;
  976. p_obj->p_vertex[3].z = -z;
  977. p_obj->p_vertex[3].tu1 = 1;
  978. p_obj->p_vertex[3].tv1 = 1;
  979. p_obj->p_vertex[3].tu2 = 1;
  980. p_obj->p_vertex[3].tv2 = 1;
  981. p_obj->p_vertex[3].tu3 = 1;
  982. p_obj->p_vertex[3].tv3 = 1;
  983. p_obj->p_vertex[3].tu4 = 1;
  984. p_obj->p_vertex[3].tv4 = 1;
  985. p_obj->p_vertex[2].x = -x;
  986. p_obj->p_vertex[2].y = -y;
  987. p_obj->p_vertex[2].z = -z;
  988. p_obj->p_vertex[2].tu1 = 1;
  989. p_obj->p_vertex[2].tv1 = 0;
  990. p_obj->p_vertex[2].tu2 = 1;
  991. p_obj->p_vertex[2].tv2 = 0;
  992. p_obj->p_vertex[2].tu3 = 1;
  993. p_obj->p_vertex[2].tv3 = 0;
  994. p_obj->p_vertex[2].tu4 = 1;
  995. p_obj->p_vertex[2].tv4 = 0;
  996. p_obj->p_face[0] = 1;
  997. p_obj->p_face[1] = 0;
  998. p_obj->p_face[2] = 3;
  999. p_obj->p_face[3] = 3;
  1000. p_obj->p_face[4] = 0;
  1001. p_obj->p_face[5] = 2;
  1002. for (i = 0; i < 4; i++) {
  1003. p_obj->p_vertex[i].x += p_bod->x;
  1004. p_obj->p_vertex[i].y += p_bod->y;
  1005. p_obj->p_vertex[i].z += p_bod->z;
  1006. }
  1007. p_kont->p_obj[3] = p_obj;
  1008. // vrchni strana
  1009. p_obj = vyrob_objekt_komplet(4, 6);
  1010. strcpy(p_obj->jmeno, "obj5");
  1011. p_obj->x_rect = p_obj->y_rect = 1;
  1012. p_obj->p_vertex[0].x = -x;
  1013. p_obj->p_vertex[0].y = y;
  1014. p_obj->p_vertex[0].z = -z;
  1015. p_obj->p_vertex[0].tu1 = 0;
  1016. p_obj->p_vertex[0].tv1 = 0;
  1017. p_obj->p_vertex[0].tu2 = 0;
  1018. p_obj->p_vertex[0].tv2 = 0;
  1019. p_obj->p_vertex[0].tu3 = 0;
  1020. p_obj->p_vertex[0].tv3 = 0;
  1021. p_obj->p_vertex[0].tu4 = 0;
  1022. p_obj->p_vertex[0].tv4 = 0;
  1023. p_obj->p_vertex[1].x = x;
  1024. p_obj->p_vertex[1].y = y;
  1025. p_obj->p_vertex[1].z = -z;
  1026. p_obj->p_vertex[1].tu1 = 1;
  1027. p_obj->p_vertex[1].tv1 = 0;
  1028. p_obj->p_vertex[1].tu2 = 1;
  1029. p_obj->p_vertex[1].tv2 = 0;
  1030. p_obj->p_vertex[1].tu3 = 1;
  1031. p_obj->p_vertex[1].tv3 = 0;
  1032. p_obj->p_vertex[1].tu4 = 1;
  1033. p_obj->p_vertex[1].tv4 = 0;
  1034. p_obj->p_vertex[3].x = x;
  1035. p_obj->p_vertex[3].y = y;
  1036. p_obj->p_vertex[3].z = z;
  1037. p_obj->p_vertex[3].tu1 = 1;
  1038. p_obj->p_vertex[3].tv1 = 1;
  1039. p_obj->p_vertex[3].tu2 = 1;
  1040. p_obj->p_vertex[3].tv2 = 1;
  1041. p_obj->p_vertex[3].tu3 = 1;
  1042. p_obj->p_vertex[3].tv3 = 1;
  1043. p_obj->p_vertex[3].tu4 = 1;
  1044. p_obj->p_vertex[3].tv4 = 1;
  1045. p_obj->p_vertex[2].x = -x;
  1046. p_obj->p_vertex[2].y = y;
  1047. p_obj->p_vertex[2].z = z;
  1048. p_obj->p_vertex[2].tu1 = 0;
  1049. p_obj->p_vertex[2].tv1 = 1;
  1050. p_obj->p_vertex[2].tu2 = 0;
  1051. p_obj->p_vertex[2].tv2 = 1;
  1052. p_obj->p_vertex[2].tu3 = 0;
  1053. p_obj->p_vertex[2].tv3 = 1;
  1054. p_obj->p_vertex[2].tu4 = 0;
  1055. p_obj->p_vertex[2].tv4 = 1;
  1056. p_obj->p_face[0] = 0;
  1057. p_obj->p_face[1] = 1;
  1058. p_obj->p_face[2] = 3;
  1059. p_obj->p_face[3] = 3;
  1060. p_obj->p_face[4] = 2;
  1061. p_obj->p_face[5] = 0;
  1062. for (i = 0; i < 4; i++) {
  1063. p_obj->p_vertex[i].x += p_bod->x;
  1064. p_obj->p_vertex[i].y += p_bod->y;
  1065. p_obj->p_vertex[i].z += p_bod->z;
  1066. }
  1067. p_kont->p_obj[4] = p_obj;
  1068. // dolni strana
  1069. p_obj = vyrob_objekt_komplet(4, 6);
  1070. strcpy(p_obj->jmeno, "obj6");
  1071. p_obj->x_rect = p_obj->y_rect = 1;
  1072. p_obj->p_vertex[0].x = -x;
  1073. p_obj->p_vertex[0].y = -y;
  1074. p_obj->p_vertex[0].z = -z;
  1075. p_obj->p_vertex[0].tu1 = 0;
  1076. p_obj->p_vertex[0].tv1 = 0;
  1077. p_obj->p_vertex[0].tu2 = 0;
  1078. p_obj->p_vertex[0].tv2 = 0;
  1079. p_obj->p_vertex[0].tu3 = 0;
  1080. p_obj->p_vertex[0].tv3 = 0;
  1081. p_obj->p_vertex[0].tu4 = 0;
  1082. p_obj->p_vertex[0].tv4 = 0;
  1083. p_obj->p_vertex[1].x = x;
  1084. p_obj->p_vertex[1].y = -y;
  1085. p_obj->p_vertex[1].z = -z;
  1086. p_obj->p_vertex[1].tu1 = 1;
  1087. p_obj->p_vertex[1].tv1 = 0;
  1088. p_obj->p_vertex[1].tu2 = 1;
  1089. p_obj->p_vertex[1].tv2 = 0;
  1090. p_obj->p_vertex[1].tu3 = 1;
  1091. p_obj->p_vertex[1].tv3 = 0;
  1092. p_obj->p_vertex[1].tu4 = 1;
  1093. p_obj->p_vertex[1].tv4 = 0;
  1094. p_obj->p_vertex[3].x = x;
  1095. p_obj->p_vertex[3].y = -y;
  1096. p_obj->p_vertex[3].z = z;
  1097. p_obj->p_vertex[3].tu1 = 1;
  1098. p_obj->p_vertex[3].tv1 = 1;
  1099. p_obj->p_vertex[3].tu2 = 1;
  1100. p_obj->p_vertex[3].tv2 = 1;
  1101. p_obj->p_vertex[3].tu3 = 1;
  1102. p_obj->p_vertex[3].tv3 = 1;
  1103. p_obj->p_vertex[3].tu4 = 1;
  1104. p_obj->p_vertex[3].tv4 = 1;
  1105. p_obj->p_vertex[2].x = -x;
  1106. p_obj->p_vertex[2].y = -y;
  1107. p_obj->p_vertex[2].z = z;
  1108. p_obj->p_vertex[2].tu1 = 0;
  1109. p_obj->p_vertex[2].tv1 = 1;
  1110. p_obj->p_vertex[2].tu2 = 0;
  1111. p_obj->p_vertex[2].tv2 = 1;
  1112. p_obj->p_vertex[2].tu3 = 0;
  1113. p_obj->p_vertex[2].tv3 = 1;
  1114. p_obj->p_vertex[2].tu4 = 0;
  1115. p_obj->p_vertex[2].tv4 = 1;
  1116. p_obj->p_face[0] = 1;
  1117. p_obj->p_face[1] = 0;
  1118. p_obj->p_face[2] = 3;
  1119. p_obj->p_face[3] = 3;
  1120. p_obj->p_face[4] = 0;
  1121. p_obj->p_face[5] = 2;
  1122. for (i = 0; i < 4; i++) {
  1123. p_obj->p_vertex[i].x += p_bod->x;
  1124. p_obj->p_vertex[i].y += p_bod->y;
  1125. p_obj->p_vertex[i].z += p_bod->z;
  1126. }
  1127. p_kont->p_obj[5] = p_obj;
  1128. updatuj_kontejner_statistika(p_kont, TRUE);
  1129. nastav_barvu_bodu_kont_dword(p_kont, 0xffffffff, COLOR_SET);
  1130. kont_norm_vect(p_kont);
  1131. return (p_kont);
  1132. }
  1133. /*
  1134. Stredovy bod + dx,dy,dz
  1135. */
  1136. void pridej_krychli(EDIT_OBJEKT ** p_src, BOD * p_bod, float x, float y,
  1137. float z)
  1138. {
  1139. EDIT_OBJEKT *p_obj = vyrob_krychli(p_bod, x, y, z, 0xffffffff);
  1140. EDIT_OBJEKT *p_obj2;
  1141. p_obj2 = slep_objekty(*p_src, p_obj);
  1142. zrus_objekt(p_src);
  1143. zrus_objekt(&p_obj);
  1144. *p_src = p_obj2;
  1145. }
  1146. /*
  1147. Vyrobi billboard na BOD + dx,dy
  1148. */
  1149. EDIT_OBJEKT *vyrob_billboard(BOD * p_bod, float x, float y)
  1150. {
  1151. EDIT_OBJEKT *p_obj = vyrob_objekt_komplet(4, 6);
  1152. int i;
  1153. p_obj->p_vertex[0].x = -x;
  1154. p_obj->p_vertex[0].y = -y;
  1155. p_obj->p_vertex[0].z = 0;
  1156. p_obj->p_vertex[1].x = x;
  1157. p_obj->p_vertex[1].y = -y;
  1158. p_obj->p_vertex[1].z = 0;
  1159. p_obj->p_vertex[2].x = x;
  1160. p_obj->p_vertex[2].y = y;
  1161. p_obj->p_vertex[2].z = 0;
  1162. p_obj->p_vertex[3].x = -x;
  1163. p_obj->p_vertex[3].y = y;
  1164. p_obj->p_vertex[3].z = 0;
  1165. p_obj->p_vertex[0].tu1 = 0;
  1166. p_obj->p_vertex[0].tv1 = 0;
  1167. p_obj->p_vertex[1].tu1 = 1;
  1168. p_obj->p_vertex[1].tv1 = 0;
  1169. p_obj->p_vertex[2].tu1 = 1;
  1170. p_obj->p_vertex[2].tv1 = 1;
  1171. p_obj->p_vertex[3].tu1 = 0;
  1172. p_obj->p_vertex[3].tv1 = 1;
  1173. for (i = 0; i < 4; i++) {
  1174. p_obj->p_vertex[i].x += p_bod->x;
  1175. p_obj->p_vertex[i].y += p_bod->y;
  1176. p_obj->p_vertex[i].z += p_bod->z;
  1177. }
  1178. // predni strana
  1179. p_obj->p_face[0] = 0;
  1180. p_obj->p_face[1] = 1;
  1181. p_obj->p_face[2] = 2;
  1182. p_obj->p_face[3] = 2;
  1183. p_obj->p_face[4] = 3;
  1184. p_obj->p_face[5] = 0;
  1185. return (p_obj);
  1186. }
  1187. // Spocita obalku objektu
  1188. void objekt_obalka(EDIT_OBJEKT * p_obj, GLMATRIX * p_m, BOD * p_min,
  1189. BOD * p_max)
  1190. {
  1191. MUJ_BOD *p_vert;
  1192. BOD a;
  1193. int v;
  1194. p_vert = p_obj->p_vertex;
  1195. assert(p_vert && p_obj->vertexnum);
  1196. mujbod2bod(&a, p_obj->p_vertex);
  1197. if (p_m)
  1198. transformuj_bod_bod_matici(&a, p_m);
  1199. *p_min = *p_max = a;
  1200. for (v = 1; v < p_obj->vertexnum; v++) {
  1201. mujbod2bod(&a, p_obj->p_vertex + v);
  1202. if (p_m)
  1203. transformuj_bod_bod_matici(&a, p_m);
  1204. if (a.x < p_min->x)
  1205. p_min->x = a.x;
  1206. if (a.y < p_min->y)
  1207. p_min->y = a.y;
  1208. if (a.z < p_min->z)
  1209. p_min->z = a.z;
  1210. if (a.x > p_max->x)
  1211. p_max->x = a.x;
  1212. if (a.y > p_max->y)
  1213. p_max->y = a.y;
  1214. if (a.z > p_max->z)
  1215. p_max->z = a.z;
  1216. }
  1217. }
  1218. void poly_obalka(EDIT_MESH_POLY * p_poly, GLMATRIX * p_mat, BOD * p_min,
  1219. BOD * p_max)
  1220. {
  1221. BOD max(-FLT_MAX, -FLT_MAX, -FLT_MAX), min(FLT_MAX, FLT_MAX, FLT_MAX), a;
  1222. int f;
  1223. for (f = 0; f < p_poly->facenum; f++) {
  1224. a.x = p_poly->p_koord[f].x;
  1225. a.y = p_poly->p_koord[f].y;
  1226. a.z = p_poly->p_koord[f].z;
  1227. if (p_mat)
  1228. transformuj_bod_bod_matici(&a, p_mat);
  1229. if (a.x < min.x)
  1230. min.x = a.x;
  1231. if (a.y < min.y)
  1232. min.y = a.y;
  1233. if (a.z < min.z)
  1234. min.z = a.z;
  1235. if (a.x > max.x)
  1236. max.x = a.x;
  1237. if (a.y > max.y)
  1238. max.y = a.y;
  1239. if (a.z > max.z)
  1240. max.z = a.z;
  1241. }
  1242. *p_max = max;
  1243. *p_min = min;
  1244. }
  1245. // spocita obalku kontejneru - spocita z matic objektu
  1246. void kontejner_obalka(EDIT_KONTEJNER * p_kont)
  1247. {
  1248. EDIT_OBJEKT *p_obj;
  1249. OBB_OLD *p_obb = &p_kont->obb;
  1250. BOD max(-FLT_MAX, -FLT_MAX, -FLT_MAX), min(FLT_MAX, FLT_MAX, FLT_MAX);
  1251. int k;
  1252. for (k = 0; k < MAX_KONT_OBJEKTU; k++) {
  1253. p_obj = p_kont->p_obj[k];
  1254. if (p_obj) {
  1255. kd_min_max_bod(&p_obj->obb.aabb_min, &min, &max);
  1256. kd_min_max_bod(&p_obj->obb.aabb_max, &min, &max);
  1257. }
  1258. }
  1259. vektor_set_all(p_obb->obb, 1, 0, 0);
  1260. vektor_set_all(p_obb->obb + 1, 0, 1, 0);
  1261. vektor_set_all(p_obb->obb + 2, 0, 0, 1);
  1262. kd_stred_bunky(&min, &max, &p_kont->obb.obb_stred);
  1263. kd_len_bunky(&min, &max, &p_kont->obb.obb_len);
  1264. }
  1265. void kontejner_obalka_aabb(EDIT_KONTEJNER * p_kont, BOD * p_min, BOD * p_max)
  1266. {
  1267. EDIT_OBJEKT *p_obj;
  1268. int k;
  1269. vektor_set(p_min, FLT_MAX);
  1270. vektor_set(p_max, -FLT_MAX);
  1271. for (k = 0; k < MAX_KONT_OBJEKTU; k++) {
  1272. p_obj = p_kont->p_obj[k];
  1273. if (p_obj) {
  1274. kd_min_max_bod(&p_obj->obb.aabb_min, p_min, p_max);
  1275. kd_min_max_bod(&p_obj->obb.aabb_max, p_min, p_max);
  1276. }
  1277. }
  1278. }
  1279. // cte velikost objektu v bytech
  1280. int cti_velikost_objektu(EDIT_OBJEKT * p_obj)
  1281. {
  1282. if (p_obj)
  1283. return (sizeof(EDIT_OBJEKT) +
  1284. p_obj->vertexnum * sizeof(p_obj->p_vertex[0]) +
  1285. p_obj->facenum * sizeof(p_obj->p_face[0]) +
  1286. p_obj->linenum * sizeof(p_obj->p_line[0]));
  1287. else
  1288. return (0);
  1289. }
  1290. void cti_velikost_kontejneru(EDIT_KONTEJNER * p_kont, int *p_size,
  1291. int *p_objektu)
  1292. {
  1293. int o;
  1294. int size;
  1295. int objektu = 0;
  1296. size = sizeof(EDIT_KONTEJNER);
  1297. for (o = 0; o < p_kont->max_objektu; o++) {
  1298. if (p_kont->p_obj[o]) {
  1299. size += cti_velikost_objektu(p_kont->p_obj[o]);
  1300. objektu++;
  1301. }
  1302. }
  1303. *p_size += size;
  1304. *p_objektu += objektu;
  1305. }
  1306. int intersect_ray_koule(BOD * p_stred, float radius, BOD * p_orig,
  1307. BOD * p_dir)
  1308. {
  1309. BOD q = *p_dir;
  1310. BOD p(p_orig->x - p_stred->x, p_orig->y - p_stred->y,
  1311. p_orig->z - p_stred->z);
  1312. float a, b2, c;
  1313. float D4, sqD4, t2;
  1314. a = q.x * q.x + q.y * q.y + q.z * q.z;
  1315. b2 = (skal_soucin(q, p)) / 2;
  1316. c = (q.x - p_stred->x) * (q.x - p_stred->x)
  1317. + (q.y - p_stred->y) * (q.y - p_stred->y)
  1318. + (q.z - p_stred->z) * (q.z - p_stred->z)
  1319. - radius * radius;
  1320. // att + bt + c = 0
  1321. D4 = b2 * b2 - a * c;
  1322. if (D4 < 0)
  1323. return (FALSE);
  1324. sqD4 = (float) sqrt(D4);
  1325. t2 = (sqD4 - b2) / a;
  1326. if (t2 < 0)
  1327. return (FALSE);
  1328. else
  1329. return (TRUE);
  1330. }
  1331. // FACE_SOUS *p_fsous;
  1332. static int _num_pass(word * p_f1, word * p_f2)
  1333. {
  1334. int i, j;
  1335. int hit = 0;
  1336. for (i = 0; i < 3; i++) {
  1337. for (j = 0; j < 3; j++) {
  1338. if (p_f1[i] == p_f2[j])
  1339. hit++;
  1340. }
  1341. }
  1342. return (hit);
  1343. }
  1344. // importovat z 3ds modelama !!!!
  1345. // toto je moje berlicka
  1346. void obj_vyrob_list_sousednosti(EDIT_OBJEKT * p_obj)
  1347. {
  1348. int f, fi;
  1349. int hit;
  1350. if (p_obj->p_fsous) {
  1351. free(p_obj->p_fsous);
  1352. }
  1353. /*
  1354. p_obj->p_fsous = mmalloc(sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1355. memset(p_obj->p_fsous,K_CHYBA,sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1356. for(f = 0; f < p_obj->facenum; f+=3) {
  1357. hit = 0;
  1358. for(fi = 0; fi < p_obj->facenum; fi+=3) {
  1359. if(f == fi)
  1360. continue;
  1361. // face maji 2 spolecne body
  1362. if(_num_pass(p_obj->p_face+f, p_obj->p_face+fi) == 2) {
  1363. assert(hit < 3);
  1364. p_obj->p_fsous[f+hit] = fi;
  1365. hit++;
  1366. }
  1367. }
  1368. }
  1369. */
  1370. }
  1371. static int _num_pass_vertex(OBJ_VERTEX ** p_f1, OBJ_VERTEX ** p_f2)
  1372. {
  1373. int i, j;
  1374. int hit = 0;
  1375. for (i = 0; i < 3; i++) {
  1376. for (j = 0; j < 3; j++) {
  1377. if (stejny_vertex_point((BOD *) (p_f1[i]), (BOD *) (p_f2[j])))
  1378. hit++;
  1379. }
  1380. }
  1381. return (hit);
  1382. }
  1383. void obj_vyrob_list_sousednosti_full(EDIT_OBJEKT * p_obj)
  1384. {
  1385. OBJ_VERTEX *p_face1[3];
  1386. OBJ_VERTEX *p_face2[3];
  1387. int f, fi;
  1388. int hit;
  1389. if (p_obj->p_fsous) {
  1390. free(p_obj->p_fsous);
  1391. }
  1392. /*
  1393. p_obj->p_fsous = mmalloc(sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1394. memset(p_obj->p_fsous,K_CHYBA,sizeof(p_obj->p_fsous[0])*p_obj->facenum);
  1395. for(f = 0; f < p_obj->facenum; f+=3) {
  1396. hit = 0;
  1397. for(fi = 0; fi < p_obj->facenum; fi+=3) {
  1398. if(f == fi)
  1399. continue;
  1400. // face maji 2 spolecne body
  1401. p_face1[0] = p_obj->p_vertex+(p_obj->p_face[f]);
  1402. p_face1[1] = p_obj->p_vertex+(p_obj->p_face[f+1]);
  1403. p_face1[2] = p_obj->p_vertex+(p_obj->p_face[f+2]);
  1404. p_face2[0] = p_obj->p_vertex+(p_obj->p_face[fi]);
  1405. p_face2[1] = p_obj->p_vertex+(p_obj->p_face[fi+1]);
  1406. p_face2[2] = p_obj->p_vertex+(p_obj->p_face[fi+2]);
  1407. if(_num_pass_vertex(p_face1, p_face2) == 2) {
  1408. assert(hit < 3);
  1409. p_obj->p_fsous[f+hit++] = fi;
  1410. }
  1411. }
  1412. }
  1413. */
  1414. }
  1415. void scale_normal_roh(MUJ_BOD * p_vertex, FACE * p_face, int v1, int v2,
  1416. int v3, BOD * p_normal)
  1417. {
  1418. BOD vektor1, vektor2, p1, p2;
  1419. float uhel; // 180 stupnu = 1.0f
  1420. vektor_sub(mujbod2bod(&p1, p_vertex + p_face[v2]),
  1421. mujbod2bod(&p2, p_vertex + p_face[v1]), &vektor1);
  1422. vektor_norm(&vektor1);
  1423. vektor_sub(mujbod2bod(&p1, p_vertex + p_face[v3]),
  1424. mujbod2bod(&p2, p_vertex + p_face[v1]), &vektor2);
  1425. vektor_norm(&vektor2);
  1426. uhel = acosf(vektor_uhel(&vektor1, &vektor2));
  1427. if (finite(uhel) && !isnan(uhel))
  1428. vektor_scale(p_normal, uhel / PI);
  1429. else
  1430. vektor_set(p_normal, 0.0f);
  1431. }
  1432. typedef struct _NORM_INDICIE
  1433. { // popisuje vertex
  1434. BOD *p_vert;
  1435. BOD norm;
  1436. int vertex;
  1437. } NORM_INDICIE;
  1438. typedef struct _FACE_INDICIE
  1439. { // popisuje face
  1440. int vertex;
  1441. BOD norm;
  1442. } FACE_INDICIE;
  1443. typedef struct _NORM_INT_PROC
  1444. {
  1445. int ind_akt; // Pole vertexu
  1446. int ind_max;
  1447. NORM_INDICIE *p_ind;
  1448. int fn_akt; // Pole facu
  1449. int fn_max;
  1450. FACE_INDICIE *p_fn;
  1451. } NORM_INT_PROC;
  1452. void ind_init(NORM_INT_PROC * p_prc, int vert, int facu)
  1453. {
  1454. memset(p_prc, 0, sizeof(p_prc[0]));
  1455. /*
  1456. p_prc->p_ind = mmalloc(sizeof(p_prc->p_ind[0])*vert);
  1457. p_prc->ind_max = vert;
  1458. p_prc->p_fn = mmalloc(sizeof(p_prc->p_fn[0])*facu);
  1459. p_prc->fn_max = facu;
  1460. */
  1461. }
  1462. void ind_smaz(NORM_INT_PROC * p_prc)
  1463. {
  1464. /*
  1465. null_free(&p_prc->p_ind);
  1466. null_free(&p_prc->p_fn);
  1467. memset(p_prc,0,sizeof(p_prc[0]));
  1468. */
  1469. }
  1470. BOD *ind_calc_fnorm(EDIT_OBJEKT * p_obj)
  1471. {
  1472. BOD *p_fnorm;
  1473. int i;
  1474. p_fnorm = (BOD *) mmalloc(sizeof(p_fnorm[0]) * p_obj->facenum);
  1475. for (i = 0; i < p_obj->facenum; i += 3) {
  1476. vektor_norm(calc_face_normal((BOD *) (p_obj->p_vertex + p_obj->p_face[i]),
  1477. (BOD *) (p_obj->p_vertex + p_obj->p_face[i + 1]),
  1478. (BOD *) (p_obj->p_vertex + p_obj->p_face[i + 2]), p_fnorm + i / 3));
  1479. }
  1480. return (p_fnorm);
  1481. }
  1482. int ind_add_obj(NORM_INT_PROC * p_prc, EDIT_OBJEKT * p_obj)
  1483. {
  1484. int i, vnum = p_obj->vertexnum, fnum = p_obj->facenum;
  1485. int handle;
  1486. NORM_INDICIE *p_ind;
  1487. FACE_INDICIE *p_fn;
  1488. BOD *p_fnorm;
  1489. if (p_prc->ind_akt + vnum > p_prc->ind_max)
  1490. return (K_CHYBA);
  1491. if (p_prc->fn_akt + fnum > p_prc->fn_max)
  1492. return (K_CHYBA);
  1493. p_fnorm = ind_calc_fnorm(p_obj);
  1494. handle = p_prc->ind_akt;
  1495. p_ind = p_prc->p_ind + handle;
  1496. p_prc->ind_akt += vnum;
  1497. for (i = 0; i < vnum; i++, p_ind++) {
  1498. p_ind->p_vert = (BOD *) (p_obj->p_vertex + i);
  1499. p_ind->vertex = handle + i;
  1500. }
  1501. p_fn = p_prc->p_fn + p_prc->fn_akt;
  1502. p_prc->fn_akt += fnum;
  1503. for (i = 0; i < fnum; i += 3) {
  1504. p_fn->norm = p_fnorm[i / 3];
  1505. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 0, 1, 2,
  1506. &p_fn->norm);
  1507. p_fn->vertex = handle + p_obj->p_face[i];
  1508. p_fn++;
  1509. p_fn->norm = p_fnorm[i / 3];
  1510. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 1, 0, 2,
  1511. &p_fn->norm);
  1512. p_fn->vertex = handle + p_obj->p_face[i + 1];
  1513. p_fn++;
  1514. p_fn->norm = p_fnorm[i / 3];
  1515. scale_normal_roh(p_obj->p_vertex, p_obj->p_face + i, 2, 0, 1,
  1516. &p_fn->norm);
  1517. p_fn->vertex = handle + p_obj->p_face[i + 2];
  1518. p_fn++;
  1519. }
  1520. free(p_fnorm);
  1521. return (handle);
  1522. }
  1523. // Kopiruje normaly zpet do objektu
  1524. int ind_vypln_obj(NORM_INT_PROC * p_prc, EDIT_OBJEKT * p_obj, int handle)
  1525. {
  1526. NORM_INDICIE *p_ind;
  1527. int i, vnum = p_obj->vertexnum;
  1528. if (handle + vnum > p_prc->ind_akt)
  1529. return (K_CHYBA);
  1530. p_ind = p_prc->p_ind + handle;
  1531. for (i = 0; i < vnum; i++, p_ind++) {
  1532. norm2mujbod(p_obj->p_vertex + i, &p_ind->norm);
  1533. }
  1534. return (handle);
  1535. }
  1536. inline int porovnej_vertexy(BOD * p_v1, BOD * p_v2)
  1537. {
  1538. if (p_v1->x > p_v2->x) {
  1539. return (1);
  1540. }
  1541. else if (p_v1->x < p_v2->x) {
  1542. return (-1);
  1543. }
  1544. else if (p_v1->y > p_v2->y) {
  1545. return (1);
  1546. }
  1547. else if (p_v1->y < p_v2->y) {
  1548. return (-1);
  1549. }
  1550. else if (p_v1->z > p_v2->z) {
  1551. return (1);
  1552. }
  1553. else if (p_v1->z < p_v2->z) {
  1554. return (-1);
  1555. }
  1556. else {
  1557. return (0);
  1558. }
  1559. }
  1560. int ind_sort_rec(const void *p_m1, const void *p_m2)
  1561. {
  1562. const NORM_INDICIE *p_i1 = (NORM_INDICIE *) p_m1;
  1563. const NORM_INDICIE *p_i2 = (NORM_INDICIE *) p_m2;
  1564. return (porovnej_vertexy(p_i1->p_vert, p_i2->p_vert));
  1565. }
  1566. int ind_sort_rec2(const void *p_m1, const void *p_m2)
  1567. {
  1568. const FACE_INDICIE *p_i1 = (FACE_INDICIE *) p_m1;
  1569. const FACE_INDICIE *p_i2 = (FACE_INDICIE *) p_m2;
  1570. return (p_i1->vertex - p_i2->vertex);
  1571. }
  1572. void ind_sort(NORM_INT_PROC * p_prc, int brutal)
  1573. {
  1574. if (brutal)
  1575. qsort(p_prc->p_ind, p_prc->ind_akt, sizeof(p_prc->p_ind[0]),
  1576. ind_sort_rec);
  1577. qsort(p_prc->p_fn, p_prc->fn_akt, sizeof(p_prc->p_fn[0]), ind_sort_rec2);
  1578. }
  1579. int ind_sort_obj_rec(const void *p_m1, const void *p_m2)
  1580. {
  1581. const NORM_INDICIE *p_i1 = (NORM_INDICIE *) p_m1;
  1582. const NORM_INDICIE *p_i2 = (NORM_INDICIE *) p_m2;
  1583. return (p_i1->vertex - p_i2->vertex);
  1584. }
  1585. void ind_sort_obj(NORM_INT_PROC * p_prc)
  1586. {
  1587. qsort(p_prc->p_ind, p_prc->ind_akt, sizeof(p_prc->p_ind[0]),
  1588. ind_sort_obj_rec);
  1589. }
  1590. BOD *ind_najdi_normal(NORM_INT_PROC * p_prc, int vertex, BOD * p_norm)
  1591. {
  1592. FACE_INDICIE *p_face = p_prc->p_fn;
  1593. int i, start = 0, stop = p_prc->fn_akt, stred;
  1594. do {
  1595. stred = start + ((stop - start) >> 1);
  1596. if (p_face[stred].vertex == vertex) {
  1597. break;
  1598. }
  1599. else {
  1600. if (start + 1 >= stop) {
  1601. return (NULL);
  1602. }
  1603. else if (p_face[stred].vertex > vertex) {
  1604. stop = stred;
  1605. }
  1606. else {
  1607. start = stred;
  1608. }
  1609. }
  1610. } while (1);
  1611. for (i = stred; i < p_prc->fn_akt && p_face[i].vertex == vertex; i++) {
  1612. vektor_add(p_norm, &p_face[i].norm, p_norm);
  1613. }
  1614. for (i = stred - 1; i > -1 && p_face[i].vertex == vertex; i--) {
  1615. vektor_add(p_norm, &p_face[i].norm, p_norm);
  1616. }
  1617. return (p_norm);
  1618. }
  1619. inline int stejny_ind(NORM_INDICIE * p_ind1, NORM_INDICIE * p_ind2)
  1620. {
  1621. return (stejny_vertex_point(p_ind1->p_vert, p_ind2->p_vert));
  1622. }
  1623. void ind_calc_norm(NORM_INT_PROC * p_prc, int brutal)
  1624. {
  1625. NORM_INDICIE *p_first;
  1626. NORM_INDICIE *p_last;
  1627. BOD norm;
  1628. int i, j, num;
  1629. ind_sort(p_prc, brutal);
  1630. p_last = p_prc->p_ind;
  1631. i = 0;
  1632. do {
  1633. p_first = p_last;
  1634. if (brutal) {
  1635. for (; (i < p_prc->ind_akt) && stejny_ind(p_first, p_last);
  1636. i++, p_last++);
  1637. num = p_last - p_first;
  1638. }
  1639. else {
  1640. if (i < p_prc->ind_akt) {
  1641. i++;
  1642. p_last++;
  1643. num = 1;
  1644. }
  1645. }
  1646. vektor_set(&norm, 0.0f);
  1647. for (j = 0; j < num; j++) {
  1648. ind_najdi_normal(p_prc, p_first[j].vertex, &norm);
  1649. }
  1650. vektor_norm(&norm);
  1651. for (j = 0; j < num; j++) {
  1652. p_first[j].norm = norm;
  1653. }
  1654. } while (i < p_prc->ind_akt);
  1655. ind_sort_obj(p_prc);
  1656. }
  1657. void calc_norm_vec(EDIT_OBJEKT * p_obj)
  1658. {
  1659. NORM_INT_PROC prc;
  1660. int h1;
  1661. ind_init(&prc, p_obj->vertexnum, p_obj->facenum);
  1662. h1 = ind_add_obj(&prc, p_obj);
  1663. ind_calc_norm(&prc, FALSE);
  1664. ind_vypln_obj(&prc, p_obj, h1);
  1665. ind_smaz(&prc);
  1666. }
  1667. void kont_norm_vect_iobject(EDIT_KONTEJNER * p_kont)
  1668. {
  1669. EDIT_OBJEKT *p_obj;
  1670. NORM_INT_PROC prc;
  1671. int *p_handle;
  1672. int i, o;
  1673. updatuj_kontejner_statistika(p_kont, FALSE);
  1674. ind_init(&prc, p_kont->bodu, p_kont->facu);
  1675. p_handle = (int *) mmalloc(sizeof(p_handle[0]) * p_kont->objektu);
  1676. i = 0;
  1677. oe_olist_reset(&o);
  1678. while ((p_obj = oe_olist_next(p_kont, &o))) {
  1679. p_handle[i] = ind_add_obj(&prc, p_obj);
  1680. i++;
  1681. }
  1682. ind_calc_norm(&prc, TRUE);
  1683. i = 0;
  1684. oe_olist_reset(&o);
  1685. while ((p_obj = oe_olist_next(p_kont, &o))) {
  1686. ind_vypln_obj(&prc, p_obj, p_handle[i]);
  1687. i++;
  1688. }
  1689. ind_smaz(&prc);
  1690. free(p_handle);
  1691. }
  1692. void kont_norm_vect(EDIT_KONTEJNER * p_kont_top)
  1693. {
  1694. EDIT_KONTEJNER *p_kont = p_kont_top;
  1695. int i;
  1696. while (p_kont) {
  1697. if (p_kont->kflag & KONT_BRUTALNORMAL) {
  1698. kont_norm_vect_iobject(p_kont);
  1699. }
  1700. else {
  1701. for (i = 0; i < p_kont->max_objektu; i++) {
  1702. if (p_kont->p_obj[i])
  1703. calc_norm_vec(p_kont->p_obj[i]);
  1704. }
  1705. }
  1706. p_kont = p_kont->p_next;
  1707. }
  1708. }
  1709. /*
  1710. Rendering linelistu
  1711. */
  1712. void kresli_objekt_dratove_jednoduse(EDIT_OBJEKT * p_obj)
  1713. {
  1714. int i, l1, l2;
  1715. assert(p_obj);
  1716. glBegin(GL_LINES);
  1717. for (i = 0; i < p_obj->linenum; i += 2) {
  1718. l1 = p_obj->p_line[i];
  1719. l2 = p_obj->p_line[i + 1];
  1720. glColor3fv(&p_obj->p_vertex[l1].dr);
  1721. glVertex3f(p_obj->p_vertex[l1].x, p_obj->p_vertex[l1].y,
  1722. p_obj->p_vertex[l1].z);
  1723. glColor3fv(&p_obj->p_vertex[l2].dr);
  1724. glVertex3f(p_obj->p_vertex[l2].x, p_obj->p_vertex[l2].y,
  1725. p_obj->p_vertex[l2].z);
  1726. }
  1727. glEnd();
  1728. }
  1729. void nastav_material_rgb_MAT(RGB_M * p_rgb)
  1730. {
  1731. MATERIAL mtrl;
  1732. ZeroMemory(&mtrl, sizeof(mtrl));
  1733. mtrl.ambient_r = p_rgb->r;
  1734. mtrl.ambient_g = p_rgb->g;
  1735. mtrl.ambient_b = p_rgb->b;
  1736. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (float *) p_rgb);
  1737. }
  1738. void nastav_material(float r, float g, float b)
  1739. {
  1740. MATERIAL mtrl;
  1741. ZeroMemory(&mtrl, sizeof(mtrl));
  1742. mtrl.ambient_r = r;
  1743. mtrl.ambient_g = g;
  1744. mtrl.ambient_b = b;
  1745. glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, &mtrl.ambient_r);
  1746. }
  1747. void kresli_kosoctverec(GLMATRIX * p_project, GLMATRIX * p_camera,
  1748. GLMATRIX * p_world, BOD * p_p, float r, float dr, float dg, float db)
  1749. {
  1750. GLMATRIX rr;
  1751. BOD p, vrc[6];
  1752. p.x = p_p->x;
  1753. p.y = p_p->y;
  1754. p.z = p_p->z;
  1755. calc_3d_2d_matrix(p_world, p_camera, p_project, &rr);
  1756. transformuj_bod_matici(&p.x, &p.y, &p.z, &rr);
  1757. r = r * p.z * 0.1f;
  1758. vrc[0].x = p_p->x + r;
  1759. vrc[0].y = p_p->y;
  1760. vrc[0].z = p_p->z;
  1761. vrc[1].x = p_p->x;
  1762. vrc[1].y = p_p->y;
  1763. vrc[1].z = p_p->z + r;
  1764. vrc[2].x = p_p->x - r;
  1765. vrc[2].y = p_p->y;
  1766. vrc[2].z = p_p->z;
  1767. vrc[3].x = p_p->x;
  1768. vrc[3].y = p_p->y;
  1769. vrc[3].z = p_p->z - r;
  1770. vrc[4].x = p_p->x;
  1771. vrc[4].y = p_p->y + r;
  1772. vrc[4].z = p_p->z;
  1773. vrc[5].x = p_p->x;
  1774. vrc[5].y = p_p->y - r;
  1775. vrc[5].z = p_p->z;
  1776. glColor3f(dr, dg, db);
  1777. glBegin(GL_LINE_LOOP);
  1778. glVertex3fv((float *) &vrc[0]);
  1779. glVertex3fv((float *) &vrc[1]);
  1780. glVertex3fv((float *) &vrc[2]);
  1781. glVertex3fv((float *) &vrc[3]);
  1782. glVertex3fv((float *) &vrc[0]);
  1783. glVertex3fv((float *) &vrc[4]);
  1784. glVertex3fv((float *) &vrc[2]);
  1785. glVertex3fv((float *) &vrc[5]);
  1786. glVertex3fv((float *) &vrc[0]);
  1787. glEnd();
  1788. glBegin(GL_LINE_LOOP);
  1789. glVertex3fv((float *) &vrc[3]);
  1790. glVertex3fv((float *) &vrc[4]);
  1791. glVertex3fv((float *) &vrc[1]);
  1792. glVertex3fv((float *) &vrc[5]);
  1793. glVertex3fv((float *) &vrc[3]);
  1794. glEnd();
  1795. glFlush();
  1796. }
  1797. void kresli_kosoctverec_word(BOD * p_p, float r, dword barva)
  1798. {
  1799. BOD vrc[6];
  1800. vrc[0].x = p_p-

Large files files are truncated, but you can click here to view the full file