この記事はBlender Advent Calendar 2018 - Adventarに参加しています。本日は19日目。
Blenderのソースコードを読んだり、書いたりするときのTipsです。
ここではgit.blender.orgのblenderブランチを扱います。
また、パッチの送り方とか、ビルドの仕方とか、externとinternの違いとか、DNAとRNAとかの話は公式に書かれていますので、そっち読んでください。
使用言語
Blenderの開発をする上で必要なプログラミング言語は、C, C++, pythonの3つです。
私が見たところでは、
- C: ヘッダーファイル(実質C++と同じ)と構造体
- C++: 論理
- python: UI
というように、Cはほとんど使われておらず、C++とpythonをメインに扱うことになりそうです。
よく使うディレクトリー
よく使うディレクトリーは以下の2つです。
- release/scripts/startup/
- source/blender/
release/scripts/startup/はUIとかをいじる時に使います。中身はpythonです。
source/blender/は論理をいじる場所です。例えば、モディファイアーの実際の処理はこの中のmodifiersというディレクトリーに格納されています。
ソースコードの位置を突き止める方法
Blenderはかなり大きいソフトなので、どこから手を付けたら良いのかわかりません。一歩目を踏むためのアドバイスを投げていきます。
ファイルを探す際の基本的な流れとしては、pythonUI->rna->dna、という手順を踏むといいでしょう。
- pythonのUIはedit sourceなどでかんたんに見れますが、実際の演算にはほとんど関係ありません。
- rnaはpythonとCをつなげる役目をします。
- dnaは実際のC(C++)で使われるオブジェクトを宣言します
rnaのファイルを探す
さきほどPythonUIから攻めろと掻きましたが、BlenderのTooltipsを使うと一気にrnaまで迫ることが出来ます。
TooltipsはUIですが、C言語系で書かれており、大抵の場合source/blender/makesrna/intern/にあります。(英語のみ。日本語翻訳は.poとかいうおおよそ翻訳に向いていないのに翻訳に使われているフォーマットに基づいて、どっか別のディレクトリに格納されています)
なので、
- 自分の必要とする機能と関係のありそうなTooltipsを探す
- makesrna/intern/内をTooltipsで検索する(特異度高いです)
の手順を踏むと、大体関係のありそうなフォルダーが見つかります。なお、BlenderのUIは結構ぐちゃぐちゃなところがあるので、これで見つからないときも稀によくあります。
static void rna_def_modifier_explode(BlenderRNA *brna)
{
StructRNA *srna;
PropertyRNA *prop;
srna = RNA_def_struct(brna, "ExplodeModifier", "Modifier");
RNA_def_struct_ui_text(srna, "Explode Modifier", "Explosion effect modifier based on a particle system");
RNA_def_struct_sdna(srna, "ExplodeModifierData");
RNA_def_struct_ui_icon(srna, ICON_MOD_EXPLODE);
#(中略)
prop = RNA_def_property(srna, "particle_uv", PROP_STRING, PROP_NONE);
RNA_def_property_string_sdna(prop, NULL, "uvname");
RNA_def_property_string_maxlength(prop, MAX_CUSTOMDATA_LAYER_NAME);
RNA_def_property_ui_text(prop, "Particle UV", "UV map to change with particle age");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
適当に引っ張ってきたこれは、RNAの中でTooltipsが宣言されている様子を示しています。
どうやらExplode Modifier
上で"UV map to change with particle age"
をするためのもののようです。
Explode Modifierのこの機能は、ソースコード上、2通りの名前を持ちます。
中略後の1行目のparticle_uv
は、pythonでUIをいじるための名前です。PythonのUIから攻める際はこちらを手がかりに使います。
中略後の2行目のuvname
は、C言語で論理を扱うための名前です。次のトピックのdnaを探す、ではこちらを使います。
dnaのファイルを探す
dnaはsource/blender/makesdnaを探すとだいたい出てきます。
dnaの記述は、普通の構造体の宣言と同じです。
構造体の名前はRNA_def_struct_sdna(srna, "ExplodeModifierData");
とあるようにExplodeModifierData
です。一方のその構造体のプロパティー名が先程の例で言うところのuvname
です。
このDNAファイルで宣言されている構造体こそが、その後Cのコードで実際に使われるものです。
似たコミットを探す
この構造体を手がかりにして実際の論理ソースコードを探すのも十分現実的ですが、関連のあるコミットを探すほうが見落としが少なくて楽です。先程突き詰めたrnaやdnaのソースコードをgit blame
したり、そのフォルダーへのコミットログで似たものを探したりすると、いいです。
ちなみに私の場合は、似たコミットを上記の手法で探す→とりあえずコピペ→ビルドするか確認する、という手順を踏んでます。
その他
- 巨大なソースコードを潜るとき、どこか別のディレクトリから関係のあるファイルにだけハードシンボリックリンクを貼るとはかどりました。ハードリンクがおすすめなのは、そのディレクトリ内でgit initすると、本物のところでgit commitしなくても変更を記録できるからです。
- http://www.letworyinteractive.com/blendercode/modules.html ここがBlender内のライブラリ(ベクトル演算とか)を調べる上でめちゃくちゃ便利でした。
- 解決されたバグからコミットログをたどるのも良さそうです。
乱文失礼しました。(想像以上に忙しかったんです……。時間に余裕が出来たら加筆・推敲するかも)
明日はdrmdrさんです。