Berusky3d.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. /*
  2. Berusky GL
  3. */
  4. #ifndef __BERUSKY_3D_H
  5. #define __BERUSKY_3D_H
  6. typedef struct _KOFOLOVA_CARA
  7. {
  8. BOD p1, p2;
  9. BODRGB b1, b2;
  10. } KOFOLOVA_CARA;
  11. typedef struct _VODOVERTEX
  12. {
  13. BOD *p_pos;
  14. BODRGBA *p_diff_mat;
  15. BODRGBA *p_diff;
  16. BODRGB *p_spec_mat;
  17. BODRGB *p_spec;
  18. float vyska; // puvodni vyska vertexu (pricita se k ni aktualni)
  19. float sinus; // argument sinusu (podle toho se udelaji barvy)
  20. } VODOVERTEX;
  21. typedef struct _VODNIK
  22. {
  23. VODOVERTEX *p_vert;
  24. float *p_vzdal;
  25. int vertexnum;
  26. int flag; // flagy vlnotvoru
  27. BOD p; // umisteni vlnotvoru
  28. float fi; // poc. faze
  29. float perioda; // frekvence
  30. float amplituda; // amplituda kmitu
  31. float dfi; // poc. faze
  32. float dperioda; // frekvence
  33. float damplituda; // amplituda kmitu
  34. float dr, dg, db, da;
  35. float adr, adg, adb, ada;
  36. float sr, sg, sb;
  37. float asr, asg, asb;
  38. struct _VODNIK *p_next;
  39. } VODNIK;
  40. typedef struct _VODA2
  41. {
  42. int meshnum; // meshe privazany k vode (co se vlni)
  43. int meshmax; // max pocty meshu ve vodnim dile
  44. GAME_MESH_OLD **p_mesh;
  45. int vertexu;
  46. VODOVERTEX *p_vertexy;
  47. VODNIK *p_vodnik;
  48. struct _VODA2 *p_next;
  49. struct _VODA2 *p_prev;
  50. } VODA2;
  51. typedef struct _GAME_KAMERA
  52. {
  53. /* Mod kamery - poly/3ds
  54. */
  55. int aktivni;
  56. /* Aktualni nastaveni kamery
  57. */
  58. GLMATRIX project, word, camera, invcam; // inverzni viev matrix s normalizovanejma vektorama
  59. /* Aktualni animace
  60. */
  61. KAMERA_TRACK_INFO *p_anim; // animace kamery
  62. int a_handle;
  63. /* Aktualni hodnoty kamery - 3ds
  64. */
  65. BOD p, t; // umisteni kamery
  66. float fov; // field-of-view
  67. float roll; // nejakej jinej ?
  68. /* Aktualni hodnoty kamery - polarni
  69. */
  70. float vzdal; // vzdal kamery
  71. float vzdal_kor; // korigovana vzdalenost kamery
  72. float fi; // uhel kamery
  73. float r; // rotace kamery
  74. int zmena; // kamera se zmenila/posunula
  75. int zmena_last; // kamera se zmenila/posunula v poslednim framu
  76. /* Flagy kontrolujici animaci
  77. */
  78. int flag; // flag animace
  79. int time; // cas animace (0-1)
  80. int time_stop;
  81. int time_start; // start-time animace
  82. int time_delka; // stop-time animace (delka)
  83. int *p_flag; // kofoluv flag
  84. int start; // frame start
  85. int stop; // frame konec
  86. } GAME_KAMERA;
  87. /*
  88. Material-animacni cast
  89. */
  90. #define MAX_MAT_ANIMACI 100
  91. // setridim list techto animaci
  92. typedef struct _MATERIAL_ANIM_LIST_BUNKA
  93. {
  94. EDIT_MATERIAL *p_anim; // material
  95. int mesh; // odkaz k mesh
  96. int objekt; // odkaz k objektu meshe
  97. int next_time; // cas pristi aktualizace animace
  98. int event; // ceka na udalost
  99. } MAL_BUNKA;
  100. /*
  101. Kontejner-animacni cast
  102. */
  103. #define MAX_KONT_ANIMACI 100
  104. #define MAX_SIM_ANIMACI 500
  105. #define MAX_RUN_ANIMACI 200
  106. #define MAX_ANIM_MATIC 20
  107. #define GK_POUZITA 0x1 // Run-animace je pouzivana
  108. #define GK_AKTIVNI 0x10 // Run-animace je aktivni
  109. #define GK_LOOP 0x100 // Run-animace se prehrava furt dokola
  110. #define GK_REMOVE 0x200 // Animace se po dobehnuti automaticky smaze
  111. #define ANIM_FLAG_KONEC (-1)
  112. typedef struct _GKA_MATICE
  113. {
  114. GLMATRIX *p_mat; // matice
  115. int *p_notify; // notify flag
  116. int flagy; // flagy
  117. int fce_param; // promena predavana funkcim
  118. void (*funkce_start) (int prom); // funkce volana na konci animace
  119. void (*funkce_frame) (int prom); // funkce volana kazdy frame
  120. void (*funkce_end) (int prom); // funkce volana na konci animace
  121. } GKA_MATICE;
  122. typedef struct _GLOBALNI_KONT_ANIMACE
  123. {
  124. int flag; // flag animace
  125. SIMPLE_TRACK_INFO *p_sim; // sim-animace
  126. dword time; // cas animace
  127. dword time_stop; // stop-cas animace
  128. dword time_start; // start-time animace
  129. dword time_delka; // delka animace
  130. int matic; // pocet matic
  131. GKA_MATICE p_mat[MAX_ANIM_MATIC]; // animacni matice
  132. BOD p, s; // vysledky aktualni interpolace
  133. QUAT q;
  134. int *p_flag; // kofoluv flag
  135. void *p_param; // kofolova end funkce
  136. int param;
  137. int param2;
  138. END_FUNKCE p_endfce;
  139. int konec;
  140. dword start; // frame start/stop
  141. dword stop;
  142. int next_ah; // nastaveni dalsi animace v poradi
  143. int next_flag;
  144. int next_start;
  145. int next_stop;
  146. struct _GLOBALNI_KONT_ANIMACE *p_next; // nasledujici polozka renderovaciho seznamu
  147. struct _GLOBALNI_KONT_ANIMACE *p_prev; // predchozi polozka renderovaciho seznamu
  148. // odmazani = setrideni seznamu
  149. } GK_ANIM;
  150. typedef struct _GK_TEXTANIM
  151. {
  152. int material;
  153. ANIM_TEXT *p_track;
  154. GLMATRIX *p_mat;
  155. int flag; // flagy animace (loop a pod)
  156. int *p_flag; // strkani vysleku animovani
  157. dword time; // aktualni cas
  158. dword time_start;
  159. dword time_stop;
  160. dword time_delka;
  161. dword start; // start
  162. dword stop; // stop
  163. struct _GK_TEXTANIM *p_next;
  164. struct _GK_TEXTANIM *p_prev;
  165. } GK_TEXTANIM;
  166. #define PRUHLEDNY_MESH 0x1
  167. #define PRUHLEDNY_POLY 0x2
  168. #define PRUHLEDNY_FLARE 0x3
  169. typedef struct _PRUHLEDNY_OBJEKT
  170. {
  171. void *p_objekt; // pointer na objekt
  172. int typ; // mesh/poly/flare
  173. float vzdal; // vzdalenost od kamery
  174. float vzdal_zrc; // vzdalenost od kamery
  175. } PRUHLEDNY_OBJEKT;
  176. /*
  177. Debug-cast
  178. */
  179. typedef struct _DEBUG_STATISTIKA
  180. {
  181. int bodu, facu, objektu, meshu;
  182. int hernich_prvku;
  183. int poly;
  184. int alfa_stage_change;
  185. int text_stage_change;
  186. int light_meshu;
  187. int light_vertexu;
  188. int hnizd, hnizd_vid;
  189. int lani_vid;
  190. int vertex_obj;
  191. } DEBUG_STATISTIKA;
  192. typedef struct _EDIT_OKNO
  193. {
  194. GLMATRIX project, word, camera, invcam; // inverzni viev matrix s normalizovanejma vektorama
  195. BOD p; // pomene pro prepocitani kamery
  196. float vzdal;
  197. float fi;
  198. float rfi;
  199. float roll;
  200. char fs; // full-scrren -> pojeho deaktivaci prekresli zbyvajici okna
  201. char vp; // jakej pouziva view-port
  202. } EDIT_OKNO;
  203. #define SFL_POSUN 0x0001
  204. #define SFL_ROTACE 0x0002
  205. #define SFL_ZOOM 0x0004
  206. typedef struct g_config
  207. {
  208. // Interface to 3D engine
  209. AGE_MAIN *p_age;
  210. GLMATRIX *p_project, *p_word, *p_camera, *p_invcam; // inverzni viev matrix s normalizovanejma vektorama
  211. float *p_vzdal; // vzdal kamery
  212. float *p_vzdal_kor; // korigovana vzdalenost kamery
  213. float *p_fi; // uhel kamery
  214. float *p_rfi; // rotace kamery
  215. BOD *p_target; // target-point kamery
  216. BOD *p_pos; // pozice kamery
  217. float *p_roll; // roll kamery
  218. int *p_mod; // mod kamery
  219. int kam_omezeni;
  220. GAME_KAMERA kamera;
  221. NASTAVENI_KAMER kam;
  222. KONFIG_DIR dir;
  223. TEXT_DIR tdir;
  224. /* Informace o levelu
  225. */
  226. int prvnum; // pocet prvku na mape
  227. PRVEK_LEVELU_GAME *p_prv_lev[MAX_PRVKU_LEVEL]; // seznam prvku umistenych nekde v levelu
  228. int hitnum; // mrizka levelu-staticke prvky - steny
  229. int *p_hit_list;
  230. int prvnum_top; // pocet top prvku na mape
  231. PRVEK_LEVELU_GAME *p_prv_lev_top[MAX_PRVKU_LEVEL_TOP]; // seznam top prvku umistenych nekde v levelu
  232. int prvnum_low; // pocet low prvku na mape
  233. PRVEK_LEVELU_GAME *p_prv_lev_low[MAX_PRVKU_LEVEL_LOW]; // seznam low prvku umistenych nekde v levelu
  234. int x_num;
  235. int y_num;
  236. int z_num; // rozmery levelu
  237. float x_start;
  238. float y_start;
  239. float z_start;
  240. BOD level_min;
  241. BOD level_max;
  242. /* Seznamy pro kresleni
  243. */
  244. int dyn_meshlistnum;
  245. GAME_MESH_OLD **p_dyn_meshlist[MAX_BERUSKY_KONTEJNERU];
  246. /* Standartni scena
  247. */
  248. int mesh_rendernum;
  249. int mesh_renderakt;
  250. GAME_MESH_OLD **p_mesh_renderlist[MAX_BERUSKY_KONTEJNERU];
  251. int poly_rendernum;
  252. int poly_renderakt;
  253. EDIT_MESH_POLY **p_poly_renderlist;
  254. int meshnum;
  255. GAME_MESH_OLD *p_mesh[MAX_BERUSKY_KONTEJNERU]; // seznam dynamickych hernich objektu
  256. int mdatanum;
  257. GAME_MESH_OLD *p_mdata[MAX_BERUSKY_DATABAZE]; // seznam databaze
  258. int polynum;
  259. EDIT_MESH_POLY *p_poly; // seznam statickych objektu
  260. EDIT_MATERIAL *p_mat[MAX_CELKEM_MATERIALU]; // seznam materialu
  261. EDIT_MATERIAL *p_smat; // scene-material
  262. EDIT_TEXT p_text[MAX_CELKEM_TEXTUR]; // seznam textur
  263. EDIT_TEXT p_lightmap[MAX_RAY_TEXTUR]; // seznam lightmap
  264. OBB_TREE_OLD obbtree; // obb-tree levelu
  265. /* Fleky v levelu
  266. */
  267. FLEK *p_fleky;
  268. FLEK *p_fleky_mesh;
  269. /* Casticove systemy
  270. */
  271. PARMETAC *p_par;
  272. /* Materialove animace -> animace materialu
  273. */
  274. MAL_BUNKA p_man[MAX_MAT_ANIMACI]; // materialove animace
  275. int mannum;
  276. /* Animacni mail
  277. */
  278. int anim_mail;
  279. /* Seznam animaci materialu
  280. */
  281. GK_TEXTANIM *p_textanim;
  282. /* Globalni kontejnerove anmimace
  283. a jejich simple tracky
  284. */
  285. HIERARCHY_TRACK_INFO p_track[MAX_SIM_ANIMACI];
  286. SIMPLE_TRACK_INFO p_sim[MAX_SIM_ANIMACI];
  287. int simnum;
  288. /* Svazane traky
  289. */
  290. GK_ANIM *p_gkanim; // seznam bezicich animaci
  291. GK_ANIM p_gkzas[MAX_RUN_ANIMACI]; // zasobnik animaci
  292. int gknum;
  293. /* Lokalni animacni traky
  294. */
  295. GAME_MESH_OLD *p_lokal[MAX_RUN_ANIMACI];
  296. int lokalnum;
  297. /* Animace kamer
  298. */
  299. KAMERA_TRACK_INFO kamery[KAM_MAX_ANIM];
  300. int kamnum;
  301. /* Animace kosti
  302. */
  303. JOINT_ANIMACE *p_chap; // seznam aktivnich joint-animaci
  304. /* Flare - linearni seznam
  305. */
  306. LENS_FLARE *p_flare;
  307. /* Staticka svetla
  308. */
  309. int slightnum;
  310. STATIC_LIGHT p_slight[MAX_FLARE_SVETEL];
  311. /* Dynamicke svetla
  312. */
  313. float dl_ambient[4]; // ambientni svetlo pro scenu
  314. int dl_recalc; // flag - prepocitat svetla (neco se posunulo)
  315. int dl_new; // flag - zmenil se pocet svetel (pribylo/ubylo)
  316. int dl_lightnum;
  317. int dl_on; // zapnute prepocty statickych svetel
  318. DYN_LIGHT p_dlight[MAX_FLARE_SVETEL];
  319. /* Extra dynamicke svetla
  320. */
  321. int edl_recalc; // flag - prepocitat svetla (neco se posunulo)
  322. int edl_new; // flag - zmenil se pocet svetel (pribylo/ubylo)
  323. int edl_lightnum;
  324. EXTRA_DYN_LIGHT p_edlight[MAX_FLARE_SVETEL];
  325. /* Linearni seznam mlznych kostek
  326. */
  327. MLZNA_KOSTKA *p_mlha;
  328. MLZNA_KOSTKA *p_mlha_akt; // aktnivni mlzna kostka
  329. ZEMNI_MLHA zm; // zemni mlha
  330. /* Linearni seznam vod
  331. */
  332. VODA2 *p_voda;
  333. /* Zasobnik na pruhledne objektu
  334. */
  335. int prhlnum;
  336. PRUHLEDNY_OBJEKT prhl[MAX_PRHL_OBJEKTU];
  337. /* Kofolovy cary
  338. */
  339. int car_a_kouzel;
  340. KOFOLOVA_CARA *p_cary;
  341. /*
  342. Zrcadlo
  343. */
  344. int zrc_akt; // zrcadlo aktivni
  345. ZDRCADLO_DESC zrc; // struktura zrcadla
  346. #ifdef DEBUG_MOD
  347. DEBUG_STATISTIKA debug;
  348. int debug_vypisy;
  349. int debug_fps;
  350. int debug_light;
  351. int debug_frame;
  352. int debug_draty;
  353. #endif
  354. FILE *debug_file;
  355. int TimeBase; // cas spusteni programu -> casova zakladna (v milisec)
  356. int TimeEndLastFrame; // cas na konci posledniho framu (v milisec)
  357. int TimeLastFrame; // delka posledniho framu (obracena hodnota je fps)
  358. float fps; // fps = 1000/TimeLongLastFrame
  359. int frame; // aktualni farme hry
  360. // predpocitana data
  361. dword conf_barva_pozadi;
  362. int conf_barva_pozadi_pouzit;
  363. int conf_barva_pozadi_pouzit_default;
  364. int conf_extra_light_vertex;
  365. int conf_pruhledna_kamera;
  366. float conf_pruhledna_kamera_radius;
  367. int conf_zpruhlednovac;
  368. int conf_menu_render;
  369. int conf_zrcadlo;
  370. int conf_p_key;
  371. int conf_r_key;
  372. int conf_full_light;
  373. int conf_full_light_last;
  374. int conf_start_zpruhlednovac;
  375. int conf_start_zvyraznovac;
  376. int conf_ovladani_rohy;
  377. int conf_ovladani_rohy_default;
  378. int conf_ovladani_rohy_smer;
  379. float conf_ovladani_rohy_rychlost;
  380. int conf_animace_okoli;
  381. int conf_dyn_light;
  382. int conf_dyn_rychlost;
  383. int conf_dyn_light_update_all;
  384. int conf_dyn_light_beruska; // TRUE - pouze beruska
  385. int conf_dyn_light_prvky; // TRUE - pouze prvky
  386. int conf_dyn_light_mesh; // TRUE - meshe
  387. int conf_dyn_light_poly; // TRUE - poly
  388. int conf_caustic;
  389. int conf_kurzor_handle;
  390. int conf_kurzor_mesh;
  391. int conf_load_tiku;
  392. int conf_load_tik;
  393. int conf_load_krok;
  394. void (*p_tik_fce) (void);
  395. // look-up tabulka pro druhou odmocninu
  396. #define MAX_LOOK_TABLE 256
  397. int p_looksqrt_linear[MAX_LOOK_TABLE * MAX_LOOK_TABLE];
  398. int p_looksqrt_quadratic[MAX_LOOK_TABLE * MAX_LOOK_TABLE];
  399. // Jednorozmerne look-up tabulky
  400. float p_looksqrt_linear_float[MAX_LOOK_TABLE];
  401. float p_looksqrt_quadratic_float[MAX_LOOK_TABLE];
  402. #define SIN_TABLE_SIZE 360
  403. // Sinus tabulka
  404. float sinus_table[SIN_TABLE_SIZE];
  405. // Flag sceny 1
  406. int sflag1;
  407. int mail;
  408. // environment sceny
  409. LEVEL_ENVIRONMENT env;
  410. int ref_pos;
  411. int ref_rot;
  412. int ref_zmena;
  413. // local config
  414. int system_kurzor;
  415. int karmin_aktivni;
  416. int mouse_move;
  417. char level_name[MAX_FILENAME];
  418. g_config(void)
  419. {
  420. memset(this, 0, sizeof(*this));
  421. karmin_aktivni = 1;
  422. }
  423. } G_KONFIG;
  424. #define OXRES hwconf.xres
  425. #define OYRES hwconf.yres
  426. #define OXSTART hwconf.xstart
  427. #define OYSTART hwconf.ystart
  428. void ber_updatuj_fps(G_KONFIG * p_ber);
  429. void ber_konfiguruj_berusky(G_KONFIG * p_ber);
  430. void ber_init_level(G_KONFIG * p_ber);
  431. void ber_klavesy_hra(G_KONFIG * p_ber);
  432. void ber_tiskni_statistiku(G_KONFIG * p_ber);
  433. void ber_prikaz_zvyraznovac(G_KONFIG * p_ber);
  434. void ber_rekonfiguruj_hra(G_KONFIG * p_ber);
  435. void ber_rekonfiguruj_3D(G_KONFIG * p_ber);
  436. void ber_rekonfiguruj_3D_aplikuj(G_KONFIG * p_ber);
  437. #define centruj_kurzor() ber_nastav_kurzor(OXRES/2, OYRES/2)
  438. #define KONST_KVAD_UTLUM 0.00392156862745098039215686274509804f
  439. /* Nastavi kurzor na zadanou pozici
  440. */
  441. void ber_nastav_kurzor(int x, int y);
  442. /* Vyrobi pozicni matici prvku
  443. */
  444. inline GLMATRIX *ber_position_matrix(G_KONFIG * p_ber, GLMATRIX * p_m, int x,
  445. int y, int z, int rotace)
  446. {
  447. init_matrix(p_m);
  448. p_m->_41 = (float) (p_ber->x_start + x * X_PRVEK + X_PRVEK / 2);
  449. p_m->_42 = (float) (p_ber->y_start + (y >> 1) * Y_PRVEK);
  450. p_m->_43 = (float) (p_ber->z_start + z * Z_PRVEK + Z_PRVEK / 2);
  451. if (rotace)
  452. rotate_matrix_y(p_m, -(rotace * PI / 2));
  453. return (p_m);
  454. }
  455. /* Vyrobi pozicni matici divokeho prvku
  456. */
  457. inline GLMATRIX *ber_position_matrix_abs(G_KONFIG * p_ber, GLMATRIX * p_m,
  458. float x, float y, float z, int rotace)
  459. {
  460. init_matrix(p_m);
  461. p_m->_41 = x;
  462. p_m->_42 = y;
  463. p_m->_43 = z;
  464. if (rotace)
  465. rotate_matrix_y(p_m, -(rotace * PI / 2));
  466. return (p_m);
  467. }
  468. inline void ber_position_level(PRVEK_LEVELU_GAME * p_lev, GLMATRIX * p_m,
  469. int rotace)
  470. {
  471. if (p_lev) {
  472. p_lev->x = p_m->_41;
  473. p_lev->y = p_m->_42 + (Y_PRVEK / 2); // stred prvku je vyse
  474. p_lev->z = p_m->_43;
  475. p_lev->rotace = rotace;
  476. }
  477. }
  478. #define ber_pozice_v_levelu(_x, _y, _z,_x_num,_z_num) ((_x_num)*(_z_num)*(_y) + (_x_num)*(_z) + (_x))
  479. #define ber_pozice_na_disku(_i,_x,_y,_z,_x_num,_z_num)\
  480. {\
  481. int zb;\
  482. _y = (_i)/((_z_num)*(_x_num));\
  483. zb = (_i)%((_z_num)*(_x_num));\
  484. _z = zb/(_x_num);\
  485. _x = zb%(_x_num);\
  486. }\
  487. #define PRV_LOW 0x01 // Low-prvek
  488. #define PRV_TOP 0x02 // Tow-prvek
  489. #define PRV_ANIM_END 0x04 // Konec top-animace prvku
  490. #endif