Blender 2.82 or later + python 開発環境のメモ

## 背景

Blender + python で開発環境を整えたい. 
Blender 内臓のエディタやコンソールは使いづらいので, vscode から使ったりしたい
自前 add-on の開発デバッグや, bpy 関数の振る舞いをお手軽調べたい, など.

## 環境

* Ubuntu 18.04
* Blender 2.82a or later

## 基本情報

blender の python を直接叩いても, `import bpy` はできないです.
blender を経由して python を動かす必要があります.

## コマンドラインから python コンソールを開く

How can I run blender from command line or a python script without opening a GUI?
https://blender.stackexchange.com/questions/1365/how-can-i-run-blender-from-command-line-or-a-python-script-without-opening-a-gui

```
$ blender --background --python-console
```

とすれば python コンソール出ます.

## VSCode で使う.

https://github.com/JacquesLucke/blender_vscode

https://github.com/AlansCodeLog/blender-debugger-for-vscode

このあたりが使えそうです.

## Advanced な内容

ありがとうございます.

BlenderのC++アドオンで高速にデータを受け渡す (LuxBlendにおける手法)
https://qiita.com/vipper36/items/3e6012c3c770ade0d412

[Blender] GitHubとTravisCIを用いてBlenderアドオンのテストを自動化する
https://qiita.com/nutti/items/fe3f3f14168155df5916


### Blender をビルドする

上記 blender as module や, 何かしら特殊なことをしたいときはソースコードからビルドするのが手っ取り早いでしょう.

https://wiki.blender.org/wiki/Building_Blender

ソースコードや, 依存ライブラリの prebuilt binary を落としたのち,
基本 make するだけでビルドできます.
git submodule を忘れずに行いましょう. 
そうしないと

```
file INSTALL cannot find
"/home/mdriftmeyer/DeveloperProjects/Blender-Repository/blender/release/datafiles/locale/languages".
```

という locale 周りでのエラーがでます.

https://developer.blender.org/T37760

Blender 自体のビルドは, Ubuntu では prebuilt binary があるので, そんなに時間かかりません.
Threadripper 1950X で 5 分くらいでした.

### headless

```
$ make headless
```

で, GUI なしビルドができます.

### Blender as module

Blender 自体を python module(`libbpy.so`)にするビルドがあります.

https://wiki.blender.org/wiki/Building_Blender/Other/BlenderAsPyModule

これにより, 好きな python インタプリタなどで `import bpy` できるので, 開発が捗るのが想定されますが, Ubuntu だとハードルが高いです.

#### prebuilt ではうまくいかない.

ビルドコマンド自体は単純です.

```
$ make bpy
```

(内部では cmake を呼んでいるので, その cmake 設定をみてみるとよいでしょう)

まず, bpy.so は shared lib でリンクされますが, prebuilt libs は `.a` しかないです. 一応 relocatable のようですが, `.a` が依存している system のライブラリも .a とリンクするので(e.g. libpng.a), libpng.a や gomp.a (OpenMP)のリンク時にエラーが出ます.

libpng.a は, apt で入っていると `/usr/lib/..` のほうを見に行ってしまうので,  いったん apt で消すなりして, prebult libs 側の libpng.a とリンクするようにすれば解決できます.
が, libpng.a は消せないときもあるでしょうから, Docker あたりで `bpy.so` をビルドするのが無難かもしれません.
 
gomp(OpenMP) は環境にもよります. CUDA などの環境を入れていると, gcc 関連で gomp がインストールされる可能性が高く, `/usr/lib/...` にある libgomp.a とリンクしようとして build fail することになります.

こちらは, gomp を消すと gcc コンパイラのパッケージも消さねばならず難しいです.
やはり Docker でビルドがいいかもしれません.

また, `WITH_MEM_JEMALLOC` を off にしてビルドしないと,


cannot allocate memory in static TLS block

というエラーが import 時に出ます.

https://devtalk.blender.org/t/problem-with-running-blender-as-a-python-module/7367

CMake 設定を見ると, Linux のときは一応 OFF になっているはずなのですが, なぜか反映されません.



#### 依存ライブラリをソースからビルドするのは...

```
$ make deps
```

で, 依存ライブラリをソースからビルドすることができます.

bashrc などで,

```
alias make=`make -j8`
```

などとして並列ビルドするようにしているとコンパイルに失敗するので, make になにも alias が設定されていないことを確認してから `make deps` するのがいいかもですが, ただしそれだと 1 コアでしかビルドしてくれないので, ビルドに時間かかってしまいます. コンパイル何度かこけるのを見越して, 並列ビルドさせるのも手かもです.

依存ライブラリを一からビルドだと, yasm(なぜアセンブラが必要?! と思ったら video codec 系で使っている) やら, システムの boost とかちあったり, LLVM を一からビルドとかでめんどいです.

少なくとも OpenVDB はなぜか boost 周りでうまくビルドできませんでした. VDB 使わないならとりあえず off でビルドするのも手でしょうか.

### add-on のインストール

無事に `bpy.so` ができて, import でクラッシュしなくなったとしても, 今度は `io_xxx` などが無いとエラーがでます. これらは add_on になりますので, add_on を入れれば解決するはずです(add_on 関連は別 git repo で管理されている)
 
## TODO

* [ ] Blender as module のビルドと動作をいろいろ試す.