Load_out.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /* Load/save out souboru
  2. */
  3. #include <string.h>
  4. #include <limits.h>
  5. #include "3d_all.h"
  6. int lo_nacti_word_matrix_out(FFILE f, GLMATRIX * p_mat);
  7. int lo_nahraj_objekty_out(EDIT_MATERIAL ** p_mat, int max_mat, FFILE f,
  8. EDIT_KONTEJNER * p_kont, int mat);
  9. typedef struct _KONTEJNER_KONFIG
  10. {
  11. dword flag; // flagy konteneru
  12. BOD zrcadlo[4]; // 4 body zrcadla
  13. char rezerved[52];
  14. } KONTEJNER_KONFIG;
  15. typedef struct _KONTEJNER_KONFIG_OLD
  16. {
  17. char flag; // flagy konteneru
  18. char rezerved[2000];
  19. } KONTEJNER_KONFIG_OLD;
  20. typedef struct _GENERIC_HEAD
  21. { //typicka hlavicka
  22. char h[4]; //flag (VVVV,FFFF,MMMM)
  23. word pocet; //pocet elementu
  24. } GENERIC_HEAD;
  25. int lo_je_tag(FFILE f, char *p_tag)
  26. {
  27. long t = fftell(f);
  28. char string[10];
  29. ffgets(string, 5, f);
  30. string[4] = 0;
  31. if (strcmp(string, p_tag) != 0) {
  32. ffseek(f, t, SEEK_SET);
  33. return ((int) NULL);
  34. }
  35. return (TRUE);
  36. }
  37. int lo_nahraj_konfiguraci_kontejneru_out(FFILE f, EDIT_KONTEJNER * p_kont)
  38. {
  39. KONTEJNER_KONFIG kkonf;
  40. KONTEJNER_KONFIG_OLD kkonf_old;
  41. if (lo_je_tag(f, KONFIG_TAG)) { // nacti nove info
  42. ffread(&kkonf, sizeof(kkonf), 1, f);
  43. p_kont->m1flag = kkonf.flag & 0xffff;
  44. p_kont->kflag = kkonf.flag & 0xffff0000;
  45. return (TRUE);
  46. }
  47. else if (lo_je_tag(f, KONFIG_TAG_OLD)) { // nacti stare info
  48. ffread(&kkonf_old, sizeof(kkonf_old), 1, f);
  49. p_kont->m1flag |= kkonf_old.flag ? MAT_PRUHLEDNY : 0;
  50. return (TRUE);
  51. }
  52. else
  53. return (FALSE);
  54. }
  55. int lo_nacti_word_matrix_out(FFILE f, GLMATRIX * p_mat)
  56. {
  57. GENERIC_HEAD head;
  58. int t = fftell(f);
  59. if (!ffread(&head, sizeof(head), 1, f)) {
  60. ffseek(f, t, SEEK_SET);
  61. return (FALSE);
  62. }
  63. if (head.h[0] != 'W' || head.h[1] != 'W' || head.h[2] != 'W'
  64. || head.h[3] != 'W') {
  65. ffseek(f, t, SEEK_SET);
  66. return (FALSE);
  67. }
  68. if (!ffread(p_mat, sizeof(GLMATRIX), 1, f)) {
  69. ffseek(f, t, SEEK_SET);
  70. return (FALSE);
  71. }
  72. return (TRUE);
  73. }
  74. void nahraj_texturu_fc(FFILE f, EDIT_MATERIAL * p_mat, EDIT_TEXT * p_text,
  75. int max, int cislo_text, int save)
  76. {
  77. OLD_MULTITEXT_FLAG mt;
  78. char string[100];
  79. int t;
  80. if (lo_je_tag(f, TEXT_TAG)) {
  81. str_read(string, f);
  82. strlwr(string);
  83. if (!strcmp(string, S_NIC)) {
  84. p_mat->p_text[cislo_text] = NULL;
  85. p_mat->textfile[cislo_text][0] = 0;
  86. }
  87. else {
  88. if (save) {
  89. if ((t = lo_najdi_texturu(p_text, max, string, FALSE)) == K_CHYBA) {
  90. if ((t = lo_najdi_volnou_texturu(p_text, max)) == K_CHYBA)
  91. chyba("Textury");
  92. strcpy(p_text[t].jmeno, string);
  93. }
  94. p_mat->p_text[cislo_text] = p_text + t;
  95. strcpy(p_mat->textfile[cislo_text], string);
  96. }
  97. }
  98. }
  99. if (lo_je_tag(f, MULTI_TAG))
  100. ffread(&mt, sizeof(mt), 1, f);
  101. }
  102. EDIT_MATERIAL *lo_nahraj_material_out(FFILE f, EDIT_TEXT * p_text, int max,
  103. int save)
  104. {
  105. EDIT_MATERIAL *p_mat;
  106. MATERIAL *p_dxmat;
  107. OLD_MULTITEXT_FLAG mt;
  108. char string[50];
  109. dword tmp;
  110. int i = 0;
  111. if (!lo_je_tag(f, MTRL_TAG))
  112. return (NULL);
  113. else {
  114. p_mat = vyrob_material();
  115. str_read(p_mat->jmeno, f);
  116. }
  117. ffread(string, sizeof(char), 9, f);
  118. // nacteni grb
  119. if (save) {
  120. p_dxmat = &p_mat->dxmat;
  121. p_dxmat->ambient_r = (float) string[0] / MAX_BYTE;
  122. p_dxmat->ambient_g = (float) string[1] / MAX_BYTE;
  123. p_dxmat->ambient_b = (float) string[2] / MAX_BYTE;
  124. p_dxmat->diffuse_r = (string[3]) ? ((float) string[3]) / MAX_BYTE : 1.0f;
  125. p_dxmat->diffuse_g = (string[4]) ? ((float) string[4]) / MAX_BYTE : 1.0f;
  126. p_dxmat->diffuse_b = (string[5]) ? ((float) string[4]) / MAX_BYTE : 1.0f;
  127. p_dxmat->diffuse_a = 1.0f;
  128. p_dxmat->specular_r = (float) string[6] / MAX_BYTE;
  129. p_dxmat->specular_g = (float) string[7] / MAX_BYTE;
  130. p_dxmat->specular_b = (float) string[8] / MAX_BYTE;
  131. p_dxmat->faktor_r = 1.0f;
  132. p_dxmat->faktor_g = 1.0f;
  133. p_dxmat->faktor_b = 1.0f;
  134. p_dxmat->faktor_a = 1.0f;
  135. }
  136. // nacte soubor s animacema
  137. if (lo_je_tag(f, MATANIM_TAG)) {
  138. str_read(p_mat->anim.jmeno, f);
  139. //lo_vyrob_animaci_list(p_mat,p_mat->anim.jmeno,p_text,max,ANIM_LOAD_ALL);
  140. }
  141. // nacte alfa tag
  142. if (lo_je_tag(f, FAKTOR_TAG)) {
  143. ffread(&tmp, sizeof(dword), 1, f);
  144. }
  145. // Nacte stage blok
  146. if (lo_je_tag(f, STAG_TAG)) {
  147. ffread(string, sizeof(char), 1, f);
  148. ffread(&tmp, sizeof(dword), 1, f);
  149. ffread(&tmp, sizeof(dword), 1, f);
  150. p_mat->alfa_state = 0;
  151. p_mat->text_state[0].text_stage = 0;
  152. p_mat->text_state[1].text_stage = 0;
  153. }
  154. // nacteni nuloveho blendu
  155. if (lo_je_tag(f, MULTI_TAG))
  156. ffread(&mt, sizeof(mt), 1, f);
  157. nahraj_texturu_fc(f, p_mat, p_text, max, 0, save);
  158. nahraj_texturu_fc(f, p_mat, p_text, max, 1, save);
  159. nahraj_texturu_fc(f, p_mat, p_text, max, 1, save);
  160. strlwr(p_mat->jmeno);
  161. if (save)
  162. return (p_mat);
  163. else {
  164. zrus_material(&p_mat);
  165. return ((EDIT_MATERIAL *) 1);
  166. }
  167. }
  168. int lo_nahraj_materialy_out(EDIT_MATERIAL ** p_mat, int max_mat,
  169. EDIT_TEXT * p_text, int max_text, FFILE f, int save)
  170. {
  171. EDIT_MATERIAL *p_tmp;
  172. int i = 0;
  173. int m, nm;
  174. while (1) {
  175. if (save) {
  176. if ((m = lo_najdi_prazdny_material(p_mat, max_mat)) == K_CHYBA)
  177. chyba("Malo materialu!");
  178. }
  179. p_tmp = lo_nahraj_material_out(f, p_text, max_text, save);
  180. if (!p_tmp) {
  181. break;
  182. }
  183. if (save) {
  184. if ((nm = lo_najdi_material(p_mat, max_mat, p_tmp->jmeno)) == K_CHYBA)
  185. p_mat[m] = p_tmp;
  186. else {
  187. /* Nahravany material byl nalezen na pozici nm
  188. */
  189. if (hlasit_kolize) {
  190. ddw("Kolize materialu - krizi se materialy %d \"%s\" a %d \"%s\"!",
  191. m, p_tmp->jmeno, nm, p_mat[nm]->jmeno);
  192. //p_mat[nm] - puvodni material
  193. //doe_cti_jmeno(NULL,p_mat[nm]->jmeno);
  194. //}
  195. }
  196. zrus_material(&p_tmp);
  197. }
  198. }
  199. i++;
  200. }
  201. return (i);
  202. }
  203. int lo_nahraj_materialy_out_jmeno(EDIT_MATERIAL ** p_mat, int max_mat,
  204. EDIT_TEXT * p_text, int max_text, char *p_file, int save)
  205. {
  206. EDIT_KONTEJNER *p_kont = NULL;
  207. FFILE f;
  208. if ((f = ffopen(p_file, "rb")) == NULL) {
  209. //ddw("Chyba nahrani materialu %s chyba '%s'",p_file,strerror(errno));
  210. return (FALSE);
  211. }
  212. p_kont = vyrob_kontejner();
  213. lo_nahraj_konfiguraci_kontejneru_out(f, p_kont);
  214. lo_nacti_word_matrix_out(f, &p_kont->world);
  215. lo_nahraj_materialy_out(p_mat, max_mat, p_text, max_text, f, save);
  216. ffclose(f);
  217. // neni treba premapovat svetla
  218. zrus_kontejner_rec(&p_kont, NULL);
  219. return (TRUE);
  220. }
  221. int lo_nacti_vertexlist_out(FFILE f, OBJEKT_BOD ** p_vert)
  222. {
  223. GENERIC_HEAD head;
  224. long t = fftell(f);
  225. float v[3];
  226. int i;
  227. if (*p_vert != NULL) {
  228. return ((int) NULL);
  229. }
  230. if (!ffread(&head, sizeof(head), 1, f)) {
  231. ffseek(f, t, SEEK_SET);
  232. return ((int) NULL);
  233. }
  234. if ((head.h[0] != 'V') ||
  235. (head.h[1] != 'V') || (head.h[2] != 'V') || (head.h[3] != 'V')) {
  236. ffseek(f, t, SEEK_SET);
  237. return ((int) NULL);
  238. }
  239. if ((*p_vert =
  240. (OBJEKT_BOD *) mmalloc(sizeof(OBJEKT_BOD) * head.pocet)) == NULL) {
  241. chyba("Nedostatek pameti...");
  242. }
  243. memset(*p_vert, 0, sizeof(OBJEKT_BOD) * head.pocet);
  244. for (i = 0; i < head.pocet; i++) {
  245. if (!ffread(&v, sizeof(v), 1, f)) {
  246. ffseek(f, t, SEEK_SET);
  247. null_free((void **) p_vert);
  248. return ((int) NULL);
  249. }
  250. (*p_vert)[i].x = v[0];
  251. (*p_vert)[i].y = v[1];
  252. (*p_vert)[i].z = v[2];
  253. (*p_vert)[i].dr = (*p_vert)[i].dg = (*p_vert)[i].db = 1.0f;
  254. }
  255. return (head.pocet);
  256. }
  257. int lo_nacti_maplist_out(FFILE f, OBJEKT_BOD ** p_vert, int c_text)
  258. {
  259. GENERIC_HEAD head;
  260. long t = fftell(f);
  261. float *p_map;
  262. float m[2];
  263. int i;
  264. if (*p_vert == NULL)
  265. return ((int) NULL);
  266. if (!ffread(&head, sizeof(head), 1, f)) {
  267. ffseek(f, t, SEEK_SET);
  268. return ((int) NULL);
  269. }
  270. if ((head.h[0] != 'M') ||
  271. (head.h[1] != 'M') || (head.h[2] != 'M') || (head.h[3] != 'M')) {
  272. ffseek(f, t, SEEK_SET);
  273. return ((int) NULL);
  274. }
  275. if (c_text >= 2) {
  276. c_text = 1;
  277. }
  278. for (i = 0; i < head.pocet; i++) {
  279. if (!ffread(&m, sizeof(m), 1, f)) {
  280. ffseek(f, t, SEEK_SET);
  281. return ((int) NULL);
  282. }
  283. p_map = &(*p_vert)[i].tu1;
  284. p_map[0 + c_text * 2] = m[0];
  285. p_map[1 + c_text * 2] = -m[1];
  286. }
  287. return (head.pocet);
  288. }
  289. int lo_nacti_facelist_out(FFILE f, FACE ** p_face)
  290. {
  291. GENERIC_HEAD head;
  292. long t = fftell(f);
  293. if (*p_face != NULL)
  294. return ((int) NULL);
  295. if (!ffread(&head, sizeof(head), 1, f)) {
  296. ffseek(f, t, SEEK_SET);
  297. return ((int) NULL);
  298. }
  299. if ((head.h[0] != 'F') ||
  300. (head.h[1] != 'F') || (head.h[2] != 'F') || (head.h[3] != 'F')) {
  301. ffseek(f, t, SEEK_SET);
  302. return ((int) NULL);
  303. }
  304. head.pocet *= 3;
  305. if (!head.pocet)
  306. chyba("load facelist -> 0 facu !");
  307. if ((*p_face = (FACE *) mmalloc(sizeof(FACE) * head.pocet)) == NULL) {
  308. chyba("Nedostatek pameti...");
  309. }
  310. if (!ffread(*p_face, sizeof(FACE), head.pocet, f)) {
  311. null_free((void **) p_face);
  312. ffseek(f, t, SEEK_SET);
  313. return ((int) NULL);
  314. }
  315. return (head.pocet);
  316. }
  317. int lo_nacti_barvy_out(FFILE f, OBJ_VERTEX * p_vert, word pocet)
  318. {
  319. GENERIC_HEAD head;
  320. dword barva;
  321. long t = fftell(f);
  322. int i;
  323. if (p_vert == NULL)
  324. return (FALSE);
  325. for (i = 0; i < pocet; i++) {
  326. p_vert[i].dr = p_vert[i].dg = p_vert[i].db = 1.0f;
  327. }
  328. if (!ffread(&head, sizeof(head), 1, f)) {
  329. ffseek(f, t, SEEK_SET);
  330. return (FALSE);
  331. }
  332. if ((head.h[0] != 'D') ||
  333. (head.h[1] != 'D') || (head.h[2] != 'D') || (head.h[3] != 'D')) {
  334. ffseek(f, t, SEEK_SET);
  335. return (FALSE);
  336. }
  337. for (i = 0; i < head.pocet; i++) {
  338. if (!ffread(&barva, sizeof(dword), 1, f)) {
  339. ffseek(f, t, SEEK_SET);
  340. return (FALSE);
  341. }
  342. else {
  343. rgb_float(barva, &p_vert[i].dr);
  344. }
  345. }
  346. return (head.pocet);
  347. }
  348. EDIT_OBJEKT *lo_nacti_vec_FILE_out(FFILE f)
  349. {
  350. EDIT_OBJEKT *p_obj = vyrob_objekt();
  351. int i = 0;
  352. if ((p_obj->vertexnum =
  353. lo_nacti_vertexlist_out(f, &p_obj->p_vertex)) == (int) NULL) {
  354. zrus_objekt(&p_obj);
  355. ffclose(f);
  356. return (NULL);
  357. }
  358. while (lo_nacti_maplist_out(f, &p_obj->p_vertex, i++));
  359. if ((p_obj->facenum =
  360. lo_nacti_facelist_out(f, &p_obj->p_face)) == (int) NULL) {
  361. zrus_objekt(&p_obj);
  362. ffclose(f);
  363. return (NULL);
  364. }
  365. lo_nacti_barvy_out(f, p_obj->p_vertex, p_obj->vertexnum);
  366. return (p_obj);
  367. }
  368. EDIT_OBJEKT *lo_nacti_vec_out(char *p_filename)
  369. {
  370. EDIT_OBJEKT *p_obj;
  371. FFILE f;
  372. if ((f = ffopen(p_filename, "rb")) == NULL)
  373. return (NULL);
  374. p_obj = lo_nacti_vec_FILE_out(f);
  375. ffclose(f);
  376. return (p_obj);
  377. }
  378. int lo_nahraj_objekty_out(EDIT_MATERIAL ** p_mat, int max_mat, FFILE f,
  379. EDIT_KONTEJNER * p_kont, int mat)
  380. {
  381. char string[50];
  382. int i, j, k;
  383. word r1;
  384. for (i = 0; i < p_kont->max_objektu; i++) {
  385. if (!lo_je_tag(f, "JMOB"))
  386. break;
  387. else
  388. str_read(string, f);
  389. if (!lo_je_tag(f, "TMSH"))
  390. continue; //je to objekt ale neni to mes
  391. if ((p_kont->p_obj[i] = lo_nacti_vec_FILE_out(f)) == NULL)
  392. chyba("Nacitani objektu...");
  393. strcpy(p_kont->p_obj[i]->jmeno, string);
  394. for (k = 0; k < 2; k++) {
  395. //nactenej jeden objekt - pricist jeste material
  396. if (!lo_je_tag(f, "FMAT")) {
  397. break; // neni material - na dalsi objekt
  398. }
  399. else
  400. str_read(string, f);
  401. if (mat) {
  402. if (!k) {
  403. if (!strcasecmp(string, S_NIC)) {
  404. p_kont->p_obj[i]->material = 0;
  405. p_kont->p_obj[i]->m1flag = 0;
  406. p_kont->p_obj[i]->m2flag = 0;
  407. p_kont->p_obj[i]->oflag = 0;
  408. }
  409. else {
  410. for (j = 0; j < max_mat; j++) {
  411. if (p_mat[j] && !strcasecmp(string, p_mat[j]->jmeno)) {
  412. p_kont->p_obj[i]->material = (word) j;
  413. p_kont->p_obj[i]->m1flag = p_mat[j]->flag;
  414. p_kont->p_obj[i]->m2flag = p_mat[j]->flag2;
  415. break;
  416. }
  417. }
  418. if (j == max_mat) {
  419. ddw("Neznamy material '%s' v objektu '%s'", string,
  420. p_kont->p_obj[i]->jmeno);
  421. p_kont->p_obj[i]->material = 0;
  422. p_kont->p_obj[i]->m1flag = 0;
  423. p_kont->p_obj[i]->m2flag = 0;
  424. }
  425. }
  426. }
  427. }
  428. else {
  429. p_kont->p_obj[i]->material = 0;
  430. p_kont->p_obj[i]->m1flag = 0;
  431. p_kont->p_obj[i]->m2flag = 0;
  432. }
  433. }
  434. if (lo_je_tag(f, "RECT")) { // sou tam recy
  435. ffread(&r1, sizeof(word), 1, f);
  436. ffread(&r1, sizeof(word), 1, f);
  437. }
  438. }
  439. return (i);
  440. }
  441. EDIT_KONTEJNER *lo_nahraj_kontejner_out(EDIT_MATERIAL ** p_mat, int max_mat,
  442. EDIT_TEXT * p_text, int max_text, char *p_jmeno, int mat)
  443. {
  444. EDIT_KONTEJNER *p_kont = NULL;
  445. FFILE f;
  446. int i = 0;
  447. p_kont = vyrob_kontejner();
  448. if ((f = ffopen(p_jmeno, "rb")) == NULL) {
  449. /*
  450. if(TVRDE_CHYBY)
  451. tiskni_chybu(__LINE__,__FILE__,NULL,"Chyba '%s' file '%s'",strerror(errno),p_jmeno);
  452. else {
  453. ddw("Chyba nahrani kontejneru %s chyba '%s'",p_jmeno,strerror(errno));
  454. return(NULL);
  455. }
  456. */
  457. return (NULL);
  458. }
  459. lo_nahraj_konfiguraci_kontejneru_out(f, p_kont);
  460. lo_nacti_word_matrix_out(f, &p_kont->world);
  461. lo_nahraj_materialy_out(p_mat, max_mat, p_text, max_text, f, mat);
  462. i = lo_nahraj_objekty_out(p_mat, max_mat, f, p_kont, mat);
  463. ffclose(f);
  464. if (i)
  465. updatuj_kontejner_statistika(p_kont, FALSE);
  466. return (p_kont);
  467. }