既にスケジュールにも載っていますが、弊社が投稿した論文がNICOGRAPH2014に採択され、11/4に発表をおこなうことになりました。まわりを見渡すと弊社以外は全て学校関係者の方々ということで、今から緊張しています。
今回投稿することになったのはひょんなきっかけからではありましたが、これを機会に CG や映像を研究している方々にも現場が抱えている悩みや問題点、テーマを知っていただき、将来にわたって産学相互に刺激を受けあうことができるきっかけとしたいと考えています。
Philosophy of Hiroshi
既にスケジュールにも載っていますが、弊社が投稿した論文がNICOGRAPH2014に採択され、11/4に発表をおこなうことになりました。まわりを見渡すと弊社以外は全て学校関係者の方々ということで、今から緊張しています。
今回投稿することになったのはひょんなきっかけからではありましたが、これを機会に CG や映像を研究している方々にも現場が抱えている悩みや問題点、テーマを知っていただき、将来にわたって産学相互に刺激を受けあうことができるきっかけとしたいと考えています。
引き続き、ドキュメントのある Blender2.6a をベースにコードリーディングを進めます。
これで Blender と VS が接続された。
とりあえず適当にブレークポイントを張って、Blender の挙動を確認してみる。
コードをざっと見て bf_blenkernel に mesh.c というのがあったので、そこの add_mesh が Blender でジオメトリを作成するときに呼ばれる関数だろうという目星をつけてブレークポイントを張る。
Space→Add Cube で Cube を作成しようとすると、ブレークポイントで処理が止まって各種情報を確認できるようになる。
call stack を辿っていくと add_primitive_cube_exec() が呼ばれていて、更に呼び出し元を辿ると wm_* 関数群まで戻る。このあたりが GUI のメニュー処理を行っている。
wm_* 内で引き継がれている引数 ot がメニューと実際の処理を紐付けるためのもので、この中にどのメニューの表示内容やメニューが選ばれたときに呼ばれる関数がまとめられている。
このようにして、特定の機能やコードを起点にその周囲の処理の流れを把握することができる。
このときの情報を元に、次にどの方向に進むかを考える。今回の情報だけでも
といった方向性に進んでいくことができる。
Blender code layout を見ながらコードのレイアウトを確認する。
横方向の点線でレイヤが分けられていて、矢印でレイヤ間/レイヤ内の依存関係が示されている。
例として Application startup レイヤの説明をおこなう。Application startup レイヤは blender/source ディレクトリにあり、creator と blenderplayer モジュールから構成されている。この二つのモジュールは依存関係がなく、それぞれは “Editor definitions, drawing, interaction” 以下のレイヤの機能を呼び出している。
全てのレイヤは基本的に下のレイヤに依存しているため、上位に行けば行くほど複雑に、逆に下位に行けば行くほどそれぞれのモジュールの機能はシンプルになっていることが想像できる。
図をボヤッと見ていてもどこから手をつけていけばわからないが、タイトル下部に書いてある矢印の図を参考に、下の方から見ていくのがコツ。
Utility Libraries(from external development)レイヤ以下は外部で開発されている共通ライブラリなので今回のコードリーディングの対象にはならない。興味があればそれぞれのライブラリのプロジェクトを調べ、個別に調査をする。
つまり、Blender が抱えるコードで最もシンプルなのはUtility Libraries(in own development)レイヤに所属するものということになるので、まずはここの構造を把握することから始める。
このレイヤに所属するモジュールをざっと眺めてみる
分類としては色々雑なものの、以上のような感じ。
このように同じレイヤ内でも全く異なる目的だったり、アプリケーション上での位置付けが異なるのものが並列して記述されているので要注意。ただ、このレイヤはあくまでもユーティリティライブラリなので直接 Blender の特定の機能と結びつくものではなく、汎用的な部品の扱いとなる。
また、モジュール一つ一つが VS のプロジェクトとして分けられている。例えば、smoke は bf_intern_smoke プロジェクトになっているので、ここのコードを辿れば Blender で使用している smoke solver の情報を得ることができる。
Blender の内部を解析するにあたって、実際の Blender の挙動から処理の流れを追う方法と、コードレイアウトのドキュメントから Blender の構造を把握する方法の二つの方法をおこなった。この二つの方法を用いることで、アプリケーションの構造を把握するための糸口を掴むことができるようになる。
引き続き、Blender Architecture を参考にしながら Blender の論理的な構造を探っていく。
酔っ払った夜中のツイートの流れでウッカリ全世界が熱望してきた“第1回 Blenderソースコードリーディング”というのをやることになったので、まずは準備として Blender のビルド環境を用意したメモを残します。
参加者の皆さんは当日コードのチェックアウトをしているとそれだけで一日おわってしまうので、この記事を参考にひとまずビルドして Blender が実行できるようになるまでは環境を整えておくと当日ダッシュで濃~い話ができるんじゃないかなと思います。
今回はまず入り口からということで比較的内部のドキュメントがまとまっている 2.6 のコードを参考にするために環境を構築してみました。Windows7/VS2008 で用意しています。
https://developer.blender.org/diffusion/B/
存在するドキュメントは 2.6 の時のものなので、この頃のコードを用いて環境を構築する。リポジトリを見ると 2.6 の次に Bug fix 版として 2.6a があったので、そちらを使用することにする。
git clone git://git.blender.org/blender.git cd blender git submodule update --init --recursive git submodule foreach git checkout master git submodule foreach git pull --rebase origin master
リリース時につけられる tag もここで確認できるので、必要なバージョンのコードを抽出する際は参考にする。
コードのチェックアウトはものすごく時間がかかるので注意。
git.exe clone --progress -v "git://git.blender.org/blender.git" "D:\chiyama\Documents\Projects\OpenSource\blender\blender" Cloning into 'D:\chiyama\Documents\Projects\OpenSource\blender\blender'... remote: Counting objects: 797630, done. Receiving objects: 100% (797630/797630), 249.43 MiB | 78.00 KiB/s, done. Resolving deltas: 100% (698733/698733), done. remote: Compressing objects: 100% (98387/98387), done. remote: Total 797630 (delta 698733), reused 794130 (delta 695726) Checking connectivity... done. Checking out files: 100% (7749/7749), done. Success (10762719 ms @ 2014/10/13 16:25:46)
約三時間(!!)
clone 後、v2.6a タグのついた部分をチェックアウト。
https://developer.blender.org/diffusion/B/browse/master/;v2.60a
※今回は clone してから checkout してしまったので二度手間になってしまった。 git clone -b (branch name) というのがあるようなのでそちらを使った方が楽かも。
http://wiki.blender.org/index.php/Dev:Doc/Building_Blender/Windows/msvc/CMake
VS2008 を使ってビルドするので以下を実行
svn checkout https://svn.blender.org/svnroot/bf-blender/trunk/lib/win64 ../lib/win64
チェックアウト先は (リポジトリ)/../lib/win64 と、リポジトリと並列な場所にする必要がある
最新のものでは Python のバージョンが異なるので、これも当時のものを使用する必要がある。リポジトリを見ると Rev.60366 が該当するリビジョンらしい(ので、チェックアウト時にリビジョンを指定する方がよい)。
ソースコードから Blender をビルドする
http://wiki.blender.org/index.php/Dev:JA/Doc/Building_Blender
ビルドシステムは SCons と CMake が選べる。私は CMake を選択。
あと、Building Blender on Windowsを見ると SCons から CMake に 移行してるっぽい?
CMake GUI で VS2008 用プロジェクトを生成。バイナリ出力先は (リポジトリ)/../build に設定。インストール先も指定できるが、2.6a のタグ付きのところから持ってきたせいか、これは使用されないっぽい。
WITH_INTERNATIONAL がオンになっているとLibIntl for Windowsが必要っぽい。本質とは関係ないしメンドイので今回はオフ。
最後のリンクでも OpenEXR 関係のライブラリが無いと言われてコケるので、プロジェクトの設定を修正。CMakeLists.txt のここ?
if(WITH_IMAGE_OPENEXR) if(MSVC90) set(MSVC_LIB _vs2008) set(MSVC_INC) elseif(MSVC10) set(MSVC_LIB _vs2010) set(MSVC_INC _vs2010) else() set(MSVC_LIB msvc) set(MSVC_INC) endif() set(OPENEXR ${LIBDIR}/openexr)
ここのバージョン判別部分をゴッソリ削って
if(WITH_IMAGE_OPENEXR) set(OPENEXR ${LIBDIR}/openexr)
こうする。
OpenEXR のパス周りで幾つかエラーが出るので修正する。
3>..\..\..\..\..\..\blender\source\blender\imbuf\intern\openexr\openexr_api.cpp(66) : fatal error C1083: include ファイルを開けません。'half.h': No such file or directory
>..\..\..\..\..\..\blender\source\blender\imbuf\intern\openexr\openexr_api.cpp(67) : fatal error C1083: include ファイルを開けません。'IlmImf/ImfVersion.h': No such file or directory
何故か IlmImf ディレクトリが指定されているので、 OpenEXR にかきかえる
INSTALL プロジェクトがあるので、これをビルドするとインストールされる。
インストール後、 blender.exe を実行して Blender が起動すれば成功。