Berusky3d_load.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945
  1. /*
  2. Berusky loaders
  3. */
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include <assert.h>
  7. #include <alloca.h>
  8. #include "3d_all.h"
  9. #include "Object.h"
  10. #include "Berusky_universal.h"
  11. #include "Berusky3d_castice.h"
  12. #include "Berusky3d.h"
  13. #include "Berusky3d_ini.h"
  14. #include "Berusky3d_load.h"
  15. #include "Berusky3d_animace.h"
  16. #include "Berusky3d_kofola_interface.h"
  17. #include "Berusky3d_render.h"
  18. /* Voda ma guid 12
  19. */
  20. int ber_je_objekt_voda(int guid)
  21. {
  22. return (guid / 1000 == 12);
  23. }
  24. /*
  25. Prace s levelem (vyrobeni/zruseni)
  26. */
  27. void ber_vyrob_level(G_KONFIG * p_ber, int x, int y, int z)
  28. {
  29. p_ber->x_num = x;
  30. p_ber->y_num = y;
  31. p_ber->z_num = z;
  32. p_ber->prvnum = 0;
  33. }
  34. void ber_zrus_level(G_KONFIG * p_ber)
  35. {
  36. int i;
  37. // vymazni vsechny prvky
  38. for (i = 0; i < MAX_PRVKU_LEVEL; i++) {
  39. if (p_ber->p_prv_lev[i]) {
  40. free(p_ber->p_prv_lev[i]);
  41. p_ber->p_prv_lev[i] = NULL;
  42. }
  43. }
  44. // vymazni level
  45. p_ber->z_num = p_ber->y_num = p_ber->x_num = 0;
  46. }
  47. /*
  48. Loady levelu
  49. */
  50. PRVEK_LEVELU_GAME *ber_vyrob_prvek_levelu(void)
  51. {
  52. PRVEK_LEVELU_GAME *p_prv =
  53. (PRVEK_LEVELU_GAME *) mmalloc(sizeof(PRVEK_LEVELU_GAME));
  54. init_matrix(&p_prv->mg);
  55. init_matrix(&p_prv->mp);
  56. return (p_prv);
  57. }
  58. /* Load meshe
  59. */
  60. int ber_najdi_mesh_id(GAME_MESH_OLD ** p_mesh, int max, int id)
  61. {
  62. int i;
  63. for (i = 0; i < max; i++) {
  64. if (p_mesh[i] && p_mesh[i]->p_data->mesh_ID == id)
  65. return (i);
  66. }
  67. return (K_CHYBA);
  68. }
  69. /* Prida regulerni mesh z disku
  70. */
  71. int ber_prvek_disk_do_bunky(G_KONFIG * p_ber, BUNKA_LEVELU_DISK * p_disk,
  72. int *p_handle, int ID, int x, int y, int z)
  73. {
  74. PRVEK_LEVELU_GAME *p_lev;
  75. GAME_MESH_OLD *p_mesh;
  76. GLMATRIX *p_m, tmp1;
  77. int guid = p_disk->guid;
  78. int mesh;
  79. int i;
  80. if (!guid) {
  81. return (TRUE);
  82. }
  83. for (i = 0; i < MAX_PRVKU_LEVEL; i++) {
  84. if (!p_ber->p_prv_lev[i]) {
  85. p_lev = p_ber->p_prv_lev[i] = ber_vyrob_prvek_levelu();
  86. p_lev->guid = p_disk->guid;
  87. p_lev->rotace = p_disk->Rotace;
  88. p_lev->staticky = ber_je_objekt_staticky(p_disk->guid);
  89. if (p_lev->staticky && !ber_je_objekt_voda(p_disk->guid)) {
  90. assert(ber_pozice_v_levelu(x, y >> 1, z, p_ber->x_num,
  91. p_ber->z_num) < p_ber->hitnum);
  92. p_ber->p_hit_list[ber_pozice_v_levelu(x, y >> 1, z, p_ber->x_num,
  93. p_ber->z_num)] = TRUE;
  94. }
  95. if (ID && p_disk->mesh != -1) {
  96. mesh = ber_najdi_mesh_id(p_ber->p_mesh, p_ber->meshnum, p_disk->mesh);
  97. if (mesh == K_CHYBA) {
  98. mesh = p_disk->mesh;
  99. }
  100. }
  101. else {
  102. mesh = p_disk->mesh;
  103. }
  104. p_lev->mesh = mesh;
  105. if (mesh != K_CHYBA && p_ber->p_mesh[mesh]) {
  106. p_mesh = p_ber->p_mesh[mesh];
  107. p_lev->p_mesh_data = p_mesh->p_data;
  108. p_lev->mp = p_mesh->m;
  109. p_m = &p_lev->mp;
  110. // Nacti umisteni meshe na mape
  111. p_lev->x = p_m->_41;
  112. p_lev->y = p_m->_42 + (Y_PRVEK / 2); // stred prvku je vyse
  113. p_lev->z = p_m->_43;
  114. p_lev->rotace = p_disk->Rotace;
  115. // Vyrob obalku prvku ve world-space
  116. transformuj_bod_matici(&p_lev->x, &p_lev->y, &p_lev->z, &p_mesh->m);
  117. init_matrix(&p_lev->mg);
  118. // Nastav pozici prvku
  119. if (p_mesh->p_data->kflag & KONT_KEYFRAME) {
  120. mat_mult_dir(&p_mesh->world, &p_mesh->m, &tmp1);
  121. key_mesh_reanimuj(p_mesh, p_mesh->sim_aktivni_time, &tmp1);
  122. }
  123. else {
  124. key_mesh_transformuj_obalky(p_mesh, &p_mesh->m);
  125. }
  126. p_mesh->p_data->kflag |= KONT_POHYB;
  127. p_mesh->p_data->mesh_handle = p_disk->mesh;
  128. }
  129. else {
  130. p_lev->mesh = K_CHYBA;
  131. }
  132. *p_handle = i;
  133. p_ber->prvnum++;
  134. return (TRUE);
  135. }
  136. }
  137. return (FALSE);
  138. }
  139. /*
  140. #define ber_pozice_v_levelu( _x,_y,_z,_x_num,_z_num)
  141. #define ber_pozice_na_disku(_i,_x,_y,_z,_x_num,_z_num)
  142. */
  143. /* Prida divoky mesh
  144. */
  145. int ber_mesh_do_bunky(G_KONFIG * p_ber, int mesh, int *p_handle)
  146. {
  147. PRVEK_LEVELU_GAME *p_lev;
  148. GAME_MESH_OLD *p_mesh = p_ber->p_mesh[mesh];
  149. GLMATRIX *p_m, tmp1;
  150. int i;
  151. if (!p_ber->p_mesh[mesh]) {
  152. return (K_CHYBA);
  153. }
  154. for (i = 0; i < MAX_PRVKU_LEVEL; i++) {
  155. if (!p_ber->p_prv_lev[i]) {
  156. p_lev = p_ber->p_prv_lev[i] = ber_vyrob_prvek_levelu();
  157. p_lev->mesh = mesh;
  158. p_mesh = p_ber->p_mesh[mesh];
  159. p_lev->p_mesh_data = p_mesh->p_data;
  160. p_lev->mp = p_mesh->m;
  161. p_m = &p_lev->mp;
  162. p_lev->pivot = p_mesh->kofola_pivot;
  163. init_matrix(&p_lev->mg);
  164. if (p_mesh->p_data->kflag & KONT_KEYFRAME) {
  165. mat_mult_dir(&p_mesh->world, &p_mesh->m, &tmp1);
  166. key_mesh_reanimuj(p_mesh, p_mesh->sim_aktivni_time, &tmp1);
  167. }
  168. else {
  169. key_mesh_transformuj_obalky(p_mesh, &p_mesh->m);
  170. }
  171. p_mesh->p_data->kflag |= KONT_POHYB;
  172. p_mesh->p_data->mesh_handle = mesh;
  173. *p_handle = i;
  174. p_ber->prvnum++;
  175. return (TRUE);
  176. }
  177. }
  178. return (FALSE);
  179. }
  180. void ber_umisti_prvek(MeshHandle handle, int x, int y, int z, int rotace)
  181. {
  182. PRVEK_LEVELU_GAME *p_lev = p_ber->p_prv_lev[handle];
  183. GAME_MESH_OLD *p_mesh;
  184. GLMATRIX *p_m, tmp1;
  185. if (p_lev) {
  186. p_m = &p_lev->mp;
  187. if (ber_je_objekt_staticky(p_lev->guid)) {
  188. p_lev->x = (float) (p_ber->x_start + x * X_PRVEK + X_PRVEK / 2);
  189. p_lev->y = (float) (p_ber->y_start + (y >> 1) * Y_PRVEK + Y_PRVEK / 2);
  190. p_lev->z = (float) (p_ber->z_start + z * Z_PRVEK + Z_PRVEK / 2);
  191. p_lev->rotace = rotace;
  192. init_matrix(&p_lev->mp);
  193. init_matrix(&p_lev->mg);
  194. if (p_lev->mesh != K_CHYBA) {
  195. p_mesh = p_ber->p_mesh[p_lev->mesh];
  196. init_matrix(&p_mesh->m);
  197. key_mesh_transformuj_obalky(p_mesh, &p_mesh->m);
  198. }
  199. }
  200. else {
  201. ber_position_matrix(p_ber, p_m, x, y, z, rotace);
  202. ber_position_level(p_lev, p_m, rotace);
  203. if (p_lev->mesh != K_CHYBA) {
  204. p_mesh = p_ber->p_mesh[p_lev->mesh];
  205. p_mesh->m = p_lev->mp;
  206. init_matrix(&p_lev->mg);
  207. p_mesh->p_data->kflag |= KONT_POHYB;
  208. if (p_mesh->p_data->kflag & KONT_KEYFRAME) {
  209. mat_mult(&p_mesh->world, &p_mesh->m, &tmp1);
  210. key_mesh_reanimuj(p_mesh, p_mesh->sim_aktivni_time, &tmp1);
  211. }
  212. else {
  213. key_mesh_transformuj_obalky(p_mesh, &p_mesh->m);
  214. }
  215. }
  216. }
  217. }
  218. }
  219. void ber_umisti_prvek_abs(PRVEK_LEVELU_GAME * p_lev, float x, float y,
  220. float z, int rotace)
  221. {
  222. GAME_MESH_OLD *p_mesh;
  223. GLMATRIX *p_m, tmp1;
  224. if (p_lev) {
  225. p_m = &p_lev->mp;
  226. ber_position_matrix_abs(p_ber, p_m, x, y, z, rotace);
  227. ber_position_level(p_lev, p_m, rotace);
  228. if (p_lev->mesh != K_CHYBA) {
  229. p_mesh = p_ber->p_mesh[p_lev->mesh];
  230. p_mesh->m = p_lev->mp;
  231. init_matrix(&p_lev->mg);
  232. p_mesh->p_data->kflag |= KONT_POHYB;
  233. if (p_mesh->p_data->kflag & KONT_KEYFRAME) {
  234. mat_mult(&p_mesh->world, &p_mesh->m, &tmp1);
  235. key_mesh_reanimuj(p_mesh, p_mesh->sim_aktivni_time, &tmp1);
  236. }
  237. else {
  238. key_mesh_transformuj_obalky(p_mesh, &p_mesh->m);
  239. }
  240. }
  241. }
  242. }
  243. inline static int _najdi_cislo(char *p_string)
  244. {
  245. char *pom = (char *) alloca(strlen(p_string));
  246. char *p_pom, *p_last;
  247. int k;
  248. strcpy(pom, p_string);
  249. p_pom = pom;
  250. while ((p_pom = strchr(p_pom, '_'))) {
  251. p_last = ++p_pom;
  252. }
  253. sscanf(p_last, "%d%s", &k, KONCOVKA_MESH);
  254. return (k);
  255. }
  256. /*
  257. Nahraje materialy
  258. */
  259. int ber_nahraj_materialy(G_KONFIG * p_ber, char *p_jmeno, char *p_dir)
  260. {
  261. char pom[200];
  262. strcpy(pom, p_jmeno);
  263. zamen_koncovku(pom, KONCOVKA_MATERIAL);
  264. chdir((p_dir));
  265. if (!lo_nahraj_materialy(p_ber->p_mat, MAX_CELKEM_MATERIALU, p_ber->p_text,
  266. MAX_CELKEM_TEXTUR, pom)) {
  267. kprintf(1, "Unable to load materials %s", p_jmeno);
  268. return (FALSE);
  269. }
  270. else
  271. return (TRUE);
  272. }
  273. /*
  274. Rozkopiruje materialy -> pouze prvni material!!!
  275. */
  276. void ber_materialy_rozkopiruj(G_KONFIG * p_ber, GAME_MESH_OLD * p_mesh,
  277. int restart)
  278. {
  279. EDIT_MATERIAL **p_imat = p_ber->p_mat;
  280. EDIT_MATERIAL *p_mat;
  281. char pom[MAX_JMENO];
  282. int mat, mnew = K_CHYBA;
  283. int i;
  284. if (p_mesh->p_data->m1flag & MAT_ANIM_FRAME) {
  285. for (i = 0; i < p_mesh->objektu; i++) {
  286. mat = p_mesh->p_mat[i];
  287. p_mat = p_imat[mat];
  288. if (p_mat->flag & MAT_ANIM_FRAME) {
  289. if (restart) {
  290. sprintf(pom, "%s_%d", p_mat->jmeno, i);
  291. mnew = lo_najdi_material(p_ber->p_mat, MAX_CELKEM_MATERIALU, pom);
  292. assert(mnew != K_CHYBA);
  293. p_mesh->p_mat[i] = mnew;
  294. }
  295. else {
  296. mnew =
  297. lo_najdi_prazdny_material(p_ber->p_mat, MAX_CELKEM_MATERIALU);
  298. assert(mnew != K_CHYBA);
  299. p_imat[mnew] = kopiruj_material(p_mat);
  300. p_mesh->p_mat[i] = mnew;
  301. sprintf(p_imat[mnew]->jmeno, "%s_%d", p_mat->jmeno, i);
  302. }
  303. }
  304. }
  305. }
  306. }
  307. /* Nahraje jeden mesh
  308. */
  309. int ber_nahraj_mesh(G_KONFIG * p_ber, char *p_jmeno, GAME_MESH_OLD ** p_mesh)
  310. {
  311. chdir((p_ber->dir.out_dir));
  312. p_mesh[0] =
  313. lo_nahraj_mesh(p_ber->p_mat, MAX_CELKEM_MATERIALU, p_ber->p_text,
  314. MAX_CELKEM_TEXTUR, p_jmeno, TRUE, p_ber->conf_extra_light_vertex);
  315. return ((int) p_mesh[0]);
  316. }
  317. inline int najdi_volnou_texturu_mat(EDIT_MATERIAL * p_mat)
  318. {
  319. int i;
  320. for (i = 0; i < MAT_TEXTUR; i++) {
  321. if (!p_mat->textfile[i][0]) {
  322. return (i);
  323. }
  324. }
  325. return (K_CHYBA);
  326. }
  327. #define AUTO_STAGE 0
  328. int ber_mat_vloz_dot3(EDIT_TEXT * p_text, int textnum, EDIT_MATERIAL * p_mat)
  329. {
  330. MATERIAL_TEXT_OLD state_stary;
  331. int btext, t, mat_text;
  332. // Nahradim prvni blok dot-3 a skopiruju operaci
  333. if ((t = najdi_volnou_texturu_mat(p_mat)) == K_CHYBA)
  334. return (FALSE);
  335. state_stary = p_mat->text_state[AUTO_STAGE];
  336. if (text_stage_edit_blok[state_stary.text_stage].textur > 1)
  337. return (FALSE);
  338. p_mat->text_state[AUTO_STAGE].text_stage = AUTO_BUMP_DOT3;
  339. p_mat->text_state[AUTO_STAGE].textury[DOT3_TEXT] = mat_text =
  340. state_stary.textury[0];
  341. p_mat->text_state[AUTO_STAGE].text_funkce[DOT3_TEXT] =
  342. state_stary.text_funkce[0];
  343. p_mat->text_state[AUTO_STAGE].text_koord[DOT3_TEXT] =
  344. state_stary.text_koord[0];
  345. p_mat->text_state[AUTO_STAGE].textury[DOT3_BUMP] = t;
  346. p_mat->text_state[AUTO_STAGE].text_funkce[DOT3_BUMP] = BLOK_DOT3_BUMP;
  347. p_mat->text_state[AUTO_STAGE].text_koord[DOT3_BUMP] =
  348. state_stary.text_koord[0];
  349. // Pridam texturu stejneho jmena ale dot-3
  350. if ((btext =
  351. lo_najdi_texturu(p_text, textnum, p_mat->textfile[mat_text],
  352. TEXT_GEN_DOT3)) == K_CHYBA) {
  353. if ((btext = lo_najdi_volnou_texturu(p_text, textnum)) == K_CHYBA)
  354. chyba("Textury");
  355. txt_kopiruj(p_text + btext, p_mat->p_text[mat_text]);
  356. p_text[btext].flag = TEXT_GEN_DOT3;
  357. txt_to_dot3(p_text + btext, FALSE);
  358. }
  359. p_mat->textflag[t] = TEXT_GEN_DOT3;
  360. p_mat->p_text[t] = p_text + btext;
  361. strcpy(p_mat->textfile[t], p_mat->textfile[mat_text]);
  362. p_mat->flag2 |= MAT2_BUMP;
  363. return (TRUE);
  364. }
  365. #define BUMP_ENV_TEXT "bumpflare.bmp"
  366. int ber_mat_vloz_dot3_env(EDIT_TEXT * p_text, int textnum,
  367. EDIT_MATERIAL * p_mat)
  368. {
  369. MATERIAL_TEXT_OLD state_stary;
  370. int btext, t, mat_text;
  371. /* Nahradim prvni blok dot-3 a skopiruju operaci
  372. */
  373. state_stary = p_mat->text_state[AUTO_STAGE];
  374. if (text_stage_edit_blok[state_stary.text_stage].textur > 1)
  375. return (FALSE);
  376. p_mat->text_state[AUTO_STAGE].text_stage = AUTO_BUMP_DOT3ENV;
  377. p_mat->text_state[AUTO_STAGE].textury[DOT3_TEXT] = mat_text =
  378. state_stary.textury[0];
  379. p_mat->text_state[AUTO_STAGE].text_funkce[DOT3_TEXT] =
  380. state_stary.text_funkce[0];
  381. p_mat->text_state[AUTO_STAGE].text_koord[DOT3_TEXT] =
  382. state_stary.text_koord[0];
  383. // Pridam bump-mapu
  384. if ((t = najdi_volnou_texturu_mat(p_mat)) == K_CHYBA) {
  385. p_mat->text_state[AUTO_STAGE] = state_stary;
  386. return (FALSE);
  387. }
  388. p_mat->text_state[AUTO_STAGE].textury[DOT3_BUMP] = t;
  389. p_mat->text_state[AUTO_STAGE].text_funkce[DOT3_BUMP] = BLOK_DOT3_BUMP;
  390. p_mat->text_state[AUTO_STAGE].text_koord[DOT3_BUMP] =
  391. state_stary.text_koord[0];
  392. // Pridam texturu stejneho jmena ale dot-3
  393. if ((btext =
  394. lo_najdi_texturu(p_text, textnum, p_mat->textfile[mat_text],
  395. TEXT_GEN_DOT3)) == K_CHYBA) {
  396. if ((btext = lo_najdi_volnou_texturu(p_text, textnum)) == K_CHYBA)
  397. chyba("Textury");
  398. txt_kopiruj(p_text + btext, p_mat->p_text[mat_text]);
  399. p_text[btext].flag = TEXT_GEN_DOT3;
  400. txt_to_dot3(p_text + btext, FALSE);
  401. }
  402. p_mat->textflag[t] = TEXT_GEN_DOT3;
  403. p_mat->p_text[t] = p_text + btext;
  404. strcpy(p_mat->textfile[t], p_mat->textfile[mat_text]);
  405. // Pridam env mapu
  406. if ((t = najdi_volnou_texturu_mat(p_mat)) == K_CHYBA) {
  407. p_mat->text_state[AUTO_STAGE] = state_stary;
  408. return (FALSE);
  409. }
  410. p_mat->text_state[AUTO_STAGE].textury[DOT3_ENV] = t;
  411. p_mat->text_state[AUTO_STAGE].text_funkce[DOT3_ENV] = BLOK_MODULACE;
  412. p_mat->text_state[AUTO_STAGE].text_koord[DOT3_ENV] =
  413. state_stary.text_koord[0];
  414. if ((btext =
  415. lo_najdi_texturu(p_text, textnum, BUMP_ENV_TEXT, FALSE)) == K_CHYBA) {
  416. if ((btext = lo_najdi_volnou_texturu(p_text, textnum)) == K_CHYBA)
  417. chyba("Textury");
  418. strcpy(p_text[btext].jmeno, BUMP_ENV_TEXT);
  419. p_text[btext].flag = FALSE;
  420. }
  421. p_mat->textflag[t] = FALSE;
  422. p_mat->p_text[t] = p_text + btext;
  423. p_mat->flag2 |= glstav_texgen_on[t];
  424. strcpy(p_mat->textfile[t], BUMP_ENV_TEXT);
  425. p_mat->flag2 |= MAT2_BUMP;
  426. return (TRUE);
  427. }
  428. // SMAT je bez bump-mappingu!!!
  429. int ber_uprava_materialu_bump_mapping(G_KONFIG * p_ber)
  430. {
  431. int matnum, i, bmptyp = hwconf.bump_mapping_typ, trida;
  432. EDIT_MATERIAL *p_mat;
  433. matnum = lo_pocet_materialu(p_ber->p_mat, MAX_CELKEM_MATERIALU);
  434. /*
  435. for(i = 0; i < MAX_CELKEM_TEXTUR; i++) {
  436. if(p_ber->p_text[i].load && p_ber->p_text[i].bump) {
  437. trida = p_ber->p_text[i].trida;
  438. if(txconf.text_bump[trida]) {
  439. txt_trida(trida);
  440. if(p_mat = lo_najdi_material_text_point(p_ber->p_mat,matnum,p_ber->p_text+i)) {
  441. if(!(p_mat->flag&(MAT_NO_BUMP|MAT_SCENE|MAT_PRUHLEDNY))) {
  442. switch(bmptyp) {
  443. case AUTO_BUMP_DOT3:
  444. kprintf(TRUE,"Dot3-Bump-material %s",p_mat->jmeno);
  445. ber_mat_vloz_dot3(p_ber->p_text,MAX_CELKEM_TEXTUR,p_mat);
  446. break;
  447. case AUTO_BUMP_DOT3ENV:
  448. kprintf(TRUE,"Env-Dot3-Bump-material %s",p_mat->jmeno);
  449. ber_mat_vloz_dot3_env(p_ber->p_text,MAX_CELKEM_TEXTUR,p_mat);
  450. break;
  451. default:
  452. break;
  453. }
  454. }
  455. }
  456. }
  457. }
  458. }
  459. */
  460. return (TRUE);
  461. }
  462. void ber_load_pridej_smat(G_KONFIG * p_ber, int reload)
  463. {
  464. int m;
  465. if (p_ber->conf_caustic && !reload && glstav_multitext_units > 2) {
  466. p_ber->p_smat = NULL;
  467. for (m = 0; m < MAX_CELKEM_MATERIALU; m++) {
  468. if (p_ber->p_mat[m] && p_ber->p_mat[m]->flag & MAT_SCENE) {
  469. p_ber->p_smat = p_ber->p_mat[m];
  470. amat_pridej_material(p_ber, p_ber->p_smat);
  471. p_ber->p_smat->flag &= ~MAT_SCENE_NUTNY;
  472. kprintf(TRUE, " - Scene-Material %s", p_ber->p_smat->jmeno);
  473. return;
  474. }
  475. }
  476. kprintf(TRUE, " - Scene-Material neni");
  477. }
  478. }
  479. int ber_nahraj_kurzor(G_KONFIG * p_ber)
  480. {
  481. int l;
  482. l = lo_najdi_volny_mesh(p_ber->p_mesh, MAX_BERUSKY_KONTEJNERU);
  483. if (l == K_CHYBA)
  484. return (FALSE);
  485. if (ber_nahraj_mesh(p_ber, JMENO_KURZOR, p_ber->p_mesh + l)) {
  486. if (l >= p_ber->meshnum)
  487. p_ber->meshnum = l + 1;
  488. p_ber->p_mesh[l]->p_data->k2flag |= KONT2_BERUSKA;
  489. return (TRUE);
  490. }
  491. else {
  492. return (FALSE);
  493. }
  494. }
  495. /*
  496. Zluta
  497. Hneda
  498. Cervena
  499. Modra
  500. Zelena
  501. */
  502. static char ber_list[][50] = { "beruska_zluta_game.b2m",
  503. "beruska_hneda_game.b2m",
  504. "beruska_cervena_game.b2m",
  505. "beruska_modra_game.b2m",
  506. "beruska_zelena_game.b2m"
  507. };
  508. int ber_je_mesh_beruska(int kont, BUNKA_LEVELU_DISK * p_berusky, int bernum,
  509. char *p_jmeno)
  510. {
  511. int i, br;
  512. for (i = 0; i < bernum; i++, p_berusky++) {
  513. if (p_berusky->mesh == kont) {
  514. br = p_berusky->guid % 10;
  515. strcpy(p_jmeno, ber_list[br]);
  516. return (TRUE);
  517. }
  518. }
  519. return (FALSE);
  520. }
  521. /*
  522. Nahraje scenu
  523. */
  524. int ber_nahraj_scenu(G_KONFIG * p_ber, char *p_jmeno, char *p_dir, int reload,
  525. BUNKA_LEVELU_DISK * p_berusky, int bernum)
  526. {
  527. EDIT_KONTEJNER *p_kont[MAX_BERUSKY_KONTEJNERU];
  528. NASTAVENI_KAMER kam;
  529. LENS_FLARE flare[MAX_FLARE_SVETEL];
  530. LEVEL_KONFIG lc;
  531. char file[200], tmp[200];
  532. dword ambient;
  533. int k, f, kflag, p, m, ret;
  534. memset(p_kont, 0, sizeof(p_kont[0]) * MAX_BERUSKY_KONTEJNERU);
  535. memset(flare, 0, sizeof(flare[0]) * MAX_FLARE_SVETEL);
  536. strcpy(file, p_jmeno);
  537. zamen_koncovku(file, KONCOVKA_SCENY);
  538. chdir((p_dir));
  539. kprintf(1, " - Load project....");
  540. if (lo_nahraj_projekt(p_ber->p_mat, MAX_CELKEM_MATERIALU,
  541. p_kont, MAX_BERUSKY_KONTEJNERU,
  542. p_ber->p_text, MAX_CELKEM_TEXTUR,
  543. file, p_ber->p_slight, MAX_FLARE_SVETEL,
  544. &p_ber->zrc, &p_ber->zrc_akt,
  545. flare, MAX_FLARE_SVETEL,
  546. &ambient, &p_ber->p_mlha,
  547. p_ber->p_dlight, MAX_FLARE_SVETEL,
  548. p_ber->p_edlight, MAX_FLARE_SVETEL,
  549. &p_ber->env, &kam, &lc, LOAD_ALL, FALSE)) {
  550. p_ber->conf_barva_pozadi = lc.barva_pozadi;
  551. p_ber->conf_barva_pozadi_pouzit =
  552. p_ber->conf_barva_pozadi_pouzit_default ? TRUE : lc.
  553. barva_pozadi_aktivni;
  554. p_ber->zm = lc.zm;
  555. p_ber->kam.min = kam.min;
  556. p_ber->kam.max = kam.max;
  557. p_ber->kam.max_uhel = MAX_UHEL_KAMERY;
  558. p_ber->kam.min_uhel = MIN_UHEL_KAMERY;
  559. p_ber->kam.max_vzdal = MAX_VZDAL_KAMERY;
  560. p_ber->kam.min_vzdal = MIN_VZDAL_KAMERY;
  561. // Nahodim scene-material
  562. ber_load_pridej_smat(p_ber, reload);
  563. p_ber->dl_lightnum =
  564. lo_najdi_prepocitej_dsvetlo(p_ber->p_dlight, MAX_FLARE_SVETEL);
  565. p_ber->edl_lightnum =
  566. lo_najdi_prepocitej_extra_svetlo(p_ber->p_edlight, MAX_FLARE_SVETEL);
  567. rgb_float(ambient, p_ber->dl_ambient);
  568. f = lo_najdi_volny_flare(flare, MAX_FLARE_SVETEL);
  569. if (f) {
  570. p_ber->p_flare = lo_flare2linear(flare, f);
  571. }
  572. p_ber->slightnum = lo_posledni_svetlo(p_ber->p_slight, MAX_FLARE_SVETEL);
  573. // Smazu materialy mazanych objektu
  574. for (k = 0; k < MAX_BERUSKY_KONTEJNERU; k++) {
  575. if (p_kont[k]) {
  576. if (ber_je_mesh_beruska(k, p_berusky, bernum, tmp)) {
  577. lo_zrus_material_kont(p_kont[k], p_ber->p_mat,
  578. MAX_CELKEM_MATERIALU);
  579. }
  580. }
  581. }
  582. // prekopiruje kontejnery-meshe 1:1
  583. for (k = 0, m = 0, p = -1; k < MAX_BERUSKY_KONTEJNERU; k++) {
  584. if (p_kont[k]) {
  585. if (ber_je_mesh_beruska(k, p_berusky, bernum, tmp)) {
  586. ret = ber_nahraj_mesh(p_ber, tmp, p_ber->p_mesh + m);
  587. assert(ret);
  588. zrus_kontejner_rec(p_kont + k, NULL);
  589. p_ber->p_mesh[m]->p_data->kflag |= KONT_PRVEK;
  590. p_ber->p_mesh[m]->p_data->k2flag |= KONT2_BERUSKA;
  591. }
  592. else {
  593. p_ber->p_mesh[m] = lo_kontejner_to_mesh(p_kont + k, p_ber->p_mat,
  594. MAX_CELKEM_MATERIALU, p_ber->conf_extra_light_vertex);
  595. }
  596. if (!p_ber->p_mesh[m])
  597. continue;
  598. // Kvuli animacim rozkopiruj materialy
  599. ber_materialy_rozkopiruj(p_ber, p_ber->p_mesh[m], reload);
  600. // Pridam do animacniho listu materialu
  601. amat_pridej_mesh(p_ber, m);
  602. kflag = p_ber->p_mesh[m]->p_data->kflag;
  603. // roztridit to na prvky/ne prvky
  604. if (!(kflag & (KONT_PRVEK | KONT_KEYFRAME))) {
  605. p_ber->p_mesh[m]->m = p_ber->p_mesh[m]->world;
  606. }
  607. // Kontejner je zrcadlo - zkusim ho najit
  608. if (p_ber->zrc_akt && kflag & KONT_ZRCADLO) {
  609. ZDRCADLO_DESC_POLY *p_poly = p_ber->zrc.p_poly;
  610. while (p_poly) {
  611. if (p_ber->p_mesh[m]->p_data->mesh_ID == p_poly->id_kont) {
  612. p_poly->zrcadlo_k = m;
  613. p_poly->poly = K_CHYBA;
  614. break;
  615. }
  616. p_poly = p_poly->p_next;
  617. }
  618. if (!p_poly)
  619. p_ber->p_mesh[m]->p_data->kflag &= ~KONT_ZRCADLO;
  620. }
  621. m++;
  622. }
  623. }
  624. p_ber->meshnum = m + 1;
  625. p_ber->conf_kurzor_mesh = ber_nahraj_kurzor(p_ber);
  626. p_ber->dl_lightnum =
  627. lo_najdi_prepocitej_dsvetlo(p_ber->p_dlight, MAX_FLARE_SVETEL);
  628. return (TRUE);
  629. }
  630. else {
  631. return (FALSE);
  632. }
  633. }
  634. /*
  635. ber_load_poly
  636. */
  637. void ber_nahraj_poly(G_KONFIG * p_ber, char *p_jmeno, char *p_dir)
  638. {
  639. MLZNA_KOSTKA *p_tmp;
  640. char file[200];
  641. int i;
  642. chdir((p_dir));
  643. strcpy(file, p_jmeno);
  644. zamen_koncovku(file, ".ply");
  645. // Load poly
  646. p_ber->p_poly =
  647. lo_nahraj_poly_list(file, &p_ber->polynum, p_ber->p_lightmap,
  648. p_ber->p_mat, MAX_CELKEM_MATERIALU);
  649. for (i = 0; i < p_ber->polynum; i++) {
  650. poly_pridej_vertex_array(p_ber->p_poly + i);
  651. amat_pridej_poly(p_ber, i);
  652. lo_poly_flaguj_materialy(p_ber->p_poly + i, p_ber->p_mat);
  653. }
  654. /* Flagovani zrcadla
  655. */
  656. {
  657. ZDRCADLO_DESC_POLY *p_poly = p_ber->zrc.p_poly;
  658. while (p_poly) {
  659. if (p_poly->poly != K_CHYBA) {
  660. p_ber->p_poly[p_poly->poly].kflag |= KONT_ZRCADLO;
  661. }
  662. p_poly = p_poly->p_next;
  663. }
  664. }
  665. /* Prismazeni mlho-kostek
  666. */
  667. if (p_ber->polynum) {
  668. p_tmp = p_ber->p_mlha;
  669. while (p_tmp) {
  670. if (p_tmp->poly != K_CHYBA) {
  671. p_ber->p_poly[p_tmp->poly].p_mlha = p_tmp;
  672. p_tmp->p_kont = p_ber->p_poly + p_tmp->poly;
  673. }
  674. p_tmp = p_tmp->p_next;
  675. }
  676. }
  677. }
  678. /*
  679. nahraje lightmapy
  680. */
  681. void ber_nahraj_lightmap(G_KONFIG * p_ber, char *p_jmeno, char *p_dir)
  682. {
  683. TXT_KONFIG zal;
  684. char pom[200];
  685. KFILE *f;
  686. int i, r;
  687. chdir((p_dir));
  688. strcpy(pom, p_jmeno);
  689. zamen_koncovku(pom, KONCOVKA_LIGHTMAPY);
  690. zal = txconf;
  691. txconf.text_trida = TEXT_LIGHT;
  692. txconf.text_mip_mapping = FALSE;
  693. txconf.text_filtr = FALSE;
  694. if ((f = kopen(NULL, pom, "rb"))) {
  695. while (!keof(f)) {
  696. if (kread(&i, sizeof(i), 1, f)) {
  697. assert(i >= 0 && i < MAX_RAY_TEXTUR);
  698. sprintf(p_ber->p_lightmap[i].jmeno, "%s_lp%.3d.bmp", pom, i);
  699. r = txt_nahraj_lightmapu_z_bmp(NULL, f, p_ber->p_lightmap + i, TRUE);
  700. assert(r);
  701. }
  702. }
  703. kclose(f);
  704. }
  705. else { // stara verze lightmap
  706. for (i = 0; i < MAX_RAY_TEXTUR; i++) {
  707. sprintf(p_ber->p_lightmap[i].jmeno, "%s\\%s_lp%.3d.bmp", p_dir, pom, i);
  708. if (efile(p_ber->p_lightmap[i].jmeno)) {
  709. kprintfl(TRUE, "Lightmap %s...", p_ber->p_lightmap[i].jmeno);
  710. txt_nahraj_lightmapu_z_bmp(p_ber->p_lightmap[i].jmeno, NULL,
  711. p_ber->p_lightmap + i, TRUE);
  712. }
  713. }
  714. }
  715. txconf = zal;
  716. /* Prepocitej lightmapy
  717. */
  718. for (i = 0; i < p_ber->polynum; i++) {
  719. lo_poly_calc_lightmap_face(p_ber->p_poly + i);
  720. }
  721. /* Zrus prebytecne bitmapy
  722. */
  723. for (i = 0; i < MAX_RAY_TEXTUR; i++) {
  724. if (p_ber->p_lightmap[i].p_bmp)
  725. bmp_zrus(&p_ber->p_lightmap[i].p_bmp);
  726. }
  727. }
  728. inline void bod_min_max(BOD * p_ref, BOD * p_min, BOD * p_max)
  729. {
  730. if (p_ref->x < p_min->x)
  731. p_min->x = p_ref->x;
  732. if (p_ref->y < p_min->y)
  733. p_min->y = p_ref->y;
  734. if (p_ref->z < p_min->z)
  735. p_min->z = p_ref->z;
  736. if (p_ref->x > p_max->x)
  737. p_max->x = p_ref->x;
  738. if (p_ref->y > p_max->y)
  739. p_max->y = p_ref->y;
  740. if (p_ref->z > p_max->z)
  741. p_max->z = p_ref->z;
  742. }
  743. void ber_velikost_sceny(G_KONFIG * p_ber)
  744. {
  745. GAME_MESH_OLD *p_mesh;
  746. BOD min, max;
  747. int i;
  748. float vzdal;
  749. min.x = min.y = min.z = FLT_MAX;
  750. max.x = max.y = max.z = -FLT_MAX;
  751. // Spocitam obalky vsech meshu
  752. for (i = 0; i < p_ber->meshnum; i++) {
  753. p_mesh = p_ber->p_mesh[i];
  754. if (p_mesh) {
  755. bod_min_max(&p_mesh->obb_world.aabb_min, &min, &max);
  756. bod_min_max(&p_mesh->obb_world.aabb_max, &min, &max);
  757. }
  758. }
  759. for (i = 0; i < p_ber->polynum; i++) {
  760. bod_min_max(&p_ber->p_poly[i].obb.aabb_min, &min, &max);
  761. bod_min_max(&p_ber->p_poly[i].obb.aabb_max, &min, &max);
  762. }
  763. vzdal = vzdal_bodu_bod(&min, &max) * 1.3f;
  764. if (vzdal > p_ber->kam.far_plane)
  765. p_ber->kam.far_plane = vzdal;
  766. kprintf(TRUE, "Z-Buffer range %.3f", p_ber->kam.far_plane);
  767. }
  768. GAME_MESH_OLD **ber_mesh_vyber_staticke(G_KONFIG * p_ber, int *p_snum,
  769. int **p_indexy)
  770. {
  771. GAME_MESH_OLD **p_list = p_ber->p_mesh;
  772. int listnum = p_ber->meshnum;
  773. GAME_MESH_OLD **p_stat;
  774. int i, snum;
  775. int *p_ind;
  776. snum = 0;
  777. for (i = 0; i < listnum; i++) {
  778. if (p_list[i] && p_list[i]->p_data->kflag & KONT_STATIC)
  779. snum++;
  780. }
  781. if (!snum) {
  782. *p_snum = 0;
  783. *p_indexy = NULL;
  784. return (NULL);
  785. }
  786. p_stat = (GAME_MESH_OLD **) mmalloc(sizeof(p_stat[0]) * snum);
  787. p_ind = (int *) mmalloc(sizeof(p_ind[0]) * snum);
  788. snum = 0;
  789. for (i = 0; i < listnum; i++) {
  790. if (p_list[i] && p_list[i]->p_data->kflag & KONT_STATIC) {
  791. p_stat[snum] = p_list[i];
  792. p_ind[snum] = i;
  793. snum++;
  794. }
  795. }
  796. *p_snum = snum;
  797. *p_indexy = p_ind;
  798. return (p_stat);
  799. }