diff -urN wf-/eye.c wf/eye.c --- wf-/eye.c 2015-12-13 00:00:00.000000000 +0900 +++ wf/eye.c 2015-12-18 00:00:00.000000000 +0900 @@ -1,7 +1,28 @@ +#include "util.h" #include "eye.h" +static void +alloc_way(eye_t *e, int n) +{ + struct way *way = &e->p_way; + + way->n = n; + way->vs = NULL; + if((way->ps = malloc(sizeof(*way->ps) * n * 2)) == NULL) ERR("No Mem"); + if((way->ts = malloc(sizeof(*way->ts) * n)) == NULL) ERR("No Mem"); + way->dg = 3; + + way = &e->t_way; + + way->n = n; + way->vs = NULL; + way->ps = e->p_way.ps + n; + way->ts = e->p_way.ts; + way->dg = 3; +} + void -eye_init(eye_t *e, int w, int h) +eye_init(eye_t *e, int w, int h, int ac, char **av) { pos_t o, wh[4]; int i; @@ -21,6 +42,29 @@ e->move_deg = 1; e->zoom_rate = 0.1; + + e->way_cnt = 0; + e->save = opt_str("-eye_save", ac, av, NULL); + if((e->load = opt_str("-eye_load", ac, av, NULL)) != NULL){ + int n; + FILE *fp; + + if((fp = fopen(e->load, "r")) == NULL) ERR("Can't open"); + fscanf(fp, "n=%d\n", &n); + alloc_way(e, n); + for(i=0; ip_way.ps[i].x, &e->p_way.ps[i].y, &e->p_way.ps[i].z, + &e->t_way.ps[i].x, &e->t_way.ps[i].y, &e->t_way.ps[i].z, + &e->p_way.ts[i]); + } + fclose(fp); + }else{ + alloc_way(e, 256); + } + + e->fps = opt_double("-fps", ac, av, 60); + e->start_sec = -1; } void @@ -102,4 +146,39 @@ e->sy = e->ey + h - 1; } +void +eye_rec(eye_t *e) +{ + if(e->way_cnt >= e->p_way.n) return; + e->p_way.ps[ e->way_cnt ] = e->p; + e->p_way.ts[ e->way_cnt ] = 1; + e->t_way.ps[ e->way_cnt++ ] = e->t; +} + +void +eye_bak(eye_t *e) +{ + if(e->way_cnt <= 0) return; + e->way_cnt--; + e->p = e->p_way.ps[ e->way_cnt ]; + e->t = e->t_way.ps[ e->way_cnt ]; +} +void +eye_save(eye_t *e) +{ + FILE *fp; + int i; + + if(!e->save) return; + + if((fp = fopen(e->save, "w")) == NULL) ERR("Can't open"); + fprintf(fp, "n=%d\n", e->way_cnt); + for(i=0; iway_cnt; i++){ + fprintf(fp, "p=(%f %f %f),t=(%f %f %f),s=%f\n", + e->p_way.ps[i].x, e->p_way.ps[i].y, e->p_way.ps[i].z, + e->t_way.ps[i].x, e->t_way.ps[i].y, e->t_way.ps[i].z, + e->p_way.ts[i]); + } + fclose(fp); +} diff -urN wf-/eye.h wf/eye.h --- wf-/eye.h 2015-12-13 00:00:00.000000000 +0900 +++ wf/eye.h 2015-12-18 00:00:00.000000000 +0900 @@ -1,7 +1,7 @@ #ifndef __EYE_H__ #define __EYE_H__ -#include "d3.h" +#include "way.h" typedef struct{ double len, w, h; @@ -12,15 +12,24 @@ plane_t clip[4]; axis_t ax; + + int way_cnt; + struct way p_way, t_way; + char *save, *load; + double fps, start_sec, sec; } eye_t; #define EYE_MOVE_MODE_N 4 -void eye_init(eye_t *e, int w, int h); +void eye_init(eye_t *e, int w, int h, int ac, char **av); void eye_update(eye_t *e); int eye_conv(const eye_t *e, const pos_t *p, int *rx, int *ry); int eye_clip(const eye_t *e, pos_t *a, pos_t *b); void eye_move(eye_t *e, int mode, int h_v, int v); void eye_set_div4(eye_t *e, int x, int y); +void eye_rec(eye_t *e); +void eye_bak(eye_t *e); +void eye_save(eye_t *e); + #endif diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c 2015-12-17 00:00:00.000000000 +0900 +++ wf/wf_ex.c 2015-12-18 00:00:00.000000000 +0900 @@ -5,11 +5,29 @@ #include "eye.h" #include "data.h" +static double +now_sec(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec * 0.000001; +} + static int key_work(eye_t *e, int *mode) { + double us, sec; + + if(e->start_sec < 0){ + if(e->load){ + while(cui_key_get2() == 0) usleep(1000); + } + e->start_sec = now_sec(); + } + switch(cui_key_get2()){ case 'q': + eye_save(e); return EOF; case ' ': case CUI_KEY_ENTER: @@ -30,10 +48,27 @@ case CUI_KEY_RIGHT: eye_move(e, *mode, 'h', 1); break; + case 'r': + eye_rec(e); + break; + case 'b': + eye_bak(e); + break; default: - usleep(1*1000); break; } + + sec = now_sec() - e->start_sec; + if(e->load){ + way_get(&e->p_way, sec); + e->p = e->p_way.ret_p; + way_get(&e->t_way, sec); + e->t = e->t_way.ret_p; + } + us = (1 / e->fps - (sec - e->sec)) * 1000000; + if(us > 0) usleep(us); + + e->sec = sec; return 0; } @@ -95,14 +130,6 @@ *op = -1; } -static double -now_sec(void) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_sec + tv.tv_usec * 0.000001; -} - int main(int ac, char **av) { @@ -113,7 +140,6 @@ struct wire_frame wf; data_t data = { type_end, NULL }; prm_t prm; - double start_sec; cui_key_init(); cui_key_fd_add(0); @@ -122,7 +148,7 @@ xinit(ac, av, &w, &h); if(opt_idx("-ximg", ac, av) > 0) ximg_curr = ximg_alloc(); - eye_init(&eye, w, h); + eye_init(&eye, w, h, ac, av); d3_set(&eye.p, 0, -4, 4); d3_set(&eye.t, 2, 2, 0); @@ -183,12 +209,10 @@ }; } - start_sec = now_sec(); - while(key_work(&eye, &mode) != EOF){ xclear(); - prm.sec = now_sec() - start_sec; + prm.sec = eye.sec; if(mode % 2 == 1){ int x, y;