Cinderがすごい話

#はじめに
この記事は先日Flying Tokyo #19に参加した際に[Cinder](https://libcinder.org/)に触発された[openFrameworks](http://openframeworks.cc/)を使っている大学生の書いた記事です。
すごいよCinder!!


###Flying Tokyo #19について
![スクリーンショット 2016-05-16 23.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/56510/1765d69b-7484-3ea6-243d-e26da846ac63.png)

[詳細(sensorsの記事)](http://www.sensors.jp/post/cinder.html)
[詳細(CBCNETの記事)](http://www.cbc-net.com/posts/2016/05/11/cinder/)

###Cinderについて
> Cinderとは、画像、音声、動画等を簡単に処理＆可視化できる、主にビジュアルデザイン向けの強力なC++ライブラリであり、The Barbarian GroupのAndrew Bell氏が中心となってオープンソースとして開発が進められています。
> 同様の思想を持つProcessingやopenFrameworksによく似ており、C++で簡単に記述できるうえ、Windows、MacOSX、iOS(iPhone/iPad)といった複数のプラットフォームをカバーしています。
> [https://research.preferred.jp/2010/11/cinder-intro/](https://research.preferred.jp/2010/11/cinder-intro/)より引用

###openFrameworksとの違いについて
ビジュアルデザイン向けの強力なC++ライブラリという点でかなり両者は似ています。私もCinderを始めたばかりなので、詳しいことはわかっていませんが、Simonさんの話を参考にさせてもらうと
そもそもProcessingやopenFrameworksはアーティスト、デザイナー、そして学生にコーディングを教えるためにつくらたもので、Cinderはというと[Barbarian Group](http://barbariangroup.com/)(米国のインタラクティブマーケティング企業)の内製ライブラリとして誕生し、プログラマがプログラマのために作ったものである。そのためCinderはアーティスティックでクリエイティブなツールをその中心に置きながらも、モダンで標準的なC++言語の作法を尊重するという特長を持っているらしい。
確かに今回のワークショップでも、ある程度C++11やテンプレートに関する知識、const correctnessとか、Smart Pointerとか知識あるの前提みたいな感じだったので、oFより敷居は高いかもしれません。
しかしながら、`setup()`,`update()`,`draw()`があるよとか、openFrameworksをやっていれば役立つ知識はかなり多いです！

###Cinderのすごいとこ！(Flying Tokyo #19で感じた点)
1. Runtime Compileのblock(oFでいうとこのaddon)があるのでライブコーディングできちゃう！([Cinder-Runtime](https://github.com/simongeilfus/Cinder-Runtime))
2. ファイルなど(画像ファイル、ソースファイルなど)に変更があった場合の監視ができ、イベントを受け取れる(oFでも多分できるけど、Cinderは[WatchDog](https://github.com/simongeilfus/Watchdog)でサポートしてくれている)
3. イベントは`getWindow()->getSignal~~`みたいなので大体受け取れてイベント駆動っぽいのも書きやすい。
4. Windowの指定が簡単、複数台ディスプレイとかがあってもどこに何を出すかとかの設定がとてもしやすい。
5. オブジェクト指向のライブラリ設計アプローチ。例えば四角形を描画するときoFでは`ofDrawRectangle( x, y, w, h )`と書いていたけど、xとか何入れてるかよくわからない、、、対してCinderは`gl::drawSolidRect( Rectf( x1, y1, x2, y2 ))`のように書く。(最近ではoFでもそのような書き方もサポートされたが、)
6. Batchというのを使うと、Gpuをうまく使える！oF以上にパフォーマンスあげるのがライブラリのおかげで楽な面が多い。 
7. [geom](https://libcinder.org/docs/reference/geometry.html)のサポートが熱く、3Dモデルとかなくても簡単な地形など作れる！(Teapod/Sphere/Cylinder/WireCapsuleなどのSourceが一行で呼び出して使える+Perlin Noise,Twist,Transformなどでの変形)(oFでも3Dモデルなくても作れたりするけど、transformとかあった？？かな？？)

などなど...


#参考
Workshopの際に講師の[**Simon**](http://www.simongeilfus.com/)さんが準備してくださった[レポジトリ](https://github.com/simongeilfus/FlyingTokyo19)を[**Teiichi Ota**](https://github.com/otachan)さんが翻訳を加え、私が多少修正、コメントを加えたものです。READMEが超充実してるので、参考にどうぞ！
https://github.com/Hiroki11x/FlyingTokyo19

特に、コンパイラを標準のものを使用していない方、Cinder-Runtimeを使う際にinstall.shでコンパイラが怒られる方、こちらが参考になればと思います。
[OSX の gcc を変更した話](http://qiita.com/Hiroki11x/items/261612c142da176bbba5)

#[**Simon**](http://www.simongeilfus.com/)さんのサンプルプロジェクト
以下に[**Simon**](http://www.simongeilfus.com/)さんが作られた[サンプルプロジェクト](https://github.com/simongeilfus/Cinder-Experiments)がまとまっています。その中の幾つかを紹介します。

###1. [CascadedShadowMapping](https://github.com/simongeilfus/Cinder-Experiments/tree/master/CascadedShadowMapping)
![gif1]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/CacededShadowMapping.gif)

###2. [PBRBasics](https://github.com/simongeilfus/Cinder-Experiments/tree/master/PBRBasics)
![gif2]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/PBRBasics.gif)

###3. [PBRTexturingBasics](https://github.com/simongeilfus/Cinder-Experiments/tree/master/PBRTexturingBasics)
![gif3]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/PBRTexturingBasics.gif)

###4. [ParallaxCorrectedCubemap](https://github.com/simongeilfus/Cinder-Experiments/tree/master/ParallaxCorrectedCubemap)
![gif4]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/ParallaxCorrectedCubemap.gif)

###5. [TessellatedNoise](https://github.com/simongeilfus/Cinder-Experiments/tree/master/TessellatedNoise)
![gif5]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/TessellatedNoise.gif)



#Blockのサンプル(openFrameworksで言うaddon)
###6. [CinderImGui](https://github.com/simongeilfus/Cinder-ImGui)
GUIツールキット[imgui](https://github.com/ocornut/imgui)のCinderBlockです。
よくあるコールバック式ではなく、Immediate Mode という少しめずらしい構造をしています。
例えばボタンなら以下のような形です。スライダーなども大体こんなかんじです。

```cpp

// draw 関数内

if(ui::Button("button 1")) {
    printf("push !\n");
}

```

毎秒何回も更新されるアプリケーションに大変親和性の高いGUIパラダイムと言えるでしょう。
openframeworksのaddonもあります >> [ofxImGui](https://github.com/jvcleave/ofxImGui)

![gif6]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/CinderImGui.gif)


###7. [CinderRuntime](https://github.com/simongeilfus/Cinder-Runtime)
これはopenFrameworksで言うaddonのsampleプロジェクト
![gif7]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/CinderRuntime.gif)

#標準のサンプル
###8. ClothSimulation
sample内に標準で入ってます！
![gif8]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/ClothSimulation.gif)

###9. DeferredShadingAdvanced
sample内に標準で入ってます！
![gif9]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/DeferredShadingAdvanced.gif)

###10. EarthQuake
sample内に標準で入ってます！
![gif10]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/EarthQuake.gif
)

###11. ExponentialShadowMap
sample内に標準で入ってます！
![gif11]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/ExponentialShadowMap.gif)

###12. FallingGears
sample内に標準で入ってます！
![gif12]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/FallingGears.gif)

###13. Flickr
sample内に標準で入ってます！
![gif13](
https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/Flickr.gif)

###14. Geometry
sample内に標準で入ってます！
![gif14](https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/Geometry.gif)

###15. GoodNightMorning
sample内に標準で入ってます！
![gif15](https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/GoodNightMorning.gif)

###16. MandelbrotGLSL
sample内に標準で入ってます！
![gif16](https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/MandelbrotGLSL.gif)

###17. MeshVoxels
sample内に標準で入ってます！
![gif17](https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/MeshVoxels.gif)

###18. NormalMapping
sample内に標準で入ってます！
![gif18](https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/NormalMapping.gif)

###19. PaletteBrowser
sample/_timeline内に標準で入ってます！
![gif19]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/PaletteBrowser.gif)

###20. ParticleSphereGPU
sample/_opengl内に標準で入ってます！
![gif20]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/ParticleSphereGPU.gif)

###21. PickingFBO
sample/_opengl内に標準で入ってます！
![gif21]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/PickingFBO.gif)

###22. VoronoiGpu
sample内に標準で入ってます！
![gif22]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/VoronoiGpu.gif)


###23. Wisteria
sample内に標準で入ってます！
![gif23]
(https://github.com/Hiroki11x/Gif_Animations/raw/master/cinder/Wisteria.gif)


#他のすごそうなサンプル集
https://github.com/paulhoux/Cinder-Samples


#追記
[Ushio@github](http://qiita.com/Ushio@github)さんからCinderImGuiについて編集いただきました、ありがとうございます！