jax 0.0.0.4 → 0.0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +14 -0
- data/Rakefile +4 -0
- data/builtin/shaders/depthmap/fragment.ejs +4 -2
- data/builtin/shaders/depthmap/material.js +5 -0
- data/builtin/shaders/depthmap/vertex.ejs +4 -1
- data/builtin/shaders/functions/noise.ejs +523 -0
- data/builtin/shaders/lighting/common.ejs +1 -1
- data/builtin/shaders/normal_map/common.ejs +1 -1
- data/builtin/shaders/{paraboloid-depthmap → paraboloid}/common.ejs +2 -2
- data/builtin/shaders/{paraboloid-depthmap → paraboloid}/fragment.ejs +3 -3
- data/builtin/shaders/paraboloid/manifest.yml +5 -0
- data/builtin/shaders/{paraboloid-depthmap → paraboloid}/material.js +4 -4
- data/builtin/shaders/{paraboloid-depthmap → paraboloid}/vertex.ejs +1 -0
- data/builtin/shaders/shadow_map/common.ejs +1 -1
- data/builtin/shaders/shadow_map/fragment.ejs +1 -1
- data/lib/jax.rb +4 -0
- data/lib/jax/application.rb +4 -5
- data/lib/jax/generators/app/templates/public/javascripts/jax.js +190 -6
- data/lib/jax/generators/material/USAGE +1 -1
- data/lib/jax/generators/shader/templates/common.ejs.tt +1 -1
- data/lib/jax/generators/shader/templates/spec.js.tt +4 -0
- data/lib/jax/packager/sprockets_template.rb +4 -0
- data/lib/jax/resource_compiler.rb +1 -1
- data/lib/jax/shader.rb +19 -7
- data/lib/jax/version.rb +1 -1
- data/spec/example_app/app/controllers/noise_controller.js +18 -0
- data/spec/example_app/app/helpers/noise_helper.js +3 -0
- data/spec/example_app/app/resources/materials/blob.yml +28 -0
- data/spec/example_app/app/shaders/blob/common.ejs +18 -0
- data/spec/example_app/app/shaders/blob/fragment.ejs +8 -0
- data/spec/example_app/app/shaders/blob/manifest.yml +15 -0
- data/spec/example_app/app/shaders/blob/material.js +48 -0
- data/spec/example_app/app/shaders/blob/vertex.ejs +13 -0
- data/spec/example_app/app/views/noise/index.js +4 -0
- data/spec/example_app/config/routes.rb +1 -0
- data/spec/example_app/spec/javascripts/controllers/noise_controller_spec.js +11 -0
- data/spec/example_app/spec/javascripts/helpers/noise_helper_spec.js +12 -0
- data/spec/example_app/spec/javascripts/shaders/blob_spec.js +30 -0
- data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +2 -1
- data/spec/javascripts/shaders/core_materials_spec.js +1 -0
- data/spec/javascripts/shaders/{dual_paraboloid_spec.js → paraboloid_spec.js} +2 -2
- data/src/constants.yml +1 -0
- data/src/constants.yml.erb +1 -0
- data/src/jax.js +14 -1
- data/src/jax/noise.js +193 -0
- data/src/jax/webgl/material.js +3 -2
- data/src/jax/webgl/scene/light_source.js +3 -2
- metadata +41 -12
- data/spec/javascripts/Player.js +0 -58
@@ -1,8 +1,8 @@
|
|
1
|
-
//= require "../functions/depth_map"
|
2
|
-
|
3
1
|
void main(void) {
|
4
2
|
/* because we do our own projection, we also have to do our own clipping */
|
5
3
|
/* if vClip is less than 0, it's behind the near plane and can be dropped. */
|
6
4
|
if (vClip < 0.0) discard;
|
7
|
-
|
5
|
+
|
6
|
+
export(vec4, exPos, vPos);
|
7
|
+
// gl_FragColor = pack_depth(vPos.z);
|
8
8
|
}
|
@@ -1,11 +1,11 @@
|
|
1
|
-
Jax.Material.
|
2
|
-
initialize: function($super) {
|
3
|
-
$super({shader:"paraboloid
|
1
|
+
Jax.Material.Paraboloid = Jax.Class.create(Jax.Material, {
|
2
|
+
initialize: function($super, options) {
|
3
|
+
$super(Jax.Util.normalizeOptions(options, {shader:"paraboloid"}));
|
4
4
|
},
|
5
5
|
|
6
6
|
setUniforms: function($super, context, mesh, options, uniforms) {
|
7
7
|
$super(context, mesh, options, uniforms);
|
8
|
-
|
8
|
+
|
9
9
|
uniforms.set({
|
10
10
|
DP_SHADOW_NEAR: 0.1, //c.world.lighting.getLight().getDPShadowNear() || 0.1;}},
|
11
11
|
DP_SHADOW_FAR: 500,//c.world.lighting.getLight().getDPShadowFar() || 500;}},
|
data/lib/jax.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "active_support/core_ext"
|
2
|
+
|
1
3
|
module Jax
|
2
4
|
autoload :Generators, File.join(File.dirname(__FILE__), "jax/generators/commands")
|
3
5
|
autoload :VERSION, File.join(File.dirname(__FILE__), "jax/version")
|
@@ -20,6 +22,8 @@ module Jax
|
|
20
22
|
def root
|
21
23
|
application && application.root
|
22
24
|
end
|
25
|
+
|
26
|
+
delegate :shader_load_paths, :to => :application
|
23
27
|
end
|
24
28
|
end
|
25
29
|
|
data/lib/jax/application.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require "active_support/core_ext"
|
2
|
-
|
3
1
|
module Jax
|
4
2
|
class Application
|
5
3
|
autoload :Configuration, "jax/application/configuration"
|
6
|
-
|
4
|
+
|
7
5
|
class << self
|
8
6
|
def inherited(base)
|
9
7
|
raise "You cannot have more than one Jax::Application" if Jax.application
|
@@ -43,6 +41,7 @@ module Jax
|
|
43
41
|
delegate :config, :to => "self.class"
|
44
42
|
delegate :root, :to => :config
|
45
43
|
delegate :routes, :to => :config
|
44
|
+
delegate :shader_load_paths, :to => :config
|
46
45
|
|
47
46
|
def shaders
|
48
47
|
# @shaders ||= begin
|
@@ -62,7 +61,7 @@ module Jax
|
|
62
61
|
|
63
62
|
def shader_paths
|
64
63
|
shader_paths = {}
|
65
|
-
|
64
|
+
shader_load_paths.each do |path|
|
66
65
|
full_path = File.directory?(path) ? path : File.expand_path(path, config.root)
|
67
66
|
glob = File.join(full_path, "*/{fragment,vertex}.ejs")
|
68
67
|
Dir[glob].each do |dir|
|
@@ -73,7 +72,7 @@ module Jax
|
|
73
72
|
end
|
74
73
|
shader_paths
|
75
74
|
end
|
76
|
-
|
75
|
+
|
77
76
|
def find_root_with_flag(flag, default=nil)
|
78
77
|
root_path = self.class.called_from
|
79
78
|
|
@@ -1,4 +1,15 @@
|
|
1
|
-
var Jax = { PRODUCTION: 1 };
|
1
|
+
var Jax = { PRODUCTION: 1, VERSION: "0.0.0.5" };
|
2
|
+
|
3
|
+
/* Called by Jax applications as of version 0.0.0.5 to alert the user to incomplete upgrades */
|
4
|
+
Jax.doVersionCheck = function(targetVersion) {
|
5
|
+
if (Jax.environment && Jax.environment == Jax.PRODUCTION) return;
|
6
|
+
|
7
|
+
if (Jax.VERSION != targetVersion) {
|
8
|
+
alert("Jax version mismatch!\n\n" +
|
9
|
+
"Your Jax gem is version "+targetVersion+", but the Jax JS library is version "+Jax.VERSION+"!\n\n" +
|
10
|
+
"Please run `rake jax:update` at the command line to fix this issue.");
|
11
|
+
}
|
12
|
+
};
|
2
13
|
|
3
14
|
Jax.default_shader = "basic";
|
4
15
|
|
@@ -4906,9 +4917,14 @@ Jax.Material.ShadowMap = Jax.Class.create(Jax.Material, {
|
|
4906
4917
|
if (back) uniforms.texture('SHADOWMAP1', back, context);
|
4907
4918
|
}
|
4908
4919
|
});
|
4909
|
-
Jax.Material.
|
4920
|
+
Jax.Material.Depthmap = Jax.Class.create(Jax.Material, {
|
4910
4921
|
initialize: function($super) {
|
4911
|
-
$super({shader:"
|
4922
|
+
$super({shader:"depthmap"});
|
4923
|
+
}
|
4924
|
+
});
|
4925
|
+
Jax.Material.Paraboloid = Jax.Class.create(Jax.Material, {
|
4926
|
+
initialize: function($super, options) {
|
4927
|
+
$super(Jax.Util.normalizeOptions(options, {shader:"paraboloid"}));
|
4912
4928
|
},
|
4913
4929
|
|
4914
4930
|
setUniforms: function($super, context, mesh, options, uniforms) {
|
@@ -4959,7 +4975,7 @@ Jax.Material.Fog = Jax.Class.create(Jax.Material, {
|
|
4959
4975
|
Jax.Material.create("basic");
|
4960
4976
|
Jax.Material.create("default", {default_shader:'basic'});
|
4961
4977
|
Jax.Material.create("depthmap", {default_shader:"depthmap"});
|
4962
|
-
Jax.Material.create("paraboloid-depthmap", {type:"
|
4978
|
+
Jax.Material.create("paraboloid-depthmap", {type:"Paraboloid",default_shader:"paraboloid",layers:[{type:"Depthmap"}]});
|
4963
4979
|
Jax.Core = {};
|
4964
4980
|
|
4965
4981
|
Jax.Core.Face = Jax.Class.create({
|
@@ -5984,6 +6000,7 @@ Jax.Scene.LightSource = (function() {
|
|
5984
6000
|
fieldOfView = 60;
|
5985
6001
|
this.camera.perspective({near:nearPlane,far:nearPlane+(2.0*sceneBoundingRadius),fov:fieldOfView,width:2048,height:2048});
|
5986
6002
|
} else if (this.type == Jax.POINT_LIGHT) {
|
6003
|
+
var paraboloid_depthmap = Jax.Material.find("paraboloid-depthmap");
|
5987
6004
|
|
5988
6005
|
context.glDisable(GL_BLEND);
|
5989
6006
|
context.glEnable(GL_CULL_FACE);
|
@@ -5999,7 +6016,7 @@ Jax.Scene.LightSource = (function() {
|
|
5999
6016
|
mat4.set(context.getInverseViewMatrix(), sm);
|
6000
6017
|
|
6001
6018
|
for (var i = 0; i < objects.length; i++) {
|
6002
|
-
objects[i].render(context, {material:
|
6019
|
+
objects[i].render(context, {material:paraboloid_depthmap, direction:1});
|
6003
6020
|
}
|
6004
6021
|
});
|
6005
6022
|
|
@@ -6008,7 +6025,7 @@ Jax.Scene.LightSource = (function() {
|
|
6008
6025
|
context.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
6009
6026
|
context.loadViewMatrix(self.camera.getModelViewMatrix());
|
6010
6027
|
for (var i = 0; i < objects.length; i++) {
|
6011
|
-
objects[i].render(context, {material:
|
6028
|
+
objects[i].render(context, {material:paraboloid_depthmap,direction:-1});
|
6012
6029
|
}
|
6013
6030
|
});
|
6014
6031
|
|
@@ -7250,6 +7267,173 @@ Jax.Context = (function() {
|
|
7250
7267
|
Jax.Context.identifier = 0;
|
7251
7268
|
Jax.Context.addMethods(GL_METHODS);
|
7252
7269
|
Jax.Context.addMethods(Jax.EVENT_METHODS);
|
7270
|
+
Jax.Noise = (function() {
|
7271
|
+
var perm/*[256]*/ = [151,160,137,91,90,15,
|
7272
|
+
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
|
7273
|
+
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
|
7274
|
+
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
|
7275
|
+
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
|
7276
|
+
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
|
7277
|
+
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
|
7278
|
+
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
|
7279
|
+
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
|
7280
|
+
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
|
7281
|
+
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
|
7282
|
+
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
|
7283
|
+
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];
|
7284
|
+
|
7285
|
+
/* These are Ken Perlin's proposed gradients for 3D noise. I kept them for
|
7286
|
+
better consistency with the reference implementation, but there is really
|
7287
|
+
no need to pad this to 16 gradients for this particular implementation.
|
7288
|
+
If only the "proper" first 12 gradients are used, they can be extracted
|
7289
|
+
from the grad4[][] array: grad3[i][j] == grad4[i*2][j], 0<=i<=11, j=0,1,2
|
7290
|
+
*/
|
7291
|
+
var grad3/*[16][3]*/ = [0,1,1, 0,1,-1, 0,-1,1, 0,-1,-1,
|
7292
|
+
1,0,1, 1,0,-1, -1,0,1, -1,0,-1,
|
7293
|
+
1,1,0, 1,-1,0, -1,1,0, -1,-1,0, // 12 cube edges
|
7294
|
+
1,0,-1, -1,0,-1, 0,-1,1, 0,1,1]; // 4 more to make 16
|
7295
|
+
|
7296
|
+
/* These are my own proposed gradients for 4D noise. They are the coordinates
|
7297
|
+
of the midpoints of each of the 32 edges of a tesseract, just like the 3D
|
7298
|
+
noise gradients are the midpoints of the 12 edges of a cube.
|
7299
|
+
*/
|
7300
|
+
var grad4/*[32][4]*/ = [0,1,1,1, 0,1,1,-1, 0,1,-1,1, 0,1,-1,-1, // 32 tesseract edges
|
7301
|
+
0,-1,1,1, 0,-1,1,-1, 0,-1,-1,1, 0,-1,-1,-1,
|
7302
|
+
1,0,1,1, 1,0,1,-1, 1,0,-1,1, 1,0,-1,-1,
|
7303
|
+
-1,0,1,1, -1,0,1,-1, -1,0,-1,1, -1,0,-1,-1,
|
7304
|
+
1,1,0,1, 1,1,0,-1, 1,-1,0,1, 1,-1,0,-1,
|
7305
|
+
-1,1,0,1, -1,1,0,-1, -1,-1,0,1, -1,-1,0,-1,
|
7306
|
+
1,1,1,0, 1,1,-1,0, 1,-1,1,0, 1,-1,-1,0,
|
7307
|
+
-1,1,1,0, -1,1,-1,0, -1,-1,1,0, -1,-1,-1,0];
|
7308
|
+
|
7309
|
+
/* This is a look-up table to speed up the decision on which simplex we
|
7310
|
+
are in inside a cube or hypercube "cell" for 3D and 4D simplex noise.
|
7311
|
+
It is used to avoid complicated nested conditionals in the GLSL code.
|
7312
|
+
The table is indexed in GLSL with the results of six pair-wise
|
7313
|
+
comparisons beween the components of the P=(x,y,z,w) coordinates
|
7314
|
+
within a hypercube cell.
|
7315
|
+
c1 = x>=y ? 32 : 0;
|
7316
|
+
c2 = x>=z ? 16 : 0;
|
7317
|
+
c3 = y>=z ? 8 : 0;
|
7318
|
+
c4 = x>=w ? 4 : 0;
|
7319
|
+
c5 = y>=w ? 2 : 0;
|
7320
|
+
c6 = z>=w ? 1 : 0;
|
7321
|
+
offsets = simplex[c1+c2+c3+c4+c5+c6];
|
7322
|
+
o1 = step(160,offsets);
|
7323
|
+
o2 = step(96,offsets);
|
7324
|
+
o3 = step(32,offsets);
|
7325
|
+
(For the 3D case, c4, c5, c6 and o3 are not needed.)
|
7326
|
+
*/
|
7327
|
+
var simplex4/*[][4]*/ = [0,64,128,192, 0,64,192,128, 0,0,0,0, 0,128,192,64,
|
7328
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 64,128,192,0,
|
7329
|
+
0,128,64,192, 0,0,0,0, 0,192,64,128, 0,192,128,64,
|
7330
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 64,192,128,0,
|
7331
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7332
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7333
|
+
64,128,0,192, 0,0,0,0, 64,192,0,128, 0,0,0,0,
|
7334
|
+
0,0,0,0, 0,0,0,0, 128,192,0,64, 128,192,64,0,
|
7335
|
+
64,0,128,192, 64,0,192,128, 0,0,0,0, 0,0,0,0,
|
7336
|
+
0,0,0,0, 128,0,192,64, 0,0,0,0, 128,64,192,0,
|
7337
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7338
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7339
|
+
128,0,64,192, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7340
|
+
192,0,64,128, 192,0,128,64, 0,0,0,0, 192,64,128,0,
|
7341
|
+
128,64,0,192, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
7342
|
+
192,64,0,128, 0,0,0,0, 192,128,0,64, 192,128,64,0];
|
7343
|
+
|
7344
|
+
var simplex_buf = null, perm_buf = null, grad_buf = null;
|
7345
|
+
|
7346
|
+
/*
|
7347
|
+
* initPermTexture() - create and load a 2D texture for
|
7348
|
+
* a combined index permutation and gradient lookup table.
|
7349
|
+
* This texture is used for 2D and 3D noise, both classic and simplex.
|
7350
|
+
*/
|
7351
|
+
function initPermTexture(context)
|
7352
|
+
{
|
7353
|
+
var tex = new Jax.Texture({min_filter: GL_NEAREST, mag_filter: GL_NEAREST, width:256, height:256});
|
7354
|
+
|
7355
|
+
if (!perm_buf) {
|
7356
|
+
var pixels = new Array(256*256*4);
|
7357
|
+
var i,j;
|
7358
|
+
for(i = 0; i<256; i++)
|
7359
|
+
for(j = 0; j<256; j++) {
|
7360
|
+
var offset = (i*256+j)*4;
|
7361
|
+
var value = perm[(j+perm[i]) & 0xFF];
|
7362
|
+
var g = (value & 0x0F) * 3;
|
7363
|
+
pixels[offset] = grad3[g+0] * 64 + 64; // Gradient x
|
7364
|
+
pixels[offset+1] = grad3[g+1] * 64 + 64; // Gradient y
|
7365
|
+
pixels[offset+2] = grad3[g+2] * 64 + 64; // Gradient z
|
7366
|
+
pixels[offset+3] = value; // Permuted index
|
7367
|
+
}
|
7368
|
+
perm_buf = new Uint8Array(pixels);
|
7369
|
+
}
|
7370
|
+
|
7371
|
+
tex.bind(context, function() {
|
7372
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, perm_buf);
|
7373
|
+
});
|
7374
|
+
|
7375
|
+
return tex;
|
7376
|
+
}
|
7377
|
+
|
7378
|
+
/*
|
7379
|
+
* initSimplexTexture() - create and load a 1D texture for a
|
7380
|
+
* simplex traversal order lookup table. This is used for simplex noise only,
|
7381
|
+
* and only for 3D and 4D noise where there are more than 2 simplices.
|
7382
|
+
* (3D simplex noise has 6 cases to sort out, 4D simplex noise has 24 cases.)
|
7383
|
+
*/
|
7384
|
+
function initSimplexTexture(context)
|
7385
|
+
{
|
7386
|
+
|
7387
|
+
if (!simplex_buf) simplex_buf = new Uint8Array(simplex4);
|
7388
|
+
var tex = new Jax.Texture({min_filter:GL_NEAREST,mag_filter:GL_NEAREST, width:64, height:1});
|
7389
|
+
tex.bind(context, function() {
|
7390
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, simplex_buf);
|
7391
|
+
});
|
7392
|
+
return tex;
|
7393
|
+
}
|
7394
|
+
|
7395
|
+
/*
|
7396
|
+
* initGradTexture(context) - create and load a 2D texture
|
7397
|
+
* for a 4D gradient lookup table. This is used for 4D noise only.
|
7398
|
+
*/
|
7399
|
+
function initGradTexture(context)
|
7400
|
+
{
|
7401
|
+
var tex = new Jax.Texture({min_filter: GL_NEAREST, mag_filter: GL_NEAREST, width:256, height:256});
|
7402
|
+
|
7403
|
+
if (!grad_buf) {
|
7404
|
+
var pixels = new Array(256*256*4);
|
7405
|
+
var i,j;
|
7406
|
+
|
7407
|
+
for(i = 0; i<256; i++)
|
7408
|
+
for(j = 0; j<256; j++) {
|
7409
|
+
var offset = (i*256+j)*4;
|
7410
|
+
var value = perm[(j+perm[i]) & 0xFF];
|
7411
|
+
var g = (value & 0x1F) * 4;
|
7412
|
+
pixels[offset] = grad4[g+0] * 64 + 64; // Gradient x
|
7413
|
+
pixels[offset+1] = grad4[g+1] * 64 + 64; // Gradient y
|
7414
|
+
pixels[offset+2] = grad4[g+2] * 64 + 64; // Gradient z
|
7415
|
+
pixels[offset+3] = grad4[g+3] * 64 + 64; // Gradient z
|
7416
|
+
}
|
7417
|
+
|
7418
|
+
grad_buf = new Uint8Array(pixels);
|
7419
|
+
}
|
7420
|
+
|
7421
|
+
tex.bind(context, function() {
|
7422
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, grad_buf);
|
7423
|
+
});
|
7424
|
+
return tex;
|
7425
|
+
}
|
7426
|
+
|
7427
|
+
return Jax.Class.create({
|
7428
|
+
initialize: function(context) {
|
7429
|
+
this.perm = initPermTexture(context);
|
7430
|
+
|
7431
|
+
this.simplex = initSimplexTexture(context);
|
7432
|
+
|
7433
|
+
this.grad = initGradTexture(context);
|
7434
|
+
}
|
7435
|
+
});
|
7436
|
+
})();
|
7253
7437
|
|
7254
7438
|
Jax.shaders = {};
|
7255
7439
|
|
@@ -14,7 +14,7 @@ exceeds the capabilities of the graphics processor.
|
|
14
14
|
Processors supported by your application:
|
15
15
|
|
16
16
|
<%supported_shaders.each do |shader| -%>
|
17
|
-
- <%=shader.name.ljust(20)%> : <%=shader.description.gsub(/\n/, "\n"+" "*25)%>
|
17
|
+
- <%=shader.name.ljust(20)%> : <%=shader.description.strip.gsub(/\n/, "\n"+" "*25)%>
|
18
18
|
<%end -%>
|
19
19
|
|
20
20
|
You can specify a shader more than once. For instance, you can create a
|
@@ -6,7 +6,7 @@ shared uniform mat4 mvMatrix, pMatrix;
|
|
6
6
|
|
7
7
|
shared varying vec2 vTexCoords;
|
8
8
|
shared varying vec3 vNormals;
|
9
|
-
shared varying vec4
|
9
|
+
shared varying vec4 vColor;
|
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
|
@@ -5,6 +5,10 @@ describe("Shader '<%=file_name%>'", function() {
|
|
5
5
|
context = new Jax.Context('webgl-canvas');
|
6
6
|
mesh = new Jax.Mesh.Quad();
|
7
7
|
});
|
8
|
+
|
9
|
+
/* dispose the context so it doesn't continue using
|
10
|
+
resources after the tests have completed */
|
11
|
+
afterEach(function() { context.dispose(); });
|
8
12
|
|
9
13
|
describe("stand-alone", function() {
|
10
14
|
beforeEach(function() { mesh.material = new Jax.Material.<%=class_name%>(); });
|
@@ -18,6 +18,10 @@ class Jax::Packager::SprocketsTemplate < Sprockets::SourceFile
|
|
18
18
|
template << "//= require \"#{relative_path}\""
|
19
19
|
end
|
20
20
|
end
|
21
|
+
template.concat [
|
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
|
template
|
22
26
|
end
|
23
27
|
end
|
@@ -5,7 +5,7 @@ class Jax::ResourceCompiler
|
|
5
5
|
if destination_file.kind_of?(IO)
|
6
6
|
save_resources destination_file, resources
|
7
7
|
else
|
8
|
-
mkdir_p File.dirname(destination_file)
|
8
|
+
mkdir_p File.dirname(destination_file) unless File.exist?(File.dirname(destination_file))
|
9
9
|
File.open destination_file, "w" do |f|
|
10
10
|
save_resources f, resources
|
11
11
|
end
|
data/lib/jax/shader.rb
CHANGED
@@ -118,14 +118,26 @@ class Jax::Shader
|
|
118
118
|
# look for Sprockets-style require directives
|
119
119
|
str.gsub! /\/\/=\s*require\s*['"]([^'"]*)['"]/m do |sub|
|
120
120
|
filename = $~[1]
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
121
|
+
found = false
|
122
|
+
paths = Jax.shader_load_paths
|
123
|
+
result = nil
|
124
|
+
for path in paths
|
125
|
+
if File.file?(real = File.join(path, "#{filename}.ejs"))
|
126
|
+
found = true
|
127
|
+
macro_name = "dependency_#{filename}".underscore.gsub(/[^a-zA-Z0-9_]/, '_')
|
128
|
+
result = <<-end_code
|
129
|
+
#ifndef #{macro_name}
|
130
|
+
#define #{macro_name}
|
125
131
|
|
126
|
-
|
127
|
-
|
128
|
-
|
132
|
+
#{File.read(real)}
|
133
|
+
#endif
|
134
|
+
end_code
|
135
|
+
break
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
raise "Required file '#{filename}.ejs' not found in load paths #{paths.inspect} for shader '#{name}'!" if !found
|
140
|
+
result
|
129
141
|
end
|
130
142
|
end
|
131
143
|
|