物体データの展開処理順の修正

先のデータの一部を拡大して配置して、再帰風にして試してみたところ...

$ cat dat4.yaml
pillar:
- kind: cube
  rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
  m2g: [ ax.zoom_z(10) ]
- kind: pipe
  rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
  m2g: [ 'ax.zoom([2,2,1])', ax.slide_z(-11) ]
  rxs:
  - [ m2g, append, 2, [ ax.slide_z(22) ] ]

big_ball:
- kind: ball
  rtd: { diff: 0.3 }
  maps:
  - fn: IMG_3999_4.mov
    fn_r: IMG_3999_4.mov
    t2m: [ ax.zoom_all(2), ax.rot_x(90) ]
  - fn: IMG_3999_4.mov
    fn_r: IMG_3999_4.mov
    t2m: [ ax.zoom_all(2), ax.rot_x(90), ax.rot_z(180) ]
  m2g: [ ax.zoom_all(1000) ]

colosseum:
- kind: export
  export: pillar
  m2g: [ ax.slide_x(20) ]
  rxs:
  - [ m2g, append, 16, [ ax.rot_z(360.0/16) ] ]
- kind: pipe
  rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
  m2g: [ 'ax.zoom([24,24,1])', ax.slide_z(-13) ]
  rxs:
  - [ m2g, append, 2, [ ax.slide_z(26) ] ]

all:
- kind: export
  export: colosseum
  rxs:
  - [ m2g, append, 2, [ ax.zoom(6) ] ]
- kind: ball
  rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
  m2g: [ ax.zoom_all(6) ]
- kind: export
  export: big_ball

# EOF
$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/wf_ wf
  :
frm : 599/600(99.8%) : total 57m 15.79s : rest 5.72s : 2018/06/01 17:11:39
frm : 600/600(100.0%) : fin 57m 15.88s
(n, fps)=(600, 30.0)

$ ls -lt out_v44/ | head
-rw-r--r--  1 kondoh  staff  3016737  6  1 17:14 wf__3.mp4
-rw-r--r--  1 kondoh  staff  3144875  6  1 17:14 wf__2.mp4
-rw-r--r--  1 kondoh  staff  3140882  6  1 17:12 wf__1.mp4
-rw-r--r--  1 kondoh  staff  9270739  6  1 17:11 wf_.mp4
  :

ん?

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/all
  :
wh : 307200/307200(100.0%) : fin 1m 20.94s
frm : 600/600(100.0%) : fin 27h 47m 53.95s
(n, fps)=(600, 30.0)
  :

$ ls -lt out_v44/ | head
-rw-r--r--  1 kondoh  staff  2207354  6  1 13:29 all_2.mp4
-rw-r--r--  1 kondoh  staff  3145411  6  1 13:29 all_1.mp4
-rw-r--r--  1 kondoh  staff  5764500  6  1 13:27 all.mp4
  :

28時間ほどもかかったけど、やっぱり「ん?」

拡大した方の外側の「柱」の上下の円柱部分。 天井と床部の円柱部分の配置が意図した通りになってません。
dat.py
  :
def d_setup(d):
  :
	if 'rxs' in d:
		rxs = d.get('rxs')
		if not rxs:
			d.pop('rxs')
			return d_setup(d)
		(targ_k, i_a, n, lx) = rxs.pop(0)

		targ = d.get(targ_k, [])
		ds = []
		for i in range(n):
			d_ = d_copy(d)
			d_[targ_k] = targ[:]
			ds.append(d_)
			targ = lx + targ if i_a == 'insert' else targ + lx
		return sum( map( d_setup, ds ), [] )
  :
	if kind == 'export' and 'export' in d:
		data = ydic.get( d.get('export'), [] )
		data = ut.map_lst( d_copy, data )
		ds = []
		for d_ in data:
			d_['m2g'] = d_.get('m2g', []) + d.get('l2g')
			ds += d_setup(d_)
		for d_ in ds:
			d_['maps'] = d_.get('maps', []) + d.get('maps', [])
		return ds
  :

この処理の順番に問題が。

dat4.yaml
  :
all:
- kind: export
  export: colosseum
  rxs:
  - [ m2g, append, 2, [ ax.zoom(6) ] ]
  :

例えばここの展開で、 先にrxsの拡大の結果がm2gの末尾に追加されて、 そのあとでexportの処理で、

colosseum:
  :
- kind: pipe
  rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
  m2g: [ 'ax.zoom([24,24,1])', ax.slide_z(-13) ]
  rxs:
  - [ m2g, append, 2, [ ax.slide_z(26) ] ]
  :

