月: 2014年10月

雑記

弊社論文が NICOGRAPH2014 に採択されました

既にスケジュールにも載っていますが、弊社が投稿した論文がNICOGRAPH2014に採択され、11/4に発表をおこなうことになりました。まわりを見渡すと弊社以外は全て学校関係者の方々ということで、今から緊張しています。

今回投稿することになったのはひょんなきっかけからではありましたが、これを機会に CG や映像を研究している方々にも現場が抱えている悩みや問題点、テーマを知っていただき、将来にわたって産学相互に刺激を受けあうことができるきっかけとしたいと考えています。

Blender, Programming

第1回 Blenderソースコードリーディング 準備:Blender2.6aのコードを読んでみる(1)

引き続き、ドキュメントのある Blender2.6a をベースにコードリーディングを進めます。

Blender 内の動作を確認する

デバッガで動作を確認する

  1. Blender を Debug 版でビルドする
  2. 起動
  3. Visual Studio(VS) で デバッグ/プロセスへアタッチ

これで Blender と VS が接続された。

ブレークポイントを張ってみる

とりあえず適当にブレークポイントを張って、Blender の挙動を確認してみる。
コードをざっと見て bf_blenkernel に mesh.c というのがあったので、そこの add_mesh が Blender でジオメトリを作成するときに呼ばれる関数だろうという目星をつけてブレークポイントを張る。

Space→Add Cube で Cube を作成しようとすると、ブレークポイントで処理が止まって各種情報を確認できるようになる。

call stack を辿っていくと add_primitive_cube_exec() が呼ばれていて、更に呼び出し元を辿ると wm_* 関数群まで戻る。このあたりが GUI のメニュー処理を行っている。
wm_* 内で引き継がれている引数 ot がメニューと実際の処理を紐付けるためのもので、この中にどのメニューの表示内容やメニューが選ばれたときに呼ばれる関数がまとめられている。

このようにして、特定の機能やコードを起点にその周囲の処理の流れを把握することができる。

このときの情報を元に、次にどの方向に進むかを考える。今回の情報だけでも

  • ジオメトリの生成や管理
  • GUI でのイベント処理
  • ot を中心としたイベント、メニュー、処理のテーブル管理
  • テーブル管理のためのアーキテクチャ

といった方向性に進んでいくことができる。

Blender 内の構造を確認する

Blender code layout を見ながらコードのレイアウトを確認する。

横方向の点線でレイヤが分けられていて、矢印でレイヤ間/レイヤ内の依存関係が示されている。

Application startup レイヤ

例として Application startup レイヤの説明をおこなう。Application startup レイヤは blender/source ディレクトリにあり、creator と blenderplayer モジュールから構成されている。この二つのモジュールは依存関係がなく、それぞれは “Editor definitions, drawing, interaction” 以下のレイヤの機能を呼び出している。

モジュールの複雑さ

全てのレイヤは基本的に下のレイヤに依存しているため、上位に行けば行くほど複雑に、逆に下位に行けば行くほどそれぞれのモジュールの機能はシンプルになっていることが想像できる。
図をボヤッと見ていてもどこから手をつけていけばわからないが、タイトル下部に書いてある矢印の図を参考に、下の方から見ていくのがコツ。

Utility Libraries(in own development)レイヤ

Utility Libraries(from external development)レイヤ以下は外部で開発されている共通ライブラリなので今回のコードリーディングの対象にはならない。興味があればそれぞれのライブラリのプロジェクトを調べ、個別に調査をする。

つまり、Blender が抱えるコードで最もシンプルなのはUtility Libraries(in own development)レイヤに所属するものということになるので、まずはここの構造を把握することから始める。

モジュール概観

このレイヤに所属するモジュールをざっと眺めてみる

  • メモリ管理
    • guardedalloc
    • memutil
  • 文字列処理
    • string
  • 数値解析
    • opennnl
  • シーンデータ管理
    • bsp
  • データ処理・ソルバー
    • audaspace
    • boolop
    • decimation
    • elbeem
    • iksolver
    • itasc
    • smoke
    • mikktspace
    • moto
  • システム・GUI
    • container
    • ghost

分類としては色々雑なものの、以上のような感じ。
このように同じレイヤ内でも全く異なる目的だったり、アプリケーション上での位置付けが異なるのものが並列して記述されているので要注意。ただ、このレイヤはあくまでもユーティリティライブラリなので直接 Blender の特定の機能と結びつくものではなく、汎用的な部品の扱いとなる。

また、モジュール一つ一つが VS のプロジェクトとして分けられている。例えば、smoke は bf_intern_smoke プロジェクトになっているので、ここのコードを辿れば Blender で使用している smoke solver の情報を得ることができる。

今回のまとめ

Blender の内部を解析するにあたって、実際の Blender の挙動から処理の流れを追う方法と、コードレイアウトのドキュメントから Blender の構造を把握する方法の二つの方法をおこなった。この二つの方法を用いることで、アプリケーションの構造を把握するための糸口を掴むことができるようになる。

引き続き、Blender Architecture を参考にしながら Blender の論理的な構造を探っていく。

Blender

第1回 Blenderソースコードリーディング 準備:Blenderをビルドする

酔っ払った夜中のツイートの流れでウッカリ全世界が熱望してきた“第1回 Blenderソースコードリーディング”というのをやることになったので、まずは準備として Blender のビルド環境を用意したメモを残します。

参加者の皆さんは当日コードのチェックアウトをしているとそれだけで一日おわってしまうので、この記事を参考にひとまずビルドして Blender が実行できるようになるまでは環境を整えておくと当日ダッシュで濃~い話ができるんじゃないかなと思います。

今回はまず入り口からということで比較的内部のドキュメントがまとまっている 2.6 のコードを参考にするために環境を構築してみました。Windows7/VS2008 で用意しています。

コードの取得

clone

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)

約三時間(!!)

Blender 2.6a のコードを取得

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 が起動すれば成功。