Bento Toolsetを紹介してみる。

# Bentoってどういうやつ？

[![tumblr_inline_o8o9vnuiC31qeupiw_540.png](https://qiita-image-store.s3.amazonaws.com/0/51857/f04a9724-c3c3-2224-a8c0-c5bf8bf43453.png)](https://github.com/takavfx/Bento)

- Bentoは、僕がGitHub場で公開しているOpen Source([MIT License](http://qiita.com/yyama2/items/20bdf5e914c20025498a))のHoudini Toolset。
- [Release毎にソースコードのダウンロードを可能にしており](https://github.com/takavfx/Bento/releases)、ダウンロードしてHoudiniパスを繋げば、すぐにHoudiniでツールが使えるようになっている。
- GitHubで公開しているため、自由にForkしたり、Pull Requestを送ったりして、自分でカスタム管理したり、皆が共有する開発スペースに参加する事ができる。



# どんな事ができるの？

現状、以下のツールがBentoに組み込まれている。

## Shelf Tools

![ss_shelf_tool_0002.png](https://qiita-image-store.s3.amazonaws.com/0/51857/e81782da-6950-0cda-4d8e-11cfd3c98c13.png)

### Cache Dependency(cCDP)

- 選択したノードの下にFile Cache SOPを作成し、ROP Network上に、File Cache SOPのパラメーターを反映したGeometry ROPをディペンデンシーを組みながら作成する。
- [こちら](http://qiita.com/takavfx/items/15170d61bacc783d8e58)の記事でも説明している。
- 画像をクリックすると動画プレビュー先にジャンプ。

[![Screenshot from 2015-09-20 23-24-50.png](https://qiita-image-store.s3.amazonaws.com/0/51857/b1238822-a454-43de-6cd9-c869e994d6b1.png)](https://vine.co/v/etgXVIPA7Yz)

### Create Delayed Load Procedural(cDLP)

- BGEOファイルなどのキャッシュファイルを選択する事で、キャッシュファイルを入力されたDelayed Load Procedural SHOPと、それを入力されたGeometry Networkを作成する。

![スクリーンショット 2016-12-08 10.26.22.png](https://qiita-image-store.s3.amazonaws.com/0/51857/64723904-682f-56d2-b653-240949470967.png)


## Python Panel

### Cache Manager
- Disk I/Oしているノードをツリー表示で一覧表示できる。
- パネル上でキャッシュの置き換えが可能。(右クリックメニュー)
- ノードのRead/Writeでのソートが可能。
- サポートしているノードに関しては[こちら](https://github.com/takavfx/Bento/blob/develop/docs/cacheManager.md)を。

![ss_cache_manager_0001.png](https://qiita-image-store.s3.amazonaws.com/0/51857/5fc7d66b-c146-2d3a-04a9-a70dfbc180a6.png)


## Script

#### Color Node Script

- ノード作成時に配色してくれるスクリプト。
- 配色サンプルは[こちら](https://github.com/takavfx/Bento/blob/develop/docs/color-nodes.md)を。
- [DFTALKにも書いた](http://dftalk.jp?p=20869)が、hipファイルがカオスになって他の人が読み取るのに困る。っていうコストを削減するためのスクリプト。


# インストール方法

1. GitHubのBentoのレポジトリページの「[**releases**](https://github.com/takavfx/Bento/releases)」ページから、最新のソースコードをダウンロード。

2. 解凍したファイルを任意の場所に保存。
  - (例) `/Users/takanori/GitHub/Bento`
3. Houdiniのユーザーコンフィグの場所に行き、houdini.envファイルを開く。
  OSごとのhoudini.envの保存先は以下のパス。
  - (win) `%HOME%/houdiniX.X/houdini.env`
  - (mac) `$HOME/Library/Preferences/houdini/x.x/houdini.env`
  - (linux) `$HOME/Houdinix.x/houdini.env`

4. houdini.envファイルに以下のようにパスを追加。
　　- (win) `BentoPackagePath;&`
　　- (Mac/Linux) `BentoPackagePath:&`(;でも可)
 
　　こんな感じ↓

```text:houdini.env
#
# Houdini Environment Settings
#
# The contents of this file are read into the environment
# at startup.  They will override any existing entries in
# the environment.
#
# The syntax is one entry per line as follows:
#    VAR = VALUE
#
# Values may be quoted
#    VAR = "VALUE"
#
# Values may be empty
#    VAR =
#

# Example:
#
# HOUDINI_NO_SPLASH = 1

HOUDINI_PATH = /Users/takanori/GitHub/Bento:&
```

# どうやって開発に参加したらいい？
## 必要な知識(だいたい)
### 言語

- Python
  - この業界では非常によく見かける言語。
  - 初心者の方はとりあえず、これを読みつつ、自分で入力して言って試して行くと良いかと。 -> [Python入門から応用までの学習サイト](http://www.python-izm.com)
- Houdini Object Model(Hython)
  - HoudiniをPythonを使ってコントールするためのモジュール(道具)。
- PySide(UI作る場合)
  - 商用利用も可のPyQt互換のUIモジュール(道具)。
  - つまるところ、カスタムしまくってるUIはこれ使ってると思ってもらって貰うと良いかと。
- CSS(UI作る場合)
  - Webでもお馴染みの、UIをデザインするための言語。

### バージョン管理
- Git
  - 定番のバージョン管理システム。個人で開発してる時はもちろん、多人数開発にはもはや必須。
  - Gitに関しては、初心者の方はこちらを。 -> [サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ](http://www.backlog.jp/git-guide/)
  - 初めての人もGUIクライアントを使って覚えて行くと、ブランチツリーの分岐や流れを視覚的に把握できるので、覚えが速いと思う。
  - オススメは[GitKraken](https://www.gitkraken.com)。
     - 僕個人の好み。
     - 無償用であれば無料使用化。有償利用はsubscription契約必要。
     - 有償利用でも無料でクライアント使いたいなら、[Source Tree](https://ja.atlassian.com/software/sourcetree)とかオススメ。
  - **「騙されたと思って、とりあえず試してみる！」がキモ！!**
- [Git Flow](http://www.atmarkit.co.jp/ait/articles/1311/18/news017.html)
  - Gitを使って行く上でのルール決め。
  - これ決めてないと、無秩序にバージョンが増えて言ってカオスになる可能性が。
- [GitHub Flow](http://www.atmarkit.co.jp/ait/articles/1401/21/news042.html)
  - [Git Hub](https://github.com/)を使ってく上でのルール決め。
  - このルール決めによって、GitHubでのリリース管理を行う。みんなが共有している状態のものの管理を行う。
  - (Bentoのブランチツリー見ると分かるけれども、実はちょっとルール破ってる・・・。今後はこちらのルールに準拠。)


## GitHubでのBento

### GitHub

* [Bento Repository](https://github.com/takavfx/Bento)

### ブランチ

![スクリーンショット 2016-12-07 4.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/51857/1ee16f7d-c306-1fbe-11e1-6ca3ee090f0d.png)


* develop
  * デフォルトブランチ。
* master
  * リリースのためのブランチ。「releases」に表示するバージョンは、こちらでタグ付けして指定する。この機能がリリース管理に便利。
* feature/xxx
  * フィーチャーブランチ。それぞれの追加する機能について集中的に開発を行うためのブランチ。
  * Cache Managerの開発をしてる時は、`feature/cache-manager`なるブランチを作って、そこで開発してた。
  * ノード色変えのスクリプトを開発したい場合、`feature/color-nodes`とか言ったブランチを作って、そこで自由に開発すれば良い。
* hotfix/yyy
  * リリースされたもののバグを直す時に使用する。

### ディレクトリ
Bentoは、基本的に`HOUDINI_PATH`を繋ぐだけで使ってもらいたいので、Houdiniのディレクトリ構造に準拠。以下、例。

* **Bneto/python2.7libs**
  * ここにPythonファイルを入れると、Houdiniが起動時に自動でimportしてくれる。
* **Bento/scripts**
  * ここにOnCreated.pyなどの決められたスクリプトを設置すると、規定の動作の際に自動で実行してくれる。
  * OnCreated.pyを設置すると、ノードが作成された時に記述されたPythonスクリプトを実行。
  * OnDeleted.pyを設置すると、ノードが削除された時に記述されたPythonスクリプトを実行。
* **Bento/python_panel**
  * Houdiniが起動時に、このディレクトリ以下の.pypanelファイルを自動で読み込む。
* **Bento/toolbar**
  * Houdiniが起動時に、このディレクトリ以下の.shelfファイルを自動で読み込む。


### 参考手順

用語等分からない場合は、上記「必要な知識(だいたい)」のリンク先を参照。そっちの方が易しく、じっくり解説されてるので。

クライアントは[GitKraken](https://www.gitkraken.com)を使用。
こんな感じのGitクライアント。

![スクリーンショット 2016-12-07 6.29.59.png](https://qiita-image-store.s3.amazonaws.com/0/51857/5974d144-5db9-c143-5029-67f8de0d9208.png)

#### [目的] ノード作成時の配色スクリプト(color-nodes)を開発したい。

1. GitHubからレポジトリをクローンしてくる。
  * Bentoの場合のレポジトリURLは`https://github.com/takavfx/Bento.git`。 
    * 左上のファイル ![スクリーンショット 2016-12-08 6.05.27.png](https://qiita-image-store.s3.amazonaws.com/0/51857/7c590176-2d22-9437-3a36-206d4477e38e.png) 
ボタン押すと、「Clone」メニューが出せる。
      * ![スクリーンショット 2016-12-08 4.00.05.png](https://qiita-image-store.s3.amazonaws.com/0/51857/f6242963-4073-9935-2920-ea87c90fa95f.png)
 
2. `master`ブランチに切り替える。
  * ![スクリーンショット 2016-12-08 2.53.08.png](https://qiita-image-store.s3.amazonaws.com/0/51857/995fc4eb-ab4a-d7fa-229b-316dc3af1d3b.png)

3. 左メニューGit Flowの矢印ボタン(Open Git Flowボタン)をクリック。
  * ![スクリーンショット 2016-12-08 1.40.38.png](https://qiita-image-store.s3.amazonaws.com/0/51857/36b82d2a-42b4-5ea2-5d6d-02c774b98762.png)

4. Start>Featureをクリック
5. `feature/parm-preset`と記入し、ラジオボタンで**Current Branch**を選択し、Start featureをクリックする。
  * ![スクリーンショット 2016-12-08 1.39.35.png](https://qiita-image-store.s3.amazonaws.com/0/51857/0233f51d-8a54-74ba-33d1-249673cb60d3.png)

6. 新しいブランチが作成され、その新しいブランチに切り替わる。
  * ![スクリーンショット 2016-12-08 2.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/51857/0ac202d2-368f-8fd5-3b1d-e86bc6d5e5b6.png)

7. `Bento/scripts`の下にOnCreated.pyファイルを作成し、スクリプトを書く。保存する。
  * ![スクリーンショット 2016-12-08 1.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/51857/eb509b2c-cd9e-24e0-f648-bcbcd4568c85.png)
8. ドキュメントを`Bento/doc`に書く。**color-nodes.md**といったファイルを作成して、マークダウンで書く。
9. Commitする。(こまめに！)
  * Atomエディタをサンプルに上げると、追加されたもの、変更されたもののファイルや行の色を変えてくれたりするのでCommitのタイミングに気付きやすい。
     * ![スクリーンショット 2016-12-08 3.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/51857/19494107-a6ea-0bd0-0779-9acc32c1aa63.png)
  * GitKrakenを横長表示にしていれば、右側の情報パネルに変更されたファイルが表示され、StageしてCommit Messageを記述すればCommitできるようになる。
     * ![スクリーンショット 2016-12-08 4.56.26.png](https://qiita-image-store.s3.amazonaws.com/0/51857/5fbfd503-0faf-a269-99b5-189857bcc30f.png)

10. GitHubにPushする。(こまめに!)
  * ![スクリーンショット 2016-12-08 6.03.11.png](https://qiita-image-store.s3.amazonaws.com/0/51857/3f6d9f65-1a6b-4ea5-f3e9-0d968c650bee.png)
11. ある程度形になるまで、7-8を繰り返す。
12. (コードが完成していたら)GitHub上でdevelopブランチへのPull Requestを出す。
  * ![スクリーンショット 2016-12-08 5.00.18.png](https://qiita-image-store.s3.amazonaws.com/0/51857/640ac5c7-b5c5-74fd-6557-f2922eb3467c.png)

13. Pull Requestが許可される。つまり、developブランチに`color-nodes`での変更が適応される。
14. developでテストが済み、公開準備が整えば、developブランチをmasterブランチにmergeするPull Requestを送る。
15. 許可されればmasterブランチに影響される。
16. masterブランチでタグ付がされ、リリースノートがGitHub上で書かれれば、正式にGitHub上の「[**releases**](https://github.com/takavfx/Bento/releases)」にバージョン登録されて公開される。

# まとめ

まだまだ、作ったりしてってるものもありますし、すでに作っているやつの改良案もいくつかありますが、皆さんも参加してもらいつつ、良いToolsetにしていければいいなと思ってます。

*開発への参加お待ちしてます！！*