Berusky3d_kamery.cpp 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489
  1. /*
  2. berusky3d_animace.c
  3. Animacni modul k beruskam II
  4. posuny objektu
  5. kyframe animace objektu
  6. animacni hierachie
  7. */
  8. #include <stdio.h>
  9. #include <math.h>
  10. #include <assert.h>
  11. #include "3d_all.h"
  12. #include "Object.h"
  13. #include "Berusky_universal.h"
  14. #include "Berusky3d_castice.h"
  15. #include "Berusky3d.h"
  16. #include "Berusky3d_ini.h"
  17. #include "Berusky3d_load.h"
  18. #include "Berusky3d_render.h"
  19. #include "Berusky3d_animace.h"
  20. #include "Berusky3d_kofola_interface.h"
  21. #include "Berusky3d_kamery.h"
  22. extern G_KONFIG ber, *p_ber;
  23. inline int bod_mezi(BOD * p, BOD * t, BOD * i)
  24. {
  25. BOD t1, i1;
  26. float vt1, vt2, vi1;
  27. vektor_sub(t, p, &t1);
  28. vektor_sub(i, p, &i1);
  29. vt1 = vektor_velikost(&t1);
  30. vektor_add(&t1, &i1, &i1);
  31. vektor_add(&t1, &t1, &t1);
  32. vt2 = vektor_velikost(&t1);
  33. vi1 = vektor_velikost(&i1);
  34. return (vi1 > vt1 && vi1 < vt2);
  35. }
  36. #define PRUHL_ALFA 0.35f
  37. void ber_kamera_zpruhledni_mesh(GAME_MESH_OLD * p_mesh, BOD * p_cam,
  38. BOD * p_stred)
  39. {
  40. BODRGBA *p_d, *p_dm;
  41. OBB_OLD *p_obb;
  42. int v, vn, o, in;
  43. int pruhlednych;
  44. BOD dir;
  45. vektor_sub(p_stred, p_cam, &dir);
  46. in = obb_intersect_line_dist(&p_mesh->obb_world, p_cam, &dir);
  47. if (in) {
  48. p_mesh->p_data->kflag |= KONT_DRAW_CAMERA;
  49. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  50. p_d = p_mesh->p_vertex_diff;
  51. p_dm = p_mesh->p_vertex_diff_material;
  52. p_obb = p_mesh->p_obb_world;
  53. pruhlednych = 0;
  54. for (o = 0; o < p_mesh->objektu; o++, p_obb++) {
  55. vn = p_mesh->objektnum[o];
  56. in = obb_intersect_line_dist(p_obb, p_cam, &dir);
  57. if (in && intersect_mesh_objekt(p_mesh, o, p_cam, &dir)) {
  58. pruhlednych++;
  59. for (v = 0; v < vn; v++, p_d++, p_dm++) {
  60. if (p_d->a > PRUHL_ALFA)
  61. p_d->a = PRUHL_ALFA;
  62. }
  63. }
  64. else {
  65. for (v = 0; v < vn; v++, p_d++, p_dm++) {
  66. p_d->a = p_dm->a;
  67. }
  68. }
  69. }
  70. if (!pruhlednych) { // Zrus pruhlednost - neni pruhledny zadny
  71. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  72. }
  73. }
  74. else {
  75. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  76. if (p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  77. || p_mesh->p_data->m2flag & MAT2_MASKA) {
  78. ber_reset_mesh(p_mesh->p_vertex_diff, p_mesh->p_vertex_diff_material,
  79. p_mesh->vertexnum);
  80. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  81. }
  82. }
  83. }
  84. void ber_kamera_zpruhledni_poly(EDIT_MESH_POLY * p_poly, BOD * p_cam,
  85. BOD * p_stred)
  86. {
  87. TEXT_KOORD *p_koord;
  88. BOD dir;
  89. int v, in;
  90. vektor_sub(p_stred, p_cam, &dir);
  91. in = obb_intersect_line_dist(&p_poly->obb, p_cam, &dir);
  92. if (in && intersect_poly(p_poly, p_cam, &dir)) {
  93. p_poly->kflag |= (KONT_UPLOAD | KONT_DRAW_CAMERA);
  94. p_koord = p_poly->p_koord;
  95. for (v = 0; v < p_poly->facenum; v++, p_koord++) {
  96. if (p_koord->da > PRUHL_ALFA)
  97. p_koord->da = PRUHL_ALFA;
  98. }
  99. }
  100. else {
  101. p_poly->kflag &= ~KONT_DRAW_CAMERA;
  102. if (p_poly->m1flag & MAT_PRUHLEDNY || p_poly->m2flag & MAT2_MASKA) {
  103. ber_reset_poly(p_poly->p_koord, p_poly->facenum);
  104. p_poly->k2flag |= KONT_UPLOAD;
  105. }
  106. }
  107. }
  108. /* viditelny objekt/poly
  109. pokud je kamera do nej kamera zariznuta
  110. pokud je na primce stred kamery/stred levelu
  111. */
  112. void ber_kamera_zpruhledni_objekty(G_KONFIG * p_ber)
  113. {
  114. EDIT_MESH_POLY *p_poly;
  115. GAME_MESH_OLD *p_mesh;
  116. GLMATRIX *p_inv = p_ber->p_invcam;
  117. int mh;
  118. static BOD lt(FLT_MAX, FLT_MAX, FLT_MAX);
  119. BOD t, p;
  120. int pohyb_kamery = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  121. if (!p_ber->conf_zpruhlednovac)
  122. return;
  123. mh = gl_Get_Active_Beetle_Mesh();
  124. if (mh == K_CHYBA)
  125. return;
  126. t.x = p_ber->p_prv_lev[mh]->x;
  127. t.y = p_ber->p_prv_lev[mh]->y;
  128. t.z = p_ber->p_prv_lev[mh]->z;
  129. if (lt.x != t.x || lt.y != t.y || lt.z != t.z) {
  130. lt.x = t.x;
  131. lt.y = t.y;
  132. lt.z = t.z;
  133. pohyb_kamery = TRUE;
  134. }
  135. p.x = p_inv->_41;
  136. p.y = p_inv->_42;
  137. p.z = p_inv->_43;
  138. /* Projedu seznam viditelnych meshu
  139. */
  140. ber_mesh_render_list_reset(p_ber);
  141. while ((p_mesh =
  142. ber_mesh_render_list_next_flag(p_ber, KONT_VIDITELNY, KONT_PRVEK))) {
  143. if (p_mesh->p_vertex_diff && (pohyb_kamery
  144. || p_mesh->p_data->kflag & KONT_POHYB))
  145. ber_kamera_zpruhledni_mesh(p_mesh, &p, &t);
  146. }
  147. /* Projedu seznam viditelnych poly
  148. */
  149. if (pohyb_kamery) {
  150. ber_poly_render_list_reset(p_ber);
  151. while ((p_poly =
  152. ber_poly_render_list_next_flag(p_ber, KONT_VIDITELNY, KONT_PRVEK))) {
  153. ber_kamera_zpruhledni_poly(p_poly, &p, &t);
  154. }
  155. }
  156. }
  157. void ber_kamera_zpruhledni_objekty_reset(G_KONFIG * p_ber)
  158. {
  159. EDIT_MESH_POLY *p_poly;
  160. GAME_MESH_OLD *p_mesh;
  161. int i, kflag;
  162. for (i = 0; i < p_ber->meshnum; i++) {
  163. p_mesh = p_ber->p_mesh[i];
  164. if (p_mesh && !(p_mesh->p_data->kflag & KONT_PRVEK)) {
  165. if ((p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  166. || p_mesh->p_data->m2flag & MAT2_MASKA) && p_mesh->p_vertex_diff) {
  167. ber_reset_mesh(p_mesh->p_vertex_diff, p_mesh->p_vertex_diff_material,
  168. p_mesh->vertexnum);
  169. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  170. }
  171. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  172. }
  173. }
  174. p_poly = p_ber->p_poly;
  175. for (i = 0; i < p_ber->polynum; i++) {
  176. kflag = p_poly->kflag;
  177. if (!(kflag & KONT_PRVEK) && (kflag & KONT_DRAW_CAMERA)) {
  178. if (p_poly->m1flag & MAT_PRUHLEDNY || p_poly->m2flag & MAT2_MASKA) {
  179. ber_reset_poly(p_poly->p_koord, p_poly->facenum);
  180. p_poly->kflag |= KONT_UPLOAD;
  181. }
  182. p_poly->kflag &= ~KONT_DRAW_CAMERA;
  183. }
  184. p_poly++;
  185. }
  186. }
  187. int ber_kamera_korekce_vzdalenosti(G_KONFIG * p_ber, int korekce,
  188. int korekce_vzdal)
  189. {
  190. NASTAVENI_KAMER *p_kam = &p_ber->kam;
  191. BOD p, pos;
  192. GLMATRIX *p_cam = p_ber->p_camera, *p_invcam = p_ber->p_invcam;
  193. float t;
  194. calc_camera_bod(p_cam, p_invcam, p_ber->p_target, *p_ber->p_vzdal,
  195. *p_ber->p_fi, *p_ber->p_rfi);
  196. p_ber->kamera.zmena = TRUE;
  197. /* bez korekce - nic nedelej, prdime na to
  198. */
  199. if (!korekce) {
  200. *p_ber->p_vzdal_kor = *p_ber->p_vzdal;
  201. set_matrix_camera(p_cam);
  202. set_matrix_camera_project(p_ber->p_project);
  203. return (FALSE);
  204. }
  205. else {
  206. /* je kamera v orezavaci kostce || je uplne mimo - kaslu na to
  207. */
  208. if (kd_je_bod_v_kostce((BOD *) & (p_invcam->_41), &p_kam->min,
  209. &p_kam->max)
  210. || !kd_je_bod_v_kostce(p_ber->p_target, &p_kam->min, &p_kam->max)) {
  211. if (p_ber->kam.min_vzdal > *p_ber->p_vzdal) {
  212. *p_ber->p_vzdal_kor = p_ber->kam.min_vzdal;
  213. calc_camera_bod(p_cam, p_invcam, p_ber->p_target, *p_ber->p_vzdal_kor,
  214. *p_ber->p_fi, *p_ber->p_rfi);
  215. }
  216. else {
  217. *p_ber->p_vzdal_kor = *p_ber->p_vzdal;
  218. }
  219. set_matrix_camera(p_cam);
  220. set_matrix_camera_project(p_ber->p_project);
  221. return (TRUE);
  222. }
  223. else {
  224. /* kamera ma target v kostce a je mimo kostku - provedu korekci
  225. */
  226. polar2kar(*p_ber->p_rfi, *p_ber->p_fi, *p_ber->p_vzdal, &pos);
  227. pos.x += p_ber->p_target->x;
  228. pos.y += p_ber->p_target->y;
  229. pos.z += p_ber->p_target->z;
  230. kd_intersect_kostku_bod_inter(p_ber->p_target, &pos, &p_kam->min,
  231. &p_kam->max, &p, &t);
  232. t = vzdal_bodu_bod(p_ber->p_target, &p) + p_ber->kam.near_plane;
  233. // vyberu ten blizsi bod
  234. *p_ber->p_vzdal_kor = (t > *p_ber->p_vzdal) ? *p_ber->p_vzdal : t;
  235. // pokud je to bliz nez povolena vzdalenost
  236. if (p_ber->kam.min_vzdal > *p_ber->p_vzdal_kor)
  237. *p_ber->p_vzdal_kor = p_ber->kam.min_vzdal;
  238. if (korekce_vzdal) {
  239. *p_ber->p_vzdal = *p_ber->p_vzdal_kor;
  240. }
  241. calc_camera_bod(p_cam, p_invcam, p_ber->p_target, *p_ber->p_vzdal_kor,
  242. *p_ber->p_fi, *p_ber->p_rfi);
  243. set_matrix_camera(p_cam);
  244. set_matrix_camera_project(p_ber->p_project);
  245. return (TRUE);
  246. }
  247. }
  248. }
  249. // kartezske souradnice -> polarni souradnice
  250. // prepocita kameru z jednoho modu do druheho
  251. inline void kam_set_mod(int mod)
  252. {
  253. BOD p;
  254. // Behem animace se neda nahazovat mod kamery
  255. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE)
  256. return;
  257. // mod uz je nahozenej
  258. if (mod == (p_ber->kamera.aktivni & 0x3))
  259. return;
  260. // 3ds->polarni
  261. if (p_ber->kamera.aktivni & GAME_KAMERA_3DS) {
  262. p_ber->kamera.aktivni &= (~0x3);
  263. p_ber->kamera.aktivni |= GAME_KAMERA_POLAR;
  264. p.x = p_ber->kamera.p.x - p_ber->kamera.t.x;
  265. p.y = p_ber->kamera.p.y - p_ber->kamera.t.y;
  266. p.z = p_ber->kamera.p.z - p_ber->kamera.t.z;
  267. kar2polar(&p, &p_ber->kamera.r, &p_ber->kamera.fi, &p_ber->kamera.vzdal);
  268. }
  269. else {
  270. // polarni->3ds
  271. p_ber->kamera.aktivni &= (~0x3);
  272. p_ber->kamera.aktivni |= GAME_KAMERA_3DS;
  273. p_ber->kamera.r = normalizuj_uhel(p_ber->kamera.r);
  274. polar2kar(p_ber->kamera.r, p_ber->kamera.fi, p_ber->kamera.vzdal,
  275. &p_ber->kamera.p);
  276. p_ber->kamera.p.x += p_ber->kamera.t.x;
  277. p_ber->kamera.p.y += p_ber->kamera.t.y;
  278. p_ber->kamera.p.z += p_ber->kamera.t.z;
  279. }
  280. }
  281. void kam_set_mod_param(int mod)
  282. {
  283. kam_set_mod(mod);
  284. }
  285. void kam_set_mod_3ds(void)
  286. {
  287. kam_set_mod(GAME_KAMERA_3DS);
  288. }
  289. void kam_set_mod_polar(void)
  290. {
  291. kam_set_mod(GAME_KAMERA_POLAR);
  292. }
  293. int kam_get_mod(void)
  294. {
  295. return (p_ber->kamera.aktivni & 0x3);
  296. }
  297. /* Nastavi kameru
  298. */
  299. int kam_pol_set(BOD * p_p, float r, float fi, float vzdal, int korekce)
  300. {
  301. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE &&
  302. (*p_ber->p_mod) & GAME_KAMERA_3DS)
  303. return (K_CHYBA);
  304. if ((*p_ber->p_mod) & GAME_KAMERA_3DS)
  305. kam_set_mod(GAME_KAMERA_POLAR);
  306. *p_ber->p_target = *p_p;
  307. *p_ber->p_rfi = DEG2RAD(r);
  308. *p_ber->p_fi = DEG2RAD(fi);
  309. *p_ber->p_vzdal = vzdal;
  310. ber_kamera_korekce_vzdalenosti(p_ber, p_ber->kam_omezeni, FALSE);
  311. p_ber->kamera.zmena = TRUE;
  312. return (TRUE);
  313. }
  314. /* Pricte vlozene hodnoty ke stavajicim
  315. */
  316. int kam_pol_add(BOD * p_p, float r, float fi, float vzdal, int korekce)
  317. {
  318. if ((*p_ber->p_mod) & GAME_KAMERA_3DS)
  319. kam_set_mod(GAME_KAMERA_POLAR);
  320. p_ber->p_target->x += p_p->x;
  321. p_ber->p_target->y += p_p->y;
  322. p_ber->p_target->z += p_p->z;
  323. *p_ber->p_rfi += DEG2RAD(r);
  324. *p_ber->p_fi += DEG2RAD(fi);
  325. *p_ber->p_vzdal += vzdal;
  326. ber_kamera_korekce_vzdalenosti(p_ber, korekce, FALSE);
  327. p_ber->kamera.zmena = TRUE;
  328. return (TRUE);
  329. }
  330. /* Cte nastaveni kamery
  331. */
  332. int kam_pol_get(BOD * p_p, float *p_r, float *p_fi, float *p_vzdal)
  333. {
  334. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE &&
  335. (*p_ber->p_mod) & GAME_KAMERA_3DS)
  336. return (K_CHYBA);
  337. if ((*p_ber->p_mod) & GAME_KAMERA_3DS)
  338. kam_set_mod(GAME_KAMERA_POLAR);
  339. *p_p = *p_ber->p_target;
  340. *p_r = RAD2DEG(*p_ber->p_rfi);
  341. *p_fi = RAD2DEG(*p_ber->p_fi);
  342. *p_vzdal = *p_ber->p_vzdal_kor;
  343. return (TRUE);
  344. }
  345. /* Cte aktualni smer pozici kamery
  346. */
  347. void kam_get_float(float *p_body)
  348. {
  349. p_body[0] = p_ber->p_invcam->_13; // vektor Z
  350. p_body[1] = p_ber->p_invcam->_23;
  351. p_body[2] = p_ber->p_invcam->_33;
  352. p_body[3] = p_ber->p_invcam->_12; // vektor Y
  353. p_body[4] = p_ber->p_invcam->_22;
  354. p_body[5] = p_ber->p_invcam->_32;
  355. }
  356. /* Cte pozici kamery + smery
  357. */
  358. void kam_get_float_ext(float *p_dir, float *p_pos)
  359. {
  360. p_dir[0] = p_ber->p_invcam->_13; // vektor Z
  361. p_dir[1] = p_ber->p_invcam->_23;
  362. p_dir[2] = p_ber->p_invcam->_33;
  363. p_dir[3] = p_ber->p_invcam->_12; // vektor Y
  364. p_dir[4] = p_ber->p_invcam->_22;
  365. p_dir[5] = p_ber->p_invcam->_32;
  366. p_pos[0] = p_ber->p_invcam->_41; // Pozice kamery
  367. p_pos[1] = p_ber->p_invcam->_42;
  368. p_pos[2] = p_ber->p_invcam->_43;
  369. }
  370. /* Nastavi kameru
  371. */
  372. int kam_3ds_set(BOD * p_pos, BOD * p_target, float roll)
  373. {
  374. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE &&
  375. (*p_ber->p_mod) & GAME_KAMERA_POLAR)
  376. return (K_CHYBA);
  377. if ((*p_ber->p_mod) & GAME_KAMERA_POLAR)
  378. kam_set_mod(GAME_KAMERA_3DS);
  379. // nastavi kameru
  380. calc_camera_3ds(p_ber->p_camera, p_ber->p_invcam, p_pos, p_target, roll);
  381. set_matrix_camera(p_ber->p_camera);
  382. set_matrix_camera_project(p_ber->p_project);
  383. p_ber->kamera.zmena = TRUE;
  384. // zapise
  385. *p_ber->p_target = *p_target;
  386. *p_ber->p_pos = *p_pos;
  387. *p_ber->p_roll = roll;
  388. return (TRUE);
  389. }
  390. /* Pricte kameru
  391. */
  392. int kam_3ds_add(BOD * p_pos, BOD * p_target, float roll)
  393. {
  394. if ((*p_ber->p_mod) & GAME_KAMERA_POLAR)
  395. kam_set_mod(GAME_KAMERA_3DS);
  396. // zapise
  397. vektor_add(p_ber->p_target, p_target, p_ber->p_target);
  398. vektor_add(p_ber->p_pos, p_pos, p_ber->p_pos);
  399. *p_ber->p_roll += DEG2RAD(roll);
  400. calc_camera_3ds(p_ber->p_camera, p_ber->p_invcam, p_ber->p_pos,
  401. p_ber->p_target, *p_ber->p_roll);
  402. set_matrix_camera(p_ber->p_camera);
  403. set_matrix_camera_project(p_ber->p_project);
  404. p_ber->kamera.zmena = TRUE;
  405. return (TRUE);
  406. }
  407. /* Nacte kameru 3ds
  408. */
  409. int kam_3ds_get(BOD * p_pos, BOD * p_target, float *p_roll)
  410. {
  411. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE &&
  412. (*p_ber->p_mod) & GAME_KAMERA_POLAR)
  413. return (K_CHYBA);
  414. if ((*p_ber->p_mod) & GAME_KAMERA_POLAR)
  415. kam_set_mod(GAME_KAMERA_3DS);
  416. *p_pos = *p_ber->p_pos;
  417. *p_target = *p_ber->p_target;
  418. *p_roll = *p_ber->p_roll;
  419. return (TRUE);
  420. }
  421. /********************************************
  422. Polarni animace
  423. ********************************************
  424. */
  425. AnimHandle kam_pol_vyrob_animaci(int framenum, int pos_keys, int rot_keys,
  426. int vzdal_keys, int korekce)
  427. {
  428. int kam;
  429. int i;
  430. for (i = 0; i < p_ber->kamnum; i++) {
  431. if (!p_ber->kamery[i].flag) {
  432. kam = i;
  433. goto naslo_se_to2;
  434. }
  435. }
  436. if (p_ber->kamnum >= KAM_MAX_ANIM) {
  437. return (K_CHYBA);
  438. }
  439. else
  440. kam = p_ber->kamnum++;
  441. naslo_se_to2:;
  442. key_kamera_vyrob_indir(p_ber->kamery + kam, pos_keys, 0, vzdal_keys, 0,
  443. rot_keys);
  444. p_ber->kamery[kam].flag =
  445. (korekce) ? GAME_KAMERA_KOREKCE | GAME_KAMERA_POLAR : GAME_KAMERA_POLAR;
  446. p_ber->kamery[kam].endtime = calc_endtime(framenum);
  447. return (kam);
  448. }
  449. AnimHandle kam_pol_vloz_klic_posun(AnimHandle handle, int klic, float x,
  450. float y, float z, int frame)
  451. {
  452. KAMERA_TRACK_INFO *p_kam;
  453. p_kam = p_ber->kamery + handle;
  454. if (handle >= p_ber->kamnum || klic >= p_kam->pos_keys)
  455. return (K_CHYBA);
  456. p_kam->p_pos[klic].x = x;
  457. p_kam->p_pos[klic].y = y;
  458. p_kam->p_pos[klic].z = z;
  459. p_kam->p_pkeys[klic].time = frame * SIM_KONSTI;
  460. return (handle);
  461. }
  462. AnimHandle kam_pol_vloz_klic_posun_bod(AnimHandle handle, int klic, BOD * p_p,
  463. int frame)
  464. {
  465. if (handle >= p_ber->kamnum || klic >= p_ber->kamery[handle].pos_keys)
  466. return (K_CHYBA);
  467. p_ber->kamery[handle].p_pos[klic] = *p_p;
  468. p_ber->kamery[handle].p_pkeys[klic].time = frame * SIM_KONSTI;
  469. return (handle);
  470. }
  471. AnimHandle kam_pol_vloz_klic_posun_parametry(AnimHandle handle, int klic,
  472. float tension, float continuity, float bias)
  473. {
  474. KAMERA_TRACK_INFO *p_kam;
  475. p_kam = p_ber->kamery + handle;
  476. if (handle >= p_ber->kamnum || klic >= p_kam->pos_keys)
  477. return (K_CHYBA);
  478. p_kam->p_pkeys[klic].tension = tension;
  479. p_kam->p_pkeys[klic].continuity = continuity;
  480. p_kam->p_pkeys[klic].bias = bias;
  481. return (handle);
  482. }
  483. AnimHandle kam_pol_vloz_klic_rotace(AnimHandle handle, int klic, float r,
  484. float fi, int frame)
  485. {
  486. if (handle >= p_ber->kamnum || klic >= p_ber->kamery[handle].quat_keys)
  487. return (K_CHYBA);
  488. kam_angle_to_quat(DEG2RAD(r), DEG2RAD(fi),
  489. p_ber->kamery[handle].p_quat + klic);
  490. p_ber->kamery[handle].p_qkeys[klic].time = frame * SIM_KONSTI;
  491. return (handle);
  492. }
  493. AnimHandle kam_pol_vloz_klic_rotace_parametry(AnimHandle handle, int klic,
  494. float tension, float continuity, float bias)
  495. {
  496. if (handle >= p_ber->kamnum || klic >= p_ber->kamery[handle].quat_keys)
  497. return (K_CHYBA);
  498. p_ber->kamery[handle].p_qkeys[klic].bias = bias;
  499. p_ber->kamery[handle].p_qkeys[klic].continuity = continuity;
  500. p_ber->kamery[handle].p_qkeys[klic].tension = tension;
  501. return (handle);
  502. }
  503. AnimHandle kam_pol_vloz_klic_vzdal(AnimHandle handle, int klic, float vzdal,
  504. int frame, float tension, float continuity, float bias)
  505. {
  506. KAMERA_TRACK_INFO *p_kam;
  507. p_kam = p_ber->kamery + handle;
  508. if (handle >= p_ber->kamnum || klic >= p_kam->roll_keys)
  509. return (K_CHYBA);
  510. p_kam->p_roll[klic] = vzdal;
  511. p_kam->p_rlkeys[klic].time = frame * SIM_KONSTI;
  512. p_kam->p_rlkeys[klic].tension = tension;
  513. p_kam->p_rlkeys[klic].bias = bias;
  514. p_kam->p_rlkeys[klic].continuity = continuity;
  515. return (handle);
  516. }
  517. AnimHandle kam_pol_vloz_klic_all(AnimHandle handle, int klic, BOD * p_p,
  518. float r, float fi, float vzdal, int frame, float tension)
  519. {
  520. KAMERA_TRACK_INFO *p_trk;
  521. int time = frame * SIM_KONSTI;
  522. p_trk = p_ber->kamery + handle;
  523. if (handle >= p_ber->kamnum)
  524. return (K_CHYBA);
  525. p_trk->p_pos[klic] = *p_p;
  526. p_trk->p_pkeys[klic].time = time;
  527. p_trk->p_pkeys[klic].tension = tension;
  528. kam_angle_to_quat(DEG2RAD(r), DEG2RAD(fi), p_trk->p_quat + klic);
  529. p_trk->p_qkeys[klic].time = time;
  530. p_trk->p_qkeys[klic].tension = tension;
  531. p_trk->p_roll[klic] = vzdal;
  532. p_trk->p_rlkeys[klic].time = time;
  533. p_trk->p_rlkeys[klic].tension = tension;
  534. return (handle);
  535. }
  536. AnimHandle kam_zrus_animaci(AnimHandle handle)
  537. {
  538. if (handle >= p_ber->kamnum)
  539. return (K_CHYBA);
  540. key_kamera_zrus_indir(p_ber->kamery + handle);
  541. memset(p_ber->kamery + handle, 0, sizeof(p_ber->kamery[0]));
  542. return (handle);
  543. }
  544. /********************************************
  545. 3ds animace
  546. ********************************************
  547. */
  548. AnimHandle kam_3ds_vyrob_animaci(int framenum, int pos_keys, int target_keys,
  549. int roll_keys, int fov_keys)
  550. {
  551. int kam;
  552. int i;
  553. for (i = 0; i < p_ber->kamnum; i++) {
  554. if (!p_ber->kamery[i].flag) {
  555. kam = i;
  556. goto naslo_se_to2;
  557. }
  558. }
  559. if (p_ber->kamnum >= KAM_MAX_ANIM) {
  560. return (K_CHYBA);
  561. }
  562. else
  563. kam = p_ber->kamnum++;
  564. naslo_se_to2:;
  565. key_kamera_vyrob_indir(p_ber->kamery + kam, pos_keys, target_keys,
  566. roll_keys, fov_keys, 0);
  567. p_ber->kamery[kam].flag = GAME_KAMERA_3DS;
  568. p_ber->kamery[kam].endtime = calc_endtime(framenum);
  569. return (kam);
  570. }
  571. /* Load animace
  572. */
  573. AnimHandle kam_3ds_nahraj_animaci(APAK_HANDLE * pHandle, char *p_jmeno)
  574. {
  575. char jmeno_kam[200];
  576. int kam;
  577. int i;
  578. for (i = 0; i < p_ber->kamnum; i++) {
  579. if (!p_ber->kamery[i].flag) {
  580. kam = i;
  581. goto naslo_se_to2;
  582. }
  583. }
  584. if (p_ber->kamnum >= KAM_MAX_ANIM) {
  585. return (K_CHYBA);
  586. }
  587. else
  588. kam = p_ber->kamnum++;
  589. naslo_se_to2:;
  590. if (!key_kamera_nahraj(p_ber->kamery + kam, jmeno_kam,
  591. p_ber->kamery[kam].jmeno, pHandle, p_jmeno, p_ber->dir.game_data_dir))
  592. return (K_CHYBA);
  593. p_ber->kamery[kam].flag = GAME_KAMERA_3DS;
  594. return (kam);
  595. }
  596. /* Position-key
  597. */
  598. AnimHandle kam_3ds_vloz_klic_posun(AnimHandle handle, int klic, float x,
  599. float y, float z, int frame)
  600. {
  601. KAMERA_TRACK_INFO *p_kam;
  602. p_kam = p_ber->kamery + handle;
  603. if (handle >= p_ber->kamnum || klic >= p_kam->pos_keys)
  604. return (K_CHYBA);
  605. p_kam->p_pos[klic].x = x;
  606. p_kam->p_pos[klic].y = y;
  607. p_kam->p_pos[klic].z = z;
  608. p_kam->p_pkeys[klic].time = frame;
  609. return (handle);
  610. }
  611. AnimHandle kam_3ds_vloz_klic_posun_bod(AnimHandle handle, int klic, BOD * p_p,
  612. int frame)
  613. {
  614. if (handle >= p_ber->kamnum || klic >= p_ber->kamery[handle].pos_keys)
  615. return (K_CHYBA);
  616. p_ber->kamery[handle].p_pos[klic] = *p_p;
  617. p_ber->kamery[handle].p_pkeys[klic].time = frame;
  618. return (handle);
  619. }
  620. AnimHandle kam_3ds_vloz_klic_posun_parametry(AnimHandle handle, int klic,
  621. float tension, float continuity, float bias)
  622. {
  623. KAMERA_TRACK_INFO *p_kam;
  624. p_kam = p_ber->kamery + handle;
  625. if (handle >= p_ber->kamnum || klic >= p_kam->pos_keys)
  626. return (K_CHYBA);
  627. p_kam->p_pkeys[klic].tension = tension;
  628. p_kam->p_pkeys[klic].continuity = continuity;
  629. p_kam->p_pkeys[klic].bias = bias;
  630. return (handle);
  631. }
  632. /* Target-key
  633. */
  634. AnimHandle kam_3ds_vloz_klic_target(AnimHandle handle, int klic, float x,
  635. float y, float z, int frame)
  636. {
  637. KAMERA_TRACK_INFO *p_kam;
  638. p_kam = p_ber->kamery + handle;
  639. if (handle >= p_ber->kamnum || klic >= p_kam->trg_keys)
  640. return (K_CHYBA);
  641. p_kam->p_trg[klic].x = x;
  642. p_kam->p_trg[klic].y = y;
  643. p_kam->p_trg[klic].z = z;
  644. p_kam->p_tkeys[klic].time = frame;
  645. return (handle);
  646. }
  647. AnimHandle kam_3ds_vloz_klic_target_bod(AnimHandle handle, int klic,
  648. BOD * p_target, int frame)
  649. {
  650. if (handle >= p_ber->kamnum || klic >= p_ber->kamery[handle].trg_keys)
  651. return (K_CHYBA);
  652. p_ber->kamery[handle].p_trg[klic] = *p_target;
  653. p_ber->kamery[handle].p_tkeys[klic].time = frame;
  654. return (handle);
  655. }
  656. AnimHandle kam_3ds_vloz_klic_target_parametry(AnimHandle handle, int klic,
  657. float tension, float continuity, float bias)
  658. {
  659. KAMERA_TRACK_INFO *p_kam;
  660. p_kam = p_ber->kamery + handle;
  661. if (handle >= p_ber->kamnum || klic >= p_kam->trg_keys)
  662. return (K_CHYBA);
  663. p_kam->p_tkeys[klic].bias = bias;
  664. p_kam->p_tkeys[klic].tension = tension;
  665. p_kam->p_tkeys[klic].continuity = continuity;
  666. return (handle);
  667. }
  668. /* Roll-keys
  669. */
  670. AnimHandle kam_3ds_vloz_klic_roll(AnimHandle handle, int klic, float roll,
  671. int frame, float tension, float continuity, float bias)
  672. {
  673. KAMERA_TRACK_INFO *p_kam;
  674. p_kam = p_ber->kamery + handle;
  675. if (handle >= p_ber->kamnum || klic >= p_kam->roll_keys)
  676. return (K_CHYBA);
  677. p_kam->p_roll[klic] = roll;
  678. p_kam->p_rlkeys[klic].time = frame * SIM_KONSTI;
  679. p_kam->p_rlkeys[klic].bias = bias;
  680. p_kam->p_rlkeys[klic].tension = tension;
  681. p_kam->p_rlkeys[klic].continuity = continuity;
  682. return (handle);
  683. }
  684. /* Fov-keys
  685. */
  686. AnimHandle kam_3ds_vloz_klic_fov(AnimHandle handle, int klic, float fov,
  687. int frame, float tension, float continuity, float bias)
  688. {
  689. KAMERA_TRACK_INFO *p_kam;
  690. p_kam = p_ber->kamery + handle;
  691. if (handle >= p_ber->kamnum || klic >= p_kam->fov_keys)
  692. return (K_CHYBA);
  693. p_kam->p_fov[klic] = fov;
  694. p_kam->p_fkeys[klic].time = frame * SIM_KONSTI;
  695. p_kam->p_fkeys[klic].bias = bias;
  696. p_kam->p_fkeys[klic].tension = tension;
  697. p_kam->p_fkeys[klic].continuity = continuity;
  698. return (handle);
  699. }
  700. /* Vlozit vsechny klice
  701. */
  702. AnimHandle kam_3ds_vloz_klic_all(AnimHandle handle, int klic, BOD * p_p,
  703. BOD * p_t, float roll, int frame, float tension)
  704. {
  705. KAMERA_TRACK_INFO *p_kam;
  706. int time = frame * SIM_KONSTI;
  707. p_kam = p_ber->kamery + handle;
  708. if (handle >= p_ber->kamnum || klic >= p_kam->pos_keys ||
  709. klic >= p_kam->trg_keys || klic >= p_kam->roll_keys)
  710. return (K_CHYBA);
  711. p_kam->p_pkeys[klic].time = time;
  712. p_kam->p_pkeys[klic].tension = tension;
  713. p_kam->p_pos[klic] = *p_p;
  714. p_kam->p_tkeys[klic].time = time;
  715. p_kam->p_tkeys[klic].tension = tension;
  716. p_kam->p_trg[klic] = *p_t;
  717. p_kam->p_rlkeys[klic].time = time;
  718. p_kam->p_rlkeys[klic].tension = tension;
  719. p_kam->p_roll[klic] = roll;
  720. return (handle);
  721. }
  722. /********************************************
  723. Vsechny animace - Animacni stroj
  724. ********************************************
  725. */
  726. //start/stop animace
  727. int kam_start(int a_handle, int *p_flag, int flag, int start, int stop)
  728. {
  729. if (p_ber->kamery[a_handle].endtime) {
  730. p_ber->kamera.p_anim = p_ber->kamery + a_handle;
  731. p_ber->kamera.aktivni =
  732. p_ber->kamery[a_handle].flag | GAME_KAMERA_ANIMACE;
  733. p_ber->kamera.p_flag = p_flag;
  734. p_ber->kamera.flag = flag;
  735. p_ber->kamera.a_handle = a_handle;
  736. *p_flag = 0;
  737. calc_time_end(p_ber->kamera.p_anim->endtime, p_ber->TimeEndLastFrame,
  738. start, stop,
  739. (dword *) & p_ber->kamera.start,
  740. (dword *) & p_ber->kamera.stop,
  741. (dword *) & p_ber->kamera.time_start,
  742. (dword *) & p_ber->kamera.time_stop,
  743. (dword *) & p_ber->kamera.time_delka);
  744. }
  745. return (TRUE);
  746. }
  747. void kam_stop(void)
  748. {
  749. if (p_ber->kamera.aktivni & GAME_KAMERA_ANIMACE) {
  750. if (p_ber->kamera.flag & GK_REMOVE)
  751. kam_zrus_animaci(p_ber->kamera.a_handle);
  752. p_ber->kamera.aktivni &= ~GAME_KAMERA_ANIMACE;
  753. p_ber->kamera.p_anim = NULL;
  754. p_ber->kamera.a_handle = K_CHYBA;
  755. }
  756. }
  757. void kani_updatuj(G_KONFIG * p_ber)
  758. {
  759. KAMERA_TRACK_INFO *p_track;
  760. GAME_KAMERA *p_kam;
  761. int konec, loop, zrusit = FALSE;
  762. int next_time = p_ber->TimeEndLastFrame;
  763. QUAT q(1.0f, 0.0f, 0.0f, 0.0f);
  764. p_kam = &p_ber->kamera;
  765. p_track = p_ber->kamera.p_anim;
  766. loop = p_kam->flag & GK_LOOP;
  767. if ((konec = (next_time > p_kam->time_stop))) {
  768. if (loop) {
  769. calc_time_loop(next_time, p_kam->start,
  770. (dword *) & p_kam->time_start,
  771. (dword *) & p_kam->time_stop,
  772. (dword *) & p_kam->time_delka, (dword *) & p_kam->time);
  773. if (p_kam->p_flag)
  774. *(p_kam->p_flag) = 0;
  775. konec = 0;
  776. }
  777. else {
  778. p_kam->time = p_kam->time_delka;
  779. zrusit = (p_kam->flag & GK_REMOVE);
  780. if (p_kam->p_flag)
  781. *(p_kam->p_flag) = K_CHYBA;
  782. }
  783. }
  784. else {
  785. p_kam->time = calc_time_akt(next_time, p_kam->time_start);
  786. if (p_kam->p_flag)
  787. *(p_kam->p_flag) =
  788. ftoi((p_kam->time / (float) p_kam->time_delka) * 100.0f);
  789. }
  790. if (p_kam->aktivni & GAME_KAMERA_3DS) {
  791. /*
  792. if(p_track->fov_keys) {
  793. key_track_interpolace_float(&p_kam->fov, p_track->p_fov, p_track->p_fkeys, p_kam->time, p_track->endtime, p_track->fov_keys, loop);
  794. projection_matrix(&p_ber->kamera.project,p_kam->fov,(float)OXRES/(float)OYRES,p_ber->kam.near_plane,p_ber->kam.far_plane);
  795. set_matrix_project(p_ber->p_project);
  796. }
  797. */
  798. if (p_track->pos_keys)
  799. key_track_interpolace_bod(&p_kam->p, p_track->p_pos, p_track->p_pkeys,
  800. p_kam->time, p_track->endtime, p_track->pos_keys, loop);
  801. if (p_track->trg_keys)
  802. key_track_interpolace_bod(&p_kam->t, p_track->p_trg, p_track->p_tkeys,
  803. p_kam->time, p_track->endtime, p_track->trg_keys, loop);
  804. if (p_track->roll_keys)
  805. key_track_interpolace_float(&p_kam->roll, p_track->p_roll,
  806. p_track->p_rlkeys, p_kam->time, p_track->endtime, p_track->roll_keys,
  807. loop);
  808. calc_camera_3ds(p_ber->p_camera, p_ber->p_invcam, &p_kam->p, &p_kam->t,
  809. p_kam->roll);
  810. set_matrix_camera(p_ber->p_camera);
  811. set_matrix_camera_project(p_ber->p_project);
  812. p_ber->kamera.zmena = TRUE;
  813. }
  814. else {
  815. if (p_track->pos_keys)
  816. key_track_interpolace_bod(&p_kam->t, p_track->p_pos, p_track->p_pkeys,
  817. p_kam->time, p_track->endtime, p_track->pos_keys, loop);
  818. if (p_track->quat_keys)
  819. key_track_interpolace_quat(&q, p_track->p_quat, p_track->p_qkeys,
  820. p_kam->time, p_track->endtime, p_track->quat_keys, loop);
  821. if (p_track->roll_keys)
  822. key_track_interpolace_float(&p_kam->vzdal, p_track->p_roll,
  823. p_track->p_rlkeys, p_kam->time, p_track->endtime, p_track->roll_keys,
  824. loop);
  825. calc_camera_polar(p_ber->p_camera, p_ber->p_invcam, &p_kam->t, &q,
  826. p_kam->vzdal);
  827. quat_to_euler(&q, &p_kam->r, &p_kam->fi);
  828. ber_kamera_korekce_vzdalenosti(p_ber, p_ber->kam_omezeni, FALSE);
  829. p_ber->kamera.zmena = TRUE;
  830. }
  831. // Zrus animaci
  832. if (zrusit)
  833. kam_stop();
  834. }
  835. /* Animace polarni
  836. */
  837. RunHandle kam_pol_anim(BOD * p_p, float r, float fi, float vzdal,
  838. int *p_flag, int flag, int framenum, float tension)
  839. {
  840. GAME_KAMERA *p_kam = &p_ber->kamera;
  841. AnimHandle ah;
  842. kam_stop();
  843. kam_set_mod(GAME_KAMERA_POLAR);
  844. ah = kam_pol_vyrob_animaci(framenum, 2, 2, 2, TRUE);
  845. kam_pol_vloz_klic_all(ah, 0, &p_kam->t, RAD2DEG(p_kam->r),
  846. RAD2DEG(p_kam->fi), p_kam->vzdal, 0, tension);
  847. kam_pol_vloz_klic_all(ah, 1, p_p, r, fi, vzdal, framenum - 1, tension);
  848. kam_start(ah, p_flag, flag | GK_REMOVE, 0, 0);
  849. return (0);
  850. }
  851. /* Animace polarni add
  852. */
  853. RunHandle kam_pol_anim_add(BOD * p_p, float r, float fi, float vzdal,
  854. int *p_flag, int flag, int framenum, float tension)
  855. {
  856. GAME_KAMERA *p_kam = &p_ber->kamera;
  857. AnimHandle ah;
  858. BOD pp;
  859. kam_stop();
  860. kam_set_mod(GAME_KAMERA_POLAR);
  861. ah = kam_pol_vyrob_animaci(framenum, 2, 2, 2, TRUE);
  862. kam_pol_vloz_klic_all(ah, 0, &p_kam->t, RAD2DEG(p_kam->r),
  863. RAD2DEG(p_kam->fi), p_kam->vzdal, 0, tension);
  864. kam_pol_vloz_klic_all(ah, 1, vektor_add(&p_kam->t, p_p, &pp),
  865. RAD2DEG(p_kam->r) + r, RAD2DEG(p_kam->fi) + fi, p_kam->vzdal + vzdal,
  866. framenum - 1, tension);
  867. kam_start(ah, p_flag, flag | GK_REMOVE, 0, 0);
  868. return (0);
  869. }
  870. /* Animace 3ds
  871. */
  872. RunHandle kam_3ds_anim(BOD * p_p, BOD * p_t, float roll, int *p_flag,
  873. int flag, int framenum, float tension)
  874. {
  875. GAME_KAMERA *p_kam = &p_ber->kamera;
  876. AnimHandle ah;
  877. kam_stop();
  878. kam_set_mod(GAME_KAMERA_3DS);
  879. ah = kam_3ds_vyrob_animaci(framenum, 2, 2, 2, 0);
  880. kam_3ds_vloz_klic_all(ah, 0, &p_kam->p, &p_kam->t, p_kam->roll, 0, tension);
  881. kam_3ds_vloz_klic_all(ah, 1, p_p, p_t, DEG2RAD(roll), framenum - 1,
  882. tension);
  883. kam_start(ah, p_flag, flag | GK_REMOVE, 0, 0);
  884. return (0);
  885. }
  886. /* Animace 3ds add
  887. */
  888. RunHandle kam_3ds_anim_add(BOD * p_p, BOD * p_t, float roll, int *p_flag,
  889. int flag, int framenum, float tension)
  890. {
  891. GAME_KAMERA *p_kam = &p_ber->kamera;
  892. AnimHandle ah;
  893. BOD p, t;
  894. kam_stop();
  895. kam_set_mod(GAME_KAMERA_3DS);
  896. ah = kam_3ds_vyrob_animaci(framenum, 2, 2, 2, 0);
  897. kam_3ds_vloz_klic_all(ah, 0, &p_kam->p, &p_kam->t, p_kam->roll, 0, tension);
  898. kam_3ds_vloz_klic_all(ah, 1, vektor_add(&p_kam->p, p_p, &p),
  899. vektor_add(&p_kam->t, p_t, &t),
  900. p_kam->roll + DEG2RAD(roll), framenum - 1, tension);
  901. kam_start(ah, p_flag, flag | GK_REMOVE, 0, 0);
  902. return (0);
  903. }
  904. void kam_set_fov(float fov)
  905. {
  906. p_ber->kamera.fov = DEG2RAD(fov);
  907. projection_matrix(p_ber->p_project, p_ber->kamera.fov,
  908. (float) OXRES / (float) OYRES, p_ber->kam.near_plane,
  909. p_ber->kam.far_plane);
  910. set_matrix_project(p_ber->p_project);
  911. set_matrix_camera_project(p_ber->p_project);
  912. }
  913. float kam_get_fov(void)
  914. {
  915. return (RAD2DEG(p_ber->kamera.fov));
  916. }
  917. static BOD __last_kam_bod;
  918. static void kam_privaz_kameru_updatuj(int a_handle)
  919. {
  920. GK_ANIM *p_gk = (GK_ANIM *) a_handle;
  921. BOD vysl;
  922. vektor_sub(&p_gk->p, &__last_kam_bod, &vysl);
  923. __last_kam_bod = p_gk->p;
  924. kam_pol_add(&vysl, 0, 0, 0, TRUE);
  925. }
  926. static void kam_privaz_kameru_start(int a_handle)
  927. {
  928. __last_kam_bod.x = __last_kam_bod.y = __last_kam_bod.z = 0.0f;
  929. }
  930. // Privaze target-point kamery na std. animaci
  931. MatrixHandle rani_privaz_kameru(RunHandle a_handle)
  932. {
  933. GK_ANIM *p_gk = (GK_ANIM *) a_handle;
  934. GKA_MATICE *p_mat;
  935. MatrixHandle matice;
  936. if (p_gk->matic < MAX_ANIM_MATIC) {
  937. matice = p_gk->matic++;
  938. p_mat = p_gk->p_mat + matice;
  939. p_mat->p_mat = NULL;
  940. p_mat->p_notify = NULL;
  941. p_mat->flagy = MESH_KAMERA;
  942. p_mat->fce_param = a_handle;
  943. p_mat->funkce_start = kam_privaz_kameru_start;
  944. p_mat->funkce_frame = kam_privaz_kameru_updatuj;
  945. p_mat->funkce_end = kam_privaz_kameru_updatuj;
  946. return (matice);
  947. }
  948. else
  949. return (K_CHYBA);
  950. }
  951. int kam_3ds_cti_klic(AnimHandle handle, float time, BOD * p_p, BOD * p_t,
  952. float *p_roll)
  953. {
  954. KAMERA_TRACK_INFO *p_track;
  955. int loop;
  956. int dtime;
  957. if (handle >= p_ber->kamnum)
  958. return (K_CHYBA);
  959. p_track = p_ber->kamery + handle;
  960. if (!p_track || p_track->flag & GAME_KAMERA_POLAR)
  961. return (K_CHYBA);
  962. loop = p_track->flag & GK_LOOP;
  963. if (time > 1.0f)
  964. time = 1.0f;
  965. else if (time < 0.0f)
  966. time = 0.0f;
  967. dtime = ftoi(time * p_track->endtime);
  968. if (p_track->pos_keys) {
  969. key_track_interpolace_bod(p_p, p_track->p_pos, p_track->p_pkeys, dtime,
  970. p_track->endtime, p_track->pos_keys, loop);
  971. }
  972. if (p_track->trg_keys) {
  973. key_track_interpolace_bod(p_t, p_track->p_trg, p_track->p_tkeys, dtime,
  974. p_track->endtime, p_track->trg_keys, loop);
  975. }
  976. if (p_track->roll_keys) {
  977. key_track_interpolace_float(p_roll, p_track->p_roll, p_track->p_rlkeys,
  978. dtime, p_track->endtime, p_track->roll_keys, loop);
  979. }
  980. else {
  981. *p_roll = 0.0f;
  982. }
  983. return (TRUE);
  984. }
  985. int kam_pol_cti_klic(AnimHandle handle, float time, BOD * p_t, float *p_r,
  986. float *p_fi, float *p_vzdal)
  987. {
  988. KAMERA_TRACK_INFO *p_track;
  989. int loop, dtime;
  990. QUAT q(1, 0, 0, 0);
  991. if (handle >= p_ber->kamnum)
  992. return (K_CHYBA);
  993. p_track = p_ber->kamery + handle;
  994. if (!p_track || p_track->flag & GAME_KAMERA_3DS)
  995. return (K_CHYBA);
  996. loop = p_track->flag & GK_LOOP;
  997. if (time > 1.0f)
  998. time = 1.0f;
  999. else if (time < 0.0f)
  1000. time = 0.0f;
  1001. dtime = ftoi(time * p_track->endtime);
  1002. if (p_track->pos_keys) {
  1003. key_track_interpolace_bod(p_t, p_track->p_pos, p_track->p_pkeys, dtime,
  1004. p_track->endtime, p_track->pos_keys, loop);
  1005. }
  1006. else {
  1007. p_t->set(0.0f);
  1008. }
  1009. if (p_track->quat_keys) {
  1010. key_track_interpolace_quat(&q, p_track->p_quat, p_track->p_qkeys, dtime,
  1011. p_track->endtime, p_track->quat_keys, loop);
  1012. }
  1013. if (p_track->roll_keys) {
  1014. key_track_interpolace_float(p_vzdal, p_track->p_roll, p_track->p_rlkeys,
  1015. dtime, p_track->endtime, p_track->roll_keys, loop);
  1016. }
  1017. else {
  1018. *p_vzdal = 0;
  1019. }
  1020. quat_to_euler(&q, p_r, p_fi);
  1021. return (TRUE);
  1022. }
  1023. void ber_zpruhledni_prvky_reset(G_KONFIG * p_ber)
  1024. {
  1025. EDIT_MESH_POLY *p_poly;
  1026. GAME_MESH_OLD *p_mesh;
  1027. int i;
  1028. for (i = 0; i < p_ber->meshnum; i++) {
  1029. p_mesh = p_ber->p_mesh[i];
  1030. if (p_mesh) {
  1031. if (p_mesh->p_data->kflag & KONT_PRVEK &&
  1032. (p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  1033. || p_mesh->p_data->m2flag & MAT2_MASKA) && p_mesh->p_vertex_diff) {
  1034. ber_reset_mesh(p_mesh->p_vertex_diff, p_mesh->p_vertex_diff_material,
  1035. p_mesh->vertexnum);
  1036. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  1037. }
  1038. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  1039. }
  1040. }
  1041. p_poly = p_ber->p_poly;
  1042. for (i = 0; i < p_ber->polynum; i++) {
  1043. if (p_poly->kflag & (KONT_DRAW_CAMERA | KONT_PRVEK)) {
  1044. if (p_poly->m1flag & MAT_PRUHLEDNY || p_poly->m2flag & MAT2_MASKA) {
  1045. ber_reset_poly(p_poly->p_koord, p_poly->facenum);
  1046. p_poly->kflag |= KONT_UPLOAD;
  1047. }
  1048. p_poly->kflag &= ~KONT_DRAW_CAMERA;
  1049. }
  1050. p_poly++;
  1051. }
  1052. }
  1053. void ber_zpruhledni_prvky(G_KONFIG * p_ber)
  1054. {
  1055. EDIT_MESH_POLY *p_poly;
  1056. TEXT_KOORD *p_koord;
  1057. GLMATRIX *p_m;
  1058. float ra, radius = p_ber->conf_pruhledna_kamera_radius;
  1059. float vzdal, alfa;
  1060. static BOD lt(FLT_MAX, FLT_MAX, FLT_MAX);
  1061. GAME_MESH_OLD *p_mesh, *p_beruska;
  1062. BOD t, p, i, *p_vrt, vr;
  1063. BODRGBA *p_d;
  1064. BODRGBA *p_dm;
  1065. int mh, o, vs, vn;
  1066. int v, key;
  1067. word *p_objektstart;
  1068. word *p_objektnum;
  1069. BODRGBA *p_vertex_diff;
  1070. BODRGBA *p_vertex_diff_material;
  1071. BOD *p_vertex_pos;
  1072. OBB_OLD *p_obb;
  1073. int kamera_zmena = p_ber->kamera.zmena || p_ber->kamera.zmena_last;
  1074. if (!p_ber->conf_pruhledna_kamera)
  1075. return;
  1076. mh = gl_Get_Active_Beetle_Mesh();
  1077. if (mh == K_CHYBA)
  1078. return;
  1079. t.x = p_ber->p_prv_lev[mh]->x;
  1080. t.y = p_ber->p_prv_lev[mh]->y;
  1081. t.z = p_ber->p_prv_lev[mh]->z;
  1082. if (!kamera_zmena && lt.x == t.x && lt.y == t.y && lt.z == t.z) {
  1083. return;
  1084. }
  1085. else {
  1086. lt.x = t.x;
  1087. lt.y = t.y;
  1088. lt.z = t.z;
  1089. }
  1090. p_beruska = p_ber->p_mesh[p_ber->p_prv_lev[mh]->mesh];
  1091. p.x = p_ber->p_invcam->_41;
  1092. p.y = p_ber->p_invcam->_42;
  1093. p.z = p_ber->p_invcam->_43;
  1094. //t - pozice berusky
  1095. ber_mesh_render_list_reset(p_ber);
  1096. while ((p_mesh =
  1097. ber_mesh_render_list_next_flag(p_ber, KONT_VIDITELNY | KONT_PRVEK,
  1098. FALSE))) {
  1099. if (p_beruska == p_mesh) {
  1100. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  1101. }
  1102. else {
  1103. BOD *p_str = &p_mesh->obb_world.obb_stred;
  1104. bod_primka_bod_bod(p_str, &p, &t, &i);
  1105. if (!bod_mezi(&p, &t, &i)) {
  1106. if ((p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  1107. || p_mesh->p_data->m2flag & MAT2_MASKA)
  1108. && p_mesh->p_vertex_diff) {
  1109. ber_reset_mesh(p_mesh->p_vertex_diff,
  1110. p_mesh->p_vertex_diff_material, p_mesh->vertexnum);
  1111. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  1112. }
  1113. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  1114. }
  1115. else {
  1116. vzdal = obb_vzdal_bod_aabb(&p_mesh->obb_world, &i);
  1117. if (vzdal > radius) {
  1118. if ((p_mesh->p_data->m1flag & MAT_PRUHLEDNY
  1119. || p_mesh->p_data->m2flag & MAT2_MASKA)
  1120. && p_mesh->p_vertex_diff) {
  1121. ber_reset_mesh(p_mesh->p_vertex_diff,
  1122. p_mesh->p_vertex_diff_material, p_mesh->vertexnum);
  1123. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  1124. }
  1125. p_mesh->p_data->kflag &= ~KONT_DRAW_CAMERA;
  1126. }
  1127. else {
  1128. if (p_mesh->p_vertex_diff) {
  1129. p_mesh->p_data->kflag |= KONT_DRAW_CAMERA;
  1130. p_mesh->p_data->k2flag |= KONT2_UPDATE_DIFF;
  1131. key = p_mesh->p_data->kflag & KONT_KEYFRAME;
  1132. p_objektstart = p_mesh->objektstart;
  1133. p_objektnum = p_mesh->objektnum;
  1134. p_vertex_diff = p_mesh->p_vertex_diff;
  1135. p_vertex_diff_material = p_mesh->p_vertex_diff_material;
  1136. p_vertex_pos = p_mesh->p_vertex_pos;
  1137. if (!key)
  1138. p_m = &p_mesh->m;
  1139. p_obb = p_mesh->p_obb_world;
  1140. for (o = 0; o < p_mesh->objektu; o++, p_obb++) {
  1141. vs = *p_objektstart++;
  1142. vn = *p_objektnum++;
  1143. p_d = p_vertex_diff + vs;
  1144. p_dm = p_vertex_diff_material + vs;
  1145. bod_primka_bod_bod(&p_obb->obb_stred, &p, &t, &i);
  1146. if (obb_vzdal_bod_aabb(p_obb, &i) < radius) {
  1147. if (key)
  1148. p_m = p_mesh->p_key + o;
  1149. p_vrt = p_vertex_pos + vs;
  1150. for (v = 0; v < vn; v++, p_d++, p_dm++, p_vrt++) {
  1151. transformuj_bod_matici_bod(p_vrt, p_m, &vr);
  1152. ra = vzdal_bodu_a_primky(&vr, &p, &t);
  1153. if (ra < radius) {
  1154. alfa = (ra / radius);
  1155. if (p_d->a > alfa)
  1156. p_d->a = alfa;
  1157. }
  1158. else {
  1159. p_d->a = p_dm->a;
  1160. }
  1161. }
  1162. }
  1163. else {
  1164. for (v = 0; v < vn; v++, p_d++, p_dm++) {
  1165. p_d->a = p_dm->a;
  1166. }
  1167. }
  1168. }
  1169. }
  1170. }
  1171. }
  1172. }
  1173. }
  1174. ber_poly_render_list_reset(p_ber);
  1175. while ((p_poly =
  1176. ber_poly_render_list_next_flag(p_ber, KONT_VIDITELNY | KONT_PRVEK,
  1177. FALSE))) {
  1178. bod_primka_bod_bod(&p_poly->obb.obb_stred, &p, &t, &i);
  1179. if (!bod_mezi(&p, &t, &i)) {
  1180. if (p_poly->m1flag & MAT_PRUHLEDNY || p_poly->m2flag & MAT2_MASKA) {
  1181. ber_reset_poly(p_poly->p_koord, p_poly->facenum);
  1182. p_poly->kflag |= KONT_UPLOAD;
  1183. }
  1184. p_poly->kflag &= ~KONT_DRAW_CAMERA;
  1185. continue;
  1186. }
  1187. vzdal = obb_vzdal_bod_aabb(&p_poly->obb, &i);
  1188. if (vzdal > radius) {
  1189. if (p_poly->m1flag & MAT_PRUHLEDNY || p_poly->m2flag & MAT2_MASKA) {
  1190. ber_reset_poly(p_poly->p_koord, p_poly->facenum);
  1191. p_poly->kflag |= KONT_UPLOAD;
  1192. }
  1193. p_poly->kflag &= ~KONT_DRAW_CAMERA;
  1194. continue;
  1195. }
  1196. p_koord = p_poly->p_koord;
  1197. for (v = 0; v < p_poly->facenum; v++, p_koord++) {
  1198. ra = vzdal_bodu_a_primky((BOD *) (&p_koord->x), &p, &t);
  1199. if (ra < radius) {
  1200. alfa = (ra / radius);
  1201. if (p_koord->da > alfa)
  1202. p_koord->da = alfa;
  1203. }
  1204. else {
  1205. p_koord->da = p_koord->mda;
  1206. }
  1207. }
  1208. p_poly->kflag |= (KONT_UPLOAD | KONT_DRAW_CAMERA);
  1209. }
  1210. }
  1211. #define KINO_POMER (6.0f/12.0f)
  1212. void kam_kino_set_clear(G_KONFIG * p_ber)
  1213. {
  1214. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  1215. }
  1216. void kam_game_set_clear(G_KONFIG * p_ber)
  1217. {
  1218. float b[4];
  1219. if (p_ber->conf_barva_pozadi_pouzit) {
  1220. rgb_float(p_ber->conf_barva_pozadi, b);
  1221. glClearColor(b[0], b[1], b[2], 1.0f);
  1222. }
  1223. }
  1224. void kam_set_kino_screen(G_KONFIG * p_ber)
  1225. {
  1226. int kxres = OXRES;
  1227. int kyres = ftoi(OXRES * KINO_POMER);
  1228. int kx = OXSTART, ky = OYSTART + (OYRES - kyres) / 2;
  1229. set_matrix_view(kx, ky, kxres, kyres);
  1230. projection_matrix(&p_ber->kamera.project, p_ber->kam.fov,
  1231. (float) kxres / (float) kyres, p_ber->kam.near_plane,
  1232. p_ber->kam.far_plane);
  1233. set_matrix_project(p_ber->p_project);
  1234. }
  1235. void kam_set_normal_screen(G_KONFIG * p_ber)
  1236. {
  1237. set_matrix_view(OXSTART, OYSTART, OXRES, OYRES);
  1238. projection_matrix(&p_ber->kamera.project, p_ber->kam.fov,
  1239. (float) OXRES / (float) OYRES, p_ber->kam.near_plane,
  1240. p_ber->kam.far_plane);
  1241. set_matrix_project(p_ber->p_project);
  1242. }