diff -urN rt_v3/cg.py rt_v4/cg.py --- rt_v3/cg.py 2018-03-18 10:31:07.000000000 +0900 +++ rt_v4/cg.py 2018-03-18 17:56:56.000000000 +0900 @@ -20,11 +20,15 @@ copen = 'copen-090419.jpg' beat = 'beat.jpg' + rtd = { 'reflect': 0.3 } + data = [ { 'kind': 'square', + 'rtd': rtd, 'l2g': [ ax.zoom_all(50) ], },{ 'kind': 'ball', + 'rtd': rtd, 'def_col': [128,0,0], 'l2g': [ ax.zoom_all(20) ], } ] diff -urN rt_v3/rt.py rt_v4/rt.py --- rt_v3/rt.py 2018-03-18 10:57:44.000000000 +0900 +++ rt_v4/rt.py 2018-03-18 18:31:18.000000000 +0900 @@ -10,41 +10,66 @@ def_col = d.get( 'def_col', v.all(128) ) return def_col -def diffusivity(lights, crsp, nv, eyev_nega): - ang_nv_eye = v.dot_product( nv, eyev_nega ) - - def f(ltd): - ltv = [0,0,1] - if 'v' in ltd: - ltv = v.nega( ltd.get('v') ) - elif 'p' in ltd: - ltv = v.sub_unit( ltd.get('p'), crsp ) - ang_nv_lt = v.dot_product( nv, ltv ) - if ang_nv_eye * ang_nv_lt < 0: - return 0 - return max( ang_nv_lt, 0 ) * ltd.get('e', 1.0) - - return sum( map( f, lights ) ) +def get_col(data, lights, l_g, nest_rate=1.0, ref_len=None): + if nest_rate < 0.01: + return [] -def get_col(data, lights, l_g): lst = map( lambda d: ( d, cross.cross_g(l_g, d) ), data ) lst = filter( lambda (d, crs): 't' in crs, lst ) if not lst: return [] + + if ref_len: + lst = filter( lambda (d, crs): crs.get('t') > ref_len * 0.000001, lst ) + if not lst: + return [] + (d, crs) = min( lst, key=lambda (d, crs): crs.get('t') ) col = map_col(d, crs) - rt = d.get('rt', {}) - base = rt.get('base', 0.3) + rtd = d.get('rtd', {}) + base = rtd.get('base', 0.3) crsp = crs.get('p') nv = v.unit( crs.get('nv') ) eyev = v.unit(l_g.v) eyev_nega = v.nega(eyev) + ang_nv_eye = v.dot_product( nv, eyev_nega ) + + def diffusivity(): + diff = rtd.get('diff', 0.9) + if not diff: + return 0 - diff = diffusivity(lights, crsp, nv, eyev_nega) * rt.get('diff', 0.9) + def f(ltd): + ltv = [0,0,1] + if 'v' in ltd: + ltv = v.nega( ltd.get('v') ) + elif 'p' in ltd: + ltv = v.sub_unit( ltd.get('p'), crsp ) + ang_nv_lt = v.dot_product( nv, ltv ) + if ang_nv_eye * ang_nv_lt < 0: + return 0 + return max( ang_nv_lt, 0 ) * ltd.get('e', 1.0) + + return sum( map( f, lights ) ) * diff + + diff = diffusivity() col = v.op1( '*', col, base + diff ) + def reflect_col(): + reflect = rtd.get('reflect', 0) + if not reflect: + return [] + ref_v = v.op2( '+', v.op1( '*', nv, 2 * ang_nv_eye ), eyev ) + ref_l = line.new( crsp, ref_v ) + col = get_col( data, lights, ref_l, nest_rate * reflect, crs.get('t') ) + return v.op1( '*', col, reflect ) + + col_ = reflect_col() + if col_: + col = v.op2( '+', col, col_ ) + return map( lambda v: min( int(v), 255 ), col ) def draw(data, lights, eye2g, wh2eye, sc_sz, video):