Berusky3d_kofola_interface.cpp 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422
  1. /*
  2. Kofolovo rozhrani - C
  3. */
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <assert.h>
  7. #include "3d_all.h"
  8. #include "Object.h"
  9. #include "Berusky_universal.h"
  10. #include "Berusky3d_castice.h"
  11. #include "Berusky3d.h"
  12. #include "Berusky3d_ini.h"
  13. #include "Berusky3d_load.h"
  14. #include "Berusky3d_render.h"
  15. #include "Berusky3d_light.h"
  16. #include "Berusky3d_animace.h"
  17. #include "Berusky3d_kamery.h"
  18. #include "Berusky3d_castice2.h"
  19. #include "Berusky3d_kofola_interface.h"
  20. extern G_KONFIG ber, *p_ber;
  21. float kom_load_progres; // aktualni tick
  22. /*
  23. Load levelu
  24. */
  25. void kom_init_level(LEVEL_HEADER * p_head) // level header
  26. {
  27. ber_zrus_level(p_ber);
  28. ber_vyrob_level(p_ber, p_head->x, p_head->y, p_head->z);
  29. p_ber->x_start = finite(p_head->x_start) ? p_head->x_start : 0.0f;
  30. p_ber->y_start = finite(p_head->y_start) ? p_head->y_start : 0.0f;
  31. p_ber->z_start = finite(p_head->z_start) ? p_head->z_start : 0.0f;
  32. p_ber->level_min.x = p_ber->x_start;
  33. p_ber->level_min.y = p_ber->y_start;
  34. p_ber->level_min.z = p_ber->z_start;
  35. p_ber->level_max.x = p_ber->x_start + p_head->x * X_PRVEK;
  36. p_ber->level_max.y = p_ber->y_start + p_head->y * Y_PRVEK;
  37. p_ber->level_max.z = p_ber->z_start + p_head->z * Z_PRVEK;
  38. p_ber->hitnum = p_head->x * p_head->y * p_head->z;
  39. p_ber->p_hit_list =
  40. (int *) mmalloc(sizeof(p_ber->p_hit_list[0]) * p_ber->hitnum);
  41. p_ber->frame = 0;
  42. }
  43. /* Vraci handle meshe - vola kofola
  44. */
  45. MeshHandle kom_pridej_prvek_levelu(BUNKA_LEVELU_DISK * p_bunka, int x, int y,
  46. int z)
  47. {
  48. int handle = K_CHYBA;
  49. int mesh;
  50. ber_prvek_disk_do_bunky(p_ber, p_bunka, &handle, TRUE, x, y, z);
  51. mesh = p_ber->p_prv_lev[handle]->mesh;
  52. if (!p_ber->p_prv_lev[handle]->staticky && (mesh == K_CHYBA
  53. || !p_ber->p_mesh[mesh])) {
  54. kprintf(TRUE, "---- Error loading mesh number %d", mesh);
  55. }
  56. return (handle);
  57. }
  58. /* Loadne prvek levelu z disku
  59. */
  60. MeshHandle kom_pridej_prvek_levelu_disk(char *p_file,
  61. BUNKA_LEVELU_DISK * p_bunka, int x, int y, int z)
  62. {
  63. int handle = K_CHYBA;
  64. int mesh;
  65. int l;
  66. l = lo_najdi_volny_mesh(p_ber->p_mesh, MAX_BERUSKY_KONTEJNERU);
  67. if (l == K_CHYBA)
  68. return (K_CHYBA);
  69. if (!ber_nahraj_mesh(p_ber, p_file, p_ber->p_mesh + l))
  70. return (K_CHYBA);
  71. if (l >= p_ber->meshnum)
  72. p_ber->meshnum = l + 1;
  73. p_bunka->mesh = l;
  74. ber_prvek_disk_do_bunky(p_ber, p_bunka, &handle, TRUE, x, y, z);
  75. mesh = p_ber->p_prv_lev[handle]->mesh;
  76. if (!p_ber->p_prv_lev[handle]->staticky && (mesh == K_CHYBA
  77. || !p_ber->p_mesh[mesh])) {
  78. kprintf(TRUE, "---- Error loading mesh number %d", mesh);
  79. }
  80. else {
  81. ber_dynamic_mesh_list_vloz_mesh(p_ber, mesh);
  82. }
  83. return (handle);
  84. }
  85. /* Pridani meshe do levelu
  86. */
  87. MeshHandle kom_pridej_mesh_do_levelu(char *p_jmeno)
  88. {
  89. int handle = K_CHYBA, kont;
  90. kont = kom_najdi_mesh(p_jmeno);
  91. if (kont == K_CHYBA || !p_ber->p_mesh[kont])
  92. return (K_CHYBA);
  93. else {
  94. ber_mesh_do_bunky(p_ber, kont, &handle);
  95. return (handle);
  96. }
  97. }
  98. /* Nastavi pivot point meshe (0,0,0) je default
  99. */
  100. int kom_mesh_set_pivot(MeshHandle prvek_handle, float x, float y, float z)
  101. {
  102. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  103. if (p_prv) {
  104. GLMATRIX m;
  105. memcpy(&m, &p_ber->p_mesh[p_prv->mesh]->m, sizeof(m));
  106. m._41 = m._42 = m._43 = 0.0f;
  107. transformuj_bod_matici(&x, &y, &z, &m);
  108. p_prv->pivot.x = x;
  109. p_prv->pivot.y = y;
  110. p_prv->pivot.z = z;
  111. return (prvek_handle);
  112. }
  113. else {
  114. return (K_CHYBA);
  115. }
  116. }
  117. /* Cte pivot meshe
  118. */
  119. int kom_mesh_get_pivot(MeshHandle prvek_handle, BOD * p_pivot)
  120. {
  121. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  122. if (p_prv) {
  123. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_prv->mesh];
  124. *p_pivot = p_mesh->kofola_pivot;
  125. return (TRUE);
  126. }
  127. else {
  128. return (FALSE);
  129. }
  130. }
  131. /* Nastavi pivot point pomoci bodu
  132. */
  133. int kom_mesh_set_pivot_bod(MeshHandle prvek_handle, BOD * p_bod)
  134. {
  135. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  136. if (p_prv) {
  137. BOD p = *p_bod;
  138. GLMATRIX m;
  139. memcpy(&m, &p_ber->p_mesh[p_prv->mesh]->m, sizeof(m));
  140. m._41 = m._42 = m._43 = 0.0f;
  141. transformuj_bod_matici(&p.x, &p.y, &p.z, &m);
  142. p_prv->pivot = p;
  143. return (prvek_handle);
  144. }
  145. else {
  146. return (K_CHYBA);
  147. }
  148. }
  149. /* resetuje matici rotace meshe + prepocita mesh na urcenou pozici
  150. (ten na teto pozici musi byt, jinak bude spatne umisteny)
  151. */
  152. int kom_mesh_reset_pr(MeshHandle prvek_handle, int x, int y, int z,
  153. int rotace)
  154. {
  155. if (p_ber->p_prv_lev[prvek_handle]) {
  156. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  157. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_prv->mesh];
  158. GLMATRIX m1, m2, m3;
  159. invert_matrix(ber_position_matrix(p_ber, &m1, x, y, z, rotace), &m2);
  160. mat_mult(&p_mesh->m, &m2, &m3);
  161. transformuj_mesh_matici(p_mesh, &m3);
  162. memcpy(&p_mesh->m, &m1, sizeof(GLMATRIX));
  163. memcpy(&p_prv->mp, &m1, sizeof(GLMATRIX));
  164. ber_position_level(p_prv, &m1, rotace);
  165. return (prvek_handle);
  166. }
  167. else {
  168. return (K_CHYBA);
  169. }
  170. }
  171. /* Nastavi flag meshe ze se nema testovat kolize s timto meshem
  172. */
  173. int kom_mesh_set_no_test(MeshHandle prvek_handle)
  174. {
  175. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  176. GAME_MESH_OLD *p_mesh;
  177. if (p_prv && p_prv->mesh != K_CHYBA) {
  178. p_mesh = p_ber->p_mesh[p_prv->mesh];
  179. p_mesh->p_data->kflag |= KONT_DRAW_NOBALKA;
  180. return (prvek_handle);
  181. }
  182. else {
  183. return (K_CHYBA);
  184. }
  185. }
  186. /* Nacte mesh - cislo pro ukladani
  187. */
  188. int kom_mesh_get_save_num(MeshHandle prvek_handle)
  189. {
  190. if (p_ber->p_prv_lev[prvek_handle]) {
  191. return (p_ber->p_prv_lev[prvek_handle]->mesh);
  192. }
  193. else {
  194. return (K_CHYBA);
  195. }
  196. }
  197. /* Nacte mesh - fyzickou pozici
  198. */
  199. int kom_mesh_get_float(MeshHandle prvek_handle, float *p_x, float *p_y,
  200. float *p_z, int *p_rotace)
  201. {
  202. if (p_ber->p_prv_lev[prvek_handle]) {
  203. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  204. *p_x = p_prv->x;
  205. *p_y = p_prv->y;
  206. *p_z = p_prv->z;
  207. *p_rotace = p_prv->rotace;
  208. return (prvek_handle);
  209. }
  210. else {
  211. return (K_CHYBA);
  212. }
  213. }
  214. /* Nacte mesh - logickou pozici
  215. */
  216. int kom_mesh_get_int(MeshHandle prvek_handle, int *p_x, int *p_y, int *p_z,
  217. int *p_rotace)
  218. {
  219. if (p_ber->p_prv_lev[prvek_handle]) {
  220. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  221. *p_x = ftoi((p_prv->x - p_ber->x_start - X_PRVEK / 2) / X_PRVEK);
  222. *p_y = ftoi((p_prv->y * 2.0f - p_ber->y_start - Y_PRVEK / 2) / Y_PRVEK);
  223. *p_z = ftoi((p_prv->z - p_ber->z_start - Z_PRVEK / 2) / Z_PRVEK);
  224. *p_rotace = p_prv->rotace;
  225. return (prvek_handle);
  226. }
  227. else {
  228. return (K_CHYBA);
  229. }
  230. }
  231. /* Prida prvek do databaze
  232. */
  233. DataHandle kom_pridej_prvek_do_databaze(SECONDDATADESC * p_sec)
  234. {
  235. int handle;
  236. if (p_ber->mdatanum >= MAX_BERUSKY_DATABAZE)
  237. return (K_CHYBA);
  238. else
  239. handle = p_ber->mdatanum++;
  240. ber_nahraj_mesh(p_ber, p_sec->File_Name[0], p_ber->p_mdata + handle);
  241. return (handle);
  242. }
  243. MeshHandle kom_vloz_prvek_z_databaze(DataHandle data_handle, int x, int y,
  244. int z, int rotace, int guid)
  245. {
  246. GAME_MESH_DATA *p_data;
  247. BUNKA_LEVELU_DISK disk;
  248. MeshHandle handle = K_CHYBA;
  249. int m;
  250. m = disk.mesh = lo_najdi_volny_mesh(p_ber->p_mesh, MAX_BERUSKY_KONTEJNERU);
  251. if (m == K_CHYBA)
  252. return (K_CHYBA);
  253. if (m >= p_ber->meshnum)
  254. p_ber->meshnum = m + 1;
  255. assert(p_ber->p_mdata[data_handle]); // source ok?
  256. p_ber->p_mesh[m] = kopiruj_mesh(p_ber->p_mdata[data_handle], NULL);
  257. assert(p_ber->p_mesh[m]); // dest ok?
  258. ber_dynamic_mesh_list_vloz_mesh(p_ber, m);
  259. p_data = p_ber->p_mesh[m]->p_data;
  260. lo_kopiruj_svetla_do_sceny_mesh(p_data, p_ber->p_dlight, MAX_FLARE_SVETEL,
  261. p_ber->p_edlight, MAX_FLARE_SVETEL);
  262. if (p_data->p_ldlight)
  263. p_ber->dl_lightnum =
  264. lo_najdi_prepocitej_dsvetlo(p_ber->p_dlight, MAX_FLARE_SVETEL);
  265. if (p_data->p_lelight)
  266. p_ber->edl_lightnum =
  267. lo_najdi_prepocitej_extra_svetlo(p_ber->p_edlight, MAX_FLARE_SVETEL);
  268. disk.guid = guid;
  269. disk.Rotace = rotace;
  270. disk.Vazba1 = disk.Vazba2 = 0;
  271. ber_prvek_disk_do_bunky(p_ber, &disk, &handle, FALSE, x, y, z);
  272. ber_umisti_prvek(handle, x, y, z, rotace);
  273. return (handle);
  274. }
  275. void kom_zrus_level(int restart)
  276. {
  277. int i;
  278. kprintf(TRUE, "Kom_zrus_level - start...");
  279. /* Zrusi casticovy systemy
  280. */
  281. {
  282. PARMETAC *p_par = p_ber->p_par;
  283. PARMETAC *p_next;
  284. while (p_par) {
  285. p_next = p_par->p_next;
  286. par_zrus_end(p_par);
  287. p_par = p_next;
  288. }
  289. }
  290. p_ber->p_par = NULL;
  291. kprintf(TRUE, "Kom_zrus_level - level...");
  292. /* Zrus level
  293. */
  294. for (i = 0; i < MAX_PRVKU_LEVEL; i++) {
  295. if (p_ber->p_prv_lev[i]) {
  296. free(p_ber->p_prv_lev[i]);
  297. p_ber->p_prv_lev[i] = NULL;
  298. }
  299. }
  300. p_ber->prvnum = 0;
  301. memset(p_ber->p_prv_lev, 0, sizeof(p_ber->p_prv_lev[0]) * MAX_PRVKU_LEVEL);
  302. kprintf(TRUE, "Kom_zrus_level - poly...");
  303. /* Zrus poly
  304. */
  305. if (p_ber->p_poly) {
  306. for (i = 0; i < p_ber->polynum; i++) {
  307. zrus_vnitrek_poly(p_ber->p_poly + i);
  308. }
  309. free(p_ber->p_poly);
  310. p_ber->p_poly = NULL;
  311. }
  312. kprintf(TRUE, "Kom_zrus_level - mesh...");
  313. /* Zrus meshe
  314. */
  315. for (i = 0; i < p_ber->meshnum; i++) {
  316. if (p_ber->p_mesh[i])
  317. zrus_mesh(p_ber->p_mesh + i);
  318. }
  319. kprintf(TRUE, "Kom_zrus_level - databaze...");
  320. /* Zrus meshe v databazi
  321. */
  322. for (i = 0; i < MAX_BERUSKY_DATABAZE; i++) {
  323. if (p_ber->p_mdata[i]) {
  324. lo_vymaz_svetla_mesh(p_ber->p_mdata[i]->p_data);
  325. zrus_mesh(p_ber->p_mdata + i);
  326. }
  327. }
  328. if (!restart) {
  329. kprintf(TRUE, "Kom_zrus_level - materialy...");
  330. /* Zrus materiay + smaterial
  331. */
  332. for (i = 0; i < MAX_CELKEM_MATERIALU; i++) {
  333. if (p_ber->p_mat[i])
  334. zrus_material(p_ber->p_mat + i);
  335. }
  336. p_ber->p_smat = NULL;
  337. kprintf(TRUE, "Kom_zrus_level - textury...");
  338. /* Zrus textury
  339. */
  340. lo_smaz_textury(p_ber->p_text, MAX_CELKEM_TEXTUR);
  341. memset(p_ber->p_text, 0, sizeof(p_ber->p_text[0]) * MAX_CELKEM_TEXTUR);
  342. }
  343. kprintf(TRUE, "Kom_zrus_level - lightmapy...");
  344. /* Zrus lightmapy
  345. */
  346. for (i = 0; i < MAX_RAY_TEXTUR; i++) {
  347. if (p_ber->p_lightmap[i].load) {
  348. txt_zrus_lightmapu(p_ber->p_lightmap + i);
  349. }
  350. }
  351. memset(p_ber->p_lightmap, 0,
  352. sizeof(p_ber->p_lightmap[0]) * MAX_CELKEM_TEXTUR);
  353. kprintf(TRUE, "Kom_zrus_level - mlho-kostky...");
  354. /* Zrus mlho-kostky
  355. */
  356. p_ber->p_mlha = zrus_mlhokostku_all(p_ber->p_mlha);
  357. p_ber->p_mlha = p_ber->p_mlha_akt = NULL;
  358. kprintf(TRUE, "Kom_zrus_level - fleky...");
  359. /* Zrus fleky
  360. */
  361. zrus_fleky(&p_ber->p_fleky);
  362. zrus_fleky(&p_ber->p_fleky_mesh);
  363. kprintf(TRUE, "Kom_zrus_level - flare...");
  364. /* Zrus flare
  365. */
  366. zrus_flare(&p_ber->p_flare);
  367. kprintf(TRUE, "Kom_zrus_level - voda...");
  368. /* Zrusi vodu
  369. */
  370. vod_zrus(&p_ber->p_voda);
  371. kprintf(TRUE, "Kom_zrus_level - animace textur...");
  372. /* Zrusi vsechny koordinatovy animace textur
  373. */
  374. tani_zrus(&p_ber->p_textanim);
  375. kprintf(TRUE, "Kom_zrus_level - animace kamer...");
  376. /* Animace kamer
  377. */
  378. for (i = 0; i < KAM_MAX_ANIM; i++) {
  379. key_kamera_zrus_indir(p_ber->kamery + i);
  380. }
  381. memset(p_ber->kamery, 0, sizeof(p_ber->kamery[0]) * KAM_MAX_ANIM);
  382. p_ber->kamnum = 0;
  383. kprintf(TRUE, "Kom_zrus_level - stat svetla...");
  384. /* Zrusi staticky svetla
  385. int slightnum;
  386. STATIC_LIGHT p_slight[MAX_FLARE_SVETEL];
  387. */
  388. p_ber->slightnum = 0;
  389. memset(p_ber->p_slight, 0, sizeof(p_ber->p_slight[0]) * MAX_FLARE_SVETEL);
  390. kprintf(TRUE, "Kom_zrus_level - dyn svetla...");
  391. /* Zrusi dynamicky svetla
  392. */
  393. for (i = 0; i < MAX_FLARE_SVETEL; i++) {
  394. if (p_ber->p_dlight[i].akt) {
  395. sdla_animaci_zrus_online(&p_ber->p_dlight[i].an);
  396. }
  397. }
  398. memset(p_ber->p_dlight, 0, sizeof(p_ber->p_dlight[0]) * MAX_FLARE_SVETEL);
  399. kprintf(TRUE, "Kom_zrus_level - extra-dyn svetla...");
  400. /* Extra-dynamicky svetla
  401. */
  402. for (i = 0; i < MAX_FLARE_SVETEL; i++) {
  403. if (p_ber->p_edlight[i].akt) {
  404. sdla_animaci_zrus_online(&p_ber->p_edlight[i].an);
  405. }
  406. }
  407. memset(p_ber->p_edlight, 0, sizeof(p_ber->p_edlight[0]) * MAX_FLARE_SVETEL);
  408. kprintf(TRUE, "Kom_zrus_level - sim-animaci...");
  409. /* Zruseni zbyvajicich sim/track animaci
  410. */
  411. for (i = 0; i < MAX_SIM_ANIMACI; i++) {
  412. if (p_ber->p_sim[i].keynum) {
  413. key_sim_zrus_vnitrek(p_ber->p_sim + i);
  414. }
  415. if (p_ber->p_track[i].endtime) {
  416. zrus_tri_vnitrek(p_ber->p_track + i);
  417. }
  418. }
  419. memset(p_ber->p_sim, 0, sizeof(p_ber->p_sim[0]) * MAX_SIM_ANIMACI);
  420. memset(p_ber->p_track, 0, sizeof(p_ber->p_track[0]) * MAX_SIM_ANIMACI);
  421. kprintf(TRUE, "Kom_zrus_level - hit-list...");
  422. /*
  423. Zruseni hit-listu
  424. */
  425. free(p_ber->p_hit_list);
  426. p_ber->p_hit_list = NULL;
  427. p_ber->hitnum = FALSE;
  428. kprintf(TRUE, "Kom_zrus_level - zrcadla...");
  429. /* Smaz zrcadla pokud jsou
  430. */
  431. {
  432. ZDRCADLO_DESC_POLY *p_poly = p_ber->zrc.p_poly, *p_tmp;
  433. while (p_poly) {
  434. p_tmp = p_poly->p_next;
  435. free(p_poly);
  436. p_poly = p_tmp;
  437. }
  438. p_ber->zrc_akt = FALSE;
  439. memset(&p_ber->zrc, 0, sizeof(p_ber->zrc));
  440. }
  441. kprintf(TRUE, "Kom_zrus_level - obb a renderlist...");
  442. /* Smaze obalky + poly render list
  443. */
  444. obbtree_zrus(&p_ber->obbtree);
  445. memset(&p_ber->obbtree, 0, sizeof(p_ber->obbtree));
  446. ber_poly_render_list_zrus(p_ber);
  447. memset(p_ber->p_dyn_meshlist, 0,
  448. sizeof(p_ber->p_dyn_meshlist[0]) * MAX_BERUSKY_KONTEJNERU);
  449. memset(p_ber->p_mesh_renderlist, 0,
  450. sizeof(p_ber->p_mesh_renderlist[0]) * MAX_BERUSKY_KONTEJNERU);
  451. kprintf(TRUE, "Kom_zrus_level - fronta animaci...");
  452. /* Smazu frontu animaci
  453. */
  454. memset(p_ber->p_lokal, 0, sizeof(p_ber->p_lokal[0]) * MAX_RUN_ANIMACI);
  455. p_ber->lokalnum = 0;
  456. kprintf(TRUE, "Kom_zrus_level - anim materialu...");
  457. /* Animace materialu
  458. */
  459. memset(&p_ber->p_man, 0, sizeof(p_ber->p_man[0]) * MAX_MAT_ANIMACI); // materialove animace
  460. p_ber->mannum = 0;
  461. kprintf(TRUE, "Kom_zrus_level - gkanimace...");
  462. /* Animace vseho
  463. */
  464. p_ber->p_gkanim = NULL;
  465. p_ber->gknum = 0;
  466. memset(p_ber->p_gkzas, 0, sizeof(p_ber->p_gkzas[0]) * MAX_RUN_ANIMACI);
  467. kprintf(TRUE, "Kom_zrus_level - animace chapadel...");
  468. /* Animace chapadel
  469. */
  470. chani_zrus_all(p_ber);
  471. kprintf(TRUE, "Kom_zrus_level - kofolovy cary...");
  472. /* Kofolovy cary - ven
  473. */
  474. p_ber->p_cary = NULL;
  475. p_ber->mail = 0;
  476. /* Vymaznu vse co tady mam
  477. */
  478. p_ber->x_num = p_ber->y_num = p_ber->z_num = 0;
  479. p_ber->dyn_meshlistnum = 0;
  480. p_ber->mesh_renderakt = 0;
  481. p_ber->mesh_rendernum = 0;
  482. p_ber->meshnum = 0;
  483. p_ber->polynum = 0;
  484. p_ber->anim_mail = 0;
  485. p_ber->simnum = 0;
  486. p_ber->dl_recalc = p_ber->dl_new = p_ber->dl_lightnum = p_ber->dl_on = 0;
  487. kprintf(TRUE, "Kom_zrus_level - all done...");
  488. }
  489. /*
  490. Vypne zrcadlo pokud je zrcadlo vypnute - vypni zrcadlo
  491. */
  492. int ber_test_zrcadla(void)
  493. {
  494. ZDRCADLO_DESC_POLY *p_poly = p_ber->zrc.p_poly;
  495. int mat;
  496. // Ma se vypnout zrcadlo
  497. if (p_ber->zrc_akt && !p_ber->conf_zrcadlo) {
  498. p_ber->zrc_akt = FALSE;
  499. while (p_poly) {
  500. if (p_poly->poly != K_CHYBA && p_ber->polynum > p_poly->poly) {
  501. p_ber->p_poly[p_poly->poly].kflag &= ~KONT_ZRCADLO;
  502. p_ber->p_poly[p_poly->poly].m1flag &= ~MAT_PRUHLEDNY;
  503. mat = p_ber->p_poly[p_poly->poly].material;
  504. p_ber->p_mat[mat]->alfa_state = FALSE;
  505. p_poly->poly = K_CHYBA;
  506. }
  507. else if (p_ber->polynum <= p_poly->poly) {
  508. p_poly->poly = K_CHYBA;
  509. }
  510. p_poly = p_poly->p_next;
  511. }
  512. return (TRUE);
  513. }
  514. else
  515. return (FALSE);
  516. }
  517. void kom_load_sys_material(int i)
  518. {
  519. char file[200];
  520. char pom[200];
  521. sprintf(pom, "system_material_%d", i);
  522. GetPrivateProfileString("game", pom, "", file, 200, ini_file);
  523. if (file[0]) {
  524. kprintf(1, "Load system materials '%s' from %s....", pom, file);
  525. if (!ber_nahraj_materialy(p_ber, file, p_ber->dir.material_dir))
  526. kprintf(1, "---- Fail load file %s....", file);
  527. }
  528. }
  529. void kom_posun_slider(void)
  530. {
  531. if (p_ber->conf_load_tik < p_ber->conf_load_tiku && p_ber->p_tik_fce) {
  532. p_ber->p_tik_fce();
  533. p_ber->conf_load_tik += p_ber->conf_load_krok;
  534. }
  535. }
  536. int ber_vyber_berusky(BUNKA_LEVELU_DISK * p_disk, int num,
  537. BUNKA_LEVELU_DISK * p_berusky)
  538. {
  539. int i, berusek = 0;
  540. for (i = 0; i < num; i++, p_disk++) {
  541. if (ber_je_objekt_beruska(p_disk->guid)) {
  542. *p_berusky++ = *p_disk;
  543. berusek++;
  544. }
  545. }
  546. if (berusek > 5) {
  547. kprintfe(TRUE, "Mas tam moc berusek!!! %d", berusek);
  548. }
  549. return (berusek);
  550. }
  551. // chdir - TRUE - nastavit adresar
  552. void kom_load_level(char *p_file, int zmen_dir, int restart,
  553. BUNKA_LEVELU_DISK * p_bunka, int bunek)
  554. {
  555. BUNKA_LEVELU_DISK berusky[5];
  556. int berusek;
  557. GAME_MESH_OLD **p_slist;
  558. int snum;
  559. char dir[200];
  560. char file[200];
  561. int vel1, vel2, vel3, vel4, ret, i, facu, vertexu;
  562. int *p_ind;
  563. dword time;
  564. berusek = ber_vyber_berusky(p_bunka, bunek, berusky);
  565. kprintf(1, "Loading level '%s'", p_file);
  566. kom_posun_slider();
  567. // Load systemovych materialu
  568. getcwd(dir, 200);
  569. for (i = 0; i < 10; i++)
  570. kom_load_sys_material(i);
  571. if (zmen_dir) {
  572. chdir((p_ber->dir.game_level_dir));
  573. strcpy(dir, p_file);
  574. zamen_koncovku(dir, "");
  575. }
  576. chdir((dir));
  577. getcwd(dir, 200);
  578. strcpy(file, p_file);
  579. kom_posun_slider();
  580. kprintf(1, "Level directory '%s'", dir);
  581. // leveldir+jmenobez koncovky
  582. // jmeno
  583. kprintf(1, "Load materials....");
  584. if (!ber_nahraj_materialy(p_ber, file, dir)) {
  585. kprintf(TRUE,
  586. "Error loading level materials %s from directory %s, stop loading..",
  587. file, dir);
  588. konec(TRUE);
  589. }
  590. kom_posun_slider();
  591. time = timeGetTime();
  592. kprintf(1, "Load scene - dynamic items....");
  593. ret = ber_nahraj_scenu(p_ber, file, dir, restart, berusky, berusek); // scena (dynamicke veci)
  594. kprintf(TRUE, "Scene load ret %d", ret);
  595. if (!ret) {
  596. kprintf(TRUE, "Error loading scene %s from directory %s, stop loading...",
  597. file, dir);
  598. konec(TRUE);
  599. }
  600. else {
  601. ber_dynamic_mesh_list_vyrob(p_ber);
  602. }
  603. kprintf(TRUE, "Loaded in %dms", timeGetTime() - time);
  604. kom_posun_slider();
  605. kprintf(1, "Load scene - static items....");
  606. ber_nahraj_poly(p_ber, file, dir); // poly (staticke veci)
  607. kom_posun_slider();
  608. if (ber_test_zrcadla())
  609. kprintf(TRUE, "Mirror off");
  610. else
  611. kprintf(TRUE, "Mirror on");
  612. time = timeGetTime();
  613. kprintf(1, "Load scene - static items - OBB Tree...");
  614. p_slist = ber_mesh_vyber_staticke(p_ber, &snum, &p_ind);
  615. obbtree_vyrob(&p_ber->obbtree, p_ber->p_poly, p_ber->polynum, p_slist, snum,
  616. p_ind, p_ber->p_mat);
  617. null_free((void **) &p_slist);
  618. null_free((void **) &p_ind);
  619. kprintf(TRUE, "time %d", timeGetTime() - time);
  620. kom_posun_slider();
  621. kprintf(1, "Load scene - lightmaps....");
  622. ber_nahraj_lightmap(p_ber, file, dir);
  623. time = timeGetTime();
  624. if (!restart) {
  625. int bump = hwconf.bump_mapping && p_ber->conf_dyn_light
  626. && p_ber->conf_dyn_rychlost == LIGHT_ALL;
  627. lo_reload_textur(&p_ber->tdir, p_ber->p_text, MAX_CELKEM_TEXTUR, bump);
  628. kom_posun_slider();
  629. if (bump) {
  630. ber_uprava_materialu_bump_mapping(p_ber);
  631. lo_reload_textur(&p_ber->tdir, p_ber->p_text, MAX_CELKEM_TEXTUR, FALSE);
  632. lo_smaz_textury_bmp(p_ber->p_text, MAX_CELKEM_TEXTUR);
  633. }
  634. }
  635. else {
  636. lo_reload_textur(&p_ber->tdir, p_ber->p_text, MAX_CELKEM_TEXTUR, FALSE);
  637. }
  638. lo_reload_stage(p_ber->p_mat, MAX_CELKEM_MATERIALU);
  639. kprintf(TRUE, "time %d", timeGetTime() - time);
  640. kom_posun_slider();
  641. kprintf(1, "Static lights %d", p_ber->slightnum);
  642. vel1 = (lo_velikost_textur(p_ber->p_text, MAX_CELKEM_TEXTUR)) / 8000;
  643. vel2 = (lo_velikost_textur(p_ber->p_lightmap, MAX_RAY_TEXTUR)) / 8000;
  644. facu = 0;
  645. vertexu = 0;
  646. vel3 =
  647. lo_velikost_meshu(p_ber->p_mesh, p_ber->meshnum, &facu, &vertexu) / 1000;
  648. vel4 =
  649. lo_velikost_poly(p_ber->p_poly, p_ber->polynum, &facu, &vertexu) / 1000;
  650. kprintf(1, "Size of mesh vert. %d KB", vel3);
  651. kprintf(1, "Size of poly vert. %d KB", vel4);
  652. kprintf(1, "Size of textures %d KB", vel1);
  653. kprintf(1, "Size of lightmaps %d KB", vel2);
  654. kprintf(1, "Size of all %d KB", vel1 + vel2);
  655. kprintf(1, "Vertex-num %d", vertexu);
  656. kprintf(1, "Face-num %d", facu);
  657. ber_velikost_sceny(p_ber);
  658. kom_posun_slider();
  659. }
  660. void kom_post_init_level(void)
  661. {
  662. ber_init_level(p_ber);
  663. }
  664. /* Zruseni meshe
  665. */
  666. void kom_zrus_prvek(MeshHandle prvek_handle)
  667. {
  668. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[prvek_handle];
  669. int mh = p_prv->mesh;
  670. GAME_MESH_DATA *p_data;
  671. if (p_prv) {
  672. if (mh != K_CHYBA) {
  673. p_data = p_ber->p_mesh[mh]->p_data;
  674. lo_vymaz_svetla_ze_sceny_mesh(p_data);
  675. if (p_data->p_ldlight)
  676. p_ber->dl_lightnum =
  677. lo_najdi_prepocitej_dsvetlo(p_ber->p_dlight, MAX_FLARE_SVETEL);
  678. if (p_data->p_lelight)
  679. p_ber->edl_lightnum =
  680. lo_najdi_prepocitej_extra_svetlo(p_ber->p_edlight,
  681. MAX_FLARE_SVETEL);
  682. zrus_mesh(p_ber->p_mesh + mh);
  683. }
  684. free(p_ber->p_prv_lev[prvek_handle]);
  685. p_ber->p_prv_lev[prvek_handle] = NULL;
  686. }
  687. }
  688. float kom_get_framerate(void)
  689. {
  690. return (p_ber->fps);
  691. }
  692. void kom_klavesy_hra(void)
  693. {
  694. ber_klavesy_hra(&ber);
  695. }
  696. BOD *kom_get_fyz_souradnice(int x, int y, int z, BOD * p_bod)
  697. {
  698. p_bod->x = (float) (p_ber->x_start + x * X_PRVEK + X_PRVEK / 2);
  699. p_bod->y = (float) (p_ber->y_start + (y >> 1) * Y_PRVEK);
  700. p_bod->z = (float) (p_ber->z_start + z * Z_PRVEK + Z_PRVEK / 2);
  701. return (p_bod);
  702. }
  703. /* Hledaci funkce
  704. */
  705. MatHandle kom_najdi_material(char *p_jmeno)
  706. {
  707. int i;
  708. for (i = 0; i < MAX_CELKEM_MATERIALU; i++) {
  709. if (p_ber->p_mat[i] && !strcmp(p_ber->p_mat[i]->jmeno, p_jmeno))
  710. return (i);
  711. }
  712. return (K_CHYBA);
  713. }
  714. EDIT_MATERIAL *kom_preloz_material(MatHandle mh)
  715. {
  716. return (p_ber->p_mat[mh]);
  717. }
  718. MeshHandle kom_najdi_mesh_prvek(char *p_jmeno)
  719. {
  720. PRVEK_LEVELU_GAME *p_prv;
  721. int i;
  722. for (i = 0; i < p_ber->prvnum; i++) {
  723. if ((p_prv = p_ber->p_prv_lev[i]) && p_prv->mesh != K_CHYBA &&
  724. !strcmp(p_ber->p_mesh[p_prv->mesh]->jmeno, p_jmeno))
  725. return ((MeshHandle) i);
  726. }
  727. return (K_CHYBA);
  728. }
  729. ExMeshHandle kom_najdi_mesh(char *p_jmeno)
  730. {
  731. int i;
  732. for (i = 0; i < p_ber->meshnum; i++) {
  733. if (p_ber->p_mesh[i] && !strcmp(p_ber->p_mesh[i]->jmeno, p_jmeno))
  734. return (i);
  735. }
  736. return (K_CHYBA);
  737. }
  738. ExMeshHandle kom_najdi_mesh_joint(ExMeshHandle * p_next)
  739. {
  740. int i;
  741. if (*p_next < 0)
  742. return (-1);
  743. for (i = *p_next; i < p_ber->meshnum; i++) {
  744. if (p_ber->p_mesh[i] && p_ber->p_mesh[i]->p_joint_anim) {
  745. *p_next = i + 1;
  746. return (i);
  747. }
  748. }
  749. *p_next = K_CHYBA;
  750. return (K_CHYBA);
  751. }
  752. /***************************************************
  753. Fleky - flekovac
  754. **************************************************
  755. */
  756. #define FLEK_BIAS 2.0f
  757. #define FLEK_BIAS_NAS 1.0f
  758. void kom_flek_zmen(FlekHandle fh, BOD * p_p, BOD * p_nx, BOD * p_nz, float dx,
  759. float dz, int rotace, int uroven, MatHandle material)
  760. {
  761. FLEK *p_flek = (FLEK *) fh;
  762. p_flek->material = material;
  763. p_flek->p = *p_p;
  764. p_flek->nx.x = p_nx->x * dx;
  765. p_flek->nx.y = p_nx->y * dx;
  766. p_flek->nx.z = p_nx->z * dx;
  767. p_flek->nz.x = p_nz->x * dz;
  768. p_flek->nz.y = p_nz->y * dz;
  769. p_flek->nz.z = p_nz->z * dz;
  770. p_flek->uroven = uroven;
  771. p_flek->bias = -(FLEK_BIAS + (float) uroven * FLEK_BIAS_NAS);
  772. p_flek->flag = FALSE;
  773. if (!rotace) {
  774. p_flek->u[0] = 0.0f;
  775. p_flek->v[0] = 0.0f;
  776. p_flek->u[1] = 1.0f;
  777. p_flek->v[1] = 0.0f;
  778. p_flek->u[2] = 1.0f;
  779. p_flek->v[2] = 1.0f;
  780. p_flek->u[3] = 0.0f;
  781. p_flek->v[3] = 1.0f;
  782. }
  783. else if (rotace == 1) {
  784. p_flek->u[1] = 0.0f;
  785. p_flek->v[1] = 0.0f;
  786. p_flek->u[2] = 1.0f;
  787. p_flek->v[2] = 0.0f;
  788. p_flek->u[3] = 1.0f;
  789. p_flek->v[3] = 1.0f;
  790. p_flek->u[0] = 0.0f;
  791. p_flek->v[0] = 1.0f;
  792. }
  793. else if (rotace == 2) {
  794. p_flek->u[2] = 0.0f;
  795. p_flek->v[2] = 0.0f;
  796. p_flek->u[3] = 1.0f;
  797. p_flek->v[3] = 0.0f;
  798. p_flek->u[0] = 1.0f;
  799. p_flek->v[0] = 1.0f;
  800. p_flek->u[1] = 0.0f;
  801. p_flek->v[1] = 1.0f;
  802. }
  803. else {
  804. p_flek->u[3] = 0.0f;
  805. p_flek->v[3] = 0.0f;
  806. p_flek->u[0] = 1.0f;
  807. p_flek->v[0] = 0.0f;
  808. p_flek->u[1] = 1.0f;
  809. p_flek->v[1] = 1.0f;
  810. p_flek->u[2] = 0.0f;
  811. p_flek->v[2] = 1.0f;
  812. }
  813. }
  814. void kom_vloz_flek(FLEK ** p_first, FLEK * p_flek)
  815. {
  816. FLEK *p_tmp = *p_first;
  817. FLEK *p_prev = NULL;
  818. while (p_tmp) {
  819. if (p_tmp->uroven < p_flek->uroven) {
  820. p_prev = p_tmp;
  821. p_tmp = p_tmp->p_next;
  822. }
  823. else
  824. break;
  825. }
  826. if (!p_tmp && p_prev) { // insert-last
  827. p_flek->p_next = NULL;
  828. p_flek->p_prew = p_prev;
  829. p_prev->p_next = p_flek;
  830. }
  831. else if (!p_prev) { // insert-first
  832. p_flek->p_next = p_tmp;
  833. p_flek->p_prew = NULL;
  834. if (p_tmp)
  835. p_tmp->p_prew = p_flek;
  836. *p_first = p_flek;
  837. }
  838. else { // insert mezi-kozy - predejdu to o 1
  839. p_flek->p_next = p_prev->p_next;
  840. p_flek->p_prew = p_prev;
  841. p_prev->p_next = p_flek;
  842. if (p_flek->p_next)
  843. p_flek->p_next->p_prew = p_flek;
  844. }
  845. }
  846. FlekHandle kom_flek_pridej(MeshHandle mh, BOD * p_p, BOD * p_nx, BOD * p_nz,
  847. float dx, float dz, int rotace, int uroven, MatHandle material)
  848. {
  849. PRVEK_LEVELU_GAME *p_prv;
  850. GAME_MESH_OLD *p_mesh;
  851. FLEK *p_flek;
  852. /* Flek se pripojuje ke scene
  853. */
  854. if (mh == K_CHYBA) {
  855. p_flek = (FLEK *) mmalloc(sizeof(FLEK));
  856. kom_flek_zmen((FlekHandle) p_flek, p_p, p_nx, p_nz, dx, dz, rotace,
  857. uroven, material);
  858. p_flek->mesh = K_CHYBA;
  859. kom_vloz_flek(&p_ber->p_fleky, p_flek);
  860. }
  861. /* Flek se pripojuje ke meshi
  862. */
  863. else {
  864. p_prv = p_ber->p_prv_lev[mh];
  865. if (!p_prv || p_prv->mesh == K_CHYBA)
  866. return (K_CHYBA);
  867. p_mesh = p_ber->p_mesh[p_prv->mesh];
  868. p_flek = (FLEK *) mmalloc(sizeof(FLEK));
  869. kom_flek_zmen((FlekHandle) p_flek, p_p, p_nx, p_nz, dx, dz, rotace,
  870. uroven, material);
  871. p_flek->mesh = p_prv->mesh;
  872. /* Pripojeni fleku ke scene
  873. */
  874. kom_vloz_flek(&p_ber->p_fleky_mesh, p_flek);
  875. }
  876. return ((int) p_flek);
  877. }
  878. int kom_flek_getflag(FlekHandle fh, int flag)
  879. {
  880. FLEK *p_flek = (FLEK *) fh;
  881. return (p_flek->flag);
  882. }
  883. int kom_flek_setflag(FlekHandle fh, int flag)
  884. {
  885. FLEK *p_flek = (FLEK *) fh;
  886. return (p_flek->flag = flag);
  887. }
  888. void kom_flek_zrus(FlekHandle fh)
  889. {
  890. FLEK *p_flek = (FLEK *) fh;
  891. if (p_flek->mesh == K_CHYBA) {
  892. /* Ruseni fleku sceny
  893. */
  894. if (p_flek->p_next)
  895. p_flek->p_next->p_prew = p_flek->p_prew;
  896. if (p_flek->p_prew)
  897. p_flek->p_prew->p_next = p_flek->p_next;
  898. else
  899. p_ber->p_fleky = p_flek->p_next;
  900. }
  901. else {
  902. /* Ruseni fleku meshu
  903. */
  904. if (p_flek->p_next)
  905. p_flek->p_next->p_prew = p_flek->p_prew;
  906. if (p_flek->p_prew)
  907. p_flek->p_prew->p_next = p_flek->p_next;
  908. else
  909. p_ber->p_fleky_mesh = p_flek->p_next;
  910. }
  911. free(p_flek);
  912. }
  913. /* Nacte pocet materialu v kontejneru
  914. */
  915. int kom_mesh_get_matnum(MeshHandle mh)
  916. {
  917. PRVEK_LEVELU_GAME *p_prv;
  918. EDIT_MATERIAL *p_mat = NULL;
  919. GAME_MESH_OLD *p_mesh;
  920. int i, amat = -1, mat = 0;
  921. if ((p_prv = p_ber->p_prv_lev[mh]) && p_prv->mesh != K_CHYBA) {
  922. p_mesh = p_ber->p_mesh[p_prv->mesh];
  923. for (i = mat = 0; i < p_mesh->objektu; i++) {
  924. if (p_mesh->p_mat[i] != amat) {
  925. amat = p_mesh->p_mat[i];
  926. mat++;
  927. }
  928. }
  929. }
  930. return (mat);
  931. }
  932. // Nacte samotne materialy
  933. int kom_mesh_get_mat(MeshHandle mh, MatHandle * p_mat)
  934. {
  935. PRVEK_LEVELU_GAME *p_prv;
  936. EDIT_MATERIAL *p_lmat = NULL;
  937. GAME_MESH_OLD *p_mesh;
  938. int i, amat = -1, mat = 0;
  939. if ((p_prv = p_ber->p_prv_lev[mh]) && p_prv->mesh != K_CHYBA) {
  940. p_mesh = p_ber->p_mesh[p_prv->mesh];
  941. for (i = mat = 0; i < p_mesh->objektu; i++) {
  942. if (p_mesh->p_mat[i] != amat) {
  943. amat = p_mesh->p_mat[i];
  944. p_mat[mat++] = amat;
  945. }
  946. }
  947. }
  948. return (mat);
  949. }
  950. // Nacte jmeno materialu z materialu
  951. char *kom_get_mat_jmeno(MatHandle mh, char *p_buffer, int max_znaku)
  952. {
  953. if (p_ber->p_mat[mh]
  954. && (strlen(p_ber->p_mat[mh]->jmeno) < (dword) max_znaku)) {
  955. return (strcpy(p_buffer, p_ber->p_mat[mh]->jmeno));
  956. }
  957. else
  958. return (NULL);
  959. }
  960. int kom_je_prvek_staticky(int guid)
  961. {
  962. return (ber_je_objekt_staticky(guid));
  963. }
  964. /* *******************************************************
  965. Nastaveni mlznych kostek
  966. */
  967. MLZNA_KOSTKA *kom_mlhokostka_najdi(char *p_jmeno)
  968. {
  969. MLZNA_KOSTKA *p_top = p_ber->p_mlha;
  970. while (p_top) {
  971. if (!strcmp(p_top->jmeno, p_jmeno))
  972. return (p_top);
  973. }
  974. return (NULL);
  975. }
  976. /* Nastaveni zpruhlednovani prvku
  977. */
  978. void kom_zpruhlednovat_prvky(int stav)
  979. {
  980. p_ber->kamera.zmena = TRUE;
  981. p_ber->conf_pruhledna_kamera = stav;
  982. if (!stav)
  983. ber_zpruhledni_prvky_reset(p_ber);
  984. }
  985. /* Zmena zpruhlednovani prvku
  986. */
  987. void kom_zpruhlednovat_prvky_zmena_berusky(void)
  988. {
  989. p_ber->kamera.zmena = TRUE;
  990. }
  991. /* Nastavi linelist
  992. */
  993. void kom_set_linelist(KOFOLOVA_CARA * p_list, int pocet)
  994. {
  995. p_ber->car_a_kouzel = pocet;
  996. p_ber->p_cary = p_list;
  997. }
  998. /* Cte level environment levelu
  999. */
  1000. LEVEL_ENVIRONMENT *kom_get_level_environment(void)
  1001. {
  1002. return (&p_ber->env);
  1003. }
  1004. /* Cte level pozici
  1005. */
  1006. void kom_get_level_size(BOD * p_min, BOD * p_max)
  1007. {
  1008. *p_min = p_ber->level_min;
  1009. *p_max = p_ber->level_max;
  1010. }
  1011. /* Vrati mesh vybrany kurzorem mysi
  1012. */
  1013. MeshHandle kom_get_mesh_mys(int itrida)
  1014. {
  1015. GLMATRIX *p_mat = get_matrix_camera_project(), m;
  1016. GAME_MESH_OLD *p_mesh;
  1017. PRVEK_LEVELU_GAME *p_prv;
  1018. int i, prvnum;
  1019. float min_t = FLT_MAX;
  1020. float t;
  1021. int min_mesh = K_CHYBA;
  1022. BOD a, b, p, *p_min, *p_max, min, max;
  1023. glu_invert_matrix(p_mat, &m);
  1024. transf_2d_3d_matrix((float) mi.x, (float) mi.y, 0.0f, &a.x, &a.y, &a.z,
  1025. &m, OXRES, OYRES, OXSTART, OYSTART);
  1026. transf_2d_3d_matrix((float) mi.x, (float) mi.y, 0.2f, &b.x, &b.y, &b.z,
  1027. &m, OXRES, OYRES, OXSTART, OYSTART);
  1028. prvnum = p_ber->prvnum;
  1029. for (i = 0; i < prvnum; i++) {
  1030. p_prv = p_ber->p_prv_lev[i];
  1031. if (p_prv && p_prv->guid && p_prv->guid / 1000 != itrida) {
  1032. if (p_prv->mesh != K_CHYBA) {
  1033. p_mesh = p_ber->p_mesh[p_prv->mesh];
  1034. p_min = &p_mesh->obb_world.aabb_min;
  1035. p_max = &p_mesh->obb_world.aabb_max;
  1036. }
  1037. else {
  1038. kd_bunka_expanze3(p_prv->x, p_prv->y, p_prv->z,
  1039. X_PRVEK2, Y_PRVEK2, Z_PRVEK2, &min, &max);
  1040. p_min = &min;
  1041. p_max = &max;
  1042. }
  1043. if (kd_intersect_kostku_bod(&a, &b, p_min, p_max, &p, &t)) {
  1044. t = vzdal_bodu_bod(&a, &p);
  1045. if (t < min_t) {
  1046. min_t = t;
  1047. min_mesh = i;
  1048. }
  1049. }
  1050. }
  1051. }
  1052. return (min_mesh);
  1053. }
  1054. int kom_get_mesh_mys_all(void)
  1055. {
  1056. GLMATRIX *p_mat = get_matrix_camera_project(), m;
  1057. GAME_MESH_OLD *p_mesh;
  1058. int i, meshnum;
  1059. float min_t = FLT_MAX;
  1060. float t;
  1061. int min_mesh = K_CHYBA;
  1062. BOD a, b, p, *p_min, *p_max;
  1063. glu_invert_matrix(p_mat, &m);
  1064. transf_2d_3d_matrix((float) mi.x, (float) mi.y, 0.0f, &a.x, &a.y, &a.z,
  1065. &m, OXRES, OYRES, OXSTART, OYSTART);
  1066. transf_2d_3d_matrix((float) mi.x, (float) mi.y, 0.2f, &b.x, &b.y, &b.z,
  1067. &m, OXRES, OYRES, OXSTART, OYSTART);
  1068. meshnum = p_ber->meshnum;
  1069. for (i = 0; i < meshnum; i++) {
  1070. p_mesh = p_ber->p_mesh[i];
  1071. if (p_mesh) {
  1072. p_min = &p_mesh->obb_world.aabb_min;
  1073. p_max = &p_mesh->obb_world.aabb_max;
  1074. if (kd_intersect_kostku_bod(&a, &b, p_min, p_max, &p, &t)) {
  1075. t = vzdal_bodu_bod(&a, &p);
  1076. if (t < min_t) {
  1077. min_t = t;
  1078. min_mesh = i;
  1079. }
  1080. }
  1081. }
  1082. }
  1083. return (min_mesh);
  1084. }
  1085. /* Nastavi aktivni mesh u multimesh charakteru
  1086. */
  1087. MeshHandle kom_mesh_set_mesh(MeshHandle mh, int ID, int rotace)
  1088. {
  1089. PRVEK_LEVELU_GAME *p_lev = p_ber->p_prv_lev[mh];
  1090. int mesh = p_lev->mesh;
  1091. GAME_MESH_OLD *p_prev = NULL,
  1092. *p_mesh = p_ber->p_mesh[mesh], *p_last = p_mesh;
  1093. assert(mesh != K_CHYBA);
  1094. while (p_mesh) {
  1095. if (p_mesh->low_id == ID) {
  1096. if (p_prev) {
  1097. p_prev->p_next = p_mesh->p_next;
  1098. p_mesh->p_next = p_last;
  1099. p_mesh->sim_flag = FALSE;
  1100. p_mesh->p_data->p_mesh = p_mesh;
  1101. p_ber->p_mesh[mesh] = p_mesh;
  1102. p_lev->mesh = mesh;
  1103. }
  1104. p_lev->rotace = rotace;
  1105. ber_umisti_prvek_abs(p_lev, p_lev->x, p_lev->y - Y_PRVEK2, p_lev->z,
  1106. p_lev->rotace);
  1107. return (mh);
  1108. }
  1109. p_prev = p_mesh;
  1110. p_mesh = p_mesh->p_next;
  1111. }
  1112. return (K_CHYBA);
  1113. }
  1114. /*
  1115. Parametry funkce:
  1116. mip_mapping = 0/1 (on/off)
  1117. mip_filtr = 0/1 (linear/trilinear)
  1118. std_filtr = 0/1 (near/liner)
  1119. wrap_x/y = 0/1 (clamp/wrap)
  1120. hi_res = 0/1
  1121. */
  1122. void kom_set_default_text_config(int mip_mapping, int mip_filtr,
  1123. int std_filtr, int wrap_x, int wrap_y, int hi_res)
  1124. {
  1125. txconf.text_mip_mapping = mip_mapping;
  1126. txconf.text_mip_filtr = txconf.text_mip_filtr;
  1127. txconf.text_filtr = txconf.text_filtr;
  1128. txconf.text_wrap_x = wrap_x;
  1129. txconf.text_wrap_y = wrap_y;
  1130. }
  1131. void kom_reload_ini(void)
  1132. {
  1133. ber_rekonfiguruj_hra(p_ber);
  1134. ber_rekonfiguruj_3D(p_ber);
  1135. ber_rekonfiguruj_3D_aplikuj(p_ber);
  1136. }
  1137. void kom_zpruhlednovac_on(void)
  1138. {
  1139. if (!p_ber->conf_zpruhlednovac) {
  1140. p_ber->conf_zpruhlednovac = TRUE;
  1141. p_ber->kamera.zmena = TRUE;
  1142. }
  1143. }
  1144. void kom_zpruhlednovac_off(void)
  1145. {
  1146. if (p_ber->conf_zpruhlednovac) {
  1147. p_ber->conf_zpruhlednovac = FALSE;
  1148. ber_kamera_zpruhledni_objekty_reset(p_ber);
  1149. }
  1150. }
  1151. // Zvyraznovani prvku on/off
  1152. void kom_zvyraznovac(void)
  1153. {
  1154. ber_prikaz_zvyraznovac(p_ber);
  1155. }
  1156. #define KOM_LOAD_KROKU 9
  1157. void kom_load_param_set(int tiku)
  1158. {
  1159. p_ber->conf_load_tiku = tiku;
  1160. p_ber->conf_load_tik = 0;
  1161. p_ber->conf_load_krok = tiku / KOM_LOAD_KROKU;
  1162. }
  1163. void kom_load_param_fce(void (*p_load_fce) (void))
  1164. {
  1165. p_ber->p_tik_fce = p_load_fce;
  1166. }
  1167. MeshHandle kom_pridej_kurzor_do_levelu(void)
  1168. {
  1169. return (kom_pridej_mesh_do_levelu(JMENO_KURZOR));
  1170. }
  1171. MeshHandle kom_prvek_viditelnost(MeshHandle mh, int vid)
  1172. {
  1173. PRVEK_LEVELU_GAME *p_prv = p_ber->p_prv_lev[mh];
  1174. if (p_prv) {
  1175. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[p_prv->mesh];
  1176. assert(p_mesh);
  1177. p_mesh->nekreslit = !vid;
  1178. return (TRUE);
  1179. }
  1180. else {
  1181. return (FALSE);
  1182. }
  1183. }