diff -urN wf-/d3.h wf/d3.h --- wf-/d3.h 2016-01-13 00:00:00.000000000 +0900 +++ wf/d3.h 2016-01-29 00:00:00.000000000 +0900 @@ -55,6 +55,7 @@ #define LINE_X_NEG {D3_O, D3_X_NEG} #define LINE_Y_NEG {D3_O, D3_Y_NEG} #define LINE_Z_NEG {D3_O, D3_Z_NEG} +#define LINE_I {D3_O, D3_I} typedef struct{ pos_t o; diff -urN wf-/data.c wf/data.c --- wf-/data.c 2016-01-25 00:00:00.000000000 +0900 +++ wf/data.c 2016-01-29 00:00:00.000000000 +0900 @@ -16,6 +16,7 @@ CASE_RET(type_cross); CASE_RET(type_square); CASE_RET(type_cube); + CASE_RET(type_box); CASE_RET(type_circle); CASE_RET(type_circle_y); CASE_RET(type_circle_x); @@ -47,6 +48,7 @@ CASE_RET(type_rdiv_way); CASE_RET(type_rail_way); CASE_RET(type_train_way); + CASE_RET(type_copy_ops); CASE_RET(type_copy); CASE_RET(type_copy_rot); CASE_RET(type_copy_domino); @@ -262,6 +264,55 @@ } static void +box_draw(struct box *box, prm_t *prm) +{ + struct wire_frame *wf = &box->wf; + data_t data = { type_wire_frame, wf }; + + if(wf->n == 0){ + d3_t *len = &box->len, p, ps[8]; + int odr_2[] = { 0,1,-1, -1, }; + int odr_4[] = { 0,1,3,2,0, -1, -1 }; + int odr_8[] = { 0,1,3,2,0,4,5,7,6,4,-1, + 1,5,-1, 2,6,-1, 3,7,-1, -1 }; + int *odrs[] = { odr_2, odr_4, odr_8 }; + int odr_ns[] = { ARR_N(odr_2), ARR_N(odr_4), ARR_N(odr_8) }; + int idx, i; + + for(p.z = -len->z*0.5; p.z <= len->z*0.5; p.z += len->z>0 ? len->z : 1){ + for(p.y = -len->y*0.5; p.y <= len->y*0.5; p.y += len->y>0 ? len->y : 1){ + for(p.x = -len->x*0.5; p.x <= len->x*0.5; p.x += len->x>0 ? len->x : 1){ + ps[ wf->n ] = p; + d3_add(&ps[ wf->n ], &box->p); + wf->n++; + } + } + } + ALLOC_N_D3(wf->p, wf->n); + for(i=0; in; i++) wf->p[i] = ps[i]; + + switch(wf->n){ + case 2: + idx = 0; + break; + case 4: + idx = 1; + break; + default: + idx = 2; + break; + } + + ALLOC_N_INT(wf->odr, odr_ns[idx]); + for(i=0; iodr[i] = odrs[idx][i]; + + ALLOC_WF(*wf); + } + + data_draw(&data, prm); +} + +static void circle_draw(struct circle *c, prm_t *prm) { int i, n = c->n; @@ -441,6 +492,9 @@ case type_cube: cube_draw(prm); break; + case type_box: + box_draw(data->p, prm); + break; case type_circle: circle_draw(data->p, prm); break; @@ -730,6 +784,14 @@ } static void +op_data_copy_ops(data_t *ops, data_t *data, prm_t *prm) +{ + for(; ops->type != type_end; ops++){ + op_data_draw(ops, data, prm); + } +} + +static void op_data_copy(struct copy *copy, data_t *data, prm_t *prm) { int x, y, z; @@ -857,18 +919,18 @@ static void op_data_recursive(struct recursive *r, data_t *data, prm_t *prm) { + struct recursive bak = *r; data_t op = { type_arr, (data_t[]){ r->op, { type_recursive, r }, { type_end } }}; - if(r->cnt >= r->n){ - r->cnt = 0; - return; - } + if(r->cnt >= r->n) return; data_draw(data, prm); + r->cnt++; op_data_draw(&op, data, prm); + *r = bak; } void @@ -954,6 +1016,9 @@ op_data_train_way(op->p, data, prm); break; + case type_copy_ops: + op_data_copy_ops(op->p, data, prm); + break; case type_copy: op_data_copy(op->p, data, prm); break; diff -urN wf-/data.h wf/data.h --- wf-/data.h 2016-01-27 00:00:00.000000000 +0900 +++ wf/data.h 2016-01-29 00:00:00.000000000 +0900 @@ -18,6 +18,7 @@ #define type_cross 2 #define type_square 3 #define type_cube 4 +#define type_box 23 #define type_circle 5 #define type_circle_y 21 #define type_circle_x 22 @@ -55,6 +56,7 @@ #define type_rail_way 132 #define type_train_way 133 +#define type_copy_ops 210 #define type_copy 200 #define type_copy_rot 201 #define type_copy_domino 207 @@ -81,6 +83,11 @@ int line_n; }; +struct box{ + d3_t len, p; + struct wire_frame wf; +}; + struct circle{ double r; int n; diff -urN wf-/wf_ex.c wf/wf_ex.c --- wf-/wf_ex.c 2016-01-27 00:00:00.000000000 +0900 +++ wf/wf_ex.c 2016-01-29 00:00:00.000000000 +0900 @@ -259,17 +259,14 @@ .l=LINE_Y, .deg_way=WAY_V2(0,-360, 10,0, 1) } }, DEND }}, .data = { type_arr, (data_t[]){ - { DTYPE_REC(op_data_set){ - .op = { type_zoom_and_slide, (d3_t[]){{3,1,1},{10-3,0,0}} }, - .data = { type_square } }}, + { DTYPE_REC(box){.len={6,2,0},.p={10-3,0,0} }}, { DTYPE_REC(op_data_set){ .op = { type_arr, (data_t[]){ { type_slide, &(d3_t){10,0,0} }, { DTYPE_REC(rot_way){ .l=LINE_Y, .deg_way=WAY_V2(0,360, 10,0, 1) }}, - { type_slide, &(d3_t){0,0,-1} }, DEND }}, - .data = { type_cube } }}, + .data = { DTYPE_REC(box){.len={2,2,2},.p={0,0,-1}} } }}, DEND }} }}; @@ -307,9 +304,8 @@ { type_slide, &(d3_t){0,0,2} }, { DTYPE_REC(rot_way){ .l=LINE_Y, .deg_way=WAY_V2(0,-360, 2,0, 3) } }, - { DTYPE_REC(rot){ .l=LINE_X, .deg=90 } }, DEND }}, - .data = { type_square } + .data = { DTYPE_REC(box){.len={2,0,2}} } }}; data_t *lissajours = &(data_t){ DTYPE_REC(op_data_set){ @@ -319,7 +315,7 @@ { DTYPE_REC(slide_way_liss){ .ps={-20,-20,-20},.pe={20,20,20},.sec={5*2,4.5*2,3*2},.init_sec={0,0,0}} }, { DTYPE_REC(rot_way){ - .l={D3_O,D3_I}, .deg_way=WAY_V2(0,360*2, 1,1, 3) } }, + .l=LINE_I, .deg_way=WAY_V2(0,360*2, 1,1, 3) } }, { type_zoom_all_way, &(struct way)WAY_V2(0,2, 3,3, 3) }, DEND }}, .data = { DTYPE_REC(circle){ .r=1,.n=10*4 } } @@ -332,7 +328,7 @@ double *spin_vs = (double[]){0, 0, 0, 360*3, 0, 0, 0}; double *spin_ts = (double[]){sky_sec+pipe_sec*2, 0, sky_sec, sky_sec, 0, pipe_sec*2+sky_sec}; struct way spin_way = {.n=6,.vs=spin_vs,.ts=spin_ts,.dg=3}; - data_t spin1 = { DTYPE_REC(rot_way){.l={D3_O,D3_I},.deg_way=spin_way} }; + data_t spin1 = { DTYPE_REC(rot_way){.l=LINE_I,.deg_way=spin_way} }; data_t spin2 = { DTYPE_REC(rot_way){.l=LINE_Z,.deg_way=spin_way} }; data_t spin = { type_arr, (data_t[]){ spin1, spin2, DEND }}; @@ -383,7 +379,7 @@ .ps=(d3_t[]){D3_O,{0,0,100},D3_O, D3_O}, .ts=(double[]){3+1.5, 1.5+4, 3, 0} }}, { DTYPE_REC(copy_rot){ - .n=10, .l={D3_O,D3_I}, .init_deg=0, .step_deg=360/10 } }, + .n=10, .l=LINE_I, .init_deg=0, .step_deg=360/10 } }, { DTYPE_REC(copy_rot){ .n=10, .l=LINE_Y, .init_deg=0, .step_deg=180.0/10 } }, { DTYPE_REC(way){ @@ -412,9 +408,8 @@ .n=2, .init_sec=0, .step_sec=8, .init=D3_O, .step=D3_O }}, { type_slide, &(d3_t){0,-4*a,0} }, { DTYPE_REC(train_way){.n=6, .len=4, .len2=8, .way=*rail} }, - { type_zoom_and_slide, (d3_t[]){ {1,6,1},{0,-2,0} } }, DEND }}, - .data = { type_cube } }}; + .data = { DTYPE_REC(box){.len={2,12,2},.p={0,-2,0} }} }}; data_t *rail1 = &(data_t){ DTYPE_REC(op_data_set){ .op = { type_slide, &(d3_t){0,-4*a,0} }, @@ -543,19 +538,15 @@ .data = { type_bar, (pos_t[]){ {0.2,0,0}, D3_X } } }}; double t1 = 0.8, r1 = 10; - data_t *gallop = &(data_t){ DTYPE_REC(op_data_set) { + data_t *gallop = &(data_t){ DTYPE_REC(op_data_set){ .op = { type_arr, (data_t[]){ { DTYPE_REC(copy_timeshift){.n=3,.step_sec=-t1*r1*0.2} }, { DTYPE_REC(rot_way){.l=LINE_Z,.deg_way=WAY_V2(0,360, t1*r1*2,0, 1) }}, { type_slide, &(d3_t){0,r1,0} }, DEND }}, .data = { type_arr, (data_t[]){ - { DTYPE_REC(op_data_set){ - .op = { type_arr, (data_t[]){ - { DTYPE_REC(copy){.n={1,1,2},.init={0,0,-0.25},.step={0,0,0.5}} }, - { type_zoom, &(d3_t){1,0.5,1} }, - DEND }}, - .data = { type_square } }}, + { DTYPE_REC(box){.len={2,1,0},.p={0,0,-0.25}} }, + { DTYPE_REC(box){.len={2,1,0},.p={0,0,0.25}} }, { DTYPE_REC(op_data_set){ .op = { type_arr, (data_t[]){ { DTYPE_REC(copy_timeshift){.n=2,.step_sec=-0.3,.init={-1,0,0},.step={2,0,0}} }, @@ -574,6 +565,24 @@ DEND }} }}, DEND }} }}; + data_t *mandala = &(data_t){ DTYPE_REC(op_data_set){ + .op = { type_arr, (data_t[]){ + { DTYPE_REC(slide_way_liss){.ps=D3_ALL(-1),.pe=D3_ALL(1),.sec={11,12,13}} }, + { DTYPE_REC(rot_way){.l=LINE_Z,.deg_way=WAY_V2(0,360, 10,10, 3)} }, + { DTYPE_REC(recursive){ + .n = 3, + .op = { type_copy_ops, (data_t[]){ + { type_zoom_and_slide, (d3_t[]){ D3_ALL(0.5), D3_O } }, + { type_arr, (data_t[]){ + { DTYPE_REC(copy_rot){.n=3,.l=LINE_I,.step_deg=120} }, + { DTYPE_REC(copy){.n={2,1,1},.init={-0.75,0,0},.step={1.5,0,0} }}, + { type_zoom_all, (double[]){0.25} }, + DEND }}, + DEND }} }}, + { DTYPE_REC(copy_rot){.n=3,.l=LINE_I,.step_deg=120} }, + DEND }}, + .data = { DTYPE_REC(circle){.r=1,.n=100} } }}; + struct{ char *key; data_t *data; @@ -593,9 +602,16 @@ { "-wave2", (data_t[]){ *wave2, DEND } }, { "-fan", (data_t[]){ *fan, DEND } }, { "-gallop", (data_t[]){ *gallop, DEND } }, + { "-mandala", (data_t[]){ *mandala, DEND } }, { NULL, (data_t[]){ DEND } } }, *dp = demos; + if(opt_idx("-help", ac, av) > 0){ + cui_key_exit(); + for(; dp->key; dp++) printf(" %s\n", dp->key); + printf(" -all\n"); + return 0; + } for(; dp->key; dp++){ data_t *p = dp->data; if(opt_idx("-all", ac, av) <= 0 && opt_idx(dp->key, ac, av) <= 0) continue;