scenejs_on_rails 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/app/controllers/scenejs_controller.rb +53 -0
  4. data/app/views/scenejs/get_scenejs_data.html.erb +3 -0
  5. data/lib/scenejs_on_rails.rb +1 -1
  6. data/lib/scenejs_on_rails/rails.rb +5 -0
  7. data/lib/scenejs_on_rails/version.rb +1 -1
  8. data/vendor/assets/javascripts/scenejs.js +17307 -0
  9. data/vendor/assets/javascripts/scenejs_extras/gui.js +478 -0
  10. data/vendor/assets/javascripts/scenejs_extras/gui/README.md +4 -0
  11. data/vendor/assets/javascripts/scenejs_extras/gui/dat.gui.min.js +94 -0
  12. data/vendor/assets/javascripts/scenejs_extras/gui/gui.js +385 -0
  13. data/vendor/assets/javascripts/scenejs_lib/cityBuilder.js +457 -0
  14. data/vendor/assets/javascripts/scenejs_lib/dat.gui.min.js +94 -0
  15. data/vendor/assets/javascripts/scenejs_lib/gl-matrix-min.js +28 -0
  16. data/vendor/assets/javascripts/scenejs_lib/gl-matrix.js +4078 -0
  17. data/vendor/assets/javascripts/scenejs_lib/require.js +36 -0
  18. data/vendor/assets/javascripts/scenejs_lib/requireConfig.js +18 -0
  19. data/vendor/assets/javascripts/scenejs_lib/requireWrapperEnd.js +1 -0
  20. data/vendor/assets/javascripts/scenejs_lib/requireWrapperStart.js +2 -0
  21. data/vendor/assets/javascripts/scenejs_lib/stats.min.js +6 -0
  22. data/vendor/assets/javascripts/scenejs_lib/sylvester.js +1 -0
  23. data/vendor/assets/javascripts/scenejs_lib/webgl-debug-utils.js +839 -0
  24. data/vendor/assets/javascripts/scenejs_plugins/geometry/boundary.js +59 -0
  25. data/vendor/assets/javascripts/scenejs_plugins/geometry/box.js +72 -0
  26. data/vendor/assets/javascripts/scenejs_plugins/geometry/plane.js +126 -0
  27. data/vendor/assets/javascripts/scenejs_plugins/geometry/quad.js +37 -0
  28. data/vendor/assets/javascripts/scenejs_plugins/geometry/skybox.js +86 -0
  29. data/vendor/assets/javascripts/scenejs_plugins/geometry/sphere.js +82 -0
  30. data/vendor/assets/javascripts/scenejs_plugins/geometry/teapot.js +5853 -0
  31. data/vendor/assets/javascripts/scenejs_plugins/geometry/torus.js +139 -0
  32. data/vendor/assets/javascripts/scenejs_plugins/geometry/vectorText.js +1499 -0
  33. data/vendor/assets/javascripts/scenejs_plugins/geometry/wobblyBox.js +44 -0
  34. data/vendor/assets/javascripts/scenejs_plugins/lib/canvas2image.js +198 -0
  35. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullEngine.js +810 -0
  36. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystem.js +185 -0
  37. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystemPool.js +174 -0
  38. data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullWorker.js +142 -0
  39. data/vendor/assets/javascripts/scenejs_plugins/lib/gl-matrix-min.js +28 -0
  40. data/vendor/assets/javascripts/scenejs_plugins/lib/jquery-1.8.3.min.js +2 -0
  41. data/vendor/assets/javascripts/scenejs_plugins/lib/k3d.js +1029 -0
  42. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/jiglib.all.min.js +3 -0
  43. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/physics.js +223 -0
  44. data/vendor/assets/javascripts/scenejs_plugins/lib/physics/worker.js +330 -0
  45. data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTracking.js +295 -0
  46. data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTrackingTarget.js +43 -0
  47. data/vendor/assets/javascripts/scenejs_plugins/node/backgrounds/gradient.js +148 -0
  48. data/vendor/assets/javascripts/scenejs_plugins/node/cameras/orbit.js +172 -0
  49. data/vendor/assets/javascripts/scenejs_plugins/node/cameras/pickFlyOrbit.js +409 -0
  50. data/vendor/assets/javascripts/scenejs_plugins/node/canvas/capture.js +107 -0
  51. data/vendor/assets/javascripts/scenejs_plugins/node/demos/color.js +30 -0
  52. data/vendor/assets/javascripts/scenejs_plugins/node/demos/redTeapot.js +52 -0
  53. data/vendor/assets/javascripts/scenejs_plugins/node/demos/spinningTeapot.js +43 -0
  54. data/vendor/assets/javascripts/scenejs_plugins/node/effects/crt.js +36 -0
  55. data/vendor/assets/javascripts/scenejs_plugins/node/effects/fog.js +159 -0
  56. data/vendor/assets/javascripts/scenejs_plugins/node/effects/snowyPeaks.js +50 -0
  57. data/vendor/assets/javascripts/scenejs_plugins/node/effects/wobble.js +42 -0
  58. data/vendor/assets/javascripts/scenejs_plugins/node/effects/xray.js +126 -0
  59. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/body.js +112 -0
  60. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/cull.js +42 -0
  61. data/vendor/assets/javascripts/scenejs_plugins/node/frustum/lod.js +125 -0
  62. data/vendor/assets/javascripts/scenejs_plugins/node/heightmaps/custom.js +185 -0
  63. data/vendor/assets/javascripts/scenejs_plugins/node/import/3ds.js +91 -0
  64. data/vendor/assets/javascripts/scenejs_plugins/node/import/md2.js +139 -0
  65. data/vendor/assets/javascripts/scenejs_plugins/node/import/obj.js +100 -0
  66. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building.js +352 -0
  67. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlass.jpg +0 -0
  68. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlassSpecular.jpg +0 -0
  69. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/highrise-windows.jpg +0 -0
  70. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/pixelcity_windows7.jpg +0 -0
  71. data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/city.js +26 -0
  72. data/vendor/assets/javascripts/scenejs_plugins/node/objects/plants/ghostTree.js +387 -0
  73. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth.js +168 -0
  74. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-lights.gif +0 -0
  75. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.gif +0 -0
  76. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.jpg +0 -0
  77. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth.jpg +0 -0
  78. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthbump.jpg +0 -0
  79. data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthclouds.jpg +0 -0
  80. data/vendor/assets/javascripts/scenejs_plugins/node/objects/toys/drinkingBird.js +632 -0
  81. data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js +77670 -0
  82. data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js~ +77636 -0
  83. data/vendor/assets/javascripts/scenejs_plugins/node/physics/body.js +85 -0
  84. data/vendor/assets/javascripts/scenejs_plugins/node/physics/box.js +30 -0
  85. data/vendor/assets/javascripts/scenejs_plugins/node/physics/material.js +35 -0
  86. data/vendor/assets/javascripts/scenejs_plugins/node/physics/plane.js +47 -0
  87. data/vendor/assets/javascripts/scenejs_plugins/node/physics/sphere.js +32 -0
  88. data/vendor/assets/javascripts/scenejs_plugins/node/physics/system.js +44 -0
  89. data/vendor/assets/javascripts/scenejs_plugins/node/physics/teapot.js +29 -0
  90. data/vendor/assets/javascripts/scenejs_plugins/node/prims/boundary.js +73 -0
  91. data/vendor/assets/javascripts/scenejs_plugins/node/prims/box.js +87 -0
  92. data/vendor/assets/javascripts/scenejs_plugins/node/prims/cylinder.js +186 -0
  93. data/vendor/assets/javascripts/scenejs_plugins/node/prims/grid.js +47 -0
  94. data/vendor/assets/javascripts/scenejs_plugins/node/prims/plane.js +137 -0
  95. data/vendor/assets/javascripts/scenejs_plugins/node/prims/quad.js +43 -0
  96. data/vendor/assets/javascripts/scenejs_plugins/node/prims/sphere.js +107 -0
  97. data/vendor/assets/javascripts/scenejs_plugins/node/prims/teapot.js +5846 -0
  98. data/vendor/assets/javascripts/scenejs_plugins/node/prims/torus.js +149 -0
  99. data/vendor/assets/javascripts/scenejs_plugins/node/prims/vectorText.js +1508 -0
  100. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/clouds.js +19 -0
  101. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/cloudySea.js +19 -0
  102. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/custom.js +150 -0
  103. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/grimmNight.js +19 -0
  104. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/interstellarClouds.js +19 -0
  105. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/miramarClouds.js +19 -0
  106. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/stormyDays.js +19 -0
  107. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/clouds.jpg +0 -0
  108. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/cloudySea.jpg +0 -0
  109. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/grimmNight.jpg +0 -0
  110. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/interstellarClouds.jpg +0 -0
  111. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/miramarClouds.jpg +0 -0
  112. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/stormyDays.jpg +0 -0
  113. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/violentDays.jpg +0 -0
  114. data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/violentDays.js +19 -0
  115. data/vendor/assets/javascripts/scenejs_plugins/texture/image.js +67 -0
  116. data/vendor/assets/javascripts/scenejs_plugins/texture/video.js +105 -0
  117. metadata +113 -1
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Camera that flies to ray-picked point on scene object
3
+ *
4
+ * Usage example
5
+ * -------------
6
+ *
7
+ * someNode.addNode({
8
+ * type: "alpha/orbitTracking",
9
+ * eye:{ x: y:0 },
10
+ * look:{ y:0 },
11
+ * yaw: 340,,
12
+ * pitch: -20,
13
+ * zoom: 350,
14
+ * zoomSensitivity:10.0,
15
+ * showPick: true
16
+ * });
17
+ *
18
+ * The camera is initially positioned at the given 'eye' and 'look', then the distance of 'eye' is zoomed out
19
+ * away from 'look' by the amount given in 'zoom', and then 'eye' is rotated by 'yaw' and 'pitch'.
20
+ *
21
+ */
22
+ require([
23
+ SceneJS.getConfigs("pluginPath") + "/lib/gl-matrix-min.js"
24
+ ],
25
+ function (glmat) {
26
+
27
+ SceneJS.Types.addType("alpha/orbitTracking", {
28
+
29
+ construct:function (params) {
30
+
31
+ var lookat = this.addNode({
32
+ type:"lookAt",
33
+
34
+ nodes:[
35
+ {
36
+ type:"name",
37
+ name:"noname",
38
+
39
+ // A plugin node type is responsible for attaching specified
40
+ // child nodes within itself
41
+ nodes:params.nodes
42
+ }
43
+ ]
44
+ });
45
+
46
+ var indicatorPos;
47
+ var indicatorVis;
48
+
49
+ if (params.showPick) {
50
+
51
+ // Red sphere to indicate current point-of-interest. We'll update the
52
+ // position of this whenever a new 3D position has been ray-picked.
53
+ // This will be the position about which we'll orbit.
54
+
55
+ // Sphere position, with a ID so we can update this node:
56
+ indicatorPos = lookat.addNode({
57
+ type:"translate",
58
+ id:"__spherePOI"
59
+ });
60
+
61
+ indicatorVis = indicatorPos.addNode({
62
+ type:"flags",
63
+ flags:{
64
+ enabled:false,
65
+ transparent:true,
66
+ specular: true,
67
+ diffuse: false
68
+ },
69
+ nodes:[
70
+ {
71
+ type:"scale",
72
+ x:50.1,
73
+ y:50.1,
74
+ z:50.1,
75
+ nodes:[
76
+ {
77
+ type:"material",
78
+ color:{ r:1.0, g:1.0, b:0.0 },
79
+ specularColor: { r:1.0, g:1.0, b:1.0 },
80
+
81
+ alpha:0.5,
82
+ emit:1.0,
83
+ nodes:[
84
+
85
+ // Sphere primitive implemented by plugin at
86
+ // http://scenejs.org/api/latest/plugins/node/prims/sphere.js
87
+ {
88
+ type:"prims/sphere"
89
+ }
90
+ ]
91
+ }
92
+ ]
93
+ }
94
+ ]
95
+ });
96
+ }
97
+
98
+ var eye = params.eye || { x:0, y:0, z:0 };
99
+ var look = params.look || { x:0, y:0, z:0};
100
+ var zoom = params.zoom || 1000;
101
+ var zoomSensitivity = params.zoomSensitivity || 1.0;
102
+
103
+ lookat.set({
104
+ eye:{ x:eye.x, y:eye.y, z:eye.z},
105
+ look:{ x:look.x, y:look.y, z:look.z },
106
+ up:{ x:0, y:1, z:0 }
107
+ });
108
+
109
+ var canvas = this.getScene().getCanvas();
110
+
111
+ canvas.addEventListener('mousedown', mouseDown, true);
112
+ canvas.addEventListener('mouseup', mouseUp, true);
113
+ canvas.addEventListener('touchstart', touchStart, true);
114
+ canvas.addEventListener('touchend', touchEnd, true);
115
+ canvas.addEventListener('mousemove', mouseMove, true);
116
+ canvas.addEventListener('touchmove', touchMove, true);
117
+ canvas.addEventListener('mousewheel', mouseWheel, true);
118
+ canvas.addEventListener('DOMMouseScroll', mouseWheel, true);
119
+
120
+ var downX;
121
+ var downY;
122
+ var lastX;
123
+ var lastY;
124
+ var dragging;
125
+
126
+ var yaw = params.yaw || 0;
127
+ var pitch = params.pitch || 0;
128
+
129
+ var currentPivot = [look.x || 0, look.y || 0, look.z || 0];
130
+ var targetPivot = [look.x || 0, look.y || 0, look.z || 0];
131
+
132
+ var needFlightUpdate = true;
133
+ var needRotateUpdate = true;
134
+
135
+ function mouseDown(event) {
136
+ lastX = downX = event.clientX;
137
+ lastY = downY = event.clientY;
138
+ dragging = true;
139
+ }
140
+
141
+ function touchStart(event) {
142
+ lastX = downX = event.targetTouches[0].clientX;
143
+ lastY = downY = event.targetTouches[0].clientY;
144
+ dragging = true;
145
+ }
146
+
147
+ function mouseUp(event) {
148
+ if (dragging && event.clientX == downX && event.clientY == downY) {
149
+ pick(event.clientX, event.clientY);
150
+ }
151
+ dragging = false;
152
+ }
153
+
154
+ function touchEnd(event) {
155
+ if (dragging && event.targetTouches[0].clientX == downX && event.targetTouches[0].clientY == downY) {
156
+ pick(event.targetTouches[0].clientX, event.targetTouches[0].clientY);
157
+ }
158
+ dragging = false;
159
+ }
160
+
161
+ function mouseMove(event) {
162
+ var posX = event.clientX;
163
+ var posY = event.clientY;
164
+ actionMove(posX, posY);
165
+ }
166
+
167
+ function touchMove(event) {
168
+ var posX = event.targetTouches[0].clientX;
169
+ var posY = event.targetTouches[0].clientY;
170
+ actionMove(posX, posY);
171
+ }
172
+
173
+ function actionMove(posX, posY) {
174
+ if (dragging) {
175
+ yaw += (posX - lastX) * 0.1;
176
+ pitch -= (posY - lastY) * 0.1;
177
+ needRotateUpdate = true;
178
+ }
179
+ lastX = posX;
180
+ lastY = posY;
181
+ }
182
+
183
+ function mouseWheel(event) {
184
+ var delta = 0;
185
+ if (!event) event = window.event;
186
+ if (event.wheelDelta) {
187
+ delta = event.wheelDelta / 120;
188
+ if (window.opera) delta = -delta;
189
+ } else if (event.detail) {
190
+ delta = -event.detail / 3;
191
+ }
192
+ if (delta) {
193
+ if (delta < 0) {
194
+ zoom -= zoomSensitivity;
195
+ } else {
196
+ zoom += zoomSensitivity;
197
+ }
198
+ }
199
+ if (event.preventDefault) {
200
+ event.preventDefault();
201
+ }
202
+ event.returnValue = false;
203
+ needRotateUpdate = true;
204
+ }
205
+
206
+ function pick(canvasX, canvasY) {
207
+ scene.pick(canvasX, canvasY, { rayPick:true });
208
+ }
209
+
210
+ var scene = this.getScene();
211
+
212
+ scene.on("pick",
213
+ function (hit) {
214
+ targetPivot = hit.worldPos;
215
+ if (indicatorVis) {
216
+ indicatorVis.setEnabled(true);
217
+ indicatorPos.setXYZ({x:targetPivot[0], y:targetPivot[1], z:targetPivot[2] });
218
+ }
219
+ needFlightUpdate = true;
220
+ });
221
+
222
+ scene.on("tick",
223
+ function () {
224
+
225
+
226
+ if (needFlightUpdate) {
227
+
228
+ // Continue flight
229
+ // Find new pivot point, interpolated on path towards new point
230
+
231
+ var a = glmat.vec3.fromValues(targetPivot[0], targetPivot[1], targetPivot[2]);
232
+ var b = glmat.vec3.fromValues(currentPivot[0], currentPivot[1], currentPivot[2]);
233
+ var vec = glmat.vec3.create();
234
+ glmat.vec3.sub(vec, a, b);
235
+ var dist = glmat.vec3.length(vec);
236
+
237
+ if (dist > 15.0) {
238
+ var vel = glmat.vec3.normalize(vec, vec);
239
+ currentPivot[0] += vec[0] * 10.2;
240
+ currentPivot[1] += vec[1] * 10.2;
241
+ currentPivot[2] += vec[2] * 10.2;
242
+
243
+ // Need to rotate lookat
244
+ needRotateUpdate = true;
245
+ } else {
246
+
247
+ // Stop flying
248
+ needFlightUpdate = false;
249
+
250
+ // Hide pick indicator
251
+ if (indicatorVis) {
252
+ indicatorVis.setEnabled(false);
253
+ }
254
+ }
255
+ }
256
+
257
+
258
+ if (needRotateUpdate) {
259
+
260
+ // Update location of point-of-interest indicator
261
+ if (indicatorVis) {
262
+ indicatorVis.setEnabled(true);
263
+ }
264
+
265
+ var eye = glmat.vec3.fromValues(0, 0, zoom);
266
+ var look = glmat.vec3.fromValues(currentPivot[0], currentPivot[1], currentPivot[2]);
267
+ // var up = glmat.vec3.fromValues(0, 1, 0);
268
+
269
+ var eyeVec = glmat.vec3.create();
270
+ glmat.vec3.sub(eyeVec, eye, look);
271
+
272
+ var mat = glmat.mat4.create();
273
+
274
+ glmat.mat4.rotateY(mat, mat, -yaw * 0.0174532925);
275
+ glmat.mat4.rotateX(mat, mat, -pitch * 0.0174532925);
276
+
277
+ var eye3 = glmat.vec3.create();
278
+
279
+ glmat.vec3.transformMat4(eye3, eye, mat);
280
+
281
+ // Update view transform
282
+ lookat.setLook({x:look[0], y:look[1], z:look[2] });
283
+ lookat.setEye({x:look[0] - eye3[0], y:look[1] - eye3[1], z:look[2] - eye3[2] });
284
+
285
+ // Rotate complete
286
+ needRotateUpdate = false;
287
+ }
288
+ });
289
+ },
290
+
291
+ destruct:function () {
292
+ // TODO: remove mouse handlers
293
+ }
294
+ });
295
+ });
@@ -0,0 +1,43 @@
1
+ /**
2
+ *
3
+ */
4
+
5
+ SceneJS.Types.addType("alpha/orbitTrackingTarget", {
6
+
7
+ construct:function (params) {
8
+ this._camera = null;
9
+ },
10
+
11
+
12
+ setEnabled:function (enabled) {
13
+ if (!this._camera && enabled) {
14
+ this.log("error", "No parent 'orbitTracking' node - ignoring enable");
15
+ return;
16
+ }
17
+ if (enabled) {
18
+ this._camera._activeTargetId = this.id;
19
+ } else {
20
+ if (this._camera._activeTargetId == this.id) {
21
+ this._camera._activeTargetId = null;
22
+ }
23
+ }
24
+ },
25
+
26
+ preCompile:function () {
27
+ this._camera = this.findParentByType("alpha/orbitTracking");
28
+ if (!this._camera) {
29
+ this.log("error", "Mandatory parent 'orbitTracking' node not found");
30
+ }
31
+ this.on("rendered", function (data) {
32
+ if (this._camera._activeTargetId == this.id) {
33
+ //this._camera.
34
+ }
35
+ });
36
+ },
37
+
38
+ destruct:function () {
39
+ if (this._camera._activeTargetId == this.id) {
40
+ this._camera._activeTargetId = null;
41
+ }
42
+ }
43
+ });
@@ -0,0 +1,148 @@
1
+ /*
2
+ * A gradient background
3
+ *
4
+ * The background is a quad that sits at the back of the view frustum.
5
+ *
6
+ * The color for the quad is specified as a color for each of the quad's vertices. The color is given as
7
+ * a flat array of 16 double precision numbers, in the range [0.0..1.0], in this format:
8
+ *
9
+ * [r, g, b, a, r, b, b, a, r, g, b, a, r, g, b, a]
10
+ *
11
+ * which is for top-left, top-right, bottom-right and bottom-left corners, respectively.
12
+ *
13
+ * The 'a' components are for the alpha channel, and should be given the value 1.0. That's just
14
+ * there in case we want to do something fancy with alpha channel at some point, like blending.
15
+ *
16
+ * var bg = myNode.addNode({
17
+ * depth: -30, // default
18
+ * colors:[
19
+ * 0.05, 0.06, 0.07, 1.0, // top left (R,G,B,A)
20
+ * 0.05, 0.06, 0.07, 1.0, // top right
21
+ * 0.85, 0.9, 0.98, 1.0, // bottom right
22
+ * 0.85, 0.9, 0.98, 1.0 // bottom left
23
+ * ]
24
+ * });
25
+ *
26
+ * // Change the colors:
27
+ *
28
+ * bg.setColors([
29
+ * 0.01, 0.03, 0.07, 1.0,
30
+ * 0.01, 0.03, 0.07, 1.0,
31
+ * 0.21, 0.2, 0.98, 1.0,
32
+ * 0.21, 0.2, 0.98, 1.0
33
+ * ]);
34
+ *
35
+ * // Change the depth:
36
+ *
37
+ * bg.setDepth(-50);
38
+ *
39
+ */
40
+ (function () {
41
+
42
+ var defaultColors = [
43
+ 0.05, 0.06, 0.07, 1.0, // top left (R,G,B,A)
44
+ 0.05, 0.06, 0.07, 1.0, // top right
45
+ 0.85, 0.9, 0.98, 1.0, // bottom right
46
+ 0.85, 0.9, 0.98, 1.0 // bottom left
47
+ ];
48
+
49
+ var defaultDepth = -30;
50
+
51
+ SceneJS.Types.addType("backgrounds/gradient", {
52
+
53
+ construct:function (params) {
54
+
55
+ var colors = params.colors;
56
+ if (colors && colors.length != 16) {
57
+ this.log("error", "Invalid 'colors' param for backgrounds/gradients: should be 16-element array");
58
+ colors = defaultColors;
59
+ }
60
+
61
+ this._lookat = this.addNode({
62
+ type:"lookAt",
63
+ eye:{ x:0, y:0, z:params.depth || defaultDepth },
64
+ look:{ x:0, y:0, z:0 },
65
+ up:{ x:0, y:1, z:.0 }
66
+ });
67
+
68
+ var lights = this._lookat.addNode({
69
+ type:"lights",
70
+ lights:[
71
+ {
72
+ mode:"dir",
73
+ color:{ r:1.0, g:1.0, b:1.0 },
74
+ dir:{ x:0.0, y:0.0, z:-1.0 },
75
+ diffuse:true,
76
+ specular:true,
77
+ space:"view"
78
+ }
79
+ ]
80
+ });
81
+
82
+ var material = lights.addNode({
83
+ type:"material",
84
+ baseColor:{ r:.95, g:.95, b:.95 },
85
+ specularColor:{ r:0.0, g:0.0, b:0.0 },
86
+ emit:0.2,
87
+ specular:0.9,
88
+ shine:3.0
89
+ });
90
+
91
+ // TODO: width and height, perhaps from frustum
92
+
93
+ this._geometry = material.addNode({
94
+ type:"geometry",
95
+ primitive:"triangles",
96
+
97
+ positions:[
98
+ 950, 200, 300,
99
+ -950, 200, 300,
100
+ -950, -200, 300,
101
+ 950, -200, 300
102
+ ],
103
+
104
+ normals:[
105
+ 0, 0, -1,
106
+ 0, 0, -1,
107
+ 0, 0, -1,
108
+ 0, 0, -1
109
+ ],
110
+
111
+ uv:[
112
+ 10, 10,
113
+ 0, 10,
114
+ 0, 0,
115
+ 10, 0
116
+ ],
117
+
118
+ colors:params.colors || defaultColors,
119
+
120
+ indices:[
121
+ 0, 1, 2, 0, 2, 3
122
+ ]
123
+ });
124
+ },
125
+
126
+ /**
127
+ * Sets the gradient colors
128
+ *
129
+ * @param {Array} [colors] 16-element flat array of colors for vertices - reverts to default when not given
130
+ */
131
+ setColors:function (colors) {
132
+ this._geometry.setColors(colors || defaultColors);
133
+ },
134
+
135
+ /** Sets the depth
136
+ *
137
+ * @param {Number} [depth] Depth on Z-axis - default is -30, reverets to that when no parameter given
138
+ */
139
+ setDepth: function(depth) {
140
+ this._lookat.setEye({ x:0, y:0, z:params.depth || defaultDepth });
141
+ },
142
+
143
+ destruct:function () {
144
+ // Not used
145
+ }
146
+ });
147
+
148
+ })();