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,42 @@
|
|
1
|
+
SceneJS.Types.addType("effects/wobble", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
var shader = this.addNode({
|
6
|
+
type:"shader",
|
7
|
+
shaders:[
|
8
|
+
{
|
9
|
+
stage:"vertex",
|
10
|
+
code:"uniform float time;\n\
|
11
|
+
vec4 myWorldPosFunc(vec4 pos){\n\
|
12
|
+
pos.x=pos.x+sin(pos.x*5.0+time+10.0)*0.1;\n\
|
13
|
+
pos.y=pos.y+sin(pos.y*5.0+time+10.0)*0.1;\n\
|
14
|
+
pos.z=pos.z+sin(pos.z*5.0+time+10.0)*0.1;\n\
|
15
|
+
return pos;\n\
|
16
|
+
}\n",
|
17
|
+
hooks:{
|
18
|
+
worldPos:"myWorldPosFunc"
|
19
|
+
}
|
20
|
+
}
|
21
|
+
],
|
22
|
+
params:{
|
23
|
+
time:0.5
|
24
|
+
},
|
25
|
+
nodes:params.nodes
|
26
|
+
});
|
27
|
+
|
28
|
+
var time = 0;
|
29
|
+
|
30
|
+
this._tick = this.getScene().on("tick",
|
31
|
+
function () {
|
32
|
+
shader.setParams({
|
33
|
+
time:time
|
34
|
+
});
|
35
|
+
time += 0.1;
|
36
|
+
});
|
37
|
+
},
|
38
|
+
|
39
|
+
destruct:function () {
|
40
|
+
this.getScene().off(this._tick);
|
41
|
+
}
|
42
|
+
});
|
@@ -0,0 +1,126 @@
|
|
1
|
+
SceneJS.Types.addType("effects/xray", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
this._shader = this.addNode({
|
6
|
+
type:"shader",
|
7
|
+
|
8
|
+
shaders:[
|
9
|
+
{
|
10
|
+
"stage":"fragment",
|
11
|
+
"code":[
|
12
|
+
"uniform bool xrayEnabled;",
|
13
|
+
"uniform float xrayOpacity;",
|
14
|
+
"uniform bool xrayMonochrome;",
|
15
|
+
|
16
|
+
"vec3 myworldNormal = vec3(0.0, 0.0, 1.0);",
|
17
|
+
"vec3 myworldEyeVec = vec3(0.0, 0.0, -1.0);",
|
18
|
+
|
19
|
+
"void myWorldNormalFunc(vec3 vec) {",
|
20
|
+
" myworldNormal = vec;",
|
21
|
+
"}",
|
22
|
+
|
23
|
+
"void myWorldEyeVecFunc(vec3 vec) {",
|
24
|
+
" myworldEyeVec = vec;",
|
25
|
+
"}",
|
26
|
+
|
27
|
+
"vec4 myPixelColorFunc(vec4 color) {",
|
28
|
+
" if (xrayEnabled && xrayOpacity < 1.0) {",
|
29
|
+
" if (xrayMonochrome) {",
|
30
|
+
" color = vec4(0.2, 0.2, 0.3, (xrayOpacity + 0.9 - abs(dot(myworldNormal, myworldEyeVec))));",
|
31
|
+
" } else {",
|
32
|
+
" color.a = (xrayOpacity + 0.9 - abs(dot(myworldNormal, myworldEyeVec)));",
|
33
|
+
" }",
|
34
|
+
" }",
|
35
|
+
" return color;",
|
36
|
+
"}"
|
37
|
+
],
|
38
|
+
|
39
|
+
hooks:{
|
40
|
+
worldNormal:"myWorldNormalFunc",
|
41
|
+
worldEyeVec:"myWorldEyeVecFunc",
|
42
|
+
pixelColor:"myPixelColorFunc"
|
43
|
+
}
|
44
|
+
}
|
45
|
+
],
|
46
|
+
params:{
|
47
|
+
xrayEnabled:true,
|
48
|
+
xrayOpacity:0.4,
|
49
|
+
xrayMonochrome:false
|
50
|
+
}
|
51
|
+
});
|
52
|
+
|
53
|
+
// Enable transparency with a flag
|
54
|
+
this._flags = this._shader.addNode({
|
55
|
+
type:"flags",
|
56
|
+
flags:{
|
57
|
+
transparent:true,
|
58
|
+
backfaces:false
|
59
|
+
},
|
60
|
+
|
61
|
+
// Child nodes that will receive the x-ray effect
|
62
|
+
nodes:params.nodes
|
63
|
+
});
|
64
|
+
|
65
|
+
this.setEnabled(params.enabled != undefined ? params.enabled : true);
|
66
|
+
this.setOpacity(params.opacity != undefined ? params.opacity : 0.4);
|
67
|
+
this.setMonochrome(params.monochrome != undefined ? params.monochrome : false);
|
68
|
+
},
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Enables or disables the X-Ray effect
|
72
|
+
* @param {Boolean} enabled
|
73
|
+
*/
|
74
|
+
setEnabled:function (enabled) {
|
75
|
+
this._enabled = enabled;
|
76
|
+
this._shader.setParams({ xrayEnabled:enabled });
|
77
|
+
this._flags.setTransparent(enabled);
|
78
|
+
},
|
79
|
+
|
80
|
+
/**
|
81
|
+
* Gets whether the X-Ray effect is enabled or not
|
82
|
+
* @return {Boolean}
|
83
|
+
*/
|
84
|
+
getEnabled:function () {
|
85
|
+
return !!this._enabled;
|
86
|
+
},
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Sets the degree of opacity for X-Ray effect, with 0 being fully transparent and 1 being fully opaque
|
90
|
+
* @param {Number} opacity
|
91
|
+
*/
|
92
|
+
setOpacity:function (opacity) {
|
93
|
+
this._opacity = opacity;
|
94
|
+
this._shader.setParams({ xrayOpacity:opacity });
|
95
|
+
},
|
96
|
+
|
97
|
+
/**
|
98
|
+
* Gets the degree of opacity
|
99
|
+
* @return {Number}
|
100
|
+
*/
|
101
|
+
getOpacity:function () {
|
102
|
+
return this._opacity;
|
103
|
+
},
|
104
|
+
|
105
|
+
/**
|
106
|
+
* Sets whether the X-Ray effect is monochrome or not
|
107
|
+
* @param {Boolean} monochrome
|
108
|
+
*/
|
109
|
+
setMonochrome:function (monochrome) {
|
110
|
+
this._monochrome = monochrome;
|
111
|
+
this._shader.setParams({ xrayMonochrome:monochrome });
|
112
|
+
},
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Gets whether the X-Ray effect is monochrome or not
|
116
|
+
* @return {Boolean}
|
117
|
+
*/
|
118
|
+
getMonochrome:function () {
|
119
|
+
return !!this._monochrome;
|
120
|
+
},
|
121
|
+
|
122
|
+
destruct:function () {
|
123
|
+
// Not used
|
124
|
+
}
|
125
|
+
})
|
126
|
+
;
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require([
|
2
|
+
// Prefix routes to plugin support libs
|
3
|
+
"scenejsPluginDeps/frustum/frustumCullSystemPool"
|
4
|
+
],
|
5
|
+
function (pool) {
|
6
|
+
|
7
|
+
SceneJS.Types.addType("frustum/body", {
|
8
|
+
|
9
|
+
construct:function (params) {
|
10
|
+
|
11
|
+
// Frustum culling and projected canvas size enabled by default
|
12
|
+
this._frustumCull = params.frustumCull != undefined ? params.frustumCull : true;
|
13
|
+
this._detailCull = params.detailCull != undefined ? params.detailCull : true;
|
14
|
+
|
15
|
+
var shape = params.shape || "box";
|
16
|
+
|
17
|
+
switch (shape) {
|
18
|
+
case "box":
|
19
|
+
this._bodyCfg = {
|
20
|
+
shape:shape,
|
21
|
+
min:params.min || [0, 0, 0],
|
22
|
+
max:params.max || [0, 0, 0],
|
23
|
+
frustumCull:this._frustumCull,
|
24
|
+
detailCull:this._detailCull
|
25
|
+
};
|
26
|
+
if (params.showBoundary) {
|
27
|
+
this.addNode({
|
28
|
+
type:"prims/boundary",
|
29
|
+
min:params.min || [0, 0, 0],
|
30
|
+
max:params.max || [0, 0, 0],
|
31
|
+
wire:true
|
32
|
+
});
|
33
|
+
}
|
34
|
+
break;
|
35
|
+
|
36
|
+
// case "sphere":
|
37
|
+
// this._bodyCfg = {
|
38
|
+
// shape:"sphere",
|
39
|
+
// center:params.center || [0, 0, 0],
|
40
|
+
// radius:params.radius || 1.0
|
41
|
+
// };
|
42
|
+
// break;
|
43
|
+
|
44
|
+
default:
|
45
|
+
this.log("error", "Unsupported value for attribute 'shape'");
|
46
|
+
}
|
47
|
+
|
48
|
+
if (params.nodes) {
|
49
|
+
this.addNodes(params.nodes);
|
50
|
+
}
|
51
|
+
},
|
52
|
+
|
53
|
+
preCompile:function () {
|
54
|
+
|
55
|
+
// This node might have been relocated in the scene graph
|
56
|
+
// and therefore inherits new view and projection transforms,
|
57
|
+
// so we'll release any existing system just in case.
|
58
|
+
|
59
|
+
this._putBody();
|
60
|
+
this._getBody();
|
61
|
+
},
|
62
|
+
|
63
|
+
_putBody:function () {
|
64
|
+
if (this._bodyId) {
|
65
|
+
this._system.removeBody(this._bodyId);
|
66
|
+
this._bodyId = null;
|
67
|
+
}
|
68
|
+
if (this._system) {
|
69
|
+
pool.putSystem(this._system);
|
70
|
+
this._system = null;
|
71
|
+
}
|
72
|
+
},
|
73
|
+
|
74
|
+
_getBody:function () {
|
75
|
+
try {
|
76
|
+
this._system = pool.getSystem(this);
|
77
|
+
var self = this;
|
78
|
+
this._bodyId = this._system.createBody(this._bodyCfg,
|
79
|
+
function (intersect, canvasSize) { // Body update handler
|
80
|
+
|
81
|
+
// Not that much overhead in relaying status
|
82
|
+
// updates via pub/sub because they only happen sparsely,
|
83
|
+
// ie. for bodies whose status actually changes
|
84
|
+
|
85
|
+
if (self._frustumCull) { // Frustum culling switching enabled
|
86
|
+
self.publish("intersect", intersect);
|
87
|
+
}
|
88
|
+
|
89
|
+
if (self._detailCull) { // LOD switching enabled
|
90
|
+
self.publish("canvasSize", canvasSize);
|
91
|
+
}
|
92
|
+
|
93
|
+
// self.log(" intersect = " + intersect + ", canvasSize = " + canvasSize);
|
94
|
+
});
|
95
|
+
} catch (e) {
|
96
|
+
this.log("Error : " + e);
|
97
|
+
if (this._system) {
|
98
|
+
pool.putSystem(this._system);
|
99
|
+
this._system = null;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
},
|
103
|
+
|
104
|
+
postCompile:function () {
|
105
|
+
// Not used
|
106
|
+
},
|
107
|
+
|
108
|
+
destruct:function () {
|
109
|
+
this._putBody();
|
110
|
+
}
|
111
|
+
});
|
112
|
+
});
|
@@ -0,0 +1,42 @@
|
|
1
|
+
SceneJS.Types.addType("frustum/cull", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
var self = this;
|
6
|
+
|
7
|
+
this.addNode({
|
8
|
+
type:"frustum/body",
|
9
|
+
shape:params.shape,
|
10
|
+
min:params.min,
|
11
|
+
max:params.max,
|
12
|
+
showBoundary:params.showBoundary,
|
13
|
+
frustumCull: params.frustumCull ? params.frustumCull : true, // Enable frustum culling?
|
14
|
+
detailCull: false // Don't need LOD switching
|
15
|
+
},
|
16
|
+
function (body) {
|
17
|
+
if (params.nodes) {
|
18
|
+
self.addNode({
|
19
|
+
type:"enable",
|
20
|
+
enabled:false,
|
21
|
+
nodes:params.nodes
|
22
|
+
},
|
23
|
+
function (enable) {
|
24
|
+
body.on("intersect",
|
25
|
+
function (intersect) {
|
26
|
+
switch (intersect) {
|
27
|
+
case 0: // Completely outside frustum
|
28
|
+
enable.setEnabled(false);
|
29
|
+
break;
|
30
|
+
case 1: // Partially inside frustum
|
31
|
+
enable.setEnabled(true);
|
32
|
+
break;
|
33
|
+
case 2: // Completely inside frustum
|
34
|
+
enable.setEnabled(true);
|
35
|
+
break;
|
36
|
+
}
|
37
|
+
});
|
38
|
+
});
|
39
|
+
}
|
40
|
+
});
|
41
|
+
}
|
42
|
+
});
|
@@ -0,0 +1,125 @@
|
|
1
|
+
SceneJS.Types.addType("frustum/lod", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
var self = this;
|
6
|
+
|
7
|
+
var sizes = params.sizes;
|
8
|
+
if (!sizes) {
|
9
|
+
this.log("error", "mandatory attribute missing: 'sizes'");
|
10
|
+
return;
|
11
|
+
}
|
12
|
+
|
13
|
+
var nodes = params.nodes;
|
14
|
+
if (!nodes) {
|
15
|
+
this.log("error", "mandatory attribute missing: 'nodes'");
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
|
19
|
+
if (sizes.length != nodes.length) {
|
20
|
+
this.log("error", "invalid attribute(s): 'sizes' and 'nodes' should be arrays of equal length");
|
21
|
+
return;
|
22
|
+
}
|
23
|
+
|
24
|
+
for (var i = 0, len = sizes.length; i < len; i++) {
|
25
|
+
if (sizes[i] <= 0) {
|
26
|
+
this.log("error", "invalid attribute: values in 'sizes' should be greater than zero");
|
27
|
+
return;
|
28
|
+
}
|
29
|
+
if (i > 0) {
|
30
|
+
if (sizes[i] <= sizes[i - 1]) {
|
31
|
+
this.log("error", "invalid attribute: values in 'sizes' should be in ascending order");
|
32
|
+
return;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
this.addNode({
|
38
|
+
type:"frustum/body",
|
39
|
+
shape:params.shape,
|
40
|
+
min:params.min,
|
41
|
+
max:params.max,
|
42
|
+
showBoundary:params.showBoundary,
|
43
|
+
frustumCull: params.frustumCull ? params.frustumCull : true, // Enable frustum culling?
|
44
|
+
detailCull:true // Enable detail culling information (default)
|
45
|
+
},
|
46
|
+
function (body) {
|
47
|
+
if (params.nodes) {
|
48
|
+
var childNodes = [];
|
49
|
+
for (var i = 0, len = params.nodes.length; i < len; i++) {
|
50
|
+
childNodes.push(self.addNode({
|
51
|
+
type:"enable",
|
52
|
+
enabled:false,
|
53
|
+
nodes:[
|
54
|
+
params.nodes[i]
|
55
|
+
]
|
56
|
+
}));
|
57
|
+
}
|
58
|
+
|
59
|
+
// The currently active child node
|
60
|
+
var currentNode;
|
61
|
+
|
62
|
+
// If frustum culling is not disabled by
|
63
|
+
// params.frustumCull, then we'll get notification
|
64
|
+
// whenever the boundaries intersection status
|
65
|
+
// changes with respect to the view frustum.
|
66
|
+
|
67
|
+
body.on("intersect",
|
68
|
+
function (intersect) {
|
69
|
+
if (currentNode) {
|
70
|
+
switch (intersect) {
|
71
|
+
case 0: // Completely outside frustum
|
72
|
+
currentNode.setEnabled(false);
|
73
|
+
break;
|
74
|
+
case 1: // Partially inside frustum
|
75
|
+
currentNode.setEnabled(true);
|
76
|
+
break;
|
77
|
+
case 2: // Completely inside frustum
|
78
|
+
currentNode.setEnabled(true);
|
79
|
+
break;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
});
|
83
|
+
|
84
|
+
// If frustum culling is not disabled by params.frustumCull,
|
85
|
+
// then we'll get notifications of change in projected canvas
|
86
|
+
// size for the boundary as long as the "intersect" notification
|
87
|
+
// reported that the boundary is not outside the view frustum.
|
88
|
+
|
89
|
+
// If frustum culling is disabled. then we'll get
|
90
|
+
// notification of canvas size changes regardless of
|
91
|
+
// whether the boundary is outside the frustum of not.
|
92
|
+
|
93
|
+
body.on("canvasSize",
|
94
|
+
function (canvasSize) {
|
95
|
+
|
96
|
+
if (currentNode) {
|
97
|
+
|
98
|
+
// We only get a 2d size update when the size has changed,
|
99
|
+
// so its safe to say we'll not be immediately re-enabling
|
100
|
+
// the currently enabled child node. No need to avoid
|
101
|
+
// any redundant re-enabling or disabling here.
|
102
|
+
|
103
|
+
currentNode.setEnabled(false);
|
104
|
+
}
|
105
|
+
//
|
106
|
+
if (canvasSize == -1) {
|
107
|
+
// All Culled
|
108
|
+
return;
|
109
|
+
}
|
110
|
+
|
111
|
+
// Enable the appropriate child, if any,
|
112
|
+
// for the boundary's projected 2D size
|
113
|
+
|
114
|
+
for (var i = sizes.length - 1; i >= 0; i--) {
|
115
|
+
if (canvasSize >= sizes[i]) {
|
116
|
+
currentNode = childNodes[i];
|
117
|
+
currentNode.setEnabled(true);
|
118
|
+
return;
|
119
|
+
}
|
120
|
+
}
|
121
|
+
});
|
122
|
+
}
|
123
|
+
});
|
124
|
+
}
|
125
|
+
});
|