さて少しコード整理してみます。
スプラインのベジェ変換は一度やればいい話なので、キャッシュしてしまいます。動的言語はこうした処理が泥縄にかけるんで楽ですね。後悔することも多いですが・・・
これだけでかなり軽くなりましたが、やはりちょっと大きなデータを読んだりすると、すぐにMacBookAirのファンが盛大に回り始めてしまいます。これはおそらく新型のCorei7なMBAを買ってこい、ということなのだと思いますが、もうちょっとどうにかしてみます。
Firebug のプロファイラがお手軽なので、これを使ってみましょう。
こんな結果になりました。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 )