22 #include <grass/gis.h> 23 #include <grass/glocale.h> 24 #include <grass/ogsf.h> 26 static float spl3(
float,
double,
double,
double,
double,
double,
double,
29 static 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 gsd_zwritemask(unsigned long n)
Write out z-mask.
void gk_free_key(Keylist *ok)
Free keyframe list.
unsigned long gk_get_mask_sofar(float time, Keylist *keys)
Get mask value.
double lin_interp(float dt, float val1, float val2)
Linear interpolation.
void GS_get_from(float *fr)
Get viewpoint 'from' position.
void GS_alldraw_cplane_fences(void)
Draw all cplace fences ?
unsigned int GS_default_draw_color(void)
Get default draw color.
void GS_setlight_position(int num, float xpos, float ypos, float zpos, int local)
Set light position.
void GS_draw_all_list(void)
Draw all glLists.
Viewnode * gk_make_framesfromkeys(Keylist *keys, int keysteps, int newsteps, int loop, float t)
Generate viewnode from keyframes.
void GV_alldraw_vect(void)
Draw all loaded vector sets.
void gsd_colormode(int cm)
Set color mode.
void GS_getlight_position(int num, float *xpos, float *ypos, float *zpos, int *local)
Get light position.
void GS_set_viewdir(float *dir)
Set viewdir.
void correct_twist(Keylist *k)
Correct twist value.
void gsd_color_func(unsigned int col)
Set current color.
void GS_moveto(float *pt)
Move viewpoint.
void gsd_x(geosurf *gs, float *center, int colr, float siz)
Draw X symbol.
int gk_draw_path(Viewnode *views, int steps, Keylist *keys)
Draw path.
Viewnode * gk_make_linear_framesfromkeys(Keylist *keys, int keysteps, int newsteps, int loop)
Generate viewnode from keyframe list (linear interpolation)
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 GS_set_twist(int t)
Set viewpoint twist value.
void gsd_endline(void)
End line.
int gk_viable_keys_for_mask(unsigned long mask, Keylist *keys, Keylist **keyret)
ADD.
int G_debug(int level, const char *msg,...)
Print debugging message.
void gk_follow_frames(Viewnode *view, int numsteps, Keylist *keys, int step, int onestep, int render, unsigned long mode)
Checks key masks.
void GS_clear(int col)
Clear view.
void GP_alldraw_site(void)
Draw all available point sets.
int GS_get_longdim(float *dim)
Get largest dimension.
unsigned int GS_background_color(void)
Get background color.
void GS_get_viewdir(float *dir)
Get viewdir.
void gsd_vert_func(float *pt)
ADD.
void GVL_alldraw_vol(void)
Draw all volume sets.
void GS_set_draw(int where)
Sets which buffer to draw to.
void GS_alldraw_surf(void)
Draw all surfaces.
void gsd_linewidth(short n)
Set width of rasterized lines.
void GS_alldraw_wire(void)
Draw all wires.
void GS_set_fov(int fov)
Set field of view.
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. ...
void G_free(void *buf)
Free allocated memory.
void gsd_bgnline(void)
Begin line.
void G_warning(const char *msg,...)
Print a warning message to stderr.
Keylist * gk_copy_key(Keylist *k)
Copy keyframes.
void GS_done_draw(void)
Draw done, swap buffers.