jax 0.0.0.8 → 0.0.0.9

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.
Files changed (31) hide show
  1. data/CHANGELOG +22 -0
  2. data/Rakefile +2 -1
  3. data/builtin/shaders/functions/noise.ejs +0 -3
  4. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +31 -3
  5. data/guides/jax_guides/common.rb +1 -1
  6. data/guides/source/index.html.erb +4 -4
  7. data/guides/source/shaders.textile +496 -2
  8. data/lib/jax/generators/app/templates/public/javascripts/jax.js +130 -94
  9. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_environment_helper.js +33 -0
  10. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +1 -13
  11. data/lib/jax/generators/shader/templates/fragment.ejs.tt +2 -3
  12. data/lib/jax/generators/shader/templates/spec.js.tt +4 -11
  13. data/lib/jax/routes.rb +0 -3
  14. data/lib/jax/tasks/rake.rb +4 -0
  15. data/lib/jax/version.rb +1 -1
  16. data/spec/example_app/app/shaders/blob/vertex.ejs +2 -0
  17. data/spec/example_app/spec/javascripts/shaders/blob_spec.js +5 -8
  18. data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_environment_helper.js +33 -0
  19. data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +1 -13
  20. data/spec/generators/app_generator_spec.rb +1 -0
  21. data/spec/javascripts/helpers/jax_spec_environment_helper.js +33 -0
  22. data/spec/javascripts/helpers/{SpecHelper.js → jax_spec_helper.js} +0 -0
  23. data/spec/javascripts/jax/core/utils_spec.js +21 -2
  24. data/spec/lib/jax/tasks/jax_rake_spec.rb +13 -0
  25. data/src/jax/context.js +1 -1
  26. data/src/jax/core/util.js +12 -5
  27. data/src/jax/mvc/model.js +1 -0
  28. data/src/jax/webgl/scene/light_manager.js +58 -45
  29. data/src/jax/webgl/scene/light_source.js +49 -4
  30. data/src/jax/webgl/world.js +12 -46
  31. metadata +11 -6
@@ -30,9 +30,6 @@ 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.');"
36
33
  end
37
34
 
38
35
  def root(controller = nil, action = 'index')
@@ -27,6 +27,10 @@ namespace :jax do
27
27
  File.open(Jax.root.join("tmp/routes.js"), 'w') do |f|
28
28
  Jax.application.config.routes.compile(f)
29
29
  end
30
+ File.open(Jax.root.join("tmp/version_check.js"), "w") do |f|
31
+ f.puts "if (Jax.doVersionCheck) Jax.doVersionCheck('#{Jax::Version::STRING}');"
32
+ f.puts "else alert('Your Jax gem version is newer than your Jax JavaScript library!\\n\\nRun `rake jax:update` to fix this.');"
33
+ end
30
34
  end
31
35
  end
32
36
 
@@ -3,7 +3,7 @@ module Jax
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
5
  TINY = 0
6
- PATCH = 8
6
+ PATCH = 9
7
7
 
8
8
  STRING = PATCH == 0 ? "#{MAJOR}.#{MINOR}.#{TINY}" : "#{MAJOR}.#{MINOR}.#{TINY}.#{PATCH}"
9
9
  end
@@ -1,6 +1,8 @@
1
1
  shared attribute vec4 VERTEX_POSITION, VERTEX_TANGENT;
2
2
  shared attribute vec3 VERTEX_NORMAL;
3
3
 
4
+ uniform float time;
5
+
4
6
  #define PI 3.141592653589793
5
7
 
