球と立方体のAND,OR,XOR演算

まず前回のメモリリークの原因から。

--- cross.c-	2018-06-08 23:53:48.000000000 +0900
+++ cross.c	2018-06-08 23:54:19.000000000 +0900
@@ -456,6 +456,7 @@
 		n = cross_cross_one( d->kind, &d->l2g, prev_idx == j, l_g, &ret_ );
 
 		if( n == 0 && ( is_pl || !d->not ) ){
+			my_area_free(&area, NULL);
 			return 0;
 		}
 		ret_.idx = j;

ここでした。 見事にfree抜けてました。

v47で、この修正だけ入れてみて無事20秒の動画を生成できました。

$ ./skill.sh

$ make

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v47/and
  :
wh : 293787/307200(95.6%) : total 9.49s : rest 0.41s : 2018/06/08 11:31:06
wh : 307200/307200(100.0%) : fin 9.10s
frm : 600/600(100.0%) : fin 1h 51m 59.51s

$ ls -lt out_v47/ | head
-rw-r--r--  1 kondoh  staff  1416918  6  8 11:33 and_2.mp4
-rw-r--r--  1 kondoh  staff  3139752  6  8 11:33 and_1.mp4
-rw-r--r--  1 kondoh  staff  4862955  6  8 11:31 and.mp4
  :

では本題。

v47のコードを整理しつつ、 物体のAND演算の箇所でOR演算でもXOR演算でも指定できるように作り変えてみました。

物体といっても対応してるのは未だ「球」と「立方体」だけです。

物体のOR演算は、素の状態で普通にORになってるはずです。 ですが、あえてOR演算として指定すると、OR演算した結果のNOTが取れたりできるので、 複雑な演算の指定をするときは便利かと。

(OR結果のNOTなら、ドモルガンの定理で展開して 個別にNOTしてANDすれば良いのでは? などと突っ込んではいけません)

視線で串刺しにして領域の演算をするときに使う area.[ch]は、 できるだけシンプルにまとめなおしてみました。

それを使う側の cross.c 。 「とっちらかり」を押さえ込んでシンプルに。 まとめなおしてふと気づくと、 先のv47のメモリリークの対応箇所は、原因の箇所自体が消えてしまいました。

サンプルデータは op.yaml を追加してます。

前回同様ワイヤーフレーム側の処理は、物体の演算には対応してません。 というか、しません。

v48.patch

$ mv rt_v47 rt_v48
$ cat v48.patch | ( cd rt_v48 ; patch -p1 )
$ cd rt_v48
$ make clean
$ make

では、いつもの速度確認。

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v48/objs_1_2_sc n=1 init_sec=5 div=2
  :
wh : 76800/76800(100.0%) : fin 3.11s
  以前の
  v47  wh : 76800/76800(100.0%) : fin 3.04s
  v45  wh : 76800/76800(100.0%) : fin 3.00s
  v43  wh : 76800/76800(100.0%) : fin 2.96s
  v42  wh : 76800/76800(100.0%) : fin 3.16s
  v39  wh : 76800/76800(100.0%) : fin 15.37s
  v38  wh : 76800/76800(100.0%) : fin 15.09s
  v37  wh : 76800/76800(100.0%) : fin 15.49s
  v36  wh : 76800/76800(100.0%) : fin 15.13s
  v35  wh : 76800/76800(100.0%) : fin 16.16s
  v34  wh : 76800/76800(100.0%) : fin 38.47s
  v32  wh : 76800/76800(100.0%) : fin 26.84s
  v31  wh : 76800/76800(100.0%) : fin 40.50s
  v30  wh : 76800/76800(100.0%) : fin 38.39s
  v29  wh : 76800/76800(100.0%) : fin 1m 44.72s
  v28  wh : 76800/76800(100.0%) : fin 1m 18.06s
  v27  wh : 76800/76800(100.0%) : fin 1m 8.39s
  v26  wh : 76800/76800(100.0%) : fin 1m 6.02s
それでは op.yaml で試してみます。
$ cat op.yaml
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: or
  args:
  - kind: ball
    rtd: '*rtd_A'
  - kind: cube
    rtd: '*rtd_A'
    m2g: [ 'ax.zoom_all(0.8)' ]
  m2g: [ 'ax.slide([-1,-1,0])', 'ax.zoom_all(20)' ]

- kind: and
  args:
  - kind: cube
    rtd: '*rtd_A'
    m2g: [ 'ax.zoom_all(0.8)' ]
  - kind: ball
    not: True
    rtd: '*rtd_A'
  m2g: [ 'ax.slide([1,-1,0])', 'ax.zoom_all(20)' ]

- kind: and
  args:
  - kind: ball
    rtd: '*rtd_A'
  - kind: cube
    not: True
    rtd: '*rtd_A'
    m2g: [ 'ax.zoom_all(0.8)' ]
  m2g: [ 'ax.slide([-1,1,0])', 'ax.zoom_all(20)' ]

- kind: and
  args:
  - kind: ball
    rtd: '*rtd_A'
  - kind: cube
    rtd: '*rtd_A'
    m2g: [ 'ax.zoom_all(0.8)' ]
  m2g: [ 'ax.slide([1,1,0])', 'ax.zoom_all(20)' ]

# EOF

になってます。

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op.yaml data_name=all name=out_v48/op_tst div=4 fps=15
  :
wh : 19200/19200(100.0%) : fin 0.83s
frm : 300/300(100.0%) : fin 6m 57.12s
estimated 3.71 hour at 640*480 30fps

$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op.yaml data_name=all name=out_v48/op
  :
wh : 260050/307200(84.7%) : total 20.16s : rest 3.09s : 2018/06/09 04:46:31
wh : 307200/307200(100.0%) : fin 17.19s
frm : 600/600(100.0%) : fin 4h 10m 41.01s

$ ls -lt out_v48/ | head
-rw-r--r--  1 kondoh  staff  3098316  6  9 04:48 op_2.mp4
-rw-r--r--  1 kondoh  staff  3142561  6  9 04:48 op_1.mp4
-rw-r--r--  1 kondoh  staff  6684097  6  9 04:46 op.mp4
  :