Jan 27, 2008

GL Excess / Ruby : Scene 2 を移植してみましたが…


オリジナルと同じ挙動が再現できていますが…遅い orz

200粒のパーティクルもキツそうですが、水面の波紋を表現するために 64x64個 の位置と法線を毎フレーム更新しているところが Ruby にはつらすぎます。
今なら頂点属性の時間発展はバーテックスシェーダにまかせてしまうところな のですが、オリジナルは 2001 年の作品。
負荷の大きい部分はわかりきっているので、そこだけを C の拡張モジュール化 してしまえば、処理速度は改善されるはずです。しかしそれで GL Excess / Ruby を名乗ってよいものなのでしょうか。悩み中です。

Jan 26, 2008

GL Excess / Ruby : ページを用意しました

ソースコードのライセンスは GPL Version 2 としています。オリジナ ル版のライセンスをそのまま引き継ぎました。
まだ Scene 9 しか移植していません。残りは 11 個! orz.

Jan 21, 2008


ruby-opengl で GLExcess

数学関数の拡張ライブラリを書くのにも少々飽きました。というか ruby-opengl で遊ぶつもりだったはずなのに、どんどん目的から離れてますね…
そのようなわけで、GLExcess の Ruby 移植をして遊ぶことにしました。 とりあえず癒し系の Scene 9 から。


ruby-opengl 自体は特に問題になることもなく移植できました。 それよりは元のソースコード(C++)の変数未初期化が原因で、パーティクルの挙動がオリジナル版と一致しないというバグに悩みました。
Ruby 1.8 と 1.9 での動作を確認しています。両者の比較をしてみるのも面白いかも。
そしてせっかく作った RMath ライブラリは一切使ってないわけですが何かorz

Jan 15, 2008

まだ拡張ライブラリ作成中


ruby-openglで遊ぶための数学関数ライブラリ・ RMath を作成中。とりあえず用意できたのはここまで:
  • RVec3/RVec4 : 3次元/4次元ベクトル
  • RMtx3/RMtx4 : 3x3/4x4正方行列
  • RQuat : クォータニオン
ちゃんと使い物になればいいのですけれどね。
Test::Unitでテストも書いてみています。テストを駆動するメソッド名を"test_..." としておけば、自動的に実行対象にしてくれるのが素敵です。 それにしても、「テストを書く順番が違う」と叱られそうですね。テストコードの書き方にも作法があるのでしょうけれど、便利な assert が使えるだけで私には十分です。
mkrf を利用したビルドも使ってみました。ソースディレクトリのルートにmkrf_conf.rbというファイルを作ります。
> more mkrf_conf.rb
require 'mkrf'
Mkrf::Generator.new( 'RMath' )
2行だけ。mkmfでの extconf.rb とほぼ同じです。あとは
> ruby mkrf_conf.rb
これで Rakefile が生成されます。あとは…
> rake -T  ← 定義済みタスクを確認
(in D:/RMath)
rake RMath.so  # Build this extension
rake clean     # Remove any temporary products.
rake clobber   # Remove any generated file.
rake install   # Install this extension
> rake
cl -nologo  -MD -Zi -O2b2xty-    -ID:/ruby19/include/ruby-1.9.0 -ID:/ruby19/incl
ude/ruby-1.9.0/i386-mswin32_90 -ID:/ruby19/lib/ruby/1.9.0/i386-mswin32_90 -ID:/r
uby19/lib/ruby/site_ruby/1.9.0 -I. -c RMathMtx3.c
RMathMtx3.c
...
これで OK、だといいのですが、マニフェストファイルの埋め込みには未対応のようです。最後にこうして完了:
> mt -manifest RMath.so.manifest -outputresource:RMath.so;2
Microsoft (R) Manifest Tool version 5.2.3790.2075
Copyright (c) Microsoft Corporation 2005.
...

Jan 13, 2008


ruby-opengl 0.60.0 : セットアップに再挑戦