6
8
  vec3 sphere(in float slice, in float stack) {
@@ -1,18 +1,15 @@
1
1
  describe("Shader 'blob'", function() {
2
- var context, material, mesh;
2
+ var material, mesh;
3
3
 
4
4
  beforeEach(function() {
5
- context = new Jax.Context('webgl-canvas');
6
5
  mesh = new Jax.Mesh.Quad();
7
6
  });
8
7
 
9
- afterEach(function() { context.dispose(); });
10
-
11
8
  describe("stand-alone", function() {
12
9
  beforeEach(function() { mesh.material = new Jax.Material.Blob(); });
13
10
 
14
- xit("should render without error", function() {
15
- expect(function() { mesh.render(context); }).not.toThrow();
11
+ it("should render without error", function() {
12
+ expect(function() { mesh.render(SPEC_CONTEXT); }).not.toThrow();
16
13
  });
17
14
  });
18
15
 
@@ -23,8 +20,8 @@ describe("Shader 'blob'", function() {
23
20
  }]});
24
21
  });
25
22
 
26
- xit("should render without error", function() {
27
- expect(function() { mesh.render(context); }).not.toThrow();
23
+ it("should render without error", function() {
24
+ expect(function() { mesh.render(SPEC_CONTEXT); }).not.toThrow();
28
25
  });
29
26
  });
30
27
  });
@@ -0,0 +1,33 @@
1
+ function setupJaxTestEnvironment() {
2
+ var jasmineEnv = jasmine.getEnv();
3
+
4
+ jsApiReporter = new jasmine.JsApiReporter();
5
+ var trivialReporter = new jasmine.TrivialReporter();
6
+
7
+ jasmineEnv.addReporter(jsApiReporter);
8
+ jasmineEnv.addReporter(trivialReporter);
9
+
10
+ jasmineEnv.specFilter = function(spec) {
11
+ return trivialReporter.specFilter(spec);
12
+ };
13
+
14
+ /*
15
+ Create a canvas element and add it to the document.
16
+ There's nothing special about this element.
17
+ */
18
+ var canvas = document.createElement("canvas");
19
+ canvas.setAttribute("id", "spec-canvas");
20
+ canvas.style.display = "none";
21
+ document.body.appendChild(canvas);
22
+
23
+ beforeEach(function() {
24
+ window.SPEC_CONTEXT = new Jax.Context(canvas);
25
+ });
26
+
27
+ afterEach(function() {
28
+ SPEC_CONTEXT.dispose();
29
+ })
30
+
31
+
32
+ jasmineEnv.execute();
33
+ }
@@ -14,20 +14,8 @@
14
14
  <script type="text/javascript">
15
15
  var jsApiReporter;
