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,168 @@
1
+ SceneJS.Types.addType("objects/space/planets/earth", {
2
+
3
+ construct:function (params) {
4
+
5
+ var texturePath = SceneJS.getConfigs("pluginPath") + "/node/objects/space/planets/earth/";
6
+
7
+ var node = this.addNode({
8
+ type:"rotate",
9
+ z:1,
10
+ angle:195
11
+ });
12
+
13
+ var earthRotate = node = node.addNode({
14
+ type:"rotate",
15
+ y:1
16
+ });
17
+
18
+ // Layer 0: Earth's surface with color, specular
19
+ // and emissive maps
20
+
21
+ node = node.addNode({
22
+ type:"layer",
23
+ priority:0,
24
+
25
+ nodes:[
26
+ {
27
+ type:"scale",
28
+ x:2,
29
+ y:2,
30
+ z:2,
31
+
32
+ nodes:[
33
+ {
34
+ type:"material",
35
+ emit:1,
36
+ color:{ r:1.0, g:1.0, b:1.0 },
37
+ specularColor:{ r:0.5, g:0.5, b:0.5 },
38
+ specular:5.0,
39
+ shine:70.0,
40
+
41
+ nodes:[
42
+ {
43
+ type:"texture",
44
+ layers:[
45
+ // // Bump map
46
+ // {
47
+ // src:"../../../textures/earthbump.jpg",
48
+ // applyTo:"normals"
49
+ // },
50
+ {
51
+ src:texturePath + "earth.jpg",
52
+ applyTo:"color"
53
+ },
54
+ {
55
+ src:texturePath + "earth-specular.jpg",
56
+ applyTo:"specular"
57
+ } ,
58
+ {
59
+ src:texturePath + "earth-lights.gif",
60
+ applyTo:"emit"
61
+ }
62
+ ],
63
+ nodes:[
64
+ {
65
+ type:"geometry",
66
+ source:{
67
+ type:"sphere",
68
+ latitudeBands:120,
69
+ longitudeBands:120
70
+ }
71
+ }
72
+ ]
73
+ }
74
+ ]
75
+ }
76
+ ]
77
+ }
78
+ ]
79
+ });
80
+
81
+ // Layer 1: Cloud layer with alpha map
82
+ var cloudsRotate = node = node.addNode({
83
+ type:"rotate",
84
+ y:1,
85
+ nodes:[
86
+ {
87
+ type:"layer",
88
+ priority:1,
89
+ nodes:[
90
+ {
91
+ type:"flags",
92
+ flags:{
93
+ transparent:true,
94
+ specular:true
95
+ },
96
+ nodes:[
97
+ {
98
+ type:"material",
99
+ emit:0.1,
100
+ alpha:0.7,
101
+ color:{ r:1, g:1, b:1 },
102
+ specularColor:{ r:1.0, g:1.0, b:1.0 },
103
+ specular:0.5,
104
+ shine:1.0,
105
+ nodes:[
106
+ {
107
+ type:"scale",
108
+ x:2.05,
109
+ y:2.05,
110
+ z:2.05,
111
+ nodes:[
112
+ {
113
+ type:"texture",
114
+ layers:[
115
+ {
116
+ src:texturePath + "earthclouds.jpg",
117
+ applyTo:"alpha",
118
+ flipY:false
119
+ }
120
+ ],
121
+ // Sphere with some material
122
+ nodes:[
123
+ {
124
+ type:"node",
125
+ z:1,
126
+ angle:195,
127
+ nodes:[
128
+ {
129
+ type:"geometry",
130
+ source:{
131
+ type:"sphere",
132
+ latitudeBands:120,
133
+ longitudeBands:120
134
+ }
135
+ }
136
+ ]
137
+ }
138
+ ]
139
+ }
140
+ ]
141
+ }
142
+ ]
143
+ }
144
+ ]
145
+ }
146
+ ]
147
+ }
148
+ ]
149
+ });
150
+
151
+ var earthAngle = 0;
152
+ var cloudsAngle = 0;
153
+
154
+ this._tick = this.getScene().on("tick",
155
+ function () {
156
+ earthRotate.setAngle(earthAngle);
157
+ cloudsRotate.setAngle(cloudsAngle);
158
+
159
+ earthAngle -= 0.02;
160
+ cloudsAngle -= 0.01;
161
+ });
162
+ },
163
+
164
+ // Node destructor, unsubscribes from scene tick
165
+ destruct:function () {
166
+ this.getScene().off(this._tick);
167
+ }
168
+ });
@@ -0,0 +1,632 @@
1
+ /**
2
+ * Drinking Bird Toy
3
+ *
4
+ * @author Moritz Kornher
5
+ *
6
+ * Usage example:
7
+ *
8
+ * someNode.addNode({
9
+ * type: "objects/toys/drinkingBird",
10
+ * rotate: true // Default false - causes bird to drink when true
11
+ * });
12
+ *
13
+ */
14
+ SceneJS.Types.addType("objects/toys/drinkingBird", {
15
+
16
+ init:function (params) {
17
+
18
+ this.rotate = params.rotate || false;
19
+
20
+ this.angle = 18;
21
+ this.direction = -1;
22
+ this.speed = 1.7;
23
+
24
+ // set up library
25
+ // TODO: if not existing
26
+ this._library = this.addNode({
27
+ type:"library",
28
+ nodes:[
29
+ // feet material
30
+ {
31
+ type:"material",
32
+ color:{ r:1.0, g:0.0, b:0.0 },
33
+ coreId:"feetMaterial"
34
+ },
35
+ // leg material
36
+ {
37
+ type:"material",
38
+ color:{ r:0.86, g:0.86, b:0.86 },
39
+ coreId:"legMaterial"
40
+ },
41
+ // head material
42
+ {
43
+ type:"material",
44
+ color:{ r:1.0, g:0.0, b:0.0 },
45
+ coreId:"headMaterial"
46
+ },
47
+ // hat material
48
+ {
49
+ type:"material",
50
+ color:{ r:0.0, g:0.0, b:0.0 },
51
+ specularColor:{ r:1.0, g:1.0, b:1.0 },
52
+ specular:1.0,
53
+ shine:50.0,
54
+ coreId:"hatMaterial"
55
+ },
56
+
57
+ // glass material
58
+ {
59
+ type:"material",
60
+ color:{ r:0.3, g:0.3, b:0.3 },
61
+ specularColor:{ r:1.0, g:1.0, b:1.0 },
62
+ specular:1.0,
63
+ shine:80.0,
64
+ alpha:0.3,
65
+ coreId:"glassMaterial"
66
+ },
67
+ //~ envMap: skyRefraction,
68
+ //~ refractionRatio: 0.3, reflectivity: 0.8
69
+
70
+ // water material
71
+ {
72
+ type:"material",
73
+ color:{ r:0.0, g:0.0, b:1.0 },
74
+ specularColor:{ r:0.0, g:0.0, b:1.0 },
75
+ specular:1.0,
76
+ shine:30.0,
77
+ alpha:0.7,
78
+ coreId:"waterMaterial"
79
+ }
80
+ //~ envMap: skyRefraction,
81
+ //~ refractionRatio: 0.3, reflectivity: 0.4
82
+
83
+ ]
84
+ });
85
+
86
+ // bird and root node
87
+ this._bird = this.addNode({
88
+ type:"translate",
89
+ x:0, y:0, z:0
90
+ });
91
+ this._bird = this._bird.addNode({
92
+ type:"rotate",
93
+ x:1, y:0, z:0,
94
+ angle:0
95
+ });
96
+
97
+
98
+ // crossbar
99
+ this._bird.addNode({
100
+ type:"translate",
101
+ x:0, y:360, z:0,
102
+ nodes:[
103
+ {
104
+ type:"rotate",
105
+ x:0, y:0, z:1,
106
+ angle:90,
107
+ nodes:[
108
+ {
109
+ type:"material",
110
+ color:{ r:0.53, g:0.53, b:0.53 },
111
+ nodes:[
112
+ {
113
+ type:"prims/cylinder",
114
+ radiusTop:5,
115
+ radiusBottom:5,
116
+ height:300,
117
+ radialSegments:32
118
+ }
119
+ ]
120
+ }
121
+ ]
122
+ }
123
+ ]
124
+ });
125
+
126
+
127
+ // mount and feet
128
+ var mount = this._bird.addNode({
129
+ type:"node",
130
+ nodes:[
131
+ {
132
+ type:"translate",
133
+ x:0, y:2, z:-45,
134
+ nodes:[
135
+ {
136
+ type:"material",
137
+ coreId:"feetMaterial",
138
+ nodes:[
139
+ {
140
+ type:"prims/box",
141
+ xSize:83,
142
+ ySize:2,
143
+ zSize:(110 + 64 + 20) / 2
144
+ }
145
+ ]
146
+ }
147
+ ]
148
+ }
149
+ ]
150
+ });
151
+ var leftFeet = mount.addNode({
152
+ type:"translate",
153
+ x:-80, y:0, z:0,
154
+ nodes:[
155
+ {
156
+ type:"translate",
157
+ x:0, y:30, z:-45,
158
+ nodes:[
159
+ {
160
+ type:"material",
161
+ coreId:"feetMaterial",
162
+ nodes:[
163
+ {
164
+ type:"prims/box",
165
+ xSize:3,
166
+ ySize:52 / 2,
167
+ zSize:(110 + 64 + 20) / 2
168
+ }
169
+ ]
170
+ }
171
+ ]
172
+ },
173
+ {
174
+ type:"translate",
175
+ x:0, y:71, z:0,
176
+ nodes:[
177
+ {
178
+ type:"material",
179
+ coreId:"feetMaterial",
180
+ nodes:[
181
+ {
182
+ type:"prims/box",
183
+ xSize:3,
184
+ ySize:15,
185
+ zSize:64 / 2
186
+ }
187
+ ]
188
+ }
189
+ ]
190
+ },
191
+ {
192
+ type:"translate",
193
+ x:0, y:15 + 56 + 334 / 2, z:0,
194
+ nodes:[
195
+ {
196
+ type:"material",
197
+ coreId:"legMaterial",
198
+ nodes:[
199
+ {
200
+ type:"prims/box",
201
+ xSize:3,
202
+ ySize:(334 - 30) / 2,
203
+ zSize:64 / 2
204
+ }
205
+ ]
206
+ }
207
+ ]
208
+ }
209
+ ]
210
+ });
211
+ var rightFeet = mount.addNode({
212
+ type:"translate",
213
+ x:80, y:0, z:0,
214
+ nodes:[
215
+ {
216
+ type:"translate",
217
+ x:0, y:30, z:-45,
218
+ nodes:[
219
+ {
220
+ type:"material",
221
+ coreId:"feetMaterial",
222
+ nodes:[
223
+ {
224
+ type:"prims/box",
225
+ xSize:3,
226
+ ySize:52 / 2,
227
+ zSize:(110 + 64 + 20) / 2
228
+ }
229
+ ]
230
+ }
231
+ ]
232
+ },
233
+ {
234
+ type:"translate",
235
+ x:0, y:71, z:0,
236
+ nodes:[
237
+ {
238
+ type:"material",
239
+ coreId:"feetMaterial",
240
+ nodes:[
241
+ {
242
+ type:"prims/box",
243
+ xSize:3,
244
+ ySize:15,
245
+ zSize:64 / 2
246
+ }
247
+ ]
248
+ }
249
+ ]
250
+ },
251
+ {
252
+ type:"translate",
253
+ x:0, y:15 + 56 + 334 / 2, z:0,
254
+ nodes:[
255
+ {
256
+ type:"material",
257
+ coreId:"legMaterial",
258
+ nodes:[
259
+ {
260
+ type:"prims/box",
261
+ xSize:3,
262
+ ySize:(334 - 30) / 2,
263
+ zSize:64 / 2
264
+ }
265
+ ]
266
+ }
267
+ ]
268
+ }
269
+ ]
270
+ });
271
+
272
+
273
+ // body
274
+ var body = this._bird.addNode({
275
+ type:"translate",
276
+ y:360
277
+ });
278
+ body = this._birdBodyRotation = body.addNode({
279
+ type:"rotate",
280
+ x:1, y:0, z:0
281
+ });
282
+ body = body.addNode({
283
+ type:"translate",
284
+ y:-200
285
+ });
286
+
287
+
288
+ // lowerbody
289
+ var lowerBody = body.addNode({
290
+ type:"node",
291
+ nodes:[
292
+ {
293
+ type:"flags",
294
+ flags:{
295
+ transparent:true
296
+ },
297
+ nodes:[
298
+ {
299
+ type:"translate",
300
+ y:225 / 2,
301
+ nodes:[
302
+ {
303
+ type:"material",
304
+ coreId:"waterMaterial",
305
+ nodes:[
306
+ {
307
+ type:"prims/cylinder",
308
+ radiusTop:8,
309
+ radiusBottom:8,
310
+ height:300,
311
+ radialSegments:16
312
+ }
313
+ ]
314
+ }
315
+ ]
316
+ },
317
+ {
318
+ type:"rotate",
319
+ x:1,
320
+ id:"birdWaterRotation",
321
+ nodes:[
322
+ {
323
+ type:"translate",
324
+ y:3,
325
+ nodes:[
326
+ {
327
+ type:"material",
328
+ coreId:"waterMaterial",
329
+ nodes:[
330
+ {
331
+ type:"geometry",
332
+ source:{
333
+ type:"sphere",
334
+ latudeBands:32,
335
+ longitudeBands:16,
336
+ radius:52,
337
+ thetaStart:Math.PI / 2,
338
+ thetaLength:Math.PI
339
+ }
340
+ }
341
+ ]
342
+ },
343
+ {
344
+ type:"material",
345
+ coreId:"waterMaterial",
346
+ nodes:[
347
+ {
348
+ type:"prims/cylinder",
349
+ radiusTop:52,
350
+ radiusBottom:52,
351
+ height:0,
352
+ radialSegments:32
353
+ }
354
+ ]
355
+ }
356
+ ]
357
+ },
358
+ ]
359
+ },
360
+ {
361
+ type:"translate",
362
+ y:350 / 2,
363
+ nodes:[
364
+ {
365
+ type:"material",
366
+ coreId:"glassMaterial",
367
+ nodes:[
368
+ {
369
+ type:"prims/cylinder",
370
+ radiusTop:12,
371
+ radiusBottom:12,
372
+ height:435,
373
+ radialSegments:16
374
+ }
375
+ ]
376
+ }
377
+ ]
378
+ },
379
+ {
380
+ type:"material",
381
+ coreId:"glassMaterial",
382
+ nodes:[
383
+ {
384
+ type:"geometry",
385
+ source:{
386
+ type:"sphere",
387
+ latudeBands:32,
388
+ longitudeBands:32,
389
+ radius:58
390
+ }
391
+ }
392
+ ]
393
+ },
394
+ ]
395
+ }
396
+ ]
397
+ });
398
+
399
+
400
+ // head
401
+ var head = body.addNode({
402
+ type:"translate",
403
+ y:390,
404
+ nodes:[
405
+ // head sphere
406
+ {
407
+ type:"material",
408
+ coreId:"headMaterial",
409
+ nodes:[
410
+ {
411
+ type:"geometry",
412
+ source:{
413
+ type:"sphere",
414
+ latudeBands:32,
415
+ longitudeBands:32,
416
+ radius:52
417
+ }
418
+ }
419
+ ]
420
+ },
421
+
422
+ // nose
423
+ {
424
+ type:"translate",
425
+ x:0, y:-15, z:-80,
426
+ nodes:[
427
+ {
428
+ type:"rotate",
429
+ x:1, y:0, z:0,
430
+ angle:-90,
431
+ nodes:[
432
+ {
433
+ type:"material",
434
+ coreId:"headMaterial",
435
+ nodes:[
436
+ {
437
+ type:"prims/cylinder",
438
+ radiusTop:8,
439
+ radiusBottom:15,
440
+ height:70,
441
+ radialSegments:16
442
+ }
443
+ ]
444
+ }
445
+ ]
446
+ }
447
+ ]
448
+ },
449
+
450
+ // left eye
451
+ {
452
+ type:"translate",
453
+ x:0, y:0, z:-45,
454
+ nodes:[
455
+ {
456
+ type:"rotate",
457
+ x:0, y:0, z:1,
458
+ angle:-50,
459
+ nodes:[
460
+ {
461
+ type:"translate",
462
+ x:0, y:27, z:0,
463
+ nodes:[
464
+ {
465
+ type:"material",
466
+ color:{ r:1.0, g:1.0, b:1.0 },
467
+ nodes:[
468
+ {
469
+ type:"geometry",
470
+ source:{
471
+ type:"sphere",
472
+ latudeBands:8,
473
+ longitudeBands:8,
474
+ radius:8
475
+ }
476
+ }
477
+ ]
478
+ },
479
+ {
480
+ type:"translate",
481
+ x:0, y:0, z:-6,
482
+ nodes:[
483
+ {
484
+ type:"material",
485
+ color:{ r:0.0, g:0.0, b:0.0 },
486
+ nodes:[
487
+ {
488
+ type:"geometry",
489
+ source:{
490
+ type:"sphere",
491
+ latudeBands:8,
492
+ longitudeBands:8,
493
+ radius:4
494
+ }
495
+ }
496
+ ]
497
+ },
498
+ ]
499
+ }
500
+ ]
501
+ }
502
+ ]
503
+ }
504
+ ]
505
+ },
506
+
507
+ // right eye
508
+ {
509
+ type:"translate",
510
+ x:0, y:0, z:-45,
511
+ nodes:[
512
+ {
513
+ type:"rotate",
514
+ x:0, y:0, z:1,
515
+ angle:50,
516
+ nodes:[
517
+ {
518
+ type:"translate",
519
+ x:0, y:27, z:0,
520
+ nodes:[
521
+ {
522
+ type:"material",
523
+ color:{ r:1.0, g:1.0, b:1.0 },
524
+ nodes:[
525
+ {
526
+ type:"geometry",
527
+ source:{
528
+ type:"sphere",
529
+ latudeBands:8,
530
+ longitudeBands:8,
531
+ radius:8
532
+ }
533
+ }
534
+ ]
535
+ },
536
+ {
537
+ type:"translate",
538
+ x:0, y:0, z:-6,
539
+ nodes:[
540
+ {
541
+ type:"material",
542
+ color:{ r:0.0, g:0.0, b:0.0 },
543
+ nodes:[
544
+ {
545
+ type:"geometry",
546
+ source:{
547
+ type:"sphere",
548
+ latudeBands:8,
549
+ longitudeBands:8,
550
+ radius:4
551
+ }
552
+ }
553
+ ]
554
+ },
555
+ ]
556
+ }
557
+ ]
558
+ }
559
+ ]
560
+ }
561
+ ]
562
+ },
563
+ ]
564
+ });
565
+
566
+ var hat = head.addNode({
567
+ type:"translate",
568
+ y:45,
569
+ x:0.001,
570
+ nodes:[
571
+ {
572
+ type:"material",
573
+ coreId:"hatMaterial",
574
+ nodes:[
575
+ {
576
+ type:"prims/cylinder",
577
+ radiusTop:71,
578
+ radiusBottom:71,
579
+ height:10,
580
+ radialSegments:32
581
+ }
582
+ ]
583
+ },
584
+ {
585
+ type:"translate",
586
+ x:0, y:38, z:0,
587
+ nodes:[
588
+ {
589
+ type:"material",
590
+ coreId:"hatMaterial",
591
+ nodes:[
592
+ {
593
+ type:"prims/cylinder",
594
+ radiusTop:45,
595
+ radiusBottom:45,
596
+ height:66,
597
+ radialSegments:32
598
+ }
599
+ ]
600
+ }
601
+ ]
602
+ }
603
+ ]
604
+ });
605
+
606
+ // register animation
607
+ var birdWaterRotation = scene.getNode("birdWaterRotation"); // TODO: unique IDs - allow many brds
608
+ var scope = this;
609
+ this._tick = this.getScene().on("tick",
610
+ function () {
611
+ if (scope.rotate) {
612
+ if (0 > scope.direction && scope.angle < -100) {
613
+ scope.direction = 1;
614
+ scope.speed = 260;
615
+ } else if (0 < scope.direction && scope.angle > 18) {
616
+ scope.direction = -1;
617
+ scope.speed = 1.7;
618
+ }
619
+ scope.speed += -1 * scope.direction * Math.log(scope.speed);
620
+ scope.angle = scope.angle + scope.direction * (scope.speed / 100 + 0.5);
621
+ scope._birdBodyRotation.setAngle(scope.angle);
622
+ //~ scope._birdWaterRotation.setAngle(-scope.angle);
623
+ birdWaterRotation.setAngle(-scope.angle);
624
+ }
625
+ });
626
+ },
627
+
628
+ // Node destructor, unsubscribes from scene tick
629
+ destroy:function () {
630
+ this.getScene().off(this._tick);
631
+ }
632
+ });