diff -urN rt_v2/cg.py rt_v3/cg.py --- rt_v2/cg.py 2018-03-17 19:20:42.000000000 +0900 +++ rt_v3/cg.py 2018-03-18 10:31:07.000000000 +0900 @@ -29,6 +29,10 @@ 'l2g': [ ax.zoom_all(20) ], } ] + lights = [ + { 'v': [0,0,-1], 'e': 1.0 }, + ] + (w, h) = ( ut.arg_i('w', 640) , ut.arg_i('h', 480) ) div = ut.arg_i('div', 1) (w, h) = map( lambda v: v / div, (w, h) ) @@ -58,7 +62,7 @@ f = rt.draw if 'wf' in sys.argv: f = wf.draw - f(data, eye2g, wh2eye, sc_sz, video) + f(data, lights, eye2g, wh2eye, sc_sz, video) video.add_img() fn = ( name if n == 1 else name+'0000{}'.format(i)[-5:] ) + '.jpg' diff -urN rt_v2/rt.py rt_v3/rt.py --- rt_v2/rt.py 2018-03-17 19:19:33.000000000 +0900 +++ rt_v3/rt.py 2018-03-18 10:57:44.000000000 +0900 @@ -10,15 +10,44 @@ def_col = d.get( 'def_col', v.all(128) ) return def_col -def get_col(data, l_g): +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): 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 [] (d, crs) = min( lst, key=lambda (d, crs): crs.get('t') ) - return map_col(d, crs) + col = map_col(d, crs) + + rt = d.get('rt', {}) + base = rt.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) + + diff = diffusivity(lights, crsp, nv, eyev_nega) * rt.get('diff', 0.9) + col = v.op1( '*', col, base + diff ) + + return map( lambda v: min( int(v), 255 ), col ) -def draw(data, eye2g, wh2eye, sc_sz, video): +def draw(data, lights, eye2g, wh2eye, sc_sz, video): (w, h, d_) = sc_sz wh2g = lstx.opt( wh2eye + [ eye2g ] ) cnt = ut.new_cnt_wh(w, h, 'wh') @@ -26,7 +55,7 @@ (ix, iy) = cnt.cur() p = lstx.tr( wh2g, 'l2g', [ix,iy,-d_] ) l_g = line.new_p2(eye2g.p, p) - col = get_col(data, l_g) + col = get_col(data, lights, l_g) if col: video.set(ix, iy, col) # EOF diff -urN rt_v2/wf.py rt_v3/wf.py --- rt_v2/wf.py 2018-03-16 20:50:41.000000000 +0900 +++ rt_v3/wf.py 2018-03-18 10:29:07.000000000 +0900 @@ -70,7 +70,7 @@ (pa, pb) = r return [pa, pb] -def draw(data, eye2g, wh2eye, sc_sz, video): +def draw(data, lights, eye2g, wh2eye, sc_sz, video): col = v.all(255) # white for d in data: ps = []