さて少しコード整理してみます。

スプラインのベジェ変換は一度やればいい話なので、キャッシュしてしまいます。動的言語はこうした処理が泥縄にかけるんで楽ですね。後悔することも多いですが・・・

これだけでかなり軽くなりましたが、やはりちょっと大きなデータを読んだりすると、すぐにMacBookAirのファンが盛大に回り始めてしまいます。これはおそらく新型のCorei7なMBAを買ってこい、ということなのだと思いますが、もうちょっとどうにかしてみます。

Firebug のプロファイラがお手軽なので、これを使ってみましょう。

profile1.jpg

こんな結果になりました。createBezierPath は svg の path エレメントを作っているところ、apply は3D座標変換ですね。差し当たって vec4 を使う意味はあまりなかったので、vec3 をそのまま使うことにします。glMatrix のベクトルは typedarray なんですが、演算だけだと通常の float array とどっちが速いんでしょうね? よく調べていないんですが、後で webgl と混ぜたい気持ちもあるので typedarray に統一していくのが良さそうです。

パーサ側も直すのが面倒なので、キャッシュした結果だけ vec3 にしました。glMatrix、Cプログラマには取っ付きにくいインタフェースですが慣れると便利です。path エレメントの生成も毎回やる必要はなかったので、これも固定にしてしまいます。d アトリビュートの変更だけで再描画できるようになりました。empty() も毎回やらなくてよくなります。この方が自然ですよね。

そして今更気づきましたが、svg の座標系は左上が原点になるので GL 的には上下が逆でした。transform アトリビュートで反転しておきます。

grabcad で iges がいくつか拾えるので、もらってきて試してみます。円弧とトリムドサーフェスがないとまだまだちゃんと出ないです・・・

(現状のデモはこちら IGES to SVG converter )

iges_ss2.jpg