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,107 @@
|
|
1
|
+
/**
|
2
|
+
* Custom node which captures images of the scene canvas
|
3
|
+
*
|
4
|
+
* Usage example:
|
5
|
+
*
|
6
|
+
* someNode.addNode({
|
7
|
+
* type: "canvas/capture",
|
8
|
+
*
|
9
|
+
* // Optional image format, "jpeg" (default), "png" or "bmp"
|
10
|
+
* format: "jpeg",
|
11
|
+
*
|
12
|
+
* // Optional image result size, defaults to current size of canvas at time of capture
|
13
|
+
* width: 300,
|
14
|
+
* height: 400
|
15
|
+
* });
|
16
|
+
*
|
17
|
+
* scene.getNode("myCanvasCapture",
|
18
|
+
* function (myCanvasCapture) {
|
19
|
+
*
|
20
|
+
* // Subscribe to captured image
|
21
|
+
* myCanvasCapture.on("image",
|
22
|
+
* function (data) {
|
23
|
+
* var src = data.src; // Data URL
|
24
|
+
* var width = data.width; // Width of image
|
25
|
+
* var height = data.height; // Height of image
|
26
|
+
* });
|
27
|
+
*
|
28
|
+
* // Do capture
|
29
|
+
* myCanvasCapture.capture({
|
30
|
+
*
|
31
|
+
* // Optional dimensions of desired image, falls back on node config,
|
32
|
+
* // or if not specified there, the current size of canvas
|
33
|
+
* width: 500,
|
34
|
+
* height: 400,
|
35
|
+
*
|
36
|
+
* // Optional format - falls back on node config,
|
37
|
+
* // or if not specified there, "jpeg"
|
38
|
+
* format: "jpeg"
|
39
|
+
* });
|
40
|
+
*/
|
41
|
+
require([
|
42
|
+
|
43
|
+
// This prefix routes to the 3rd-party libs directory containing resources used by plugins
|
44
|
+
"scenejsPluginDeps/canvas2image"
|
45
|
+
],
|
46
|
+
function () {
|
47
|
+
|
48
|
+
SceneJS.Types.addType("canvas/capture", {
|
49
|
+
|
50
|
+
construct:function (params) {
|
51
|
+
this._format = params.format ? supportedFormat(params.format) : "jpeg";
|
52
|
+
this._width = params.width;
|
53
|
+
this._height = params.height;
|
54
|
+
},
|
55
|
+
|
56
|
+
capture:function (params) {
|
57
|
+
|
58
|
+
params = params || {};
|
59
|
+
|
60
|
+
var scene = this.getScene();
|
61
|
+
scene.renderFrame({ force:true }); // HACK - need to fix need for this in SceneJS
|
62
|
+
var canvas = scene.getCanvas();
|
63
|
+
|
64
|
+
var width = params.width || this._width || canvas.width;
|
65
|
+
var height = params.height || this._height || canvas.height;
|
66
|
+
|
67
|
+
var image;
|
68
|
+
|
69
|
+
var format = params.format ? this._supportedFormat(params.format) : this._format;
|
70
|
+
|
71
|
+
switch (format) {
|
72
|
+
case "jpeg":
|
73
|
+
image = Canvas2Image.saveAsJPEG(canvas, true, width, height);
|
74
|
+
break;
|
75
|
+
|
76
|
+
case "png":
|
77
|
+
image = Canvas2Image.saveAsPNG(canvas, true, width, height);
|
78
|
+
break;
|
79
|
+
|
80
|
+
case "bmp":
|
81
|
+
image = Canvas2Image.saveAsBMP(canvas, true, width, height);
|
82
|
+
break;
|
83
|
+
|
84
|
+
default:
|
85
|
+
this.log("error", "format unsupported: " + format);
|
86
|
+
return;
|
87
|
+
}
|
88
|
+
|
89
|
+
this.publish("image", {
|
90
|
+
src:image.src,
|
91
|
+
format:format,
|
92
|
+
width:width,
|
93
|
+
height:height
|
94
|
+
});
|
95
|
+
},
|
96
|
+
|
97
|
+
_supportedFormat:function (format) {
|
98
|
+
if (format != "jpeg" && format != "png" && format != "bmp") {
|
99
|
+
this.log("error", "unsupported format for canvas/capture node: " + format
|
100
|
+
+ " - supported types are 'jpeg', 'bmp' and 'png' - falling back on 'jpeg'");
|
101
|
+
return "jpeg";
|
102
|
+
}
|
103
|
+
return format;
|
104
|
+
}
|
105
|
+
});
|
106
|
+
|
107
|
+
});
|
@@ -0,0 +1,30 @@
|
|
1
|
+
SceneJS.Types.addType("demos/color", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
this._material = this.addNode({
|
6
|
+
type:"material",
|
7
|
+
|
8
|
+
// Custom node types are responsible for attaching any child nodes that
|
9
|
+
// are specified in their properties
|
10
|
+
nodes:params.nodes
|
11
|
+
});
|
12
|
+
|
13
|
+
// Set initial color, if provided
|
14
|
+
if (params.color) {
|
15
|
+
this.setColor(params.color);
|
16
|
+
}
|
17
|
+
},
|
18
|
+
|
19
|
+
setColor:function (color) {
|
20
|
+
this._material.setColor(color);
|
21
|
+
},
|
22
|
+
|
23
|
+
getColor:function () {
|
24
|
+
return this._material.getColor();
|
25
|
+
},
|
26
|
+
|
27
|
+
destruct:function () {
|
28
|
+
// Not used
|
29
|
+
}
|
30
|
+
});
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/**
|
2
|
+
* A red teapot node type with attributes for position and size.
|
3
|
+
* Demonstrates how to expose settable attributes on a custom node type.
|
4
|
+
*/
|
5
|
+
SceneJS.Types.addType("demos/redTeapot", {
|
6
|
+
|
7
|
+
construct:function (params) {
|
8
|
+
|
9
|
+
// Create child nodes
|
10
|
+
|
11
|
+
this._translate = this.addNode({
|
12
|
+
type:"translate"
|
13
|
+
});
|
14
|
+
|
15
|
+
this._scale = this._translate.addNode({
|
16
|
+
type:"scale",
|
17
|
+
x:1, y:1, z:1,
|
18
|
+
nodes:[
|
19
|
+
{
|
20
|
+
type:"material",
|
21
|
+
color:{ r:1.0, g:0.6, b:0.6 },
|
22
|
+
nodes:[
|
23
|
+
{
|
24
|
+
type:"geometry",
|
25
|
+
source:{
|
26
|
+
type:"teapot"
|
27
|
+
}
|
28
|
+
}
|
29
|
+
]
|
30
|
+
}
|
31
|
+
]
|
32
|
+
});
|
33
|
+
|
34
|
+
// Set initial position and size, if provided
|
35
|
+
if (params.pos) {
|
36
|
+
this.setPos(params.pos);
|
37
|
+
}
|
38
|
+
if (params.size) {
|
39
|
+
this.setSize(params.size);
|
40
|
+
}
|
41
|
+
},
|
42
|
+
|
43
|
+
// Sets position of teapot
|
44
|
+
setPos:function (pos) {
|
45
|
+
this._translate.setXYZ(pos);
|
46
|
+
},
|
47
|
+
|
48
|
+
// Sets size of teapot
|
49
|
+
setSize:function (size) {
|
50
|
+
this._scale.setXYZ(size);
|
51
|
+
}
|
52
|
+
});
|
@@ -0,0 +1,43 @@
|
|
1
|
+
/**
|
2
|
+
* A spinning teapot node type.
|
3
|
+
* Demonstrates how to hook the type into the scene animation loop for autonomous animation.
|
4
|
+
*/
|
5
|
+
SceneJS.Types.addType("demos/spinningTeapot", {
|
6
|
+
|
7
|
+
construct:function (params) {
|
8
|
+
|
9
|
+
// Create child nodes
|
10
|
+
var rotate = this.addNode({
|
11
|
+
type:"rotate",
|
12
|
+
y:1,
|
13
|
+
angle:0,
|
14
|
+
nodes:[
|
15
|
+
{
|
16
|
+
type:"material",
|
17
|
+
color:{ r:0.6, g:1.0, b:0.6 },
|
18
|
+
nodes:[
|
19
|
+
{
|
20
|
+
type:"geometry",
|
21
|
+
source:{
|
22
|
+
type:"teapot"
|
23
|
+
}
|
24
|
+
}
|
25
|
+
]
|
26
|
+
}
|
27
|
+
]
|
28
|
+
});
|
29
|
+
|
30
|
+
// Spin the teapot within the scene animation loop
|
31
|
+
var angle = 0;
|
32
|
+
this._tick = this.getScene().on("tick",
|
33
|
+
function () {
|
34
|
+
rotate.setAngle(angle);
|
35
|
+
angle += 0.1;
|
36
|
+
});
|
37
|
+
},
|
38
|
+
|
39
|
+
// Node destructor, unsubscribes from scene tick
|
40
|
+
destruct:function () {
|
41
|
+
this.getScene().off(this._tick);
|
42
|
+
}
|
43
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
SceneJS.Types.addType("effects/crt", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
this._shader = this.addNode({
|
6
|
+
type:"shader",
|
7
|
+
|
8
|
+
shaders:[
|
9
|
+
|
10
|
+
{
|
11
|
+
stage:"fragment",
|
12
|
+
code:"vec4 myPixelColorFunc(vec4 color) {\n\
|
13
|
+
float m = mod(gl_FragCoord.y, 4.0);\n\
|
14
|
+
if (m < 1.5) {\n\
|
15
|
+
color = vec4(0.0, 0.0, 0.0, 1.0);\n\
|
16
|
+
} else if (m < 2.0) {\n\
|
17
|
+
color = vec4(0.2, 0.2, 0.2, 1.0);\n\
|
18
|
+
} else if (m < 2.5) {\n\
|
19
|
+
color = vec4(0.2, 0.2, 0.2, 1.0);\n\
|
20
|
+
}\n\
|
21
|
+
return color;\n\
|
22
|
+
}",
|
23
|
+
|
24
|
+
hooks:{
|
25
|
+
pixelColor:"myPixelColorFunc"
|
26
|
+
}
|
27
|
+
}
|
28
|
+
],
|
29
|
+
nodes:params.nodes
|
30
|
+
});
|
31
|
+
},
|
32
|
+
|
33
|
+
destruct:function () {
|
34
|
+
// Not used
|
35
|
+
}
|
36
|
+
});
|
@@ -0,0 +1,159 @@
|
|
1
|
+
SceneJS.Types.addType("effects/fog", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
// Holds params for custom shader node
|
6
|
+
this._shaderParams = {
|
7
|
+
fogMode:1.0, // 0.0 disabled, 1.0 linear, 2.0 exponential, 3.0 quadratic, 4.0 constant
|
8
|
+
fogDensity:0.05, // Fog density in range of [0.0..1.0]
|
9
|
+
fogStart:0.0, // Nearest point of fog in view space (receeding Z-axis is positive)
|
10
|
+
fogEnd:10000.0, // Furthest point of fog in view space
|
11
|
+
fogColor:[0.6, 0.0, 0.0] // Colour of fog - the colour that objects blend into
|
12
|
+
};
|
13
|
+
|
14
|
+
// Custom shader node
|
15
|
+
this._shader = this.addNode({
|
16
|
+
type:"shader",
|
17
|
+
coreId:"effects/fog",
|
18
|
+
|
19
|
+
shaders:[
|
20
|
+
|
21
|
+
{
|
22
|
+
stage:"fragment",
|
23
|
+
code:[
|
24
|
+
|
25
|
+
/* Parameter uniforms
|
26
|
+
*/
|
27
|
+
"uniform float fogMode;",
|
28
|
+
"uniform float fogDensity;",
|
29
|
+
"uniform float fogStart;",
|
30
|
+
"uniform float fogEnd;",
|
31
|
+
"uniform vec3 fogColor;",
|
32
|
+
|
33
|
+
/* Collected view-space fragment position
|
34
|
+
*/
|
35
|
+
"vec4 _viewPos;",
|
36
|
+
|
37
|
+
/* Collects view-space fragment position
|
38
|
+
*/
|
39
|
+
"void fogViewPosFunc(vec4 viewPos) {",
|
40
|
+
" _viewPos = viewPos;",
|
41
|
+
"}",
|
42
|
+
|
43
|
+
/* Modifies fragment colour
|
44
|
+
*/
|
45
|
+
"vec4 fogPixelColorFunc(vec4 color) {",
|
46
|
+
" if (fogMode != 0.0) {", // not "disabled"
|
47
|
+
" float fogFactor = (1.0 - fogDensity);",
|
48
|
+
" if (fogMode != 4.0) {", // not "constant"
|
49
|
+
" if (fogMode == 1.0) {", // "linear"
|
50
|
+
" fogFactor *= clamp(pow(max((fogEnd - length(- _viewPos.xyz)) / " +
|
51
|
+
" (fogStart - fogEnd), 0.0), 2.0), 0.0, 1.0);",
|
52
|
+
" } else {", // "exp" or "exp2"
|
53
|
+
" fogFactor *= clamp((fogStart - length(- _viewPos.xyz)) / (fogStart - fogEnd), 0.0, 1.0);",
|
54
|
+
" }",
|
55
|
+
" }",
|
56
|
+
" return color * (fogFactor + vec4(fogColor, 1.0)) * (1.0 - fogFactor);",
|
57
|
+
" }",
|
58
|
+
" return color;",
|
59
|
+
"}"
|
60
|
+
],
|
61
|
+
|
62
|
+
/* Bind our functions to hooks
|
63
|
+
*/
|
64
|
+
hooks:{
|
65
|
+
viewPos:"fogViewPosFunc",
|
66
|
+
pixelColor:"fogPixelColorFunc"
|
67
|
+
}
|
68
|
+
}
|
69
|
+
],
|
70
|
+
|
71
|
+
// Declare parameters and set default values
|
72
|
+
params:this._shaderParams,
|
73
|
+
|
74
|
+
nodes:params.nodes
|
75
|
+
});
|
76
|
+
|
77
|
+
if (params.mode != undefined) {
|
78
|
+
this.setMode(params.mode);
|
79
|
+
}
|
80
|
+
if (params.density != undefined) {
|
81
|
+
this.setDensity(params.density);
|
82
|
+
}
|
83
|
+
if (params.start != undefined) {
|
84
|
+
this.setStart(params.start);
|
85
|
+
}
|
86
|
+
if (params.end != undefined) {
|
87
|
+
this.setEnd(params.end);
|
88
|
+
}
|
89
|
+
if (params.color != undefined) {
|
90
|
+
this.setColor(params.color);
|
91
|
+
}
|
92
|
+
},
|
93
|
+
|
94
|
+
setMode:function (mode) {
|
95
|
+
switch (mode) {
|
96
|
+
case "disabled":
|
97
|
+
this._shaderParams.fogMode = 0;
|
98
|
+
break;
|
99
|
+
case "linear":
|
100
|
+
this._shaderParams.fogMode = 1;
|
101
|
+
break;
|
102
|
+
case "exp":
|
103
|
+
this._shaderParams.fogMode = 2;
|
104
|
+
break;
|
105
|
+
case "exp2":
|
106
|
+
this._shaderParams.fogMode = 3;
|
107
|
+
break;
|
108
|
+
case "constant":
|
109
|
+
this._shaderParams.fogMode = 4;
|
110
|
+
break;
|
111
|
+
}
|
112
|
+
this._shader.setParams(this._shaderParams);
|
113
|
+
},
|
114
|
+
|
115
|
+
getMode:function () {
|
116
|
+
return ["disabled", "linear", "exp", "exp2", "constant"][this._shaderParams.fogMode]; // TODO: optimize
|
117
|
+
},
|
118
|
+
|
119
|
+
setDensity:function (density) {
|
120
|
+
this._shaderParams.fogDensity = density;
|
121
|
+
this._shader.setParams(this._shaderParams);
|
122
|
+
},
|
123
|
+
|
124
|
+
getDensity:function () {
|
125
|
+
return this._shaderParams.fogDensity;
|
126
|
+
},
|
127
|
+
|
128
|
+
setStart:function (start) {
|
129
|
+
this._shaderParams.fogStart = start;
|
130
|
+
this._shader.setParams(this._shaderParams);
|
131
|
+
},
|
132
|
+
|
133
|
+
getStart:function () {
|
134
|
+
return this._shaderParams.fogStart;
|
135
|
+
},
|
136
|
+
|
137
|
+
setEnd:function (end) {
|
138
|
+
this._shaderParams.fogEnd = end;
|
139
|
+
this._shader.setParams(this._shaderParams);
|
140
|
+
},
|
141
|
+
|
142
|
+
getEnd:function () {
|
143
|
+
return this._shaderParams.fogEnd;
|
144
|
+
},
|
145
|
+
|
146
|
+
setColor:function (color) {
|
147
|
+
this._shaderParams.fogColor = [color.r || 0, color.g || 0, color.b || 0 ];
|
148
|
+
this._shader.setParams(this._shaderParams);
|
149
|
+
},
|
150
|
+
|
151
|
+
getColor:function () {
|
152
|
+
var color = this._shaderParams.fogColor;
|
153
|
+
return { r:color[0], g:color[1], b:color[2] };
|
154
|
+
},
|
155
|
+
|
156
|
+
destruct:function () {
|
157
|
+
// Not used
|
158
|
+
}
|
159
|
+
});
|
@@ -0,0 +1,50 @@
|
|
1
|
+
SceneJS.Types.addType("effects/snowyPeaks", {
|
2
|
+
|
3
|
+
construct:function (params) {
|
4
|
+
|
5
|
+
var altitude = params.altitude || 0;
|
6
|
+
|
7
|
+
this._shader = this.addNode({
|
8
|
+
type:"shader",
|
9
|
+
shaders:[
|
10
|
+
{
|
11
|
+
stage:"fragment",
|
12
|
+
code:[
|
13
|
+
"float posY = 0.0;",
|
14
|
+
"vec4 myWorldPosFunc(vec4 pos){",
|
15
|
+
" posY=pos.y;",
|
16
|
+
" return pos;",
|
17
|
+
"}",
|
18
|
+
|
19
|
+
"uniform float altitude;",
|
20
|
+
"vec3 myMaterialBaseColorFunc(vec3 color) {",
|
21
|
+
" if (posY > altitude) {",
|
22
|
+
" color = vec3(1.0, 1.0, 1.0);",
|
23
|
+
" }",
|
24
|
+
" return color;",
|
25
|
+
"}"
|
26
|
+
],
|
27
|
+
hooks:{
|
28
|
+
materialBaseColor:"myMaterialBaseColorFunc",
|
29
|
+
worldPos:"myWorldPosFunc"
|
30
|
+
}
|
31
|
+
}
|
32
|
+
],
|
33
|
+
params:{
|
34
|
+
altitude:altitude
|
35
|
+
},
|
36
|
+
nodes:params.nodes
|
37
|
+
});
|
38
|
+
},
|
39
|
+
|
40
|
+
setAltitude:function (altitude) {
|
41
|
+
this._shader.setParams({
|
42
|
+
altitude:altitude
|
43
|
+
});
|
44
|
+
},
|
45
|
+
|
46
|
+
destruct:function () {
|
47
|
+
// Not used
|
48
|
+
}
|
49
|
+
})
|
50
|
+
;
|