jax 0.0.0.5 → 0.0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +26 -1
- data/Rakefile +3 -1
- data/builtin/shaders/picking/common.ejs +2 -0
- data/builtin/shaders/picking/fragment.ejs +4 -0
- data/builtin/shaders/picking/material.js +14 -0
- data/builtin/shaders/picking/vertex.ejs +24 -0
- data/lib/jax/generators/app/templates/public/javascripts/jax.js +289 -681
- data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +55 -2
- data/lib/jax/generators/shader/templates/common.ejs.tt +2 -2
- data/lib/jax/packager/sprockets_template.rb +1 -4
- data/lib/jax/routes.rb +3 -0
- data/lib/jax/version.rb +1 -1
- data/spec/example_app/app/controllers/noise_controller.js +37 -5
- data/spec/example_app/app/controllers/picking_controller.js +32 -0
- data/spec/example_app/app/helpers/picking_helper.js +3 -0
- data/spec/example_app/app/models/blob.js +38 -0
- data/spec/example_app/app/resources/blobs/default.yml +2 -0
- data/spec/example_app/app/resources/materials/blob.yml +2 -2
- data/spec/example_app/app/shaders/blob/common.ejs +8 -13
- data/spec/example_app/app/shaders/blob/fragment.ejs +1 -1
- data/spec/example_app/app/shaders/blob/material.js +15 -12
- data/spec/example_app/app/shaders/blob/vertex.ejs +33 -8
- data/spec/example_app/app/views/picking/index.js +4 -0
- data/spec/example_app/config/routes.rb +1 -0
- data/spec/example_app/spec/javascripts/controllers/picking_controller_spec.js +11 -0
- data/spec/example_app/spec/javascripts/helpers/picking_helper_spec.js +12 -0
- data/spec/example_app/spec/javascripts/models/blob_spec.js +11 -0
- data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +40 -2
- data/spec/javascripts/jax/model_spec.js +10 -0
- data/spec/javascripts/jax/world_spec.js +74 -1
- data/spec/javascripts/shaders/preprocessor_spec.js +35 -0
- data/src/constants.yml +1 -1
- data/src/jax.js +30 -8
- data/src/jax/anim_frame.js +6 -2
- data/src/jax/builtin/meshes/cube.js +22 -1
- data/src/jax/builtin/meshes/plane.js +27 -0
- data/src/jax/builtin/meshes/quad.js +7 -1
- data/src/jax/builtin/meshes/sphere.js +20 -1
- data/src/jax/builtin/meshes/teapot.js +10 -0
- data/src/jax/builtin/meshes/torus.js +18 -0
- data/src/jax/compatibility.js +165 -2
- data/src/jax/context.js +176 -9
- data/src/jax/core.js +6 -3
- data/src/jax/core/math.js +18 -3
- data/src/jax/core/matrix_stack.js +4 -3
- data/src/jax/core/util.js +15 -0
- data/src/jax/events.js +67 -12
- data/src/jax/geometry.js +5 -1
- data/src/jax/geometry/plane.js +59 -5
- data/src/jax/{controller.js → mvc/controller.js} +38 -0
- data/src/jax/mvc/helper.js +35 -0
- data/src/jax/mvc/model.js +301 -0
- data/src/jax/{route_set.js → mvc/route_set.js} +0 -0
- data/src/jax/{view.js → mvc/view.js} +6 -0
- data/src/jax/{view_manager.js → mvc/view_manager.js} +1 -0
- data/src/jax/noise.js +13 -0
- data/src/jax/prototype/class.js +3 -0
- data/src/jax/prototype/extensions.js +26 -8
- data/src/jax/webgl/camera.js +6 -6
- data/src/jax/webgl/core/framebuffer.js +4 -4
- data/src/jax/webgl/material.js +16 -0
- data/src/jax/webgl/mesh.js +19 -4
- data/src/jax/webgl/scene/light_manager.js +8 -0
- data/src/jax/webgl/scene/light_source.js +3 -3
- data/src/jax/webgl/shader.js +4 -2
- data/src/jax/webgl/shader_chain.js +1 -0
- data/src/jax/webgl/world.js +157 -6
- data/vendor/glmatrix/glMatrix.js +365 -408
- metadata +32 -10
- data/src/jax/helper.js +0 -8
- data/src/jax/model.js +0 -163
@@ -28,15 +28,56 @@
|
|
28
28
|
|
29
29
|
window.onload = function() {
|
30
30
|
jasmineEnv.execute();
|
31
|
+
|
32
|
+
/*
|
33
|
+
Create a canvas element and add it to the document.
|
34
|
+
There's nothing special about this element.
|
35
|
+
*/
|
31
36
|
var canvas = document.createElement("canvas");
|
32
37
|
canvas.setAttribute("id", "webgl-canvas");
|
33
38
|
canvas.setAttribute("width", "600");
|
34
39
|
canvas.setAttribute("height", "400");
|
35
40
|
document.body.appendChild(canvas);
|
36
41
|
|
37
|
-
|
42
|
+
/*
|
43
|
+
Instantiate a Jax context.
|
44
|
+
Note that you can have more than one, though you usually won't need to do so.
|
45
|
+
Each context should be initialized with its own canvas element.
|
46
|
+
*/
|
47
|
+
window.context = new Jax.Context(canvas);
|
48
|
+
|
49
|
+
/*
|
50
|
+
That's all there is to initializing a Jax context, if you have a root route.
|
51
|
+
If not, you'll need to point it at a Jax controller manually:
|
52
|
+
*/
|
53
|
+
// context.redirect_to("controller_name/action_name");
|
54
|
+
|
55
|
+
/* Set up framerate monitoring */
|
56
|
+
function updateFramerateMessage() {
|
57
|
+
document.getElementById('jax_fps').innerHTML = parseInt(context.getFramesPerSecond());
|
58
|
+
document.getElementById('jax_ups').innerHTML = parseInt(context.getUpdatesPerSecond());
|
59
|
+
}
|
60
|
+
window.context.afterUpdate(function() { if (document.show_framerate) updateFramerateMessage(); });
|
38
61
|
};
|
39
62
|
})();
|
63
|
+
|
64
|
+
/*
|
65
|
+
helpers for the framerate links. Updating the DIV with framerates incurs a performance
|
66
|
+
hit, so it's disabled by default; enable it when you need it, leave it when you don't.
|
67
|
+
*/
|
68
|
+
function showFramerate() {
|
69
|
+
document.show_framerate = true;
|
70
|
+
document.getElementById('jax_fpsups').style.display = 'inline';
|
71
|
+
document.getElementById('jax_showfps').style.display = "none";
|
72
|
+
}
|
73
|
+
|
74
|
+
function hideFramerate() {
|
75
|
+
document.show_Framerate = false;
|
76
|
+
context.disableFrameSpeedCalculations();
|
77
|
+
context.disableUpdateSpeedCalculations();
|
78
|
+
document.getElementById('jax_fpsups').style.display = "none";
|
79
|
+
document.getElementById('jax_showfps').style.display = "inline";
|
80
|
+
}
|
40
81
|
</script>
|
41
82
|
|
42
83
|
<% js_files.each do |js_file| %>
|
@@ -52,11 +93,23 @@
|
|
52
93
|
background-color: #fff0f0;
|
53
94
|
font-size:14pt;
|
54
95
|
}
|
96
|
+
|
97
|
+
#jax_fpsups { display:none; }
|
98
|
+
#jax_fps { display:inline; }
|
99
|
+
#jax_ups { display:inline; }
|
55
100
|
</style>
|
56
101
|
</head>
|
57
102
|
<body>
|
58
103
|
<div id="jax_banner">
|
59
|
-
Jax
|
104
|
+
<!-- or we could use <%%=Jax::Version::STRING%> for the Rubygem version -->
|
105
|
+
Jax v<script type="text/javascript">document.write(Jax.VERSION);</script>
|
106
|
+
→
|
107
|
+
<a href="#" id="jax_showfps" onclick="showFramerate();return false;">Show Framerate</a>
|
108
|
+
<div id="jax_fpsups">
|
109
|
+
Frames per second: <div id="jax_fps">(calculating...)</div>
|
110
|
+
Updates per second: <div id="jax_ups">(calculating...)</div>
|
111
|
+
<a href="#" onclick="hideFramerate();return false;">Hide Framerate</a>
|
112
|
+
</div>
|
60
113
|
</div>
|
61
114
|
<div id="jasmine_content"></div>
|
62
115
|
</body>
|
@@ -5,8 +5,8 @@ shared uniform mat3 nMatrix;
|
|
5
5
|
shared uniform mat4 mvMatrix, pMatrix;
|
6
6
|
|
7
7
|
shared varying vec2 vTexCoords;
|
8
|
-
shared varying vec3
|
9
|
-
shared varying vec4
|
8
|
+
shared varying vec3 vNormal;
|
9
|
+
shared varying vec4 vBaseColor;
|
10
10
|
|
11
11
|
// If a variable isn't shared, it will be defined specifically for this shader.
|
12
12
|
// If this shader is used twice in one materials, unshared variables will be
|
@@ -18,10 +18,7 @@ class Jax::Packager::SprocketsTemplate < Sprockets::SourceFile
|
|
18
18
|
template << "//= require \"#{relative_path}\""
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
22
|
-
"if (Jax.doVersionCheck) Jax.doVersionCheck('#{Jax::Version::STRING}');",
|
23
|
-
"else alert('Your Jax gem version is newer than your Jax JavaScript library!\n\nRun `rake jax:update` to fix this.');"
|
24
|
-
]
|
21
|
+
|
25
22
|
template
|
26
23
|
end
|
27
24
|
end
|
data/lib/jax/routes.rb
CHANGED
@@ -30,6 +30,9 @@ module Jax
|
|
30
30
|
|
31
31
|
outfile.puts "Jax.routes.map(#{path.inspect}, #{controller_name_for(set[1])}, #{args});"
|
32
32
|
end
|
33
|
+
|
34
|
+
outfile.puts "if (Jax.doVersionCheck) Jax.doVersionCheck('#{Jax::Version::STRING}');"
|
35
|
+
outfile.puts "else alert('Your Jax gem version is newer than your Jax JavaScript library!\\n\\nRun `rake jax:update` to fix this.');"
|
33
36
|
end
|
34
37
|
|
35
38
|
def root(controller = nil, action = 'index')
|
data/lib/jax/version.rb
CHANGED
@@ -1,18 +1,50 @@
|
|
1
1
|
//= require "application_controller"
|
2
2
|
|
3
3
|
var NoiseController = (function() {
|
4
|
+
var red, green, blue;
|
5
|
+
|
4
6
|
return Jax.Controller.create("noise", ApplicationController, {
|
5
7
|
index: function() {
|
6
|
-
var model = new
|
8
|
+
var model = new Blob();
|
7
9
|
this.world.addObject(model);
|
8
10
|
this.player.camera.move(-5);
|
9
|
-
|
11
|
+
|
12
|
+
var light_options = {
|
13
|
+
type: Jax.POINT_LIGHT,
|
14
|
+
attenuation: {
|
15
|
+
constant: 0,
|
16
|
+
linear: 0,
|
17
|
+
quadratic: 0.002
|
18
|
+
}
|
19
|
+
};
|
20
|
+
|
21
|
+
red = new LightSource(Jax.Util.normalizeOptions({
|
22
|
+
position: [-20, 0, 20], color: { ambient: [0.2, 0, 0, 1], diffuse: [0.8, 0, 0, 1], specular:[1.0, 0, 0, 1] }
|
23
|
+
}, light_options));
|
24
|
+
this.world.addLightSource(red);
|
10
25
|
|
26
|
+
green = new LightSource(Jax.Util.normalizeOptions({
|
27
|
+
position: [ 20, 20, 20], color: { ambient: [0, 0.2, 0, 1], diffuse: [0, 0.8, 0, 1], specular:[0, 1.0, 0, 1] }
|
28
|
+
}, light_options));
|
29
|
+
this.world.addLightSource(green);
|
30
|
+
|
31
|
+
blue = new LightSource(Jax.Util.normalizeOptions({
|
32
|
+
position: [ 20, -20, 20], color: { ambient: [0, 0, 0.2, 1], diffuse: [0, 0, 0.8, 1], specular:[0, 0, 1.0, 1] }
|
33
|
+
}, light_options));
|
34
|
+
this.world.addLightSource(blue);
|
35
|
+
},
|
11
36
|
|
12
|
-
|
13
|
-
|
14
|
-
mouse_clicked: function(event) {
|
37
|
+
update: function(tc) {
|
38
|
+
this.rot = (this.rot || 0) + tc * 3.0;
|
15
39
|
|
40
|
+
function set(light, angle) {
|
41
|
+
var s = Math.sin(angle), c = Math.cos(angle);
|
42
|
+
light.camera.setPosition(s*20, c*20, 20);
|
43
|
+
}
|
44
|
+
var dif = Math.deg2rad(120);
|
45
|
+
set(red, this.rot + dif);
|
46
|
+
set(blue, this.rot + dif*2);
|
47
|
+
set(green, this.rot + dif*3);
|
16
48
|
}
|
17
49
|
});
|
18
50
|
})();
|
@@ -0,0 +1,32 @@
|
|
1
|
+
//= require "application_controller"
|
2
|
+
|
3
|
+
var PickingController = (function() {
|
4
|
+
return Jax.Controller.create("picking", ApplicationController, {
|
5
|
+
index: function() {
|
6
|
+
function mesh() { return new Jax.Mesh.Sphere({size: 1.0}); };
|
7
|
+
|
8
|
+
ofront = this.world.addObject(new Jax.Model({position:[ 0.0, 0.0,-5],mesh:mesh()}));
|
9
|
+
otopleft = this.world.addObject(new Jax.Model({position:[-2.5, 2.5,-5],mesh:mesh()}));
|
10
|
+
otopright = this.world.addObject(new Jax.Model({position:[ 2.5, 2.5,-5],mesh:mesh()}));
|
11
|
+
obottomleft = this.world.addObject(new Jax.Model({position:[-2.5,-2.5,-5],mesh:mesh()}));
|
12
|
+
obottomright = this.world.addObject(new Jax.Model({position:[ 2.5,-2.5,-5],mesh:mesh()}));
|
13
|
+
},
|
14
|
+
|
15
|
+
mouse_pressed: function(e) { alert(e.x+" "+e.y); },
|
16
|
+
|
17
|
+
mouse_moved: function(evt) {
|
18
|
+
var obj = this.world.pick(evt.x, evt.y);
|
19
|
+
if (obj) {
|
20
|
+
if (this.current_obj && obj != this.current_obj) {
|
21
|
+
this.current_obj.mesh.setColor(1,1,1,1);
|
22
|
+
}
|
23
|
+
obj.mesh.setColor(1,0,0,1);
|
24
|
+
} else {
|
25
|
+
if (this.current_obj) {
|
26
|
+
this.current_obj.mesh.setColor(1,1,1,1);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
this.current_obj = obj;
|
30
|
+
}
|
31
|
+
});
|
32
|
+
})();
|
@@ -0,0 +1,38 @@
|
|
1
|
+
/**
|
2
|
+
* class Blob < Jax.Model
|
3
|
+
*
|
4
|
+
**/
|
5
|
+
var Blob = (function() {
|
6
|
+
return Jax.Model.create({
|
7
|
+
update: function(tc) {
|
8
|
+
this.camera.rotate(tc, [1,0,0]);
|
9
|
+
},
|
10
|
+
|
11
|
+
after_initialize: function() {
|
12
|
+
var u = (2*Math.PI)/16, v = (Math.PI/16);
|
13
|
+
|
14
|
+
this.mesh = new Jax.Mesh({
|
15
|
+
material: Material.find("blob"),
|
16
|
+
|
17
|
+
init: function(vertices, colors, textureCoords, normals, indices) {
|
18
|
+
for (var x = 0; x < 64; x++) {
|
19
|
+
for (var y = 0; y < 64; y++) {
|
20
|
+
var u = x, v = y;
|
21
|
+
|
22
|
+
vertices.push(u, v, 0);
|
23
|
+
vertices.push(u+1, v, 0);
|
24
|
+
vertices.push(u, v+1, 0);
|
25
|
+
|
26
|
+
vertices.push(u, v+1, 0);
|
27
|
+
vertices.push(u+1, v, 0);
|
28
|
+
vertices.push(u+1, v+1, 0);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
});
|
33
|
+
|
34
|
+
this.mesh.material.u = u;
|
35
|
+
this.mesh.material.v = v;
|
36
|
+
}
|
37
|
+
});
|
38
|
+
})();
|
@@ -1,18 +1,13 @@
|
|
1
1
|
//= require "functions/noise"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
shared uniform mat4 ivMatrix, mvMatrix, pMatrix, vMatrix;
|
4
|
+
shared uniform mat3 vnMatrix, nMatrix;
|
5
5
|
|
6
|
-
shared uniform
|
7
|
-
shared uniform
|
6
|
+
shared uniform vec4 materialDiffuse, materialAmbient, materialSpecular;
|
7
|
+
shared uniform float materialShininess;
|
8
8
|
|
9
|
-
shared
|
10
|
-
shared varying vec3 vNormals;
|
11
|
-
shared varying vec4 vColor;
|
12
|
-
|
13
|
-
// If a variable isn't shared, it will be defined specifically for this shader.
|
14
|
-
// If this shader is used twice in one materials, unshared variables will be
|
15
|
-
// defined twice -- once for each use of the shader.
|
9
|
+
shared uniform int PASS_TYPE;
|
16
10
|
|
17
|
-
|
18
|
-
|
11
|
+
shared varying vec2 vTexCoords;
|
12
|
+
shared varying vec3 vNormal, vSurfacePos;
|
13
|
+
shared varying vec4 vBaseColor;
|
@@ -7,9 +7,11 @@ Jax.Material.Blob = (function() {
|
|
7
7
|
|
8
8
|
return Jax.Class.create(Jax.Material, {
|
9
9
|
initialize: function($super, options) {
|
10
|
+
this.u = this.v = 0.0;
|
11
|
+
|
10
12
|
options = Jax.Util.normalizeOptions(options, {
|
11
|
-
shader: "blob"
|
12
|
-
|
13
|
+
shader: "blob"
|
14
|
+
|
13
15
|
// You can specify default options (see +manifest.yml+) here.
|
14
16
|
});
|
15
17
|
|
@@ -21,28 +23,29 @@ Jax.Material.Blob = (function() {
|
|
21
23
|
$super(context, mesh, options, uniforms);
|
22
24
|
|
23
25
|
uniforms.set('mvMatrix', context.getModelViewMatrix());
|
24
|
-
uniforms.set('nMatrix',
|
25
|
-
uniforms.set('pMatrix',
|
26
|
+
uniforms.set('nMatrix', context.getNormalMatrix());
|
27
|
+
uniforms.set('pMatrix', context.getProjectionMatrix());
|
26
28
|
|
27
29
|
// uniforms.texture('Texture', this.texture, context);
|
28
30
|
|
29
|
-
this.l = this.l || new Date().getTime();
|
30
|
-
var tc = (new Date().getTime() - this.l) / 1000;
|
31
|
+
// this.l = this.l || new Date().getTime();
|
32
|
+
// var tc = (new Date().getTime() - this.l) / 1000;
|
31
33
|
|
32
34
|
var noise = getNoise(this, context);
|
33
35
|
|
34
|
-
uniforms.texture('permTexture',
|
36
|
+
uniforms.texture('permTexture', noise.perm, context);
|
35
37
|
uniforms.texture('simplexTexture', noise.simplex, context);
|
36
|
-
uniforms.texture('gradTexture',
|
38
|
+
uniforms.texture('gradTexture', noise.grad, context);
|
37
39
|
|
38
|
-
uniforms.set('time',
|
40
|
+
uniforms.set('time', Jax.uptime);
|
39
41
|
},
|
40
42
|
|
41
43
|
setAttributes: function($super, context, mesh, options, attributes) {
|
42
44
|
attributes.set('VERTEX_POSITION', mesh.getVertexBuffer());
|
43
|
-
attributes.set('
|
44
|
-
attributes.set('
|
45
|
-
attributes.set('
|
45
|
+
attributes.set('VERTEX_TANGENT', mesh.getTangentBuffer());
|
46
|
+
// attributes.set('VERTEX_COLOR', mesh.getColorBuffer());
|
47
|
+
// attributes.set('VERTEX_NORMAL', mesh.getNormalBuffer());
|
48
|
+
// attributes.set('VERTEX_TEXCOORDS', mesh.getTextureCoordsBuffer());
|
46
49
|
}
|
47
50
|
});
|
48
51
|
})();
|
@@ -1,13 +1,38 @@
|
|
1
|
-
shared attribute vec4 VERTEX_POSITION,
|
1
|
+
shared attribute vec4 VERTEX_POSITION, VERTEX_TANGENT;
|
2
2
|
shared attribute vec3 VERTEX_NORMAL;
|
3
|
-
shared attribute vec2 VERTEX_TEXCOORDS;
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
#define PI 3.141592653589793
|
5
|
+
|
6
|
+
vec3 sphere(in float slice, in float stack) {
|
7
|
+
vec3 res;
|
8
|
+
|
9
|
+
float theta = (slice / 64.0) * PI,
|
10
|
+
phi = (stack / 64.0) * 2.0 * PI;
|
11
|
+
float sinth = sin(theta), costh = cos(theta),
|
12
|
+
sinph = sin(phi), cosph = cos(phi);
|
13
|
+
|
14
|
+
res.x = cosph * sinth;
|
15
|
+
res.y = costh;
|
16
|
+
res.z = sinph * sinth;
|
17
|
+
|
18
|
+
float n = snoise(vec4(res, time*0.5)) * 0.5;
|
19
|
+
res += normalize(res)*n;
|
9
20
|
|
10
|
-
|
21
|
+
return res;
|
22
|
+
}
|
23
|
+
|
24
|
+
void main(void) {
|
25
|
+
vec3 pos = sphere(VERTEX_POSITION.x, VERTEX_POSITION.y);
|
26
|
+
vec3 a = sphere(VERTEX_POSITION.x+1.0, VERTEX_POSITION.y);
|
27
|
+
vec3 b = sphere(VERTEX_POSITION.x, VERTEX_POSITION.y+1.0);
|
28
|
+
|
29
|
+
a = (a - pos);
|
30
|
+
b = (b - pos);
|
31
|
+
|
32
|
+
vNormal = nMatrix * cross(b, a);
|
33
|
+
|
34
|
+
vSurfacePos = (mvMatrix * vec4(pos, 1.0)).xyz;
|
35
|
+
gl_Position = pMatrix * mvMatrix * vec4(pos, 1.0);
|
11
36
|
|
12
|
-
|
37
|
+
vBaseColor = vec4(1,1,1,1);
|
13
38
|
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
describe("PickingHelper", function() {
|
2
|
+
var helper;
|
3
|
+
|
4
|
+
beforeEach(function() {
|
5
|
+
var klass = Jax.Class.create({helpers: function() { return [PickingHelper]; } });
|
6
|
+
helper = new klass();
|
7
|
+
});
|
8
|
+
|
9
|
+
it("does something", function() {
|
10
|
+
expect(1).toEqual(1);
|
11
|
+
});
|
12
|
+
});
|