jax 0.0.0.4 → 0.0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
data/lib/jax/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
//= require "application_controller"
|
2
|
+
|
3
|
+
var NoiseController = (function() {
|
4
|
+
return Jax.Controller.create("noise", ApplicationController, {
|
5
|
+
index: function() {
|
6
|
+
var model = new Jax.Model({mesh:new Jax.Mesh.Sphere({material:Material.find("blob")})});
|
7
|
+
this.world.addObject(model);
|
8
|
+
this.player.camera.move(-5);
|
9
|
+
},
|
10
|
+
|
11
|
+
|
12
|
+
// Some special actions are fired whenever the corresponding input is
|
13
|
+
// received from the user.
|
14
|
+
mouse_clicked: function(event) {
|
15
|
+
|
16
|
+
}
|
17
|
+
});
|
18
|
+
})();
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# ambient component multiplied with the light source's ambient component
|
2
|
+
ambient:
|
3
|
+
red: 1.0
|
4
|
+
green: 1.0
|
5
|
+
blue: 1.0
|
6
|
+
alpha: 1.0
|
7
|
+
|
8
|
+
# diffuse component multiplied with the light source's diffuse component
|
9
|
+
diffuse:
|
10
|
+
red: 1.0
|
11
|
+
green: 1.0
|
12
|
+
blue: 1.0
|
13
|
+
alpha: 1.0
|
14
|
+
|
15
|
+
# specular component multiplied with the light source's specular component
|
16
|
+
specular:
|
17
|
+
red: 1.0
|
18
|
+
green: 1.0
|
19
|
+
blue: 1.0
|
20
|
+
alpha: 1.0
|
21
|
+
|
22
|
+
shininess: 30
|
23
|
+
|
24
|
+
layers:
|
25
|
+
# remove Lighting to conserve video memory if you don't need/want support for light sources
|
26
|
+
- type: Lighting
|
27
|
+
|
28
|
+
- type: Blob
|
@@ -0,0 +1,18 @@
|
|
1
|
+
//= require "functions/noise"
|
2
|
+
|
3
|
+
// Shared variables save on graphics memory and allow you to "piggy-back" off of
|
4
|
+
// variables defined in other shaders:
|
5
|
+
|
6
|
+
shared uniform mat3 nMatrix;
|
7
|
+
shared uniform mat4 mvMatrix, pMatrix;
|
8
|
+
|
9
|
+
shared varying vec2 vTexCoords;
|
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.
|
16
|
+
|
17
|
+
// uniform sampler2D Texture;
|
18
|
+
// uniform float TextureScaleX, TextureScaleY;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
description: |
|
2
|
+
Causes the object to have "blob-like" edges, like a thick liquid
|
3
|
+
|
4
|
+
|
5
|
+
# Add an 'options' attribute if your shader's Material can accept
|
6
|
+
# multiple configurations. Usually, you'll have an option for each
|
7
|
+
# corresponding uniform or attribute variable.
|
8
|
+
|
9
|
+
# Example:
|
10
|
+
|
11
|
+
#options:
|
12
|
+
# path: "/path/to/texture.png"
|
13
|
+
# flip_y: false
|
14
|
+
# scale_x: 1.0
|
15
|
+
# scale_y: 1.0
|
@@ -0,0 +1,48 @@
|
|
1
|
+
Jax.Material.Blob = (function() {
|
2
|
+
function getNoise(self, context) {
|
3
|
+
var noise = self.noise[context.id];
|
4
|
+
if (!noise) noise = self.noise[context.id] = new Jax.Noise(context);
|
5
|
+
return noise;
|
6
|
+
}
|
7
|
+
|
8
|
+
return Jax.Class.create(Jax.Material, {
|
9
|
+
initialize: function($super, options) {
|
10
|
+
options = Jax.Util.normalizeOptions(options, {
|
11
|
+
shader: "blob",
|
12
|
+
|
13
|
+
// You can specify default options (see +manifest.yml+) here.
|
14
|
+
});
|
15
|
+
|
16
|
+
$super(options);
|
17
|
+
this.noise = {};
|
18
|
+
},
|
19
|
+
|
20
|
+
setUniforms: function($super, context, mesh, options, uniforms) {
|
21
|
+
$super(context, mesh, options, uniforms);
|
22
|
+
|
23
|
+
uniforms.set('mvMatrix', context.getModelViewMatrix());
|
24
|
+
uniforms.set('nMatrix', context.getNormalMatrix());
|
25
|
+
uniforms.set('pMatrix', context.getProjectionMatrix());
|
26
|
+
|
27
|
+
// uniforms.texture('Texture', this.texture, context);
|
28
|
+
|
29
|
+
this.l = this.l || new Date().getTime();
|
30
|
+
var tc = (new Date().getTime() - this.l) / 1000;
|
31
|
+
|
32
|
+
var noise = getNoise(this, context);
|
33
|
+
|
34
|
+
uniforms.texture('permTexture', noise.perm, context);
|
35
|
+
uniforms.texture('simplexTexture', noise.simplex, context);
|
36
|
+
uniforms.texture('gradTexture', noise.grad, context);
|
37
|
+
|
38
|
+
uniforms.set('time', tc);
|
39
|
+
},
|
40
|
+
|
41
|
+
setAttributes: function($super, context, mesh, options, attributes) {
|
42
|
+
attributes.set('VERTEX_POSITION', mesh.getVertexBuffer());
|
43
|
+
attributes.set('VERTEX_COLOR', mesh.getColorBuffer());
|
44
|
+
attributes.set('VERTEX_NORMAL', mesh.getNormalBuffer());
|
45
|
+
attributes.set('VERTEX_TEXCOORDS', mesh.getTextureCoordsBuffer());
|
46
|
+
}
|
47
|
+
});
|
48
|
+
})();
|
@@ -0,0 +1,13 @@
|
|
1
|
+
shared attribute vec4 VERTEX_POSITION, VERTEX_COLOR;
|
2
|
+
shared attribute vec3 VERTEX_NORMAL;
|
3
|
+
shared attribute vec2 VERTEX_TEXCOORDS;
|
4
|
+
|
5
|
+
void main(void) {
|
6
|
+
vec4 pos = VERTEX_POSITION;
|
7
|
+
float n = snoise(vec4(pos.xyz, time));
|
8
|
+
pos.xyz += normalize(pos.xyz)*n;
|
9
|
+
|
10
|
+
gl_Position = pMatrix * mvMatrix * pos;
|
11
|
+
|
12
|
+
vColor = vec4(n);
|
13
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
describe("NoiseHelper", function() {
|
2
|
+
var helper;
|
3
|
+
|
4
|
+
beforeEach(function() {
|
5
|
+
var klass = Jax.Class.create({helpers: function() { return [NoiseHelper]; } });
|
6
|
+
helper = new klass();
|
7
|
+
});
|
8
|
+
|
9
|
+
it("does something", function() {
|
10
|
+
expect(1).toEqual(1);
|
11
|
+
});
|
12
|
+
});
|
@@ -0,0 +1,30 @@
|
|
1
|
+
describe("Shader 'blob'", function() {
|
2
|
+
var context, material, mesh;
|
3
|
+
|
4
|
+
beforeEach(function() {
|
5
|
+
context = new Jax.Context('webgl-canvas');
|
6
|
+
mesh = new Jax.Mesh.Quad();
|
7
|
+
});
|
8
|
+
|
9
|
+
afterEach(function() { context.dispose(); });
|
10
|
+
|
11
|
+
describe("stand-alone", function() {
|
12
|
+
beforeEach(function() { mesh.material = new Jax.Material.Blob(); });
|
13
|
+
|
14
|
+
xit("should render without error", function() {
|
15
|
+
expect(function() { mesh.render(context); }).not.toThrow();
|
16
|
+
});
|
17
|
+
});
|
18
|
+
|
19
|
+
describe("as a layer", function() {
|
20
|
+
beforeEach(function() {
|
21
|
+
mesh.material = new Jax.Material({layers:[{
|
22
|
+
type:"Blob"
|
23
|
+
}]});
|
24
|
+
});
|
25
|
+
|
26
|
+
xit("should render without error", function() {
|
27
|
+
expect(function() { mesh.render(context); }).not.toThrow();
|
28
|
+
});
|
29
|
+
});
|
30
|
+
});
|
@@ -77,7 +77,8 @@
|
|
77
77
|
<div id="jax_nav">
|
78
78
|
<a href="#" onclick="context.redirectTo('/');return false;">Lighting w/Multiple Sources</a> |
|
79
79
|
<a href="#" onclick="context.redirectTo('shadows');return false;">Shadows</a> |
|
80
|
-
<a href="#" onclick="context.redirectTo('textures');return false;">Textures</a>
|
80
|
+
<a href="#" onclick="context.redirectTo('textures');return false;">Textures</a> |
|
81
|
+
<a href="#" onclick="context.redirectTo('noise');return false;">Noise Functions</a>
|
81
82
|
</div>
|
82
83
|
<div id="jasmine_content"></div>
|
83
84
|
</body>
|
@@ -1,10 +1,10 @@
|
|
1
|
-
describe("Material segment '
|
1
|
+
describe("Material segment 'paraboloid'", function() {
|
2
2
|
var context;
|
3
3
|
var matr;
|
4
4
|
|
5
5
|
beforeEach(function() {
|
6
6
|
context = new Jax.Context(document.getElementById('canvas-element'));
|
7
|
-
matr = new Jax.Material.
|
7
|
+
matr = new Jax.Material.Paraboloid();
|
8
8
|
spyOn(matr, 'prepareShader').andCallThrough();
|
9
9
|
});
|
10
10
|
|
data/src/constants.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
JAX_VERSION: 0.0.0.5
|
@@ -0,0 +1 @@
|
|
1
|
+
JAX_VERSION: <%=Jax::Version::STRING%>
|
data/src/jax.js
CHANGED
@@ -2,7 +2,19 @@
|
|
2
2
|
* Jax
|
3
3
|
* Root namespace containing all Jax data
|
4
4
|
**/
|
5
|
-
var Jax = { PRODUCTION: 1 };
|
5
|
+
var Jax = { PRODUCTION: 1, VERSION: "<%=JAX_VERSION%>" };
|
6
|
+
|
7
|
+
/* Called by Jax applications as of version 0.0.0.5 to alert the user to incomplete upgrades */
|
8
|
+
Jax.doVersionCheck = function(targetVersion) {
|
9
|
+
// don't do this in production cause that would be a Bad Idea
|
10
|
+
if (Jax.environment && Jax.environment == Jax.PRODUCTION) return;
|
11
|
+
|
12
|
+
if (Jax.VERSION != targetVersion) {
|
13
|
+
alert("Jax version mismatch!\n\n" +
|
14
|
+
"Your Jax gem is version "+targetVersion+", but the Jax JS library is version "+Jax.VERSION+"!\n\n" +
|
15
|
+
"Please run `rake jax:update` at the command line to fix this issue.");
|
16
|
+
}
|
17
|
+
};
|
6
18
|
|
7
19
|
// note: the default_shader is used immediately after Jax.Material has been defined. So, most
|
8
20
|
// likely the end user won't be able to customize it with the expected result. Materials created
|
@@ -24,6 +36,7 @@ Jax.default_shader = "basic";
|
|
24
36
|
//= require "jax/route_set"
|
25
37
|
//= require "jax/view"
|
26
38
|
//= require "jax/context"
|
39
|
+
//= require "jax/noise"
|
27
40
|
|
28
41
|
Jax.shaders = {};
|
29
42
|
|
data/src/jax/noise.js
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
Jax.Noise = (function() {
|
2
|
+
var perm/*[256]*/ = [151,160,137,91,90,15,
|
3
|
+
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
|
4
|
+
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
|
5
|
+
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
|
6
|
+
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
|
7
|
+
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
|
8
|
+
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
|
9
|
+
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
|
10
|
+
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
|
11
|
+
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
|
12
|
+
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
|
13
|
+
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
|
14
|
+
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];
|
15
|
+
|
16
|
+
/* These are Ken Perlin's proposed gradients for 3D noise. I kept them for
|
17
|
+
better consistency with the reference implementation, but there is really
|
18
|
+
no need to pad this to 16 gradients for this particular implementation.
|
19
|
+
If only the "proper" first 12 gradients are used, they can be extracted
|
20
|
+
from the grad4[][] array: grad3[i][j] == grad4[i*2][j], 0<=i<=11, j=0,1,2
|
21
|
+
*/
|
22
|
+
var grad3/*[16][3]*/ = [0,1,1, 0,1,-1, 0,-1,1, 0,-1,-1,
|
23
|
+
1,0,1, 1,0,-1, -1,0,1, -1,0,-1,
|
24
|
+
1,1,0, 1,-1,0, -1,1,0, -1,-1,0, // 12 cube edges
|
25
|
+
1,0,-1, -1,0,-1, 0,-1,1, 0,1,1]; // 4 more to make 16
|
26
|
+
|
27
|
+
/* These are my own proposed gradients for 4D noise. They are the coordinates
|
28
|
+
of the midpoints of each of the 32 edges of a tesseract, just like the 3D
|
29
|
+
noise gradients are the midpoints of the 12 edges of a cube.
|
30
|
+
*/
|
31
|
+
var grad4/*[32][4]*/ = [0,1,1,1, 0,1,1,-1, 0,1,-1,1, 0,1,-1,-1, // 32 tesseract edges
|
32
|
+
0,-1,1,1, 0,-1,1,-1, 0,-1,-1,1, 0,-1,-1,-1,
|
33
|
+
1,0,1,1, 1,0,1,-1, 1,0,-1,1, 1,0,-1,-1,
|
34
|
+
-1,0,1,1, -1,0,1,-1, -1,0,-1,1, -1,0,-1,-1,
|
35
|
+
1,1,0,1, 1,1,0,-1, 1,-1,0,1, 1,-1,0,-1,
|
36
|
+
-1,1,0,1, -1,1,0,-1, -1,-1,0,1, -1,-1,0,-1,
|
37
|
+
1,1,1,0, 1,1,-1,0, 1,-1,1,0, 1,-1,-1,0,
|
38
|
+
-1,1,1,0, -1,1,-1,0, -1,-1,1,0, -1,-1,-1,0];
|
39
|
+
|
40
|
+
/* This is a look-up table to speed up the decision on which simplex we
|
41
|
+
are in inside a cube or hypercube "cell" for 3D and 4D simplex noise.
|
42
|
+
It is used to avoid complicated nested conditionals in the GLSL code.
|
43
|
+
The table is indexed in GLSL with the results of six pair-wise
|
44
|
+
comparisons beween the components of the P=(x,y,z,w) coordinates
|
45
|
+
within a hypercube cell.
|
46
|
+
c1 = x>=y ? 32 : 0;
|
47
|
+
c2 = x>=z ? 16 : 0;
|
48
|
+
c3 = y>=z ? 8 : 0;
|
49
|
+
c4 = x>=w ? 4 : 0;
|
50
|
+
c5 = y>=w ? 2 : 0;
|
51
|
+
c6 = z>=w ? 1 : 0;
|
52
|
+
offsets = simplex[c1+c2+c3+c4+c5+c6];
|
53
|
+
o1 = step(160,offsets);
|
54
|
+
o2 = step(96,offsets);
|
55
|
+
o3 = step(32,offsets);
|
56
|
+
(For the 3D case, c4, c5, c6 and o3 are not needed.)
|
57
|
+
*/
|
58
|
+
var simplex4/*[][4]*/ = [0,64,128,192, 0,64,192,128, 0,0,0,0, 0,128,192,64,
|
59
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 64,128,192,0,
|
60
|
+
0,128,64,192, 0,0,0,0, 0,192,64,128, 0,192,128,64,
|
61
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 64,192,128,0,
|
62
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
63
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
64
|
+
64,128,0,192, 0,0,0,0, 64,192,0,128, 0,0,0,0,
|
65
|
+
0,0,0,0, 0,0,0,0, 128,192,0,64, 128,192,64,0,
|
66
|
+
64,0,128,192, 64,0,192,128, 0,0,0,0, 0,0,0,0,
|
67
|
+
0,0,0,0, 128,0,192,64, 0,0,0,0, 128,64,192,0,
|
68
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
69
|
+
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
70
|
+
128,0,64,192, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
71
|
+
192,0,64,128, 192,0,128,64, 0,0,0,0, 192,64,128,0,
|
72
|
+
128,64,0,192, 0,0,0,0, 0,0,0,0, 0,0,0,0,
|
73
|
+
192,64,0,128, 0,0,0,0, 192,128,0,64, 192,128,64,0];
|
74
|
+
|
75
|
+
var simplex_buf = null, perm_buf = null, grad_buf = null;
|
76
|
+
|
77
|
+
/*
|
78
|
+
* initPermTexture() - create and load a 2D texture for
|
79
|
+
* a combined index permutation and gradient lookup table.
|
80
|
+
* This texture is used for 2D and 3D noise, both classic and simplex.
|
81
|
+
*/
|
82
|
+
function initPermTexture(context)
|
83
|
+
{
|
84
|
+
var tex = new Jax.Texture({min_filter: GL_NEAREST, mag_filter: GL_NEAREST, width:256, height:256});
|
85
|
+
|
86
|
+
if (!perm_buf) {
|
87
|
+
var pixels = new Array(256*256*4);
|
88
|
+
var i,j;
|
89
|
+
for(i = 0; i<256; i++)
|
90
|
+
for(j = 0; j<256; j++) {
|
91
|
+
var offset = (i*256+j)*4;
|
92
|
+
var value = perm[(j+perm[i]) & 0xFF];
|
93
|
+
var g = (value & 0x0F) * 3;
|
94
|
+
pixels[offset] = grad3[g+0] * 64 + 64; // Gradient x
|
95
|
+
pixels[offset+1] = grad3[g+1] * 64 + 64; // Gradient y
|
96
|
+
pixels[offset+2] = grad3[g+2] * 64 + 64; // Gradient z
|
97
|
+
pixels[offset+3] = value; // Permuted index
|
98
|
+
}
|
99
|
+
perm_buf = new Uint8Array(pixels);
|
100
|
+
}
|
101
|
+
|
102
|
+
tex.bind(context, function() {
|
103
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, perm_buf);
|
104
|
+
});
|
105
|
+
|
106
|
+
return tex;
|
107
|
+
}
|
108
|
+
|
109
|
+
/*
|
110
|
+
* initSimplexTexture() - create and load a 1D texture for a
|
111
|
+
* simplex traversal order lookup table. This is used for simplex noise only,
|
112
|
+
* and only for 3D and 4D noise where there are more than 2 simplices.
|
113
|
+
* (3D simplex noise has 6 cases to sort out, 4D simplex noise has 24 cases.)
|
114
|
+
*/
|
115
|
+
function initSimplexTexture(context)
|
116
|
+
{
|
117
|
+
// webgl doesn't support 1D so we'll simulate it with a 64x1 texture
|
118
|
+
|
119
|
+
if (!simplex_buf) simplex_buf = new Uint8Array(simplex4);
|
120
|
+
var tex = new Jax.Texture({min_filter:GL_NEAREST,mag_filter:GL_NEAREST, width:64, height:1});
|
121
|
+
tex.bind(context, function() {
|
122
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 64, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, simplex_buf);
|
123
|
+
});
|
124
|
+
return tex;
|
125
|
+
}
|
126
|
+
|
127
|
+
/*
|
128
|
+
* initGradTexture(context) - create and load a 2D texture
|
129
|
+
* for a 4D gradient lookup table. This is used for 4D noise only.
|
130
|
+
*/
|
131
|
+
function initGradTexture(context)
|
132
|
+
{
|
133
|
+
var tex = new Jax.Texture({min_filter: GL_NEAREST, mag_filter: GL_NEAREST, width:256, height:256});
|
134
|
+
|
135
|
+
if (!grad_buf) {
|
136
|
+
var pixels = new Array(256*256*4);
|
137
|
+
var i,j;
|
138
|
+
|
139
|
+
for(i = 0; i<256; i++)
|
140
|
+
for(j = 0; j<256; j++) {
|
141
|
+
var offset = (i*256+j)*4;
|
142
|
+
var value = perm[(j+perm[i]) & 0xFF];
|
143
|
+
var g = (value & 0x1F) * 4;
|
144
|
+
pixels[offset] = grad4[g+0] * 64 + 64; // Gradient x
|
145
|
+
pixels[offset+1] = grad4[g+1] * 64 + 64; // Gradient y
|
146
|
+
pixels[offset+2] = grad4[g+2] * 64 + 64; // Gradient z
|
147
|
+
pixels[offset+3] = grad4[g+3] * 64 + 64; // Gradient z
|
148
|
+
}
|
149
|
+
|
150
|
+
grad_buf = new Uint8Array(pixels);
|
151
|
+
}
|
152
|
+
|
153
|
+
tex.bind(context, function() {
|
154
|
+
context.glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, grad_buf);
|
155
|
+
});
|
156
|
+
return tex;
|
157
|
+
}
|
158
|
+
|
159
|
+
/**
|
160
|
+
* class Jax.Noise
|
161
|
+
*
|
162
|
+
* Used by +Jax.Material.Noise+.
|
163
|
+
**/
|
164
|
+
return Jax.Class.create({
|
165
|
+
initialize: function(context) {
|
166
|
+
/**
|
167
|
+
* Jax.Noise#perm -> Jax.Texture
|
168
|
+
* A 2D texture for a combined index permutation and gradient lookup table.
|
169
|
+
* This texture is used for both 2D and 3D noise, both classic and simplex.
|
170
|
+
**/
|
171
|
+
this.perm = initPermTexture(context);
|
172
|
+
|
173
|
+
/**
|
174
|
+
* Jax.Noise#simplex -> Jax.Texture
|
175
|
+
* A 1D texture for a simplex transversal order lookup table. This is used
|
176
|
+
* for simplex noise only, and only for 3D and 4D noise where there are more
|
177
|
+
* than 2 simplices. (3D simplex noise has 6 cases to sort out, 4D simplex
|
178
|
+
* noise has 24 cases.)
|
179
|
+
*
|
180
|
+
* Note that WebGL does not support 1D textures, so this is technically a
|
181
|
+
* 2D texture with a height of 1 pixel.
|
182
|
+
**/
|
183
|
+
this.simplex = initSimplexTexture(context);
|
184
|
+
|
185
|
+
/**
|
186
|
+
* Jax.Noise#grad -> Jax.Texture
|
187
|
+
* A 2D texture for a 4D gradient lookup table. This is used for 4D noise
|
188
|
+
* only.
|
189
|
+
**/
|
190
|
+
this.grad = initGradTexture(context);
|
191
|
+
}
|
192
|
+
});
|
193
|
+
})();
|