APIの仕様を理解しているだけでは理解できないBlenderの振る舞いに悩まされることがあります。キーボードやマウスの具体的なイベント制御とか。このような問題に出くわしたとき、Pythonからは意識する必要がなかったBlenderの内部構造を理解しておくと非常に心強いですよね。残念なことに、アドオン開発と同様にBlenderの内部構造を解説している記事も非常に少ないです。そこでBlenderの内部を詳しく知るために、Blenderのソースコードを読みながら、理解したことを少しずつ記事としてまとめていこうと考えています。Blenderの内部構造というニッチなところですが、本記事が少しでも皆様のお役に立てれば幸いです。記念すべき第1回は、Blenderのオペレータ実行処理について書きたいと思います。[Plane])を実行したときのBlender内部の処理を見ていきたいと思います。ついて詳しくなるためには、そのbl_idnameについて理解しておき必要があります。実行する必要がありますが、まずそのメニュー項目上で、マウスオーバーしてみましょう。」の文字列書かれたあとに、「bpy.ops.mesh.primitive_plane_add」と表示されています。表示された文字列のうち「mesh.primitive_plane_add」と書かれているのは、1つのオペレータに対して1つだけ割りあてられた識別子になります。APIではbl_idnameと呼ぶため、以降はこれにしたがって、bl_idnameと呼ぶことにします。処理を、primitive_plane_addと呼ぶことにします。APIとして提供されていますが、その実装はC言語で書かれています。このため、C言語で記述されたBlenderのソースコードの中からprimitive_plane_addの処理を探す必要があります。Blenderのソースコードはそれなりに巨大であるため、探すのがとても大変です。そこで役立つのが、bl_idnameです。bl_idnameは、オペレータ1つに対して1つ割り当てられた識別子であるため、bl_idnameでソースコードを検索することで、調べたいオペレータのソースコードを確認できます。見つけることができます。構造体に対して様々な値を設定していることがわかります。関数などを登録することができます。RedoやRepeat時に作られるパネルのUIを記述する。なにも設定されていなければ、自動生成されたUIとなる。詳しく見ていきましょう。マウスオーバーした時に表示されるオペレータ名と説明文であることがわかります。関数が登録されています。関数が呼び出されることになります。ED_operator_scene_editable;最後に、フラグとオペレータプロパティを登録して完了です。関数では、最初にユーザから指定されたオペレータプロパティを取得します。ここで取得したオペレータプロパティは、以降のPlaneオブジェクト作成に使います。関数を呼び出して、Planeオブジェクトを作成します。この段階では、頂点情報などメッシュを構成するデータは作らず、空のオブジェクトのみが作られている状態です。キーとして英語環境の場合は「Plane」、日本語環境の場合は「平面」に置きかえるため、Blender上では新しいPlaneオブジェクトを作成したときに、ロケールに応じて生成されるオブジェクト名について、日本語か英語かを切りかえることができます。オブジェクトからメッシュを取得するためのものです。取得したメッシュを使い、のちの処理で平面のメッシュを構築します。関数でテクスチャを作成します。関数を呼び出すことで、bmeshベースでメッシュを構築します。作成したオブジェクトの頂点を選択した状態にしたり、Blenderに対して再描画通知を行ったりしたあと、オペレータが終了します。OPERATOR_FINISHED;}おわりにここまでで、オペレータ「primitive_plane_add」を通して、Blenderのオペレータに関する内部処理の一部を見てきましたが、いかがでしょうか。構造体のメンバ変数「exec」などに馴染みがあるのではないでしょうか。Blenderのアドオンの作り方を理解していると、Blenderの内部構造がさらに把握しやすくなります。Blenderのアドオン開発に興味がある方は、どうぞ「はじめてのBlenderアドオン開発」もご覧ください。本記事で説明したオペレータ処理には、モーダルモードやイベント処理など、ここで説明した内容以上に多くの話題があります。それぞれの処理については、別途記事としてまとめたいとおもいますので、どうぞお楽しみに。