2016年における GLBoost の主な変更点について

この記事は[GLBoost Advent Calender 2016](http://qiita.com/advent-calendar/2016/glboost)の５日目の記事です。

GLBoost は2016年の１年間のアップデートでいくつかの
破壊的変更
機能改善が行われています。
古いコードを最新ライブラリに移植する際の備忘録としてまとめてみました。

## 主な変更点
- 最初に glBoostContext を生成するようになった
- 「new GLBoost～」→「glBoostContext.create～」に変更
- 「scene.add()」→「scene.addChild()」に変更
- 「Camera」→「PerspectiveCamera」に変更
- 「scene.prepareForRender()」→「expression.prepareToRender()」に変更
-  renderer.draw(scene)」→「renderer.draw(expression)」に変更

##新旧コード比較

<table>
<tr>
<th>比較項目</th>
<th>新（GLBoost.js r1）</th>
<th>旧（GLBoost.js 2016.3.21 版）</th>
</tr>

<tr>
<td>レンダラの初期化</td>
<td>
<pre>
var canvas = document.getElementById("canvas");
var glBoostContext = new GLBoost.GLBoostMiddleContext(canvas);
var renderer = 
glBoostContext.create
Renderer({
  clearColor: {red: 0.0, green: 0.0, blue: 0.0, alpha: 1}
});
</pre>
</td>
<td>
<pre>
var canvas = document.getElementById("canvas");
var renderer = new GLBoost.Renderer({
  clearColor: {red: 0.0, green: 0.0, blue: 0.0, alpha: 1}
});
</pre>
</td>
</tr>

<tr>
<td>シーンの作成</td>
<td>
<pre>
var scene = glBoostContext.createScene();
</pre>
</td>
<td>
<pre>
var scene = new GLBoost.Scene();
</pre>
</td>
</tr>

<tr>
<td>カメラの作成 </td>
<td>
<pre>
var camera = glBoostContext.createPerspectiveCamera({
  eye: new GLBoost.Vector3(0.0, 0.0, 200.0),
  center: new GLBoost.Vector3(0.0, 0.0, 0.0),
  up: new GLBoost.Vector3(0.0, 1.0, 0.0)
}, {
  fovy: 45.0,
  aspect: 1.0,
  zNear: 0.1,
  zFar: 1000.0
});
scene.addChild(camera);
</pre>
</td>
<td>
<pre>
var camera = new GLBoost.Camera({
  eye: new GLBoost.Vector3(0.0, 0.0, 200.0),
  center: new GLBoost.Vector3(0.0, 0.0, 0.0),
  up: new GLBoost.Vector3(0.0, 1.0, 0.0)
}, {
  fovy: 45.0,
  aspect: 1.0,
  zNear: 0.1,
  zFar: 1000.0
});
scene.add(camera);
</pre>
</td>
</tr>

<tr>
<td>ライトの作成 </td>
<td>
<pre>
var light = glBoostContext.createPointLight(
  new GLBoost.Vector3(1, 1, 1));
light.translate = new GLBoost.Vector3(0,150,0);
scene.addChild(light);
</pre>
</td>
<td>
<pre>
var light = new GLBoost.PointLight(
  new GLBoost.Vector3(1, 1, 1));
light.translate = new GLBoost.Vector3(0,150,0);
scene.add(light);
</pre>
</td>
</tr>

<tr>
<td>表示する物体の作成</td>
<td>
<pre>
var geometry = 
  glBoostContext.createCube(
    new GLBoost.Vector3(100,100,100), 
    new GLBoost.Vector4(1,1,1,1));
var material = glBoostContext.createClassicMaterial();
var texture = glBoostContext.createTexture("texture.jpg");
material.setTexture(texture);
material.shaderClass = GLBoost.PhongShader;
var cube = glBoostContext.createMesh(geometry, material);
scene.addChild(cube);
</pre>
</td>
<td>
<pre>
var geometry = 
  new GLBoost.Cube(
    new GLBoost.Vector3(100,100,100), 
    new GLBoost.Vector3(1,1,1));
var material = new GLBoost.ClassicMaterial();
var texture = new GLBoost.Texture("texture.jpg");
material.texture = texture;
var shader = new GLBoost.PhongShader('#world');
material.shader = shader;
var cube = new GLBoost.Mesh(geometry, material);
scene.add(cube);
</pre>
</td>
</tr>

<tr>
<td>レンダリング</td>
<td>
<pre>
var expression = glBoostContext.createExpressionAndRenderPasses(1);
expression.renderPasses[0].scene = scene;
expression.prepareToRender();

var render = function() {
  renderer.clearCanvas();
  renderer.draw(expression);
  requestAnimationFrame(render);
};
</pre>
</td>
<td>
<pre>
scene.prepareToRender();

var render = function() {
  renderer.clearCanvas();
  renderer.draw(scene);
  requestAnimationFrame(render);
};
</pre>
</td>
</tr>
</table>

## 追加された主な機能

```js
// カメラコントローラー
camera.cameraController = glBoostContext.createCameraController();
```

```js
// 軸表示ツール
// usage : createAxisGizmo(length)
var axisGizmo = glBoostContext.createAxisGizmo(10);
scene.addChild(axisGizmo);
```

```js
// グリッド表示ツール
// usage : createGridGizmo(length, division, isXZ, isXY, isYZ, colorVec)
var gridGizmo = glBoostContext.createGridGizmo(3, 4, true, false, true, new GLBoost.Vector4(1, 1, 1, 1));
scene.addChild(gridGizmo);
```