2009年6月22日の記事『
POV-Ray v3.7 beta 33 が出たけれど、、、 | KOKAのつぶやき 』の中で、shapes.inc の Round_Box() マクロ内で『Parse Error: Bad operands for period operator.』というエラーが出たと言うことを書きましたが、その原因と経過がほぼ特定できました。
その直接の原因は私のシーンファイルの修正ミスなのですが、このパターンにはまると POV-Ray の出すエラーメッセージだけでは、一体シーンファイルの何処にエラーの原因があるのかまるで分からないことになるというちょっと厄介な問題を含んでいます。
以前のバージョン、POV-Ray 3.6.1c などでは、エラーあるいはワーニングメッセージが該当行のエラー箇所をファイル名と行番号で示してくれたのですが、最新のベータバージョン v3.7 beta 33 では、parse 中にエラーがあると言う表示はあるのですがそのエラーを含む ファイル名や行番号の表示が無いのです。(表示するように設定できるオプションがあるのかもしれませんが、見出せていません。)
ですから、Options メニューの Editor Window から Auto-Load Error File 、Auto-Show Parse Messages をチェックしておかなければ、次のようなエラー表示も見えないことになってしまいます。
しかし、これを見ても、POV-Ray v3.7b beta 33 に付属の インクルードファイルである shapes.inc 内の Round_Box() マクロ内で『Parse Error: Bad operands for period operator.』というエラーがあると言うことしか分かりません。
この問題に当たってから、チェック環境を整える作業をしながらPOV-Ray公式サイトの新 beta 33 に関する説明を詳しく読んで、原因追求の手がかりを探していました。
POV-Ray公式サイトの「Changes between 3.7.beta.32 and 3.7.beta.33」の中の1項目「 http://bugs.povray.org/task/33 (parse accepting invalid vector float components) 」に次のような変更説明がありました。
The parser is missing extra period characters when it parses a float as a vector component.
#local sample = <0.0.0.1,0,0>;
Doesn’t generate an error, but should.
vector component にピリオドが複数含まれるようなケースでは、本来はエラーなのに今までエラーを表示していよいうバグがあったが、エラー表示するように修正されたということです。
これを見て、気が付いたことがあります。
新しいベータバージョンをインストールする時は、可能な限り別PCに新バージョンをインストールして旧の環境を残すようにしているのですが、64ビットOSのPCは1台しかありませんので、POV-Ray関係フォルダのバックアップと復元ポイントの作成によって、万が一不都合があった場合も元の状態に戻せるという条件を作っていました。
今回はあらかじめ 一つ古いPC(コア2 Windows XP 32ビットOS の PC)でテストする慎重さをつい忘れて、Windows XP 64ビット OS の PC 側で先に新しいベータバージョンをインストールしてしまいました。64ビット版での新 beta の処理結果を早く見たいと思ってしまい油断してしまいました。
以前何回も新しいバージョンが出るたびにレンダリングスピード比較をしていたシーンファイルを使ってレンダリングを実行したのです。
そこでレンダリングに入る前のシーンファイルの parse 段階で、エラーが出ました。
それまでの複数のバージョンで何の問題もなかったシーンファイルのレンダリングでエラーが出たので、慌ててしまい、瞬間的に新ベータを入れたことに問題があったと思ってしまいました。
この Windows XP 64ビット版の PC を今はメイン PC にしていますので、大急ぎで元のシステムを復元しPOV-Ray関連の必要なフォルダはバックアップからコピーして、元の状態のPOV-Ray環境に戻しました。
そして、別の Windows XP 32ビット版の PC に32ビット版の beta 33 をインストールして、落ち着いて beta 33 で何故このようなエラーが生じるのかチェックに入りました。
落ち着いてテストしてみたら、次のような修正ミスをしていたことに気が付きました。
実は、エラーは2段階に生じていたのに慌てていて、その際シーンファイルの一部を修正したのですが、その修正にミスがあったのです。そのことを思い出して気が付くまでに、次のような膨大な作業をやってしまいました。
POV-Ray が出した最終的なエラーメッセージが Round_Box() マクロに関して『Parse Error: Bad operands for period operator.』という内容であったことと、beta 32 から beta 33 への変更箇所の一つに vector component の浮動小数点の値の表示において <0.0.0.1,0,0> というように小数点が複数含まれるようなエラーに関するバグ修正が行われたということから、複数あるインクルードファイルの中の Round_Box マクロを使ったオブジェクトにエラーの原因を探るという方針を立てました。
70feetクラスのケッチ(koka_yacht_02)で用いているincludeファイルは、実に30ファイルもありました。
anchor2_define.inc
block_1_define.inc
block_1_of_jib_track_define.inc
block_3_define.inc
block_only_define.inc
cleat_define.inc
fairleader_define.inc
fender_maru_2_define.inc
fender_maru_define.inc
jib_track_define.inc
koka_yacht_01_boom_vang_define.inc
koka_yacht_01_cowl-head_ventilator_with_box_define.inc
koka_yacht_01_hatch_skylight_define.inc
koka_yacht_01_koukaitou_define.inc
koka_yacht_01_u_life_ring_define.inc
koka_yacht_01_wheel_define.inc
koka_yacht_01_winch_define.inc
koka_yacht_01_windvane_3syoku_define.inc
koka_yacht_02_define.inc
koka_yacht_02_furl_jib_sail_define.inc
koka_yacht_02_hull_define.inc
koka_yacht_02_main_sheet_traveler_define.inc
koka_yacht_02_mast_boom_stay_define.inc
koka_yacht_02_mast_gard_define.inc
koka_yacht_02_musen_define.inc
koka_yacht_02_pulpit_lifeline_define.inc
koka_yacht_02_stanchion_define.inc
koka_yacht_02_swim_rudder_define.inc
kyc_mark_define.inc
mast_step_define.inc
10番目の "jib_track_define.inc" でやっと、想定していたエラー箇所を見つけました。
そのエラー箇所を含むシーンファイルの一部です。
//***********************************************
// ジブトラック 2
//***********************************************
#declare Jib_Track_2_Base = union{
// 穴あきトラック
difference{
object{ Round_Box(<-30.0,-0.1,-1.0>,<30.0,0.5,1.0>, 0.1 , 0) }
box{ <-31,0.1,-0.8>,<31, 0.4, 0.8> }
box{ <-32,0.1,-0.4>,<32, 0.6, 0.4> }
#declare N = 0;
#while (N < 30)
cylinder{ <0,-1,0>,<0,1,0>,0.3 translate <29-(2*N),0,0> }
#declare N = N + 1;
#end
material{ Metal_Tex }
}
// カー付きブロック
// カー
object{ Round_Box(<-2.0,0.1,-0.8>,<2.0,0.4,0.8>, 0.15 , 0)
material{ Block_Tex }
translate<0,0.1,0>
}
object{ Round_Box(<-1.0.0.1,-0.4>,<1.0,0.6,0.4>, 0.15 , 0) // エラー箇所
material{ Block_Tex }
translate<0,0.1,0>
}
// ストッパー
object{ Round_Cylinder(<0,0,0>, <0,0.35,0>, 0.35 , 0.1, 0)
material{ Metal_Tex }
translate<-1.5,0.4,0>
}
このエラー行を一瞥して、
object{ Round_Box(<-1.0
.0.1,-0.4
この部分の2番目の小数点以下が不要だと、早とちりして削除してしまったのです。大ミスです(ーー;)。このことに後になって気が付きましたが。
その修正の結果、この行はこうなってしまいました。
object{ Round_Box(<-1.0,-0.4>,<1.0,0.6,0.4>, 0.15 , 0)
つまり Round_Boxマクロの先頭の vector component の値が一つ不足した状態です。
このシーンファイル全体を parse すると、"jib_track_define.inc"のエラー該当行に関するエラーメッセージは何も無くて shapes.inc の Round_Box() マクロ内で『Parse Error: Bad operands for period operator.』というエラーが出ます。
このエラーの表示の仕方にもちょっと問題はありますけれどね。
これでやっと問題の箇所が特定できたようなので、次のように正しく修正しました。
object{ Round_Box(<-1.0
,0.1,-0.4>,<1.0,0.6,0.4>, 0.15 , 0)
2番目の小数点をカンマに変更しました。
これでシーンファイル全体をレンダリングしたら、求めていた画像が出来ました。
そこで、本来の目的の「レンダリングスピード比較」ですが、次のような結果になりました。
処理時間の比較データです。
<2008年11月4日>
---------------------------------------------------------------------------------------------
64bit版 POV-Ray 3.6 正規版 の "pvengine64.exe" での実行時間: 37分 44秒
64bit版 POV-Ray 3.7 beta 29 の "pvengine64.exe" での実行時間: 12分 26秒
---------------------------------------------------------------------------------------------
<2009年4月7日>
---------------------------------------------------------------------------------------------
64bit版 POV-Ray 3.7 beta 32 の "pvengine64.exe" での実行時間: 11分 56秒
---------------------------------------------------------------------------------------------
<前回(2009年5月26日)>
---------------------------------------------------------------------------------------------
32bit版 POV-Ray 3.7 beta 32 の "pvengine-sse2.exe" での実行時間: 11分 36秒
---------------------------------------------------------------------------------------------
<今回(2009年6月27日)>
---------------------------------------------------------------------------------------------
64bit版 POV-Ray 3.7 beta 33 の "pvengine64.exe" での実行時間: 11分 49秒
---------------------------------------------------------------------------------------------
3.7 beta 32 の64bit版より beta 33 の64bit版の方が、7秒ほど速いという結果でした。差と言うほどのものではありませんけれど。
これで、一応安心して beta 33 を使えます。
mesh2 のレンダリングの問題も解消されたし、いろいろ大きな修正が入って、徐々に各種パフォーマンスが上がってきていますので、使い勝手が向上していることは間違いありません。