diff -urN rt_v48/cross.c rt_v49/cross.c --- rt_v48/cross.c 2018-06-08 23:52:17.000000000 +0900 +++ rt_v49/cross.c 2018-06-10 20:14:51.000000000 +0900 @@ -96,7 +96,6 @@ for(i=0; its[ ret->ts_n++ ] = ts[i]; } - ret->ts_n = ret->ts_n < 2 ? 0 : 2; /* ! */ return ret->ts_n; } @@ -152,12 +151,8 @@ return ret->ts_n; } for(i=0; ip); - if( fabs(ret->p[2]) < 1 ){ - ret->ts[ ret->ts_n++ ] = ts[i]; - } + ret->ts[ ret->ts_n++ ] = ts[i]; } - ret->ts_n = ret->ts_n < 2 ? 0 : 2; /* ! */ return ret->ts_n; } @@ -231,7 +226,6 @@ ret->ts[ ret->ts_n++ ] = ts[i]; } } - ret->ts_n = ret->ts_n < 2 ? 0 : 2; /* ! */ return ret->ts_n; } @@ -404,6 +398,24 @@ } static int +is_op_area_none(int op, struct area *a) +{ + int v = -1; + + switch(op){ + case AREA_OP_AND: + v = 0; + break; + case AREA_OP_OR: + v = 1; + break; + default: + break; + } + return v != -1 && area_is_all(a, v); +} + +static int cross_op(struct line *l_g, int prev_idx, struct data *data, int p_i, struct data_one *pd, struct area *ret_a) { int op = kind_to_op(pd->kind); @@ -413,9 +425,8 @@ area_init(ret_a, v); for(i=0; ichildren.n; i++){ - int id = pd->children.lst[i], pl; + int id = pd->children.lst[i]; struct data_one *d; - struct cross_ret r; struct area a; j = get_idx_of_id(data, id); @@ -423,22 +434,25 @@ continue; } d = &data->lst[j]; - pl = is_plane(d->kind); - r.use_ts_only = 1; - - if( !is_op(d->kind) ){ + if( is_op(d->kind) ){ + cross_op(l_g, prev_idx, data, j, d, &a); + }else{ + struct cross_ret r; + + r.use_ts_only = 1; n = cross_cross_one( d->kind, &d->l2g, prev_idx == j, l_g, &r ); r.idx = j; area_init(&a, 0); if(n == 0){ - if(pl && r.l.p[2] < 0){ + if(is_plane(d->kind) && r.l.p[2] < 0){ area_init(&a, 1); } - }else if(pl){ + }else if(n == 1){ r.t = r.ts[0]; + line_on_line_p(&r.l, r.t, r.p); area_ins(&a, r.t, &r, sizeof(r)); cross_get_nv( d->kind, &d->l2g, l_g, 0, &r ); if(r.ang_nv_eyev > 0){ @@ -447,11 +461,10 @@ }else{ for(k=0; k<2; k++){ r.t = r.ts[k]; + line_on_line_p(&r.l, r.t, r.p); area_ins(&a, r.t, &r, sizeof(r)); } } - }else{ - cross_op(l_g, prev_idx, data, j, d, &a); } if(d->not){ @@ -460,18 +473,7 @@ area_op_eq(op, ret_a, &a); - v = -1; - switch(op){ - case AREA_OP_AND: - v = 0; - break; - case AREA_OP_OR: - v = 1; - break; - default: - break; - } - if( v != -1 && area_is_all(ret_a, v) ){ + if(is_op_area_none(op, ret_a)){ return 0; } } @@ -499,10 +501,10 @@ { struct data *data; struct cross_ret ret_; - int i, idx; + int i; data = data_get(); - idx = -1; + ret->idx = -1; for(i=0; in; i++){ struct data_one *d = &data->lst[i]; @@ -517,21 +519,23 @@ if( !cross_op( l_g, prev_idx, data, i, d, &a ) ){ continue; } - my_area_sel(&a, &ret_); - + if( !my_area_sel(&a, &ret_) ){ + continue; + } }else if( !cross_cross_one( d->kind, &d->l2g, prev_idx == i, l_g, &ret_ ) ){ continue; } - if( idx < 0 || ret_.t < ret->t ){ - idx = ret_.idx >= 0 ? ret_.idx : i; + if( ret->idx < 0 || ret_.t < ret->t ){ *ret = ret_; + if(ret->idx < 0){ + ret->idx = i; + } } } - if( idx >= 0 ){ - struct data_one *d = &data->lst[idx]; + if( ret->idx >= 0 ){ + struct data_one *d = &data->lst[ ret->idx ]; cross_get_nv( d->kind, &d->l2g, l_g, d->not, ret ); } - ret->idx = idx; } int diff -urN rt_v48/dat.py rt_v49/dat.py --- rt_v48/dat.py 2018-06-08 23:52:17.000000000 +0900 +++ rt_v49/dat.py 2018-06-10 20:16:27.000000000 +0900 @@ -116,6 +116,13 @@ def d_setup(d, in_op=False): # return lst [d] + for_op_not = lambda : d.pop('not') if in_op and 'not' in d else False + + def ret_lst(lst, f): + if in_op: + return d_setup( { 'kind': 'and', 'args': lst, 'not': f }, in_op ) + return sum( map( d_setup, lst ), [] ) + kind = d.get('kind') if kind == 'poly_n': @@ -134,6 +141,8 @@ return sum( map( poly_n_f, range(n) ), [] ) if kind == 'cube': + f = for_op_not() + def cube_f(l, deg): d_ = d_copy(d) d_['kind'] = 'square' @@ -144,15 +153,8 @@ (line.y1, 90), (line.y1, -90) ] - f_not = False - if in_op and 'not' in d: - f_not = d.pop('not') - lst = ut.map_up_lst( cube_f, rots ) - - if in_op: - return d_setup( { 'kind': 'and', 'args': lst, 'not': f_not } ) - return sum( map( d_setup, lst ), [] ) + return ret_lst(lst, f) if kind == 'tri_prism_side': d0 = d_copy(d) @@ -171,6 +173,8 @@ return sum( map( d_setup, [d0,d1,d2] ), [] ) if kind == 'tri_prism': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'tri_prism_side' @@ -182,7 +186,7 @@ d2['kind'] = 'triangle' d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1,d2] ), [] ) + return ret_lst( [d0,d1,d2], f ) if kind == 'poly_n_prism_side': n = d.get('n', 3) @@ -200,6 +204,8 @@ return sum( map( poly_n_prism_side_f, range(n) ), [] ) if kind == 'poly_n_prism': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'poly_n_prism_side' @@ -211,7 +217,7 @@ d2['kind'] = 'poly_n' d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1,d2] ), [] ) + return ret_lst( [d0,d1,d2], f ) if kind == 'four_pyramid_side': n = 4 @@ -226,6 +232,8 @@ return sum( map( four_pyramid_side_f, range(n) ), [] ) if kind == 'four_pyramid': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'four_pyramid_side' @@ -233,7 +241,7 @@ d1['kind'] = 'square' d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1] ), [] ) + return ret_lst( [d0,d1], f ) if kind == 'tri_pyramid_side': d0 = d_copy(d) @@ -255,6 +263,8 @@ return sum( map( d_setup, [d0,d1, d2] ), [] ) if kind == 'tri_pyramid': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'tri_pyramid_side' @@ -262,7 +272,7 @@ d1['kind'] = 'triangle' d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1] ), [] ) + return ret_lst( [d0,d1], f ) if kind == 'poly_n_pyramid_side': n = d.get('n', 3) @@ -282,6 +292,8 @@ return sum( map( poly_n_pyramid_side_f, range(n) ), [] ) if kind == 'poly_n_pyramid': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'poly_n_pyramid_side' @@ -289,9 +301,11 @@ d1['kind'] = 'poly_n' d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1] ), [] ) + return ret_lst( [d0,d1], f ) if kind == 'pipe': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'pipe_side' @@ -303,9 +317,11 @@ d2['kind'] = 'circle' d2['l2m'] = [ ax.slide_z(1), ax.zoom_z(-1) ] + d2.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1,d2] ), [] ) + return ret_lst( [d0,d1,d2], f ) if kind == 'cone': + f = for_op_not() + d0 = d_copy(d) d0['kind'] = 'cone_side' @@ -313,7 +329,7 @@ d1['kind'] = 'circle' d1['l2m'] = [ ax.zoom_z(-1) ] + d1.get( 'l2m', [] ) - return sum( map( d_setup, [d0,d1] ), [] ) + return ret_lst( [d0,d1], f ) ### if_not_set_opt( d, 'l2m', [] ) @@ -389,7 +405,8 @@ if kind in ops: ds = [] - for d_ in d.get('args', []): + args = d.pop('args') if 'args' in d else [] + for d_ in args: d_['m2g'] = d_.get('m2g', []) + d.get('l2g') ds += d_setup(d_, True) for d_ in ds: diff -urN rt_v48/op2.yaml rt_v49/op2.yaml --- rt_v48/op2.yaml 1970-01-01 09:00:00.000000000 +0900 +++ rt_v49/op2.yaml 2018-06-10 20:28:40.000000000 +0900 @@ -0,0 +1,51 @@ +defs: + rtd_A: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } + mov4: IMG_3999_4.mov + +big_ball: +- kind: ball + rtd: { diff: 0.3 } + maps: + - fn: '*mov4' + fn_r: '*mov4' + t2m: [ ax.zoom_all(2), ax.rot_x(90) ] + - fn: '*mov4' + fn_r: '*mov4' + t2m: [ ax.zoom_all(2), ax.rot_x(90), ax.rot_z(180) ] + m2g: [ ax.zoom_all(1000) ] + +all: +- kind: export + export: big_ball + +- kind: and + args: + - kind: ball + not: True + rtd: '*rtd_A' + m2g: + - ax.zoom_all(0.5) + - ax.slide_x(1) + - kind: cube + not: True + rtd: '*rtd_A' + m2g: + - ax.zoom_all(0.5) + - ax.slide_x(-1) + - kind: xor + args: + - kind: pipe + rtd: '*rtd_A' + m2g: + - 'ax.slide( way.liss([-1,-1,-1],[1,1,1],[3,4,5])(sec) )' + - kind: cone + rtd: '*rtd_A' + m2g: + - ax.zoom_z(2) + - ax.slide_z(-1) + - 'ax.slide( way.liss([1,1,1],[-1,-1,-1],[4,5,6])(sec) )' + m2g: + - ax.rot_x(90) + - ax.zoom_all(20) + +# EOF