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
修正結果の確認