23#include <grass/glocale.h>
24#include <grass/ogsf.h>
26static float spl3(
float,
double,
double,
double,
double,
double,
double,
29static float spl3(
float tension,
double data0,
double data1,
double x,
30 double x2,
double x3,
double lderiv,
double rderiv)
33 (data0 * (2 * x3 - 3 * x2 + 1) + data1 * (-2 * x3 + 3 * x2) +
34 (
double)tension * lderiv * (x3 - 2 * x2 +
x) +
35 (
double)tension * rderiv * (x3 - x2)));
50 newk = (Keylist *) G_malloc(
sizeof(Keylist));
55 for (i = 0; i < KF_NUMFIELDS; i++) {
56 newk->fields[i] = k->fields[i];
60 newk->look_ahead = k->look_ahead;
61 newk->fieldmask = k->fieldmask;
62 newk->next = newk->prior =
NULL;
82 float startpos, endpos, curpos;
83 unsigned long mask = 0xFFFFFFFF;
87 for (k = keys; k->next; k = k->next) ;
91 curpos = startpos + time * (endpos - startpos);
93 for (k = keys; k->next; k = k->next) {
94 if (k->pos <= curpos) {
118 for (k = keys; k; k = k->next) {
119 if ((mask & k->fieldmask) == mask) {
142 int onestep,
int render,
unsigned long mode)
151 for (frame = step - 1; frame < numsteps; frame++) {
161 if ((mask & KF_FROMX_MASK)) {
162 tmp[
X] = v->fields[KF_FROMX];
164 if ((mask & KF_FROMY_MASK)) {
165 tmp[
Y] = v->fields[KF_FROMY];
167 if ((mask & KF_FROMZ_MASK)) {
168 tmp[Z] = v->fields[KF_FROMZ];
174 G_debug(3,
"gk_follow_frames():");
175 G_debug(3,
" MASK: %lx", mask);
176 G_debug(3,
" FROM: %f %f %f", tmp[
X], tmp[
Y], tmp[Z]);
183 if ((mask & KF_DIRX_MASK)) {
184 tmp[
X] = v->fields[KF_DIRX];
186 if ((mask & KF_DIRY_MASK)) {
187 tmp[
Y] = v->fields[KF_DIRY];
189 if ((mask & KF_DIRZ_MASK)) {
190 tmp[Z] = v->fields[KF_DIRZ];
198 G_debug(3,
"gk_follow_frames():");
200 G_debug(3,
" DIR: %f %f %f\n", tmp[
X], tmp[
Y], tmp[Z]);
202 if ((mask & KF_TWIST_MASK)) {
206 if ((mask & KF_FOV_MASK)) {
236 if (mode & FM_PATH) {
240 if (mode & FM_VECT) {
244 if (mode & FM_SITE) {
254 if (mode & FM_LABEL) {
305 Viewnode *v, *newview;
306 Keylist *k, *kp1, *kp2, *km1, **tkeys;
307 float startpos, endpos;
308 double dt1, dt2,
x, x2, x3, range, time, time_step, len, rderiv, lderiv;
311 tkeys = (Keylist **) G_malloc(keysteps *
sizeof(Keylist *));
318 if (keys && keysteps) {
320 G_warning(_(
"Need at least 3 keyframes for spline"));
326 for (k = keys; k->next; k = k->next) ;
328 startpos = keys->pos;
330 range = endpos - startpos;
331 time_step = range / (newsteps - 1);
333 newview = (Viewnode *) G_malloc(newsteps *
sizeof(Viewnode));
339 for (i = 0; i < newsteps; i++) {
344 time = startpos + i * time_step;
346 if (i == newsteps - 1) {
350 for (field = 0; field < KF_NUMFIELDS; field++) {
354 k = kp1 = kp2 = km1 =
NULL;
359 loop, tkeys, &k, &kp1, &kp2, &km1,
366 if (len == 0.0 || nvk == 0) {
370 v->fields[field] = keys->fields[field];
374 v->fields[field] = k->fields[field];
379 else if (!km1 && !kp2) {
381 v->fields[field] =
lin_interp((time - k->pos) / len,
387 x = (time - k->pos) / len;
393 rderiv = (kp2->fields[field] - k->fields[field]) / dt2;
394 lderiv = (3 * (kp1->fields[field] -
395 k->fields[field]) / dt1 - rderiv) / 2.0;
396 v->fields[field] = spl3(
t, k->fields[field],
397 kp1->fields[field],
x, x2, x3,
402 lderiv = (kp1->fields[field] - km1->fields[field]) / dt1;
403 rderiv = (3 * (kp1->fields[field] -
404 k->fields[field]) / dt2 - lderiv) / 2.0;
405 v->fields[field] = spl3(
t, k->fields[field],
406 kp1->fields[field],
x, x2, x3,
411 lderiv = (kp1->fields[field] - km1->fields[field]) / dt1;
412 rderiv = (kp2->fields[field] - k->fields[field]) / dt2;
413 v->fields[field] = spl3(
t, k->fields[field],
414 kp1->fields[field],
x, x2, x3,
456 Keylist * karray[], Keylist ** km1, Keylist ** kp1,
457 Keylist ** kp2, Keylist ** km2,
double *dt1,
463 *km1 = *kp1 = *kp2 = *km2 =
NULL;
466 for (i = 0; i < nvk; i++) {
467 if (time < karray[i]->pos) {
478 *km1 = karray[nvk - 1];
483 *km1 = karray[i - 1];
485 len = karray[i]->pos - karray[i - 1]->pos;
490 *km2 = karray[nvk - 2];
491 *kp2 = karray[(i + 1) % nvk];
495 *kp2 = karray[i + 1];
499 else if (i == nvk - 1) {
502 *km2 = nvk > 2 ? karray[i - 2] : karray[1];
507 *km2 = karray[i - 2];
512 *km2 = karray[i - 2];
513 *kp2 = karray[i + 1];
516 *dt1 = (*km2) ? (*kp1)->pos - (*km2)->pos : len;
517 *dt2 = (*kp2) ? (*kp2)->pos - (*km1)->pos : len;
519 if (i == 1 && loop) {
523 if (i == nvk - 1 && loop) {
541 return ((
double)(val1 + dt * (val2 - val1)));
559 Keylist * karray[], Keylist ** km1, Keylist ** kp1)
566 for (i = 0; i < nvk; i++) {
567 if (time < karray[i]->pos) {
578 *km1 = karray[nvk - 1];
583 *km1 = karray[i - 1];
585 len = karray[i]->pos - karray[i - 1]->pos;
605 int newsteps,
int loop)
608 Viewnode *v, *newview;
609 Keylist *k, *k1, *k2, **tkeys;
610 float startpos, endpos, dt, range, time, time_step, len;
613 tkeys = (Keylist **) G_malloc(keysteps *
sizeof(Keylist *));
620 if (keys && keysteps) {
622 G_warning(_(
"Need at least 2 keyframes for interpolation"));
628 for (k = keys; k->next; k = k->next) ;
630 startpos = keys->pos;
632 range = endpos - startpos;
633 time_step = range / (newsteps - 1);
635 newview = (Viewnode *) G_malloc(newsteps *
sizeof(Viewnode));
641 for (i = 0; i < newsteps; i++) {
646 time = startpos + i * time_step;
647 if (i == newsteps - 1) {
651 for (field = 0; field < KF_NUMFIELDS; field++) {
656 v->fields[field] = keys->fields[field];
666 if (len == 0.0 || nvk == 0) {
670 v->fields[field] = keys->fields[field];
674 v->fields[field] = k1->fields[field];
678 dt = (time - k1->pos) / len;
707 for (c = k; c; c = c->next) {
709 if ((c->fields[KF_TWIST] - p->fields[KF_TWIST]) > 1800.) {
710 for (
t = c;
t;
t =
t->next) {
711 t->fields[KF_TWIST] -= 3600.;
714 else if ((p->fields[KF_TWIST] - c->fields[KF_TWIST]) > 1800.) {
715 for (
t = k, j = 0; j < cnt; j++,
t =
t->next) {
716 t->fields[KF_TWIST] -= 3600.;
745 if (!views || !keys) {
759 for (frame = 0; frame < steps; frame++) {
769 for (k = keys; k; k = k->next) {
void G_free(void *buf)
Free allocated memory.
int G_debug(int level, const char *msg,...)
Print debugging message.
void G_warning(const char *msg,...)
Print a warning message to stderr.
double lin_interp(float dt, float val1, float val2)
Linear interpolation.
void correct_twist(Keylist *k)
Correct twist value.
double get_2key_neighbors(int nvk, float time, float range, int loop, Keylist *karray[], Keylist **km1, Keylist **kp1)
Finds interval containing time, putting left (or equal) key at km1, right at kp1.
unsigned long gk_get_mask_sofar(float time, Keylist *keys)
Get mask value.
double get_key_neighbors(int nvk, double time, double range, int loop, Keylist *karray[], Keylist **km1, Keylist **kp1, Keylist **kp2, Keylist **km2, double *dt1, double *dt2)
Find interval containing time.
void gk_free_key(Keylist *ok)
Free keyframe list.
int gk_draw_path(Viewnode *views, int steps, Keylist *keys)
Draw path.
Keylist * gk_copy_key(Keylist *k)
Copy keyframes.
Viewnode * gk_make_framesfromkeys(Keylist *keys, int keysteps, int newsteps, int loop, float t)
Generate viewnode from keyframes.
Viewnode * gk_make_linear_framesfromkeys(Keylist *keys, int keysteps, int newsteps, int loop)
Generate viewnode from keyframe list (linear interpolation)
int gk_viable_keys_for_mask(unsigned long mask, Keylist *keys, Keylist **keyret)
ADD.
void gk_follow_frames(Viewnode *view, int numsteps, Keylist *keys, int step, int onestep, int render, unsigned long mode)
Checks key masks.
void GP_alldraw_site(void)
Draw all available point sets.
void GS_alldraw_cplane_fences(void)
Draw all cplace fences ?
void GS_draw_all_list(void)
Draw all glLists.
unsigned int GS_default_draw_color(void)
Get default draw color.
void GS_get_from(float *fr)
Get viewpoint 'from' position.
void GS_get_viewdir(float *dir)
Get viewdir.
void GS_alldraw_wire(void)
Draw all wires.
void GS_clear(int col)
Clear view.
void GS_set_viewdir(float *dir)
Set viewdir.
void GS_moveto(float *pt)
Move viewpoint.
void GS_setlight_position(int num, float xpos, float ypos, float zpos, int local)
Set light position.
unsigned int GS_background_color(void)
Get background color.
void GS_alldraw_surf(void)
Draw all surfaces.
void GS_set_draw(int where)
Sets which buffer to draw to.
int GS_get_longdim(float *dim)
Get largest dimension.
void GS_getlight_position(int num, float *xpos, float *ypos, float *zpos, int *local)
Get light position.
void GS_done_draw(void)
Draw done, swap buffers.
void GS_set_fov(int fov)
Set field of view.
void GS_set_twist(int t)
Set viewpoint twist value.
void gsd_x(geosurf *gs, float *center, int colr, float siz)
Draw X symbol.
void gsd_zwritemask(unsigned long n)
Write out z-mask.
void gsd_vert_func(float *pt)
ADD.
void gsd_colormode(int cm)
Set color mode.
void gsd_endline(void)
End line.
void gsd_bgnline(void)
Begin line.
void gsd_color_func(unsigned int col)
Set current color.
void gsd_linewidth(short n)
Set width of rasterized lines.
void GV_alldraw_vect(void)
Draw all loaded vector sets.
void GVL_alldraw_vol(void)
Draw all volume sets.