gk.c 16 KB

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