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.
- checksums.yaml +4 -4
- data/README.md +5 -5
- data/app/controllers/scenejs_controller.rb +53 -0
- data/app/views/scenejs/get_scenejs_data.html.erb +3 -0
- data/lib/scenejs_on_rails.rb +1 -1
- data/lib/scenejs_on_rails/rails.rb +5 -0
- data/lib/scenejs_on_rails/version.rb +1 -1
- data/vendor/assets/javascripts/scenejs.js +17307 -0
- data/vendor/assets/javascripts/scenejs_extras/gui.js +478 -0
- data/vendor/assets/javascripts/scenejs_extras/gui/README.md +4 -0
- data/vendor/assets/javascripts/scenejs_extras/gui/dat.gui.min.js +94 -0
- data/vendor/assets/javascripts/scenejs_extras/gui/gui.js +385 -0
- data/vendor/assets/javascripts/scenejs_lib/cityBuilder.js +457 -0
- data/vendor/assets/javascripts/scenejs_lib/dat.gui.min.js +94 -0
- data/vendor/assets/javascripts/scenejs_lib/gl-matrix-min.js +28 -0
- data/vendor/assets/javascripts/scenejs_lib/gl-matrix.js +4078 -0
- data/vendor/assets/javascripts/scenejs_lib/require.js +36 -0
- data/vendor/assets/javascripts/scenejs_lib/requireConfig.js +18 -0
- data/vendor/assets/javascripts/scenejs_lib/requireWrapperEnd.js +1 -0
- data/vendor/assets/javascripts/scenejs_lib/requireWrapperStart.js +2 -0
- data/vendor/assets/javascripts/scenejs_lib/stats.min.js +6 -0
- data/vendor/assets/javascripts/scenejs_lib/sylvester.js +1 -0
- data/vendor/assets/javascripts/scenejs_lib/webgl-debug-utils.js +839 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/boundary.js +59 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/box.js +72 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/plane.js +126 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/quad.js +37 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/skybox.js +86 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/sphere.js +82 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/teapot.js +5853 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/torus.js +139 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/vectorText.js +1499 -0
- data/vendor/assets/javascripts/scenejs_plugins/geometry/wobblyBox.js +44 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/canvas2image.js +198 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullEngine.js +810 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystem.js +185 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullSystemPool.js +174 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/frustum/frustumCullWorker.js +142 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/gl-matrix-min.js +28 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/jquery-1.8.3.min.js +2 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/k3d.js +1029 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/physics/jiglib.all.min.js +3 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/physics/physics.js +223 -0
- data/vendor/assets/javascripts/scenejs_plugins/lib/physics/worker.js +330 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTracking.js +295 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/alpha/orbitTrackingTarget.js +43 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/backgrounds/gradient.js +148 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/cameras/orbit.js +172 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/cameras/pickFlyOrbit.js +409 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/canvas/capture.js +107 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/demos/color.js +30 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/demos/redTeapot.js +52 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/demos/spinningTeapot.js +43 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/effects/crt.js +36 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/effects/fog.js +159 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/effects/snowyPeaks.js +50 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/effects/wobble.js +42 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/effects/xray.js +126 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/frustum/body.js +112 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/frustum/cull.js +42 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/frustum/lod.js +125 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/heightmaps/custom.js +185 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/import/3ds.js +91 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/import/md2.js +139 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/import/obj.js +100 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building.js +352 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlass.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/HighRiseGlassSpecular.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/highrise-windows.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/building/pixelcity_windows7.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/buildings/city.js +26 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/plants/ghostTree.js +387 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth.js +168 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-lights.gif +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.gif +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth-specular.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earth.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthbump.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/space/planets/earth/earthclouds.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/toys/drinkingBird.js +632 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js +77670 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/objects/vehicles/tank.js~ +77636 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/body.js +85 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/box.js +30 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/material.js +35 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/plane.js +47 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/sphere.js +32 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/system.js +44 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/physics/teapot.js +29 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/boundary.js +73 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/box.js +87 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/cylinder.js +186 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/grid.js +47 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/plane.js +137 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/quad.js +43 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/sphere.js +107 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/teapot.js +5846 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/torus.js +149 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/prims/vectorText.js +1508 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/clouds.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/cloudySea.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/custom.js +150 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/grimmNight.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/interstellarClouds.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/miramarClouds.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/stormyDays.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/clouds.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/cloudySea.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/grimmNight.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/interstellarClouds.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/miramarClouds.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/stormyDays.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/textures/violentDays.jpg +0 -0
- data/vendor/assets/javascripts/scenejs_plugins/node/skyboxes/violentDays.js +19 -0
- data/vendor/assets/javascripts/scenejs_plugins/texture/image.js +67 -0
- data/vendor/assets/javascripts/scenejs_plugins/texture/video.js +105 -0
- 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
|
+
})();
|