追記: 以下の内容は古くなっています。こちらが役に立つかもしれません
VC++ 2008 版の Ruby 1.9.0 ができたので、ruby-opengl 0.60.0 のインストール。
  • GLUTのヘッダ・ライブラリは Windows SDK や Platform SDK で使える場所に配置しておきます。
  • rake や mkrf を最新版にしておきます。mkrf の 0.2.3 は Ruby 1.9.0 対応済みのバージョンです。
  > gem install mkrf
  Successfully installed mkrf-0.2.3
  1 gem installed
  Installing ri documentation for mkrf-0.2.3...
  Installing RDoc documentation for mkrf-0.2.3...
いきなり gem install ruby-opengl とやってしまうと、Ruby 1.8 版のバイナリがインストールされてしまうので注意。ソースアーカイブをいただいてきて作業します。
> wget http://rubyforge.org/frs/download.php/30282/ruby-opengl-0.60.0.gem
...
> gem install ruby-opengl-0.60.0.gem
  Building native extensions.  This could take a while...
  Successfully installed ruby-opengl-0.60.0
  1 gem installed
ではさっそく!
> ruby d:\ruby19\lib\ruby\gems\1.9.0\gems\ruby-opengl-0.60.0\examples\RedBook\teapots.rb

---------------------------
ruby.exe - コンポーネントが見つかりません
---------------------------
MSVCR90.dll が見つからなかったため、
このアプリケーションを開始できませんでした。
アプリケーションをインストールし直すとこの問題は解決される場合があります。
---------------------------
OK   
---------------------------
あらら。
案の定、できあがった各種 DLL にはマニフェストが埋め込まれていませんでした。というわけで後は手作業で、
  • gl.so
  • glu.so
  • glut.so
にマニフェストファイルを埋め込みます。ビルド時の中間ファイルがすべて残っているので、
> cd d:\ruby19\lib\ruby\gems\1.9.0\gems\ruby-opengl-0.60.0\ext\gl
> mt -manifest gl.so.manifest -outputresource:gl.so;2
> cd ..\glu
> mt -manifest glu.so.manifest -outputresource:glu.so;2
> cd ..\glut
> mt -manifest glut.so.manifest -outputresource:glut.so;2
> cd ..\..
> rake
  d:\ruby19\lib\ruby\gems\1.9.0\gems\ruby-opengl-0.60.0>rake
  (in d:/ruby19/lib/ruby/gems/1.9.0/gems/ruby-opengl-0.60.0)
  ruby mkrf_conf.rb
  call rake --nosearch
  (in d:/ruby19/lib/ruby/gems/1.9.0/gems/ruby-opengl-0.60.0/ext/gl)
  copy gl.so ..\..\lib
          1 個のファイルをコピーしました。
  ruby mkrf_conf.rb
  call rake --nosearch
  (in d:/ruby19/lib/ruby/gems/1.9.0/gems/ruby-opengl-0.60.0/ext/glu)
  copy glu.so ..\..\lib
          1 個のファイルをコピーしました。
  ruby mkrf_conf.rb
  call rake --nosearch
  (in d:/ruby19/lib/ruby/gems/1.9.0/gems/ruby-opengl-0.60.0/ext/glut)
  copy glut.so ..\..\lib
          1 個のファイルをコピーしました。
今度こそ!
> ruby d:\ruby19\lib\ruby\gems\1.9.0\gems\ruby-opengl-0.60.0\examples\RedBook\teapots.rb

うまく実行できました。

Jan 10, 2008

ruby-opengl 0.60.0 リリース


でてました。同じ日にこれが利用しているmkrf も 0.2.3 に。
One-Click Ruby Installer (Ruby 1.8.6) での利用は問題無しでした(Ruby 1.8向けのバイナリが自動的にインストールされるので)。
Ruby 1.9.0 の方は…、ちょっとうまくいきません。考えられる原因は多々ありまして、
  • target=mingw32 として Cygwin でビルドした私家版 Ruby 1.9.0 を使ってる
  • OS が VIsta (UAC有効)
  • ...
