Blender Hack Blog

オープンソースの総合3DCGソフトウェアのBlenderのコード解析や開発を記録していきます。

Hello Blender Hack: bpy.app.ocio.supportedの値を変更してみる

はじめに

Blenderにごく簡単な修正をして、修正が反映されるのを確認する実験をしてみます。 修正自体は、何も面白くないですが、BlenderのHackingの第一歩としては意義があると思います。

使用したコード

master (af940c68cbed7e840d6ae58f2645ff12ed6abffb) 2.93.0を使用しました。

修正前の挙動の確認

Blenderの組み込みPythonシェルで以下を評価するとTrueが返りました。

>>> bpy.app.ocio.supported
True

挙動に対応するコード

source/blender/python/intern/bpy_app_ocio.cbpy.app.ocioをセットするコードが見つかりました。 ローカル変数posをインクリメントしながら、プロパティを順番にセットしているようです。 SetObjItem(PyBool_FromLong(1));bpy.app.ocio.supportedTrueを返すように実装していそうです。

static PyObject *make_ocio_info(void)
{
  PyObject *ocio_info;
  int pos = 0;

#ifdef WITH_OCIO
  int curversion;
#endif

  ocio_info = PyStructSequence_New(&BlenderAppOCIOType);
  if (ocio_info == NULL) {
    return NULL;
  }

#ifndef WITH_OCIO
#  define SetStrItem(str) PyStructSequence_SET_ITEM(ocio_info, pos++, PyUnicode_FromString(str))
#endif

#define SetObjItem(obj) PyStructSequence_SET_ITEM(ocio_info, pos++, obj)

#ifdef WITH_OCIO
  curversion = OCIO_getVersionHex();
  SetObjItem(PyBool_FromLong(1));
  SetObjItem(
      PyC_Tuple_Pack_I32(curversion >> 24, (curversion >> 16) % 256, (curversion >> 8) % 256));
  SetObjItem(PyUnicode_FromFormat(
      "%2d, %2d, %2d", curversion >> 24, (curversion >> 16) % 256, (curversion >> 8) % 256));
#else
  SetObjItem(PyBool_FromLong(0));
  SetObjItem(PyC_Tuple_Pack_I32(0, 0, 0));
  SetStrItem("Unknown");
#endif

  if (PyErr_Occurred()) {
    Py_CLEAR(ocio_info);
    return NULL;
  }

#undef SetStrItem
#undef SetObjItem

  return ocio_info;
}

コードの修正

そこで以下のように修正します。0をセットすることでFalseを返すようになるのではと考えました。

% git diff
diff --git a/source/blender/python/intern/bpy_app_ocio.c b/source/blender/python/intern/bpy_app_ocio.c
index 3a36e90018f..125f03e2a52 100644
--- a/source/blender/python/intern/bpy_app_ocio.c
+++ b/source/blender/python/intern/bpy_app_ocio.c
@@ -70,7 +70,7 @@ static PyObject *make_ocio_info(void)
 
 #ifdef WITH_OCIO
   curversion = OCIO_getVersionHex();
-  SetObjItem(PyBool_FromLong(1));
+  SetObjItem(PyBool_FromLong(0));
   SetObjItem(
       PyC_Tuple_Pack_I32(curversion >> 24, (curversion >> 16) % 256, (curversion >> 8) % 256));
   SetObjItem(PyUnicode_FromFormat(

修正結果の確認

修正後、Xcodeでビルドと実行します。

Blender組み込みのPythonシェルで確認すると、予想通りbpy.app.ocio.supportedFalseを返すようになりました。

f:id:fixme:20210222133733p:plain
修正結果の確認

macOS: XcodeでBlenderの開発環境を構築する

はじめに

今回はBlenderXcodeでビルドしてデバッグ実行するまでの工程を記録に残します。 公式マニュアルで不足していた部分を補足します。

手順

公式マニュアルを参考にしました。 https://wiki.blender.org/wiki/Building_Blender/Mac

Xcodeのインストール

App Storeから最新のXcodeをインストールしました。 時間がかかりますがしばらく放置します。

Homebrewのインストール

https://brew.sh

cmakeとsvnのインストール

% brew install cmake svn

ソースコードと依存外部ライブラリの取得

make updateのタイミングで外部依存ライブラリが取得されます。

% mkdir ~/blender-git
% cd ~/blender-git
% git clone https://git.blender.org/blender.git
% cd blender
% make update

Xcodeのプロジェクトファイルの生成

ビルドしたBlenderの配置先を作成し、ビルド時にそこに配置されるようにCMAKE_INSTALL_PREFIXを指定します。 cmakeが成功すると、build_xcode/Blender.xcodeprojが生成されます。

CMAKE_INSTALL_PREFIXを指定しないと、書き込み権限が無いため、ビルドに失敗しました。

% mkdir /Users/yoshinori_sano/build
% cd ~/blender-git/blender
% cmake . -B ../build_xcode/ -G "Xcode"  -DCMAKE_INSTALL_PREFIX=/Users/yoshinori_sano/build

Xcodeの設定

Blender.xcodeprojを開きます。

Automatically Create Schemesを選択します。

Active Schemeをinstallに設定します。

Product->Scheme->Edit Schemeを選択し、RunのexecutableにBlender.appを選択します。 Environmental Variablesに以下を設定します。 これらの環境変数をセットしないと、XcodeからBlenderを起動できません。

  • BLENDER_SYSTEM_PYTHON: /Users/yoshinori_sano/build/Blender.app/Contents/Resources/2.93/python
  • BLENDER_SYSTEM_DATAFILES: /Users/yoshinori_sano/build/Blender.app/Contents/Resources/2.93/datafiles
  • BLENDER_SYSTEM_SCRIPTS: /Users/yoshinori_sano/build/Blender.app/Contents/Resources/2.93/scripts

f:id:fixme:20210222125010p:plain
環境変数の設定

Choseをクリックして設定を保存します。

デバッグ実行

source/creator/creator.cmain()があるので、適当な場所にbreak pointをセットします。

Runボタンをクリックするとビルドが開始されます。 ビルドが正常に完了したら、Debug版のBlenderが起動します。

設定したbreak pointで実行が停止します。

実行を続行すると、BlenderのUIが表示されます。

f:id:fixme:20210222130300p:plain
Blender 2.93.0 Alphaの起動直後