こちらの'm2g'。このzoomとslide_z。ここまではオッケー。export の

			d_['m2g'] = d_.get('m2g', []) + d.get('l2g')

allのrxsのm2gに追加された拡大は、d.get('l2g') に反映されているので、 zoomとslide_zのm2gよりも後方に追加されます。

問題はそのあと
			d_['m2g'] = d_.get('m2g', []) + d.get('l2g')
			ds += d_setup(d_)

このd_setup(d)から

  rxs:
  - [ m2g, append, 2, [ ax.slide_z(26) ] ]

が展開されて、m2gのさらに後ろ側に、このslize_z()が追加されます。

なんともややこしい...

そもそも、exportの展開を先に処理して、export元のrxs展開込みで済ませた状態で、 外側のrxsのコピー展開を処理するのが自然かと。

ということで、exportとrxsの処理順を入れ替えてみました。

そのままではダメ。一部rxs展開がうまく成されません。抜けがありました。 なかなか手強い。

以前の処理順では、exportの展開時にはrxsは展開済みの前提で、 データ中にrxsが現れる事はありませんでした。

処理順を変えたので、前提が崩れます。 exportの展開時でもrxsがあれば展開先に追加するように修正します。

v44.patch

$ mv rt_v43 rt_v44
$ cat v44.patch | ( cd rt_v44 ; patch -p1 )
$ cd rt_v44
$ make clean
$ make

視点移動はちょっと引き気味にしてみます。

$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/wf_tst wf fps=2
  :
frm : 39/40(97.5%) : total 3m 51.44s : rest 5.78s : 2018/06/03 05:26:49
frm : 40/40(100.0%) : fin 3m 51.59s
estimated 0.96 hour at 640*480 30fps

円柱部分の配置OK

$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/rough fps=4 div=8
  :
frm : 79/80(98.8%) : total 2m 22.23s : rest 1.77s : 2018/06/03 05:31:27
wh : 0/4800(0.0%) : not start yet
wh : 4800/4800(100.0%) : fin 0.98s
frm : 80/80(100.0%) : fin 2m 21.78s
estimated 18.91 hour at 640*480 30fps

それでは19時間で。

$ ./cg.py eyep=[0,0,0],[450,450,150],10 sec=20 yaml=dat4.yaml data_name=all name=out_v44/fix
  :
wh : 307200/307200(100.0%) : fin 1m 4.04s
frm : 600/600(100.0%) : fin 18h 52m 12.35s
(n, fps)=(600, 30.0)
  :
./v.mp4 315/600

$ ls -lt out_v44/ | head
-rw-r--r--  1 kondoh  staff  2762196  6  4 00:31 fix_2.mp4
-rw-r--r--  1 kondoh  staff  3141307  6  4 00:31 fix_1.mp4
-rw-r--r--  1 kondoh  staff  6391237  6  4 00:29 fix.mp4
  :

ほぼ19時間でした。

手前の大きな角柱の横切りが、あまりにチラチラするのでもう一丁。 dat5.yaml で試してみます。

$ diff -u dat4.yaml dat5.yaml
--- dat4.yaml	Sun Jun  3 04:12:50 2018
+++ dat5.yaml	Mon Jun  4 04:58:05 2018
@@ -36,7 +36,7 @@
 - kind: export
   export: colosseum
   rxs:
-  - [ m2g, append, 2, [ ax.zoom(6) ] ]
+  - [ m2g, append, 2, [ ax.zoom(16) ] ]
 - kind: ball
   rtd: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 }
   m2g: [ ax.zoom_all(6) ]
$ 

外側の柱の拡大率をアップして、視点移動の引きも元に戻してみます。

$ wget http://kondoh2.html.xdomain.jp/rt/dat5.yaml

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=dat5.yaml data_name=all name=out_v44/dat5
  :
wh : 290062/307200(94.4%) : total 1m 18.96s : rest 4.40s : 2018/06/05 02:43:04
wh : 307200/307200(100.0%) : fin 1m 14.59s
frm : 600/600(100.0%) : fin 21h 35m 6.34s

$ ls -lt out_v44/ | head
-rw-r--r--  1 kondoh  staff  2559915  6  5 02:45 dat5_2.mp4
-rw-r--r--  1 kondoh  staff  3132526  6  5 02:45 dat5_1.mp4
-rw-r--r--  1 kondoh  staff  6155197  6  5 02:43 dat5.mp4
  :

21時間半。 視点の開始位置と終了位置がちょうど、柱に埋まった位置になってました。