16
16
  (function() {
17
- var jasmineEnv = jasmine.getEnv();
18
-
19
- jsApiReporter = new jasmine.JsApiReporter();
20
- var trivialReporter = new jasmine.TrivialReporter();
21
-
22
- jasmineEnv.addReporter(jsApiReporter);
23
- jasmineEnv.addReporter(trivialReporter);
24
-
25
- jasmineEnv.specFilter = function(spec) {
26
- return trivialReporter.specFilter(spec);
27
- };
28
-
29
17
  window.onload = function() {
30
- jasmineEnv.execute();
18
+ setupJaxTestEnvironment();
31
19
 
32
20
  /*
33
21
  Create a canvas element and add it to the document.
@@ -15,6 +15,7 @@ EXPECTED_FILES = %w(
15
15
  spec/javascripts/support/jasmine.yml
16
16
  spec/javascripts/support/jasmine_runner.rb
17
17
  spec/javascripts/support/spec_layout.html.erb
18
+ spec/javascripts/support/spec_helpers/jax_spec_environment_helper.js
18
19
  spec/javascripts/support/spec_helpers/jax_spec_helper.js
19
20
  Rakefile
20
21
  Gemfile
@@ -0,0 +1,33 @@
1
+ function setupJaxTestEnvironment() {
2
+ var jasmineEnv = jasmine.getEnv();
3
+
4
+ jsApiReporter = new jasmine.JsApiReporter();
5
+ var trivialReporter = new jasmine.TrivialReporter();
6
+
7
+ jasmineEnv.addReporter(jsApiReporter);
8
+ jasmineEnv.addReporter(trivialReporter);
9
+
10
+ jasmineEnv.specFilter = function(spec) {
11
+ return trivialReporter.specFilter(spec);
12
+ };
13
+
14
+ /*
15
+ Create a canvas element and add it to the document.
16
+ There's nothing special about this element.
17
+ */
18
+ var canvas = document.createElement("canvas");
19
+ canvas.setAttribute("id", "spec-canvas");
20
+ canvas.style.display = "none";
21
+ document.body.appendChild(canvas);
22
+
23
+ beforeEach(function() {
24
+ window.SPEC_CONTEXT = new Jax.Context(canvas);
25
+ });
26
+
27
+ afterEach(function() {
28
+ SPEC_CONTEXT.dispose();
29
+ })
30
+
31
+
32
+ jasmineEnv.execute();
33
+ }
@@ -2,6 +2,19 @@ describe("Jax.Util", function() {
2
2
  describe("vectorize", function() {
3
3
  var data;
4
4
 
5
+ describe("2D", function() {
6
+ beforeEach(function() { data = [1, 2]; });
7
+
8
+ it("should have length 2", function() { expect(Jax.Util.vectorize({x:0,y:1})).toEqualVector([0,1]); });
9
+ it("should work", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2]); });
10
+ });
11
+
12
+ describe("with array", function() {
13
+ beforeEach(function() { data = [1, 2, 3]; });
14
+
15
+ it("should return the original vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
16
+ });
17
+
5
18
  describe("with object with names", function() {
6
19
  beforeEach(function() { data = {x:1,y:2,z:3}; });
7
20
  it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
@@ -33,6 +46,12 @@ describe("Jax.Util", function() {
33
46
  describe("colorize", function() {
34
47
  var data;
35
48
 
49
+ describe("3D", function() {
50
+ beforeEach(function() { data = [1, 2, 3]; });
51
+
52
+ it("should work", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,1]); });
53
+ });
54
+
36
55
  describe("with object with short names", function() {
37
56
  beforeEach(function() { data = {r:1,g:2,b:3,a:4}; });
38
57
  it("should produce a color", function() { expect(Jax.Util.colorize(data)).toEqualVector([1,2,3,4]); });
@@ -108,7 +127,7 @@ describe("Jax.Util", function() {
108
127
  describe("with a vector", function() {
109
128
  beforeEach(function() { data = [1,2,3]; });
110
129
  it("should produce a vector", function() { expect(Jax.Util.vectorize(data)).toEqualVector([1,2,3]); });
111
- it("should not return itself", function() { expect(Jax.Util.vectorize(data)).not.toEqual(data); });
130
+ xit("should not return itself", function() { expect(Jax.Util.vectorize(data)).not.toEqual(data); });
112
131
  });
113
132
  });
114
133
 
@@ -175,7 +194,7 @@ describe("Jax.Util", function() {
175
194
  });
176
195
  });
177
196
 
178
- describe("with a gen object left and array right", function() {
197
+ describe("with a object left and array right", function() {
179
198
  beforeEach(function() { normalized = Jax.Util.normalizeOptions({p:{"x":20,"y":40,"z":60}}, {p:[1,2,3]}); });
180
199
  it("should merge both into a gen object", function() {
181
200
  expect(Object.isArray(normalized.p)).toBeFalsy();
@@ -37,6 +37,15 @@ describe "Rake Tasks:" do
37
37
  Dir.chdir File.expand_path('..', pwd)
38
38
  end
39
39
 
40
+ context "jax:generate_files" do
41
+ before(:each) { rake('jax:generate_files') }
42
+ subject { File.read(File.expand_path('tmp/version_check.js')) }
43
+
44
+ it "should do a version check" do
45
+ subject.should =~ /jax:update/
46
+ end
47
+ end
48
+
40
49
  context "jax:package" do
41
50
  before(:each) { rake('jax:package') }
42
51
 
@@ -47,6 +56,10 @@ describe "Rake Tasks:" do
47
56
  File.should exist('pkg/images/test.png')
48
57
  end
49
58
 
59
+ it "should not do a version check" do
60
+ subject.should_not =~ /jax:update/
61
+ end
62
+
50
63
  it "should contain views" do
51
64
  subject.should =~ /Jax.views.push\('welcome\/index'/
52
65
  end
@@ -384,7 +384,7 @@ Jax.Context = (function() {
384
384
  var error = this.glGetError();
385
385
  if (error != GL_NO_ERROR)
386
386
  {
387
- var str = "GL error in "+this.canvas.id+": "+error;
387
+ var str = "GL error in "+this.canvas.id+": "+error+" ("+Jax.Util.enumName(error)+")";
388
388
  error = new Error(str);
389
389
  var message = error;
390
390
  if (error.stack)
@@ -41,18 +41,25 @@ Jax.Util = {
41
41
  **/
42
42
  vectorize: function(data) {
43
43
  if (data) {
44
- var res = vec3.create();
44
+ var res = [];//vec3.create();
45
45
  if (typeof(data) == "string") {
46
46
  var components = data.split(/[,\s]+/);
47
- if (components.length >= 3) {
48
- for (var i = 0; i < 3; i++)
47
+ if (components.length >= 2) {
48
+ for (var i = 0; i < components.length; i++)
49
49
  res[i] = parseFloat(components[i]);
50
50
  }
51
51
  return res;
52
52
  }
53
53
  if (data.length && data.length >= 3) return vec3.set(data, res);
54
- if ((res[0] = data.x) != undefined && (res[1] = data.y) != undefined && (res[2] = data.z) != undefined) return res;
55
- if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined && (res[2] = data[2]) != undefined) return res;
54
+ else if (data.length == 2) return [data[0], data[1]];
55
+ if ((res[0] = data.x) != undefined && (res[1] = data.y) != undefined) {
56
+ if (data.z != undefined) res[2] = data.z;
57
+ return res;
58
+ }
59
+ if ((res[0] = data[0]) != undefined && (res[1] = data[1]) != undefined) {
60
+ if (data[2] != undefined) res[2] = data[2];
61
+ return res;
62
+ }
56
63
  }
57
64
  throw new Error("Input argument for Jax.Util.vectorize not recognized: "+JSON.stringify(data));
58
65
  },
@@ -149,6 +149,7 @@
149
149
  *
150
150
  **/
151
151
  getBoundingCube: function() {
152
+ if (!this.mesh) return {left:0,right:0,bottom:0,top:0,front:0,back:0,width:0,height:0,depth:0};
152
153
  if (!this.mesh.built) this.mesh.rebuild();
153
154
  return this.mesh.bounds;
154
155
  },
@@ -5,12 +5,64 @@ Jax.Scene.LightManager = (function() {
5
5
  initialize: function(context) {
6
6
  this.context = context;
7
7
  this._lights = [];
8
+ this.objects = [];
9
+ },
10
+
11
+ addObject: function(obj) {
12
+ this.objects.push(obj);
13
+ for (var j = 0; j < this._lights.length; j++)
14
+ if (obj.isShadowCaster())
15
+ this._lights[j].registerCaster(obj);
16
+ this.recalculateBoundingRadius();
17
+ },
18
+
19
+ removeObject: function(obj) {
20
+ if (this.objects[obj]) {
21
+ var o = this.objects[obj];
22
+ this.objects.splice(obj, 1);
23
+ for (var j = 0; j < this._lights.length; j++)
24
+ if (o.isShadowCaster())
25
+ this._lights[j].unregisterCaster(o);
26
+ this.recalculateBoundingRadius();
27
+ return o;
28
+ }
29
+ for (var i = 0; i < this.objects.length; i++)
30
+ if (this.objects[i] == obj)
31
+ return this.removeObject(obj);
32
+ },
33
+
34
+ getShadowCasters: function() {
35
+ var ret = [];
36
+ for (var i = 0; i < this.objects.length; i++) {
37
+ if (this.objects[i].isShadowCaster())
38
+ ret.push(this.objects[i]);
39
+ }
40
+ return ret;
8
41
  },
9
42
 
10
43
  add: function(light) {
11
44
  if (this._lights.length == Jax.max_lights)
12
45
  throw new Error("Maximum number of light sources in a scene has been exceeded! Try removing some first.");
46
+ for (var i = 0; i < this.objects.length; i++) {
47
+ if (this.objects[i].isShadowCaster())
48
+ light.registerCaster(this.objects[i]);
49
+ }
13
50
  this._lights.push(light);
51
+ light.boundingRadius = this.boundingRadius || 0;
52
+ },
53
+
54
+ recalculateBoundingRadius: function() {
55
+ var boundingRadius = null;
56
+ var i, j;
57
+ for (i = 0; i < this.objects.length; i++) {
58
+ j = vec3.length(this.objects[i].camera.getPosition()) + this.objects[i].getBoundingSphereRadius();
59
+ if (boundingRadius == null || boundingRadius < j)
60
+ boundingRadius = j;
61
+ }
62
+ this.boundingRadius = boundingRadius = boundingRadius || 0;
63
+
64
+ for (i = 0; i < this._lights.length; i++)
65
+ this._lights[i].boundingRadius = boundingRadius;
14
66
  },
15
67
 
16
68
  enable: function() { this.enabled = true; },
@@ -37,60 +89,21 @@ Jax.Scene.LightManager = (function() {
37
89
  return result;
38
90
  },
39
91
 
40
- illuminate: function(context, objects, options) {
92
+ illuminate: function(context, options) {
93
+ // used by individual light sources
41
94
  options = Jax.Util.normalizeOptions(options, {});
42
95
 
43
96
  // Use alpha blending for the first pass, and additive blending for subsequent passes.
44
97
  this.context.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
45
- for (var i = 0; i < this._lights.length; i++) {
46
- for (var j = 0; j < objects.length; j++) {
47
- this._current_light = i;
48
- options.model_index = j;
49
-
50
- /* TODO optimization: see if objects[j] is even affected by this._lights[i] (based on attenuation) */
51
- if (objects[j].isLit())
52
- objects[j].render(context, options);
53
- }
54
- this.context.glBlendFunc(GL_ONE, GL_ONE);
55
- }
56
- delete this._current_light;
57
- },
58
-
59
- ambient: function(context, objects, options) {
60
- options = Jax.Util.normalizeOptions(options, {});
61
-
62
98
  for (var i = 0; i < this._lights.length; i++) {
63
99
  this._current_light = i;
64
- for (var j = 0; j < objects.length; j++) {
65
- options.model_index = j;
66
-
67
- /* TODO optimization: see if objects[j] is even affected by this._lights[i] (based on attenuation) */
68
- if (objects[j].isLit())
69
- objects[j].render(context, options);
70
- }
71
- }
72
- delete this._current_light;
73
- },
74
-
75
- updateShadowMaps: function(context, objects) {
76
- var boundingRadius = null;
77
- var i, j;
78
- for (i = 0; i < objects.length; i++) {
79
- j = vec3.length(objects[i].camera.getPosition()) + objects[i].getBoundingSphereRadius();
80
- if (boundingRadius == null || boundingRadius < j)
81
- boundingRadius = j;
100
+ this._lights[i].render(context, this.objects, options);
101
+ if (i == 0) this.context.glBlendFunc(GL_ONE, GL_ONE);
82
102
  }
83
- boundingRadius = boundingRadius || 0;
84
103
 
85
- // context.glPolygonOffset(1.1, 4.0);
86
- // context.glPolygonOffset(2,2);
87
- // context.glEnable(GL_POLYGON_OFFSET_FILL);
88
- for (i = 0; i < this._lights.length; i++)
89
- this._lights[i].updateShadowMap(context, boundingRadius, objects);
90
- // context.glDisable(GL_POLYGON_OFFSET_FILL);
91
- // context.glPolygonOffset(0.0, 0.0);
104
+ delete this._current_light;
92
105
  },
93
-
106
+
94
107
  getDirection: function(index) { return this.getLight(index).getDirection(); },
95
108
 
96
109
  getPosition: function(index) { return this.getLight(index).getPosition(); },
@@ -49,6 +49,9 @@ Jax.Scene.LightSource = (function() {
49
49
  data.color.diffuse = Jax.Util.colorize(data.color.diffuse);
50
50
  data.color.specular= Jax.Util.colorize(data.color.specular);
51
51
  $super(data);
52
+
53
+ var self = this;
54
+ this.camera.addEventListener('matrixUpdated', function() { self.invalidate(); });
52
55
 
53
56
  this.spotExponent = this.spot_exponent;
54
57
  delete this.spot_exponent;
@@ -125,13 +128,48 @@ Jax.Scene.LightSource = (function() {
125
128
  return this.shadowMatrix;
126
129
  },
127
130
 
131
+ registerCaster: function(object) {
132
+ var self = this;
133
+ function updated() { self.invalidate(); }
134
+ object.camera.addEventListener('matrixUpdated', updated);
135
+ this.invalidate();
136
+ },
137
+
138
+ unregisterCaster: function(object) {
139
+ /* FIXME remove the shadowmap event listener from object's camera matrix */
140
+ },
141
+
128
142
  isShadowcaster: function() { return this.shadowcaster; },
129
143
 
130
144
  getDPShadowNear: function() { setupProjection(this); return this.camera.projection.near; },
131
145
 
132
146
  getDPShadowFar: function() { setupProjection(this); return this.camera.projection.far; },
133
147
 
134
- updateShadowMap: function(context, sceneBoundingRadius, objects) {
148
+ invalidate: function() { this.valid = false; },
149
+
150
+ render: function(context, objects, options) {
151
+ if (!this.valid) {
152
+ var real_pass = context.current_pass;
153
+ /* shadowgen pass */
154
+ context.current_pass = Jax.Scene.SHADOWMAP_PASS;
155
+ this.updateShadowMap(context, this.boundingRadius, objects, options);
156
+ this.valid = true;
157
+ context.current_pass = real_pass;
158
+ }
159
+
160
+ for (var j = 0; j < objects.length; j++) {
161
+ options.model_index = j;
162
+
163
+ /* TODO optimization: see if objects[j] is even affected by this light (based on attenuation) */
164
+ if (objects[j].isLit()) // it could be unlit but still in array if it casts a shadow
165
+ objects[j].render(context, options);
166
+ }
167
+ },
168
+
169
+ updateShadowMap: function(context, sceneBoundingRadius, objects, render_options) {
170
+ // we can't afford to taint the original options
171
+ render_options = Jax.Util.normalizeOptions(render_options, {});
172
+
135
173
  setupProjection(this);
136
174
 
137
175
  var self = this;
@@ -163,6 +201,9 @@ Jax.Scene.LightSource = (function() {
163
201
  context.glPolygonOffset(2.0, 2.0);
164
202
 
165
203
  context.pushMatrix(function() {
204
+ render_options.direction = 1;
205
+ render_options.material = paraboloid_depthmap;
206
+
166
207
  self.framebuffers[0].bind(context, function() {
167
208
  // front paraboloid
168
209
  self.framebuffers[0].viewport(context);
@@ -171,17 +212,19 @@ Jax.Scene.LightSource = (function() {
171
212
  mat4.set(context.getInverseViewMatrix(), sm);
172
213
 
173
214
  for (var i = 0; i < objects.length; i++) {
174
- objects[i].render(context, {material:paraboloid_depthmap, direction:1});
215
+ objects[i].render(context, render_options);
175
216
  }
176
217
  });
177
218
 
219
+ render_options.direction = -1;
220
+
178
221
  self.framebuffers[1].bind(context, function() {
179
222
  // back paraboloid
180
223
  self.framebuffers[1].viewport(context);
181
224
  context.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
182
225
  context.loadViewMatrix(self.camera.getTransformationMatrix());
183
226
  for (var i = 0; i < objects.length; i++) {
184
- objects[i].render(context, {material:paraboloid_depthmap,direction:-1});
227
+ objects[i].render(context, render_options);
185
228
  }
186
229
  });
187
230
 
@@ -197,6 +240,8 @@ Jax.Scene.LightSource = (function() {
197
240
  return;
198
241
  }
199
242
 
243
+ render_options.material = "depthmap";
244
+
200
245
  this.framebuffers[0].bind(context, function() {
201
246
  self.framebuffers[0].viewport(context);
202
247
  context.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -214,7 +259,7 @@ Jax.Scene.LightSource = (function() {
214
259
  context.glEnable(GL_POLYGON_OFFSET_FILL);
215
260
  context.glPolygonOffset(2.0, 2.0);
216
261
  for (var i = 0; i < objects.length; i++) {
217
- objects[i].render(context, {material:'depthmap'});
262
+ objects[i].render(context, render_options);
218
263
  }
219
264
  context.glDisable(GL_POLYGON_OFFSET_FILL);
220
265
  context.glEnable(GL_BLEND);