Feb 17, 2008

GL Excess/Ruby : Scene 7 を移植


レンズフレアの効果がかっこいい Scene 7 です。

Scene 7 では 10x10x10 の多次元配列が登場しますが、次のように定義してみました:
@f_angle = Array.new(10) { Array.new(10) { Array.new(10) { 0.0 } } }
...
@f_angle[i][j][k] = (100*a + 10*b + c).to_f
他にも Hash と Array を組み合わせることで、もっときれいに記述することもできます:
ary = Hash.new
...
ary[[i,j,k]] = ... # ここで [i,j,k] が Array。
こちらの方が簡潔ですが、配列を参照するたびに Array のインスタンスが生成されてしまいます。今回のように速度が要求されるケースでは利用しない方が無難であると思います。
GL Excess / Ruby のページも更新。 Scene 7 をダウンロードできるようにしておきました:
未実装のシーンは 8, 10, 11 の 3 個となりました。

Feb 16, 2008

ruby-breakpoint, etc.


[ruby-list:44570] Re: Q: 動的デバッグ方法

> (1) 動的にデバッグモードに移るようなライブラリ関数はあります
>    でしょうか?

ruby-breakpointはどうでしょうか?
breakpointと書いた時点でirbに突入します。

RubyForge: ruby-breakpoint: Project Info

ruby-breakpoint lets you inspect and modify state, diagnose bugs,
patch applications and more all via IRB by simply doing a method
call at the place you want to investigate. It is no longer being
maintained. Please consider using ruby-debug instead.

RubyとCursesを使ったコンソールテキストエディタ

連載第二回目です。今回も引き続きRubyとCursesを使ったコンソールプログラムを作っていきます。

GL Excess / Ruby : Scene 6 の移植完了


結局、ロケットの形状データはオリジナル版と同様に配列ベタ持ちで使うことにしました。 パフォーマンスに深刻な影響が出ることもありませんでしたので。
あと実行終了後のクリーンアップ部分に glDeleteLists( @shiplist, 1 ) と追記。これってオリジナル版には見当らないのですが、大丈夫なんでしょうかね。

GL Excess / Ruby のページも更新。 Scene 6 をダウンロードできるようにしておきました:
未実装のシーンは 7, 8, 10, 11 の 4 個。

Feb 15, 2008

GL Excess/Ruby : Scene 6 の移植中


Scene 6 です。GL Excess で唯一、何らかのツールでモデリングされたジオメトリ(ロケットです)が登場します。 とりあえず、ロケット以外のもの全部を移植してしまいました。

ロケットの準備ができるまでの間、かわりに Teapot に飛んでもらうことにしました(^^;
オリジナル版ではモデルデータ(頂点情報とインデックス)を C の配列でベタ持ちしています。 Ruby ではこれをどのような形式で持つのがいいか、考え中です。
(案)
  • Marshal.dump で前処理しておいたバイト列を Marshal.load で復活
  • Array#pack/String#unpack

Feb 11, 2008

GL Excess / Ruby : Scene 5 を移植


バンプマッピングが印象的な Scene 5 です。最近主流のピクセル単位の処理で はないことから、負荷はそれほどでもありません。バンプマップの処理よりも、 燈台の炎を表現するパーティクルが負担になっている印象を受けます。

GL Excess / Ruby のページも更新。 Scene 5 をダウンロードできるようにしておきました:
未実装のシーンは 6, 7, 8, 10, 11 の 5 個です。

Feb 6, 2008

GL Excess / Ruby : Scene 1 を移植


GL Excess のオープニングである Scene 1 を移植しました。全然問題なしです。

GL Excess / Ruby のページも更新。 Scene 1 をダウンロードできるようにしておきました:
残りは 6 シーンになりました。未実装のシーンは 5, 6, 7, 8, 10, 11。大物ばかりですね。

Feb 4, 2008

GL Excess / Ruby : Scene 12 をサクッと移植、と思いきや


Scene 12 は GL Excess 全12シーンで一番短い行数のプログラムです(scene12.cppが281行)。

移植なんて一瞬だぜ、と思っていたら。
texture.rb で raw テクスチャの幅が正しく取れないケースがあることがわかりました。 Ruby 1.8 と 1.9 との間で、 String#to_i の挙動に違いがあることが原因のようです。
両方のバージョンで動かしたかったがために、次のようにして対処してみました:
texture.rb
major, minor, micro = RUBY_VERSION.scan( /\d+/ )

if ( major == "1" && minor == "8" )
  # for Ruby 1.8.
  width  = pow2( w[0].to_i - "0"[0].to_i )
  height = pow2( h[0].to_i - "0"[0].to_i )
else
  # for Ruby 1.9.
  width  = pow2( w[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i )
  height = pow2( h[0].unpack("U")[0].to_i - "0"[0].unpack("U")[0].to_i )
end
普通であればどのようにして対処するべきところなのでしょうか?
GL Excess / Ruby のページも更新。 Scene 12 をダウンロードできるようにしておきました:

Feb 3, 2008

GL Excess / Ruby : Scene 4 を移植


パーティクルが多いように見えるので心配でしたが、特に問題なく移植できました。

GL Excess / Ruby のページも更新。 Scene 4 をダウンロードできるようにしておきました:

Feb 2, 2008

GL Excess / Ruby : Scene 3 を移植


シーン冒頭の山がせり上がってる部分については、ディスプレイリスト + glScalef() の組み合わせで書き直しました。計算の無駄を省いたおかげで、元となっている glxsglut に比べても遜色ない速度で動いてくれるようになりました。

そのようなわけで GL Excess / Ruby のページも更新。
移植済みのシーンは 2, 3, 9 。残りはあと 9 個です。