gk.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. /*!
  2. \file gk.c
  3. \brief OGSF library - setting and manipulating keyframes animation (lower level functions)
  4. GRASS OpenGL gsurf OGSF Library
  5. (C) 1999-2008 by the GRASS Development Team
  6. This program is free software under the
  7. GNU General Public License (>=v2).
  8. Read the file COPYING that comes with GRASS
  9. for details.
  10. \author Bill Brown USACERL, GMSL/University of Illinois
  11. \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
  12. */
  13. #include <stdlib.h>
  14. #include <math.h>
  15. #include <grass/gis.h>
  16. #include <grass/glocale.h>
  17. #include <grass/gstypes.h>
  18. #include <grass/keyframe.h>
  19. #include <grass/kftypes.h>
  20. static float spl3(float, double, double, double, double, double, double,
  21. double);
  22. static float spl3(float tension, double data0, double data1, double x,
  23. double x2, double x3, double lderiv, double rderiv)
  24. {
  25. return ((float)
  26. (data0 * (2 * x3 - 3 * x2 + 1) + data1 * (-2 * x3 + 3 * x2) +
  27. (double)tension * lderiv * (x3 - 2 * x2 + x) +
  28. (double)tension * rderiv * (x3 - x2)));
  29. }
  30. /*!
  31. \brief Copy keyframes
  32. \param k source keyframes
  33. \return pointer to Keylist struct (target)
  34. */
  35. Keylist *gk_copy_key(Keylist * k)
  36. {
  37. Keylist *newk;
  38. int i;
  39. newk = (Keylist *) G_malloc(sizeof(Keylist)); /* G_fatal_error */
  40. if (!newk) {
  41. return (NULL);
  42. }
  43. for (i = 0; i < KF_NUMFIELDS; i++) {
  44. newk->fields[i] = k->fields[i];
  45. }
  46. newk->pos = k->pos;
  47. newk->look_ahead = k->look_ahead;
  48. newk->fieldmask = k->fieldmask;
  49. newk->next = newk->prior = NULL;
  50. return (newk);
  51. }
  52. /*!
  53. \brief Get mask value
  54. Get begin & end pos, AND all masks in keys <= pos
  55. Time must be between 0.0 & 1.0
  56. \param time timestamp
  57. \param keys list of keyframes
  58. \return mask value
  59. */
  60. unsigned long gk_get_mask_sofar(float time, Keylist * keys)
  61. {
  62. Keylist *k;
  63. float startpos, endpos, curpos;
  64. unsigned long mask = 0xFFFFFFFF;
  65. if (keys) {
  66. /* find end key */
  67. for (k = keys; k->next; k = k->next) ;
  68. startpos = keys->pos;
  69. endpos = k->pos;
  70. curpos = startpos + time * (endpos - startpos);
  71. for (k = keys; k->next; k = k->next) {
  72. if (k->pos <= curpos) {
  73. mask &= k->fieldmask; /* (else break) */
  74. }
  75. }
  76. }
  77. return (mask);
  78. }
  79. /*!
  80. \brief ADD
  81. \param mask mask value
  82. \param keys list of keyframes
  83. \param[out] keyret output list of keyframes
  84. \return number of output keyframes
  85. */
  86. int gk_viable_keys_for_mask(unsigned long mask, Keylist * keys,
  87. Keylist ** keyret)
  88. {
  89. Keylist *k;
  90. int cnt = 0;
  91. for (k = keys; k; k = k->next) {
  92. if ((mask & k->fieldmask) == mask) {
  93. keyret[cnt++] = k;
  94. }
  95. }
  96. return (cnt);
  97. }
  98. /*!
  99. \brief Checks key masks
  100. Because if they're masked up until the current position,
  101. pre-existing (or current) field should be used.
  102. \param view pointer to Viewmode struct
  103. \param numsteps number of steps
  104. \param keys list of keyframes
  105. \param step step value
  106. \param onestep
  107. \param render
  108. \param mode
  109. */
  110. void gk_follow_frames(Viewnode * view, int numsteps, Keylist * keys, int step,
  111. int onestep, int render, unsigned long mode)
  112. {
  113. Viewnode *v;
  114. int frame; /* frame is index into viewnode array */
  115. float tmp[3];
  116. float x, y, z;
  117. int num, w;
  118. unsigned long mask;
  119. for (frame = step - 1; frame < numsteps; frame++) {
  120. v = &view[frame];
  121. mask = gk_get_mask_sofar((float)frame / numsteps, keys);
  122. /* TODO?: set view field to current settings if not set,
  123. thereby keeping view structure up to date for easier saving of
  124. animation? */
  125. GS_get_from(tmp);
  126. if ((mask & KF_FROMX_MASK)) {
  127. tmp[X] = v->fields[KF_FROMX];
  128. }
  129. if ((mask & KF_FROMY_MASK)) {
  130. tmp[Y] = v->fields[KF_FROMY];
  131. }
  132. if ((mask & KF_FROMZ_MASK)) {
  133. tmp[Z] = v->fields[KF_FROMZ];
  134. }
  135. GS_moveto(tmp);
  136. GS_get_from(tmp);
  137. G_debug(3, "gk_follow_frames():");
  138. G_debug(3, " MASK: %lx", mask);
  139. G_debug(3, " FROM: %f %f %f", tmp[X], tmp[Y], tmp[Z]);
  140. /* ACS 1 line: was GS_get_focus(tmp);
  141. with this kanimator works also for flythrough navigation
  142. also changed in GK2.c
  143. */
  144. GS_get_viewdir(tmp);
  145. if ((mask & KF_DIRX_MASK)) {
  146. tmp[X] = v->fields[KF_DIRX];
  147. }
  148. if ((mask & KF_DIRY_MASK)) {
  149. tmp[Y] = v->fields[KF_DIRY];
  150. }
  151. if ((mask & KF_DIRZ_MASK)) {
  152. tmp[Z] = v->fields[KF_DIRZ];
  153. }
  154. /* ACS 1 line: was GS_set_focus(tmp);
  155. with this kanimator works also for flythrough navigation
  156. also changed in GK2.c
  157. */
  158. GS_set_viewdir(tmp);
  159. G_debug(3, "gk_follow_frames():");
  160. GS_get_viewdir(tmp);
  161. G_debug(3, " DIR: %f %f %f\n", tmp[X], tmp[Y], tmp[Z]);
  162. if ((mask & KF_TWIST_MASK)) {
  163. GS_set_twist((int)v->fields[KF_TWIST]);
  164. }
  165. if ((mask & KF_FOV_MASK)) {
  166. GS_set_fov((int)v->fields[KF_FOV]);
  167. }
  168. /* Initilaize lights before drawing */
  169. num = 1;
  170. GS_getlight_position(num, &x, &y, &z, &w);
  171. GS_setlight_position(num, x, y, z, w);
  172. num = 2; /* Top light */
  173. GS_setlight_position(num, 0., 0., 1., 0);
  174. if (render) {
  175. GS_set_draw(GSD_FRONT);
  176. }
  177. else {
  178. GS_set_draw(GSD_BACK);
  179. }
  180. GS_ready_draw();
  181. GS_clear(GS_background_color());
  182. if (render) {
  183. GS_alldraw_surf();
  184. }
  185. else {
  186. GS_alldraw_wire();
  187. }
  188. GS_alldraw_cplane_fences();
  189. if (mode & FM_PATH) {
  190. gk_draw_path(view, numsteps, keys);
  191. }
  192. if (mode & FM_VECT) {
  193. GV_alldraw_vect();
  194. }
  195. if (mode & FM_SITE) {
  196. GP_alldraw_site();
  197. }
  198. if (mode & FM_VOL) {
  199. GVL_alldraw_vol();
  200. }
  201. GS_done_draw();
  202. if (mode & FM_LABEL) {
  203. GS_draw_all_list(); /* draw labels and legend */
  204. }
  205. if (onestep) {
  206. return;
  207. }
  208. }
  209. return;
  210. }
  211. /*!
  212. \brief Free keyframe list
  213. \param ok pointer to Keylist struct
  214. */
  215. void gk_free_key(Keylist * ok)
  216. {
  217. Keylist *k, *prev;
  218. if (ok) {
  219. k = ok;
  220. while (k) {
  221. prev = k;
  222. k = k->next;
  223. G_free(prev);
  224. }
  225. }
  226. return;
  227. }
  228. /*!
  229. \brief Generate viewnode from keyframes
  230. Here we use a cardinal cubic spline
  231. \param keys list of keyframes
  232. \param keysteps keyframe step
  233. \param newsteps new step value
  234. \param loop loop indicator
  235. \param t
  236. \return pointer to Viewnode
  237. \return NULL on failure
  238. */
  239. Viewnode *gk_make_framesfromkeys(Keylist * keys, int keysteps, int newsteps,
  240. int loop, float t)
  241. {
  242. int i;
  243. Viewnode *v, *newview;
  244. Keylist *k, *kp1, *kp2, *km1, **tkeys;
  245. float startpos, endpos;
  246. double dt1, dt2, x, x2, x3, range, time, time_step, len, rderiv, lderiv;
  247. /* allocate tmp keys to hold valid keys for fields */
  248. tkeys = (Keylist **) G_malloc(keysteps * sizeof(Keylist *)); /* G_fatal_error */
  249. if (!tkeys) {
  250. return (NULL);
  251. }
  252. correct_twist(keys);
  253. if (keys && keysteps) {
  254. if (keysteps < 3) {
  255. G_warning(_("Need at least 3 keyframes for spline"));
  256. G_free(tkeys);
  257. return (NULL);
  258. }
  259. /* find end key */
  260. for (k = keys; k->next; k = k->next) ;
  261. startpos = keys->pos;
  262. endpos = k->pos;
  263. range = endpos - startpos;
  264. time_step = range / (newsteps - 1);
  265. newview = (Viewnode *) G_malloc(newsteps * sizeof(Viewnode)); /* G_fatal_error */
  266. if (!newview) { /* not used */
  267. G_free(tkeys);
  268. return (NULL);
  269. }
  270. for (i = 0; i < newsteps; i++) {
  271. int field = 0;
  272. v = &newview[i];
  273. time = startpos + i * time_step;
  274. if (i == newsteps - 1) {
  275. time = endpos; /*to ensure no roundoff errors */
  276. }
  277. for (field = 0; field < KF_NUMFIELDS; field++) {
  278. int nvk = 0; /* number of viable keyframes for this field */
  279. /* now need to do for each field to look at mask */
  280. k = kp1 = kp2 = km1 = NULL;
  281. nvk = gk_viable_keys_for_mask((unsigned long)(1 << field),
  282. keys, tkeys);
  283. if (nvk) {
  284. len = get_key_neighbors(nvk, time, range,
  285. loop, tkeys, &k, &kp1, &kp2, &km1,
  286. &dt1, &dt2);
  287. }
  288. /* ACS 1 line: was if (len == 0.0) {
  289. when disabling a channel no calculation must be made at all (otherwise core dump)
  290. */
  291. if (len == 0.0 || nvk == 0) {
  292. if (!k) {
  293. /* none valid - use first.
  294. (when showing , will be ignored anyway) */
  295. v->fields[field] = keys->fields[field];
  296. }
  297. else if (!kp1) {
  298. /* none on right - use left */
  299. v->fields[field] = k->fields[field];
  300. }
  301. continue;
  302. }
  303. else if (!km1 && !kp2) {
  304. /* only two valid - use linear */
  305. v->fields[field] = lin_interp((time - k->pos) / len,
  306. k->fields[field],
  307. kp1->fields[field]);
  308. continue;
  309. }
  310. x = (time - k->pos) / len;
  311. x2 = x * x;
  312. x3 = x2 * x;
  313. if (!km1) {
  314. /* leftmost interval */
  315. rderiv = (kp2->fields[field] - k->fields[field]) / dt2;
  316. lderiv = (3 * (kp1->fields[field] -
  317. k->fields[field]) / dt1 - rderiv) / 2.0;
  318. v->fields[field] = spl3(t, k->fields[field],
  319. kp1->fields[field], x, x2, x3,
  320. lderiv, rderiv);
  321. }
  322. else if (!kp2) {
  323. /* rightmost interval */
  324. lderiv = (kp1->fields[field] - km1->fields[field]) / dt1;
  325. rderiv = (3 * (kp1->fields[field] -
  326. k->fields[field]) / dt2 - lderiv) / 2.0;
  327. v->fields[field] = spl3(t, k->fields[field],
  328. kp1->fields[field], x, x2, x3,
  329. lderiv, rderiv);
  330. }
  331. else {
  332. /* not on ends */
  333. lderiv = (kp1->fields[field] - km1->fields[field]) / dt1;
  334. rderiv = (kp2->fields[field] - k->fields[field]) / dt2;
  335. v->fields[field] = spl3(t, k->fields[field],
  336. kp1->fields[field], x, x2, x3,
  337. lderiv, rderiv);
  338. }
  339. }
  340. }
  341. G_free(tkeys);
  342. return (newview);
  343. }
  344. else {
  345. G_free(tkeys);
  346. return (NULL);
  347. }
  348. }
  349. /*!
  350. \brief Find interval containing time
  351. Changed June 94 to handle masks - now need to have called get_viable_keys
  352. for appropriate mask first to build the ARRAY of viable keyframes.
  353. Putting left (or equal) key
  354. at km1, right at kp1, 2nd to right at kp2, and second to left at km2.
  355. dt1 is given the length of the current + left intervals
  356. dt2 is given the length of the current + right intervals
  357. \param nvk
  358. \param time
  359. \param range
  360. \param loop
  361. \param karray
  362. \param km1
  363. \param kp1
  364. \param kp2
  365. \param km2
  366. \param dt1
  367. \param dt2
  368. \return the length of the current interval
  369. \return 0 on error
  370. */
  371. double get_key_neighbors(int nvk, double time, double range, int loop,
  372. Keylist * karray[], Keylist ** km1, Keylist ** kp1,
  373. Keylist ** kp2, Keylist ** km2, double *dt1,
  374. double *dt2)
  375. {
  376. int i;
  377. double len;
  378. *km1 = *kp1 = *kp2 = *km2 = NULL;
  379. *dt1 = *dt2 = 0.0;
  380. for (i = 0; i < nvk; i++) {
  381. if (time < karray[i]->pos) {
  382. break;
  383. }
  384. }
  385. if (!i) {
  386. return (0.0); /* before first keyframe or nvk == 0 */
  387. }
  388. if (i == nvk) {
  389. /* past or == last keyframe! */
  390. *km1 = karray[nvk - 1];
  391. return (0.0);
  392. }
  393. /* there's at least 2 */
  394. *km1 = karray[i - 1];
  395. *kp1 = karray[i];
  396. len = karray[i]->pos - karray[i - 1]->pos;
  397. if (i == 1) {
  398. /* first interval */
  399. if (loop) {
  400. *km2 = karray[nvk - 2];
  401. *kp2 = karray[(i + 1) % nvk];
  402. }
  403. else {
  404. if (nvk > 2) {
  405. *kp2 = karray[i + 1];
  406. }
  407. }
  408. }
  409. else if (i == nvk - 1) {
  410. /* last interval */
  411. if (loop) {
  412. *km2 = nvk > 2 ? karray[i - 2] : karray[1];
  413. *kp2 = karray[1];
  414. }
  415. else {
  416. if (nvk > 2) {
  417. *km2 = karray[i - 2];
  418. }
  419. }
  420. }
  421. else {
  422. *km2 = karray[i - 2];
  423. *kp2 = karray[i + 1];
  424. }
  425. *dt1 = (*km2) ? (*kp1)->pos - (*km2)->pos : len;
  426. *dt2 = (*kp2) ? (*kp2)->pos - (*km1)->pos : len;
  427. if (i == 1 && loop) {
  428. *dt1 += range;
  429. }
  430. if (i == nvk - 1 && loop) {
  431. *dt2 += range;
  432. }
  433. return (len);
  434. }
  435. /*!
  436. \brief Linear interpolation
  437. \param dt coeficient
  438. \param val2 value 2
  439. \param val1 value 1
  440. \return val1 + dt * (val2 - val1)
  441. */
  442. double lin_interp(float dt, float val1, float val2)
  443. {
  444. return ((double)(val1 + dt * (val2 - val1)));
  445. }
  446. /*!
  447. \brief Finds interval containing time, putting left (or equal) key
  448. at km1, right at kp1
  449. \param nvk
  450. \param time
  451. \param range
  452. \param loop
  453. \param karray
  454. \param km1
  455. \param km2
  456. \return interval value
  457. */
  458. double get_2key_neighbors(int nvk, float time, float range, int loop,
  459. Keylist * karray[], Keylist ** km1, Keylist ** kp1)
  460. {
  461. int i;
  462. double len;
  463. *km1 = *kp1 = NULL;
  464. for (i = 0; i < nvk; i++) {
  465. if (time < karray[i]->pos) {
  466. break;
  467. }
  468. }
  469. if (!i) {
  470. return (0.0); /* before first keyframe or nvk == 0 */
  471. }
  472. if (i == nvk) {
  473. /* past or == last keyframe! */
  474. *km1 = karray[nvk - 1];
  475. return (0.0);
  476. }
  477. /* there's at least 2 */
  478. *km1 = karray[i - 1];
  479. *kp1 = karray[i];
  480. len = karray[i]->pos - karray[i - 1]->pos;
  481. return (len);
  482. }
  483. /*!
  484. \brief Generate viewnode from keyframe list (linear interpolation)
  485. Here we use linear interpolation. Loop variable isn't used, but left
  486. in for use in possible "linear interp with smoothing" version.
  487. \param kesy keyframe list
  488. \param keysteps step value
  489. \param newsteps new step value
  490. \param loop loop indicator
  491. \param pointer to viewnode struct
  492. \param NULL on failure
  493. */
  494. Viewnode *gk_make_linear_framesfromkeys(Keylist * keys, int keysteps,
  495. int newsteps, int loop)
  496. {
  497. int i, nvk;
  498. Viewnode *v, *newview;
  499. Keylist *k, *k1, *k2, **tkeys;
  500. float startpos, endpos, dt, range, time, time_step, len;
  501. /* allocate tmp keys to hold valid keys for fields */
  502. tkeys = (Keylist **) G_malloc(keysteps * sizeof(Keylist *)); /* G_fatal_error */
  503. if (!tkeys) {
  504. return (NULL);
  505. }
  506. correct_twist(keys);
  507. if (keys && keysteps) {
  508. if (keysteps < 2) {
  509. G_warning(_("Need at least 2 keyframes for interpolation"));
  510. G_free(tkeys);
  511. return (NULL);
  512. }
  513. /* find end key */
  514. for (k = keys; k->next; k = k->next) ;
  515. startpos = keys->pos;
  516. endpos = k->pos;
  517. range = endpos - startpos;
  518. time_step = range / (newsteps - 1);
  519. newview = (Viewnode *) G_malloc(newsteps * sizeof(Viewnode)); /* G_fatal_error */
  520. if (!newview) { /* not used */
  521. G_free(tkeys);
  522. return (NULL);
  523. }
  524. for (i = 0; i < newsteps; i++) {
  525. int field = 0;
  526. v = &newview[i];
  527. time = startpos + i * time_step;
  528. if (i == newsteps - 1) {
  529. time = endpos; /*to ensure no roundoff errors */
  530. }
  531. for (field = 0; field < KF_NUMFIELDS; field++) {
  532. nvk = gk_viable_keys_for_mask((unsigned long)(1 << field),
  533. keys, tkeys);
  534. if (!nvk) {
  535. v->fields[field] = keys->fields[field]; /*default-not used */
  536. }
  537. else {
  538. len = get_2key_neighbors(nvk, time, range, loop,
  539. tkeys, &k1, &k2);
  540. }
  541. /* ACS 1 line: was if (len == 0.0) {
  542. when disabling a channel no calculation must be made at all (otherwise core dump)
  543. */
  544. if (len == 0.0 || nvk == 0) {
  545. if (!k1) {
  546. /* none valid - use first.
  547. (when showing , will be ignored anyway) */
  548. v->fields[field] = keys->fields[field];
  549. }
  550. else if (!k2) {
  551. /* none on right - use left */
  552. v->fields[field] = k1->fields[field];
  553. }
  554. }
  555. else {
  556. dt = (time - k1->pos) / len;
  557. v->fields[field] = lin_interp(dt,
  558. k1->fields[field],
  559. k2->fields[field]);
  560. }
  561. }
  562. }
  563. G_free(tkeys);
  564. return (newview);
  565. }
  566. else {
  567. G_free(tkeys);
  568. return (NULL);
  569. }
  570. }
  571. /*!
  572. \brief Correct twist value
  573. \param k keyframe list
  574. */
  575. void correct_twist(Keylist * k)
  576. {
  577. Keylist *c, *p, *t;
  578. int cnt, j;
  579. p = NULL;
  580. cnt = 0;
  581. for (c = k; c; c = c->next) {
  582. if (p) {
  583. if ((c->fields[KF_TWIST] - p->fields[KF_TWIST]) > 1800.) {
  584. for (t = c; t; t = t->next) {
  585. t->fields[KF_TWIST] -= 3600.;
  586. }
  587. }
  588. else if ((p->fields[KF_TWIST] - c->fields[KF_TWIST]) > 1800.) {
  589. for (t = k, j = 0; j < cnt; j++, t = t->next) {
  590. t->fields[KF_TWIST] -= 3600.;
  591. }
  592. }
  593. }
  594. p = c;
  595. ++cnt;
  596. }
  597. return;
  598. }
  599. /*!
  600. \brief Draw path
  601. \param views Viewnode struct
  602. \param steps step value
  603. \param keys keyframe list
  604. \return 0 on failure
  605. \return 1 on success
  606. */
  607. int gk_draw_path(Viewnode * views, int steps, Keylist * keys)
  608. {
  609. Viewnode *v;
  610. Keylist *k;
  611. int frame;
  612. float siz, from[3];
  613. if (!views || !keys) {
  614. return (0);
  615. }
  616. GS_get_longdim(&siz);
  617. siz /= 200.;
  618. gsd_colormode(CM_COLOR);
  619. gsd_linewidth(2);
  620. gsd_color_func(GS_default_draw_color());
  621. gsd_zwritemask(0);
  622. gsd_bgnline();
  623. for (frame = 0; frame < steps; frame++) {
  624. v = &views[frame];
  625. gsd_vert_func(&(v->fields[KF_FROMX]));
  626. }
  627. gsd_endline();
  628. gsd_linewidth(1);
  629. for (k = keys; k; k = k->next) {
  630. gsd_x(NULL, &(k->fields[KF_FROMX]),
  631. ~(GS_background_color() | 0xFF0000), siz);
  632. }
  633. /* draw viewer position for inset images */
  634. GS_get_from(from);
  635. gsd_x(NULL, from, ~(GS_default_draw_color() | 0xFFFF00), 3.0 * siz);
  636. gsd_zwritemask(0xffffffff);
  637. return (1);
  638. }