January 6, 2019

BlenderのソースコードをXcodeで読む Part4

前回の記事gpu_texture.cGPUTexture で中断しましたが、今回は寄り道をしてオブジェクトを選択した時の振る舞いを追ってみたいと思います。

「オブジェクトを選択した時」というのはこれのことで、マウスカーソルでクリックした時のことです。

Object Mode時にマウスカーソルでオブジェクトをクリックすると、以下のコードで選択なのか選択解除なのか引数 base のフラグを操作します。

// blender/editors/object/object_select.c L100
void ED_object_base_select(Base *base, eObjectSelect_Mode mode)
{
	if (mode == BA_INVERT) {
		mode = (base->flag & BASE_SELECTED) != 0 ? BA_DESELECT : BA_SELECT;
	}

	if (base) {
		switch (mode) {
			case BA_SELECT:
				if ((base->flag & BASE_SELECTABLE) != 0) {
					base->flag |= BASE_SELECTED;
				}
				break;
			case BA_DESELECT:
				base->flag &= ~BASE_SELECTED;
				break;
			case BA_INVERT:
				/* Never happens. */
				break;
		}
		BKE_scene_object_base_flag_sync_from_base(base);
	}
}

この引数の型 BaseObject を持っていて、この Object にロケーションやサイズなど色んな情報がぶら下がっています。 (Object は色々と情報を持っているので読解は次回に飛ばします。)

// blender/makesdna/DNA_layer_types.h L37
typedef struct Base {
	struct Base *next, *prev;
	short flag;
	unsigned short local_view_bits;
	short sx, sy;
	struct Object *object;
	unsigned int lay DNA_DEPRECATED;
	int flag_legacy;
} Base;

ED_object_base_select 関数のもう一つの引数 mode があり、この引数の型 eObjectSelect_Mode は以下で定義されています。

// blender/editors/include/ED_object.h L96
typedef enum eObjectSelect_Mode {
	BA_DESELECT = 0,
	BA_SELECT = 1,
	BA_INVERT = 2,
} eObjectSelect_Mode;

BA_DESELECT は選択解除の時で BA_SELECT は選択した時というのはデバッグ実行していて分かったのですが、残りの BA_INVERT はよくわからず。下図の赤枠の所をクリックしたら選択が反転するのですが、ボタン押したらブレイクポイントに来ると思っていたのですが到達せず。てっきりここで使っていると思っていたのですが違うのかもしれません。

fig-01.png

さて、今日はこの辺で。