Load.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. /*
  2. Header k load.c :-)
  3. funkce pro praci s databazi materialu a textur
  4. a nacitanim x1 a out souboru...
  5. */
  6. #ifndef __LOAD_H
  7. #define __LOAD_H
  8. #define TVRDE_CHYBY 0
  9. #define S_NIC "nic"
  10. #define MTRL_TAG "MTRL"
  11. #define FAKTOR_TAG "AFCT"
  12. #define STAG_TAG "STGT"
  13. #define TEXT_TAG "TEXT"
  14. #define MULTI_TAG "MLTT"
  15. #define MRIZKA_TAG "MRIZ"
  16. #define MRIZKA_SIG "0001"
  17. #define KONFIG_TAG "KNFG"
  18. #define MATANIM_TAG "MTAN"
  19. #define KONFIG_TAG_OLD "CNFG"
  20. #define ANIM_LOAD_ALL 0
  21. #define ANIM_LOAD_FRAME 1
  22. #define ANIM_LOAD_POSUN 2
  23. #define COPY_GEOMETRY 0x0001
  24. #define COPY_DIFFUSE 0x0002
  25. #define COPY_SPECULAR 0x0004
  26. #define COPY_MAP1 0x0008
  27. #define COPY_MAP2 0x0010
  28. #define COPY_MATERIAL 0x0020
  29. #define LOAD_GEOM 0x0001
  30. #define LOAD_MATERIALY 0x0002
  31. #define LOAD_TEXTURY 0x0004
  32. #define LOAD_STAT_LIGHT 0x0008
  33. #define LOAD_DYN_LIGHT 0x0010
  34. #define LOAD_EXTRA_DYN_LIGHT 0x0020
  35. #define LOAD_AMBIENT 0x0040
  36. #define LOAD_MLHA 0x0080
  37. #define LOAD_ZRCADLO 0x0100
  38. #define LOAD_FLARE 0x0200
  39. #define LOAD_LEVEL_ENV 0x0400
  40. #define LOAD_KAMERY 0x0800
  41. #define LOAD_LEVEL_CONF 0x1000
  42. #define SAVE_GEOM_VYBR 0x2000
  43. #define LOAD_ALL (LOAD_GEOM|LOAD_MATERIALY|LOAD_TEXTURY|LOAD_STAT_LIGHT|LOAD_DYN_LIGHT|LOAD_EXTRA_DYN_LIGHT|LOAD_AMBIENT|LOAD_MLHA|LOAD_ZRCADLO|LOAD_FLARE|LOAD_LEVEL_ENV|LOAD_LEVEL_CONF|LOAD_KAMERY)
  44. inline void lo_vloz_mezery(FILE * f, int pocet)
  45. {
  46. int i;
  47. for (i = 0; i < pocet; i++)
  48. fwrite(" ", sizeof(byte), 1, f);
  49. }
  50. extern int hlasit_kolize;
  51. inline void str_read(char *p_string, FFILE f)
  52. {
  53. int ret;
  54. while ((ret = ffread(p_string, sizeof(char), 1, f)) && ret > 0 && *p_string)
  55. p_string++;
  56. }
  57. /*
  58. Koncovky
  59. */
  60. char *zamen_koncovku(char *p_file, const char *p_koncovka);
  61. char *zamen_koncovku_znak(char *p_file, char znak, const char *p_koncovka);
  62. char *cti_koncovku(char *p_file);
  63. /*
  64. Mlha
  65. */
  66. MLZNA_KOSTKA *vyrob_mlhokostku(char *p_jmeno);
  67. MLZNA_KOSTKA *kopiruj_mlhokostku(MLZNA_KOSTKA * p_src, char *p_jmeno);
  68. void zrus_mlhokostku(MLZNA_KOSTKA ** p_first, MLZNA_KOSTKA * p_maz);
  69. MLZNA_KOSTKA *zrus_mlhokostku_all(MLZNA_KOSTKA * p_first);
  70. /*
  71. Objekty
  72. */
  73. int smaz_divoke_vertexy_objektu_dir(EDIT_OBJEKT * p_obj);
  74. void zrus_objekt(EDIT_OBJEKT ** p_obj);
  75. void kopiruj_objekt_geometrie(EDIT_OBJEKT * p_src, EDIT_OBJEKT * p_cil);
  76. EDIT_OBJEKT *vyrob_objekt(void);
  77. EDIT_OBJEKT *vyrob_objekt_komplet(int v, int f);
  78. EDIT_OBJEKT *kopiruj_objekt(EDIT_OBJEKT * p_src);
  79. EDIT_OBJEKT *slep_objekty(EDIT_OBJEKT * p_obj1, EDIT_OBJEKT * p_obj2);
  80. /*
  81. Kontejnery
  82. */
  83. EDIT_KONTEJNER *vyrob_kontejner(void);
  84. void zrus_kontejner(EDIT_KONTEJNER ** pp_kont, MLZNA_KOSTKA ** p_first);
  85. void zrus_kontejner_rec(EDIT_KONTEJNER ** pp_kont, MLZNA_KOSTKA ** p_first);
  86. void vyprazdni_kontejner(EDIT_KONTEJNER * p_kont);
  87. void updatuj_kontejner_flag(EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_mat);
  88. void updatuj_kontejner_statistika(EDIT_KONTEJNER * p_kont, int obalky);
  89. void updatuj_obalku_kontejner(EDIT_KONTEJNER * p_kont);
  90. void smaz_divoke_vertexy_kontejneru(EDIT_KONTEJNER * p_kont);
  91. void vycisti_kontejner(EDIT_KONTEJNER * p_kont);
  92. void preindexuj_kontejner(EDIT_KONTEJNER * p_kont);
  93. int slep_kontejner(EDIT_KONTEJNER * p_kont);
  94. int slep_kontejner_dist(EDIT_KONTEJNER * p_kont, float min_dist);
  95. EDIT_KONTEJNER *kopiruj_kontejner(EDIT_KONTEJNER * p_src,
  96. EDIT_MATERIAL ** p_smat, EDIT_MATERIAL ** p_dmat, int dmatnum,
  97. STATIC_LIGHT * p_slight, int slightnum, DYN_LIGHT * p_dlight, int dlightnum,
  98. EXTRA_DYN_LIGHT * p_elight, int elightnum, LENS_FLARE * p_flare,
  99. int maxflares);
  100. EDIT_KONTEJNER *kopiruj_kontejner_indir_vyber(EDIT_KONTEJNER * p_src,
  101. EDIT_KONTEJNER * p_dest, int flag);
  102. int lo_setrid_kontejner(EDIT_KONTEJNER * p_kont);
  103. void lo_setrid_kontejner_materialy(EDIT_KONTEJNER * p_kont);
  104. void kont_extra_light(EDIT_KONTEJNER * p_kont);
  105. /*
  106. Animace
  107. */
  108. void zrus_tri_vnitrek(HIERARCHY_TRACK_INFO * p_tri);
  109. void zrus_tri(HIERARCHY_TRACK_INFO ** p_trii);
  110. void key_root_zrus_rec(HIERARCHY_TRACK_INFO * p_tri);
  111. void key_root_zrus(HIERARCHY_ROOT * p_root);
  112. /*
  113. Materialy
  114. */
  115. EDIT_MATERIAL *vyrob_material(void);
  116. void zrus_material(EDIT_MATERIAL ** p_mat);
  117. EDIT_MATERIAL *kopiruj_material(EDIT_MATERIAL * p_src);
  118. EDIT_MATERIAL *kopiruj_material_indir(EDIT_MATERIAL * p_src,
  119. EDIT_MATERIAL * p_dest);
  120. int lo_pocet_materialu(EDIT_MATERIAL ** p_mat, int max);
  121. EDIT_MATERIAL *lo_najdi_material_text_point(EDIT_MATERIAL ** p_mat, int max,
  122. EDIT_TEXT * p_text);
  123. void lo_zrus_material_kont(EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_list,
  124. int num);
  125. /*
  126. Soubor
  127. */
  128. int efile(char *p_file);
  129. int efileAPAK(APAK_HANDLE * pAHandle, char *p_file);
  130. /*
  131. Meshe
  132. */
  133. GAME_MESH_OLD *kopiruj_mesh(GAME_MESH_OLD * p_src, GAME_MESH_DATA * p_data);
  134. GAME_MESH_OLD *edit_to_mesh(GAME_MESH_DATA * p_mesh_data,
  135. EDIT_KONTEJNER * p_kont, EDIT_MATERIAL ** p_mat, int max_mat,
  136. int shadow_volume);
  137. GAME_MESH_OLD *vyrob_mesh(int objektu, GAME_MESH_DATA * p_data);
  138. GAME_MESH_DATA *vyrob_mesh_data(void);
  139. GAME_MESH_DATA *kopiruj_mesh_data(GAME_MESH_DATA * p_src,
  140. GAME_MESH_OLD * p_mesh_top, GAME_MESH_DATA * p_desc);
  141. void zrus_mesh(GAME_MESH_OLD ** p_mesh);
  142. void mesh_pridej_vodavertexy(GAME_MESH_OLD * p_mesh);
  143. void mesh_pridej_vertex_array(GAME_MESH_OLD * p_mesh);
  144. /*
  145. Polylisty
  146. */
  147. void poly_pridej_vertex_array(EDIT_MESH_POLY * p_poly);
  148. EDIT_MESH_POLY *vyrob_poly(void);
  149. void zrus_poly(EDIT_MESH_POLY ** p_poly);
  150. void zrus_vnitrek_poly(EDIT_MESH_POLY * p_poly);
  151. EDIT_MESH_POLY *edit_to_poly_indir(EDIT_KONTEJNER * p_kont,
  152. EDIT_MESH_POLY * p_poly, int kID);
  153. FFILE lo_poly_file_vyrob(char *p_file, int filenum, int velikost);
  154. FFILE lo_poly_file_otevri(char *p_file, int *p_filenum, int velikost);
  155. void lo_poly_file_zavri(FFILE f);
  156. void lo_poly_uloz(FFILE f, EDIT_MESH_POLY * p_poly, EDIT_TEXT * p_light);
  157. void lo_poly_nahraj_indir(FFILE f, EDIT_MESH_POLY * p_poly,
  158. EDIT_TEXT * p_light);
  159. EDIT_MESH_POLY *lo_nahraj_poly_list(char *p_file, int *p_polynum,
  160. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum);
  161. void lo_uloz_poly_list(char *p_file, EDIT_MESH_POLY * p_poly, int polynum,
  162. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum);
  163. /*
  164. Animacni list
  165. */
  166. void lo_vyrob_animaci_list(EDIT_MATERIAL * p_mat, char *p_list,
  167. EDIT_TEXT * p_text, int max, char komplet, char *p_dir);
  168. void lo_uloz_animaci_list(EDIT_MATERIAL * p_mat, char *p_list, char *p_dir);
  169. /*
  170. Hledaci funkce
  171. */
  172. int lo_najdi_texturu(EDIT_TEXT * p_text, int max, char *p_file, int flag);
  173. int lo_najdi_volnou_texturu(EDIT_TEXT * p_text, int max);
  174. int lo_najdi_material(EDIT_MATERIAL ** p_mat, int max, char *p_text);
  175. int lo_najdi_prazdny_material(EDIT_MATERIAL ** p_mat, int max);
  176. int lo_najdi_volny_kontejner(EDIT_KONTEJNER ** p_kont, int max);
  177. int lo_najdi_volny_kontejner_up(EDIT_KONTEJNER ** p_kont, int max, int up);
  178. int lo_najdi_volny_kontejner_zpet(EDIT_KONTEJNER ** p_kont, int max);
  179. int lo_najdi_kontejner(EDIT_KONTEJNER ** p_kont, int max, char *p_jmeno);
  180. int lo_najdi_volny_objekt_kont(EDIT_KONTEJNER * p_kont);
  181. int lo_najdi_volny_mesh(GAME_MESH_OLD ** p_mesh, int max);
  182. int lo_najdi_prazdnou_animaci(ANIM_MATERIAL * p_anim, int max);
  183. void lo_zrus_animaci(ANIM_MATERIAL * p_amat);
  184. int lo_najdi_kameru(KAMERA * p_kam, int max, char *p_jmeno);
  185. int lo_najdi_volnou_kameru(KAMERA * p_kam, int max);
  186. int lo_najdi_volny_flare(LENS_FLARE * p_flare, int max);
  187. int lo_posledni_svetlo(STATIC_LIGHT * p_light, int max);
  188. int lo_najdi_objekt_kont_ID(EDIT_KONTEJNER * p_kont, int ID);
  189. EDIT_OBJEKT *lo_najdi_objekt_kont_poiter_ID(EDIT_KONTEJNER * p_kont, int ID);
  190. /*
  191. Loady
  192. */
  193. void lo_poly_calc_lightmap_face(EDIT_MESH_POLY * p_poly);
  194. EDIT_KONTEJNER *lo_nahraj_kontejner(EDIT_MATERIAL ** p_mat, int max_mat,
  195. EDIT_TEXT * p_text, int max_text, char *p_jmeno, int mat);
  196. int lo_reload_textur_dir(EDIT_TEXT * p_text, int max, char *p_dir, int save);
  197. int lo_smaz_textury(EDIT_TEXT * p_text, int max);
  198. int lo_nahraj_materialy(EDIT_MATERIAL ** p_mat, int max_mat,
  199. EDIT_TEXT * p_text, int max_text, char *p_file);
  200. int lo_uloz_material(EDIT_MATERIAL * p_mat, char *p_file, char *p_dir);
  201. int lo_uloz_materialy(EDIT_MATERIAL ** p_mat, int max_mat, char *p_file,
  202. char *p_dir);
  203. int lo_uloz_materialy_pouzite(EDIT_MATERIAL ** p_mat, int max_mat,
  204. char *p_file, char *p_dir);
  205. FFILE lo_uloz_kontejner(EDIT_MATERIAL ** p_mat, int max_mat,
  206. EDIT_KONTEJNER * p_kont_top, char *p_jmeno, int file, FFILE f);
  207. void lo_vymaz_materialy(EDIT_MATERIAL ** p_mat, int max_mat,
  208. EDIT_TEXT * p_text, int max_text);
  209. GAME_MESH_OLD *lo_nahraj_mesh(EDIT_MATERIAL ** p_mat, int max_mat,
  210. EDIT_TEXT * p_text, int max_text, char *p_file, int mat, int extra_light);
  211. int lo_najdi_objekt_kont(EDIT_KONTEJNER * p_kont, char *p_jmeno);
  212. EDIT_OBJEKT *lo_najdi_objekt_kont_poiter(EDIT_KONTEJNER * p_kont,
  213. char *p_jmeno);
  214. EDIT_MESH_POLY *lo_nahraj_poly_list(char *p_file, int *p_polynum,
  215. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum);
  216. void lo_uloz_poly_list(char *p_file, EDIT_MESH_POLY * p_poly, int polynum,
  217. EDIT_TEXT * p_light, EDIT_MATERIAL ** p_mat, int matnum);
  218. void lo_poly_flaguj_materialy(EDIT_MESH_POLY * p_poly,
  219. EDIT_MATERIAL ** p_mat);
  220. void lo_poly_oznac_zrcadlo(EDIT_MESH_POLY * p_poly);
  221. int lo_velikost_textur(EDIT_TEXT * p_text, int max);
  222. void lo_kontejner_jedinecne_jmena(EDIT_KONTEJNER * p_kont, int ds3);
  223. GAME_MESH_OLD *lo_kontejner_to_mesh(EDIT_KONTEJNER ** p_kont_top,
  224. EDIT_MATERIAL ** p_mat, int max_mat, int extra_light);
  225. int lo_reload_textur(TEXT_DIR * p_dir, EDIT_TEXT * p_text, int num, int save);
  226. int lo_reload_textur_chyby(EDIT_TEXT * p_text, int num);
  227. int lo_velikost_meshu(GAME_MESH_OLD ** p_mesh, int num, int *p_facu,
  228. int *p_vertexu);
  229. int lo_velikost_poly(EDIT_MESH_POLY * p_poly, int num, int *p_facu,
  230. int *p_vertexu);
  231. void zrus_fleky(FLEK ** p_flek);
  232. void zrus_flare(LENS_FLARE ** p_flare);
  233. int lo_najdi_volne_dsvetlo(DYN_LIGHT * p_dlight, int max);
  234. int lo_najdi_plne_dsvetlo(DYN_LIGHT * p_dlight, int max);
  235. DYN_LIGHT *lo_najdi_volne_dsvetlo_point(DYN_LIGHT * p_dlight, int max);
  236. int lo_najdi_prepocitej_dsvetlo(DYN_LIGHT * p_dlight, int max);
  237. int lo_najdi_prepocitej_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max);
  238. int lo_najdi_volne_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max);
  239. int lo_najdi_plne_extra_svetlo(EXTRA_DYN_LIGHT * p_dlight, int max);
  240. EXTRA_DYN_LIGHT *lo_najdi_volne_extra_svetlo_point(EXTRA_DYN_LIGHT * p_dlight,
  241. int max);
  242. int lo_najdi_volne_stat_svetlo(STATIC_LIGHT * p_light, int max);
  243. int lo_najdi_plne_stat_svetlo(STATIC_LIGHT * p_light, int max);
  244. LENS_FLARE *lo_flare2linear(LENS_FLARE * p_flare, int max);
  245. void lo_kontlist_jedinecne_jmena(EDIT_KONTEJNER ** p_kont, int listnum);
  246. char *cti_za_znak(char *p_string, char znak);
  247. #define smaz_face_bez_vertexu(p_face,facenum,f) \
  248. { \
  249. if(f < facenum) \
  250. memmove(p_face+f,p_face+(f+3),(facenum-f-1)*sizeof(p_face[0]));\
  251. facenum -= 3; \
  252. }
  253. #define smaz_vertex_bez_facu(p_vert,vertexnum,v)\
  254. { \
  255. if(v+1 < vertexnum) \
  256. memmove(p_vert+v,p_vert+v+1,(vertexnum-v-1)*sizeof(p_vert[0]));\
  257. vertexnum--; \
  258. }
  259. inline void mat_default_stage_bloky(EDIT_MATERIAL * p_mat)
  260. {
  261. MATERIAL_TEXT_OLD *p_stg;
  262. int i, j;
  263. p_mat->alfa_state = 0;
  264. memset(p_mat->text_state, 0, sizeof(p_mat->text_state[0]) * MAT_TEXTUR);
  265. for (i = 0; i < MAT_TEXTUR; i++) {
  266. p_stg = p_mat->text_state + i;
  267. p_stg->text_stage = !i ? 0 : K_CHYBA;
  268. for (j = 0; j < MAT_TEXTUR; j++)
  269. p_stg->textury[j] = j;
  270. /* Defaultni bump-mapping
  271. */
  272. p_stg->text_ati_bump_matrix[0] = 2.0f / 256.0f;
  273. p_stg->text_ati_bump_matrix[1] = 0.0f;
  274. p_stg->text_ati_bump_matrix[2] = 2.0f / 256.0f;
  275. p_stg->text_ati_bump_matrix[3] = 0.0f;
  276. }
  277. }
  278. /* Prevod svetel do sceny
  279. */
  280. void lo_preved_svetla_do_sceny(EDIT_KONTEJNER * p_kont,
  281. STATIC_LIGHT * p_light, int lightnum, DYN_LIGHT * p_dlist, int dlistnum,
  282. EXTRA_DYN_LIGHT * p_elist, int elistnum);
  283. void lo_kopiruj_svetla_do_sceny(EDIT_KONTEJNER * p_kont,
  284. STATIC_LIGHT * p_light, int lightnum, DYN_LIGHT * p_dlist, int dlistnum,
  285. EXTRA_DYN_LIGHT * p_elist, int elistnum, LENS_FLARE * p_flares,
  286. int maxflares);
  287. void lo_kopiruj_svetla_do_sceny_mesh(GAME_MESH_DATA * p_data,
  288. DYN_LIGHT * p_dlist, int dlistnum, EXTRA_DYN_LIGHT * p_elist, int elistnum);
  289. void lo_preved_svetla_do_sceny_mesh(GAME_MESH_DATA * p_data,
  290. DYN_LIGHT * p_dlist, int dlistnum, EXTRA_DYN_LIGHT * p_elist, int elistnum);
  291. void lo_preved_flare_do_sceny(STATIC_LIGHT * p_light,
  292. LENS_FLARE * p_flarelist, int flaremax);
  293. void lo_vymaz_svetla_ze_sceny(EDIT_KONTEJNER * p_kont);
  294. void lo_vymaz_svetla(EDIT_KONTEJNER * p_kont);
  295. void lo_vymaz_svetla_ze_sceny_mesh(GAME_MESH_DATA * p_data);
  296. void lo_vymaz_svetla_mesh(GAME_MESH_DATA * p_data);
  297. void lo_premapuj_svetla_kont(EDIT_KONTEJNER * p_src, EDIT_KONTEJNER * p_dest);
  298. void lo_premapuj_svetla_kont_mesh(EDIT_KONTEJNER * p_src,
  299. GAME_MESH_OLD * p_dest);
  300. void lo_premapuj_svetla_mesh(GAME_MESH_OLD * p_src, GAME_MESH_OLD * p_dest);
  301. void lo_transformuj_svetla_do_wordspace(EDIT_KONTEJNER * p_src);
  302. void lo_premapuj_svetla_do_wordspace(EDIT_KONTEJNER * p_src);
  303. LENS_FLARE *lo_kopiruj_flare(LENS_FLARE * p_flarelist, int max,
  304. LENS_FLARE * p_flare);
  305. int lo_najdi_objekt_kont_plny(EDIT_KONTEJNER * p_kont);
  306. void zrus_kosti_rec(JOINT ** p_joint);
  307. void zrus_kosti(EDIT_OBJEKT * p_obj);
  308. void zrus_kosti_key(JOINT_KEYS ** p_key);
  309. void zrus_kosti_prs_rec(JOINT * p_joint);
  310. int *NvConsolidateSingleFace(EXTRA_FACE * p_eface, int facenum,
  311. int *p_facevel);
  312. void NvStripToGL(EXTRA_FACE * p_face, int facenum);
  313. void oe_obj_to_strip(EDIT_OBJEKT * p_obj);
  314. void oe_kont_to_strip(EDIT_KONTEJNER * p_kont_top);
  315. int lo_reload_textur_vypis(EDIT_TEXT * p_text, int num);
  316. int lo_pocet_textur(EDIT_TEXT * p_text, int max);
  317. int lo_smaz_textury_bmp(EDIT_TEXT * p_text, int max);
  318. void lo_reload_stage(EDIT_MATERIAL ** p_mat, int num);
  319. #endif