パス名の問題かもしれないですし、パーミッションに違反しているために必要なファイルにアクセスできていないのかもしれませんし。うん、問題が切り分けられない(笑
最近出た Visual C++ 2008 Express Edition をインストールしてあるので、私家版 Ruby もこれで作りなおしてしまった方が問題が少ないかもしれませんね。
あー、でも extconf.rb や mkrf が MS のビルド環境にどの程度適応していてくれているのか*1によって、これはこれでイバラの道かも。
*1  DLLへのマニフェスト埋め込みとか、GNUのツールにはないけ ど必須の手順がありますね。

Jan 7, 2008

Cygwin Package List

http://cygwin.com/packages/"Search Package List: " というテキストボックスにファイル名を入力して検索すると、そのファイル名 を含む Cygwin パッケージ名を教えてくれます。
例えば今日は svn を使おうとして 「"cygexpat-0.dll" というファイルが見付 からない」、というエラーが出ましたが、上記サイトで検索してみると、
Found 3 matches for cygexpat-0.dll.

  expat/expat-1.95.7-1 XML parser library written in C (development/documentation package)
  expat/expat-1.95.8-1 XML parser library written in C (development/documentation package)
  libexpat0/libexpat0-1.95.8-2 XML parser library written in C (runtime package)
という結果が出て、Expat のイン ストール状況を確認すればよいということがわかります。

Jan 2, 2008

Cygwin の make


Ruby 1.9.0 で extconf.rb から生成した Makefile を使おうとするとこんなことに:
$ d\:/ruby19/bin/ruby extconf.rb
creating Makefile

$ make -f Makefile
Makefile:130: *** target pattern contains no `%'.  Stop.

$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i686-pc-cygwin
この 「target pattern contains no `%'. Stop.」というメッセージ は make 3.81 を使っているときによく見かける気がします。
そこで 3.80 に戻そうにも、Cygwin の setup.exe 経由ではもうダウンロード できません。
Windows build prerequisites using cygwin というページで知りましたが、こちらのページで過去の Cygwin バイナリパッケージが配布されています:
make はこちら:
ここにある make-3.80-1.tar.bz2 をいただいて、Cygwin のインストー ルディレクトリ直下で展開します。これで $(cygwin)/usr/bin/make.exe とし てインストールされます。
$ d\:/cygwin/usr/bin/make.exe -v
GNU Make 3.80
Copyright (C) 2002  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

引き続き拡張ライブラリ


数学関数はとりあえず
  • 3/4次元ベクトル
  • 4x4行列
まで実装。あとは3x3行列とクォータニオンがあれば結構使い物になりそう。
でもテストは一個も書いてませんが何か。
CppUnit ならわかるのですが、 Ruby でのテスト方法ってどうなってるんでしょう。
今日は Ruby 1.8.6 ( One-Click Ruby Installerの 1.8.6-26 )向けにビ ルドしようとしたら、1.9.0と微妙に違う点があることに気付いたので何点かメ モ:

ruby.h の場所

(Ruby 1.8.6) $(RUBY)/lib/ruby/1.8/i386-mswin32/ruby.h
(Ruby 1.9.0) $(RUBY)/include/ruby-1.9.0/ruby.h
1.9になって、インクルードファイルがちゃんと include/の下に配置さ れるようになった模様。

マクロの有無

構造体メンバへのアクセスを隠蔽するマクロが 1.8 時代には無かった模様。
/* Ruby 1.8 対策 (RFLOAT_VALUEマクロが無いので) */
#ifndef RFLOAT_VALUE
#define RFLOAT_VALUE(v) (RFLOAT(v)->value)
#endif
/* Ruby 1.8 対策 (DOUBLE2NUMマクロが無いので) */
#ifndef DOUBLE2NUM
#define DOUBLE2NUM(dbl) rb_float_new(dbl)
#endif
…まるで Antinews を書いてる気分ですね。