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
data/src/jax/compatibility.js
CHANGED
@@ -1,4 +1,28 @@
|
|
1
1
|
/* Defines constants, functions, etc. that may exist in one browser but not in another */
|
2
|
+
/**
|
3
|
+
* Jax.Compatibility
|
4
|
+
* Contains values used for cross-browser compatibility.
|
5
|
+
**/
|
6
|
+
Jax.Compatibility = (function() {
|
7
|
+
var offsetTop = 1;
|
8
|
+
var offsetLeft = 1;
|
9
|
+
|
10
|
+
return {
|
11
|
+
/**
|
12
|
+
* Jax.Compatibility.offsetTop -> Number
|
13
|
+
* Some browsers have different values for +offsetTop+. Jax must track these
|
14
|
+
* changes in order to ensure that the reported mouse coordinates are accurate.
|
15
|
+
**/
|
16
|
+
offsetTop: offsetTop,
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Jax.Compatibility.offsetLeft -> Number
|
20
|
+
* Some browsers have different values for +offsetLeft+. Jax must track these
|
21
|
+
* changes in order to ensure that the reported mouse coordinates are accurate.
|
22
|
+
**/
|
23
|
+
offsetLeft: offsetLeft,
|
24
|
+
};
|
25
|
+
})();
|
2
26
|
|
3
27
|
/*
|
4
28
|
Object.keys defined only in the newest browsers. If they're going to fail, let them fail due to HTML5 incompatibility
|
@@ -13,10 +37,149 @@ if (!Object.keys) {
|
|
13
37
|
};
|
14
38
|
}
|
15
39
|
|
40
|
+
/**
|
41
|
+
* Array#clear() -> Array
|
42
|
+
* Removes all objects from this array and returns itself, now empty.
|
43
|
+
**/
|
44
|
+
Array.prototype.clear = Array.prototype.clear || function() {
|
45
|
+
this.splice(0, this.length);
|
46
|
+
return this;
|
47
|
+
};
|
48
|
+
|
16
49
|
|
17
50
|
/* KeyEvent in Firefox contains various keyCode constants, but they are missing in Chrome. */
|
18
51
|
if (typeof(KeyEvent) == "undefined") {
|
19
|
-
|
52
|
+
/**
|
53
|
+
* Global.KeyEvent
|
54
|
+
*
|
55
|
+
* By default, Firefox defines a global +KeyEvent+ namespace containing character codes
|
56
|
+
* for use with keyboard events. These are very useful for comparison with +event.keyCode+,
|
57
|
+
* but are not supported by other browsers.
|
58
|
+
*
|
59
|
+
* In the event that a browser other than Firefox is used, Jax defines a fake +KeyEvent+
|
60
|
+
* namespace to be used in its place. The constants contained within are taken from
|
61
|
+
* Firefox 3.6, with the addition of the boolean +fake+, which is always true unless
|
62
|
+
* the client is using Firefox.
|
63
|
+
*
|
64
|
+
* The individual values of the following constants may be different from one client to another:
|
65
|
+
*
|
66
|
+
* KeyEvent.DOM_VK_CANCEL
|
67
|
+
* KeyEvent.DOM_VK_HELP
|
68
|
+
* KeyEvent.DOM_VK_BACK_SPACE
|
69
|
+
* KeyEvent.DOM_VK_TAB
|
70
|
+
* KeyEvent.DOM_VK_CLEAR
|
71
|
+
* KeyEvent.DOM_VK_RETURN
|
72
|
+
* KeyEvent.DOM_VK_ENTER
|
73
|
+
* KeyEvent.DOM_VK_SHIFT
|
74
|
+
* KeyEvent.DOM_VK_CONTROL
|
75
|
+
* KeyEvent.DOM_VK_ALT
|
76
|
+
* KeyEvent.DOM_VK_PAUSE
|
77
|
+
* KeyEvent.DOM_VK_CAPS_LOCK
|
78
|
+
* KeyEvent.DOM_VK_ESCAPE
|
79
|
+
* KeyEvent.DOM_VK_SPACE
|
80
|
+
* KeyEvent.DOM_VK_PAGE_UP
|
81
|
+
* KeyEvent.DOM_VK_PAGE_DOWN
|
82
|
+
* KeyEvent.DOM_VK_END
|
83
|
+
* KeyEvent.DOM_VK_HOME
|
84
|
+
* KeyEvent.DOM_VK_LEFT
|
85
|
+
* KeyEvent.DOM_VK_UP
|
86
|
+
* KeyEvent.DOM_VK_RIGHT
|
87
|
+
* KeyEvent.DOM_VK_DOWN
|
88
|
+
* KeyEvent.DOM_VK_PRINTSCREEN
|
89
|
+
* KeyEvent.DOM_VK_INSERT
|
90
|
+
* KeyEvent.DOM_VK_DELETE
|
91
|
+
* KeyEvent.DOM_VK_0
|
92
|
+
* KeyEvent.DOM_VK_1
|
93
|
+
* KeyEvent.DOM_VK_2
|
94
|
+
* KeyEvent.DOM_VK_3
|
95
|
+
* KeyEvent.DOM_VK_4
|
96
|
+
* KeyEvent.DOM_VK_5
|
97
|
+
* KeyEvent.DOM_VK_6
|
98
|
+
* KeyEvent.DOM_VK_7
|
99
|
+
* KeyEvent.DOM_VK_8
|
100
|
+
* KeyEvent.DOM_VK_9
|
101
|
+
* KeyEvent.DOM_VK_SEMICOLON
|
102
|
+
* KeyEvent.DOM_VK_EQUALS
|
103
|
+
* KeyEvent.DOM_VK_A
|
104
|
+
* KeyEvent.DOM_VK_B
|
105
|
+
* KeyEvent.DOM_VK_C
|
106
|
+
* KeyEvent.DOM_VK_D
|
107
|
+
* KeyEvent.DOM_VK_E
|
108
|
+
* KeyEvent.DOM_VK_F
|
109
|
+
* KeyEvent.DOM_VK_G
|
110
|
+
* KeyEvent.DOM_VK_H
|
111
|
+
* KeyEvent.DOM_VK_I
|
112
|
+
* KeyEvent.DOM_VK_J
|
113
|
+
* KeyEvent.DOM_VK_K
|
114
|
+
* KeyEvent.DOM_VK_L
|
115
|
+
* KeyEvent.DOM_VK_M
|
116
|
+
* KeyEvent.DOM_VK_N
|
117
|
+
* KeyEvent.DOM_VK_O
|
118
|
+
* KeyEvent.DOM_VK_P
|
119
|
+
* KeyEvent.DOM_VK_Q
|
120
|
+
* KeyEvent.DOM_VK_R
|
121
|
+
* KeyEvent.DOM_VK_S
|
122
|
+
* KeyEvent.DOM_VK_T
|
123
|
+
* KeyEvent.DOM_VK_U
|
124
|
+
* KeyEvent.DOM_VK_V
|
125
|
+
* KeyEvent.DOM_VK_W
|
126
|
+
* KeyEvent.DOM_VK_X
|
127
|
+
* KeyEvent.DOM_VK_Y
|
128
|
+
* KeyEvent.DOM_VK_Z
|
129
|
+
* KeyEvent.DOM_VK_CONTEXT_MENU
|
130
|
+
* KeyEvent.DOM_VK_NUMPAD0
|
131
|
+
* KeyEvent.DOM_VK_NUMPAD1
|
132
|
+
* KeyEvent.DOM_VK_NUMPAD2
|
133
|
+
* KeyEvent.DOM_VK_NUMPAD3
|
134
|
+
* KeyEvent.DOM_VK_NUMPAD4
|
135
|
+
* KeyEvent.DOM_VK_NUMPAD5
|
136
|
+
* KeyEvent.DOM_VK_NUMPAD6
|
137
|
+
* KeyEvent.DOM_VK_NUMPAD7
|
138
|
+
* KeyEvent.DOM_VK_NUMPAD8
|
139
|
+
* KeyEvent.DOM_VK_NUMPAD9
|
140
|
+
* KeyEvent.DOM_VK_MULTIPLY
|
141
|
+
* KeyEvent.DOM_VK_ADD
|
142
|
+
* KeyEvent.DOM_VK_SEPARATOR
|
143
|
+
* KeyEvent.DOM_VK_SUBTRACT
|
144
|
+
* KeyEvent.DOM_VK_DECIMAL
|
145
|
+
* KeyEvent.DOM_VK_DIVIDE
|
146
|
+
* KeyEvent.DOM_VK_F1
|
147
|
+
* KeyEvent.DOM_VK_F2
|
148
|
+
* KeyEvent.DOM_VK_F3
|
149
|
+
* KeyEvent.DOM_VK_F4
|
150
|
+
* KeyEvent.DOM_VK_F5
|
151
|
+
* KeyEvent.DOM_VK_F6
|
152
|
+
* KeyEvent.DOM_VK_F7
|
153
|
+
* KeyEvent.DOM_VK_F8
|
154
|
+
* KeyEvent.DOM_VK_F9
|
155
|
+
* KeyEvent.DOM_VK_F10
|
156
|
+
* KeyEvent.DOM_VK_F11
|
157
|
+
* KeyEvent.DOM_VK_F12
|
158
|
+
* KeyEvent.DOM_VK_F13
|
159
|
+
* KeyEvent.DOM_VK_F14
|
160
|
+
* KeyEvent.DOM_VK_F15
|
161
|
+
* KeyEvent.DOM_VK_F16
|
162
|
+
* KeyEvent.DOM_VK_F17
|
163
|
+
* KeyEvent.DOM_VK_F18
|
164
|
+
* KeyEvent.DOM_VK_F19
|
165
|
+
* KeyEvent.DOM_VK_F20
|
166
|
+
* KeyEvent.DOM_VK_F21
|
167
|
+
* KeyEvent.DOM_VK_F22
|
168
|
+
* KeyEvent.DOM_VK_F23
|
169
|
+
* KeyEvent.DOM_VK_F24
|
170
|
+
* KeyEvent.DOM_VK_NUM_LOCK
|
171
|
+
* KeyEvent.DOM_VK_SCROLL_LOCK
|
172
|
+
* KeyEvent.DOM_VK_COMMA
|
173
|
+
* KeyEvent.DOM_VK_PERIOD
|
174
|
+
* KeyEvent.DOM_VK_SLASH
|
175
|
+
* KeyEvent.DOM_VK_BACK_QUOTE
|
176
|
+
* KeyEvent.DOM_VK_OPEN_BRACKET
|
177
|
+
* KeyEvent.DOM_VK_BACK_SLASH
|
178
|
+
* KeyEvent.DOM_VK_CLOSE_BRACKET
|
179
|
+
* KeyEvent.DOM_VK_QUOTE
|
180
|
+
* KeyEvent.DOM_VK_META
|
181
|
+
*
|
182
|
+
**/
|
20
183
|
KeyEvent = {
|
21
184
|
fake: true,
|
22
185
|
DOM_VK_CANCEL : 3,
|
@@ -137,4 +300,4 @@ if (typeof(KeyEvent) == "undefined") {
|
|
137
300
|
};
|
138
301
|
|
139
302
|
/* TODO handle special cases -- see http://www.javascripter.net/faq/keycodes.htm */
|
140
|
-
}
|
303
|
+
}
|
data/src/jax/context.js
CHANGED
@@ -32,12 +32,47 @@ Jax.Context = (function() {
|
|
32
32
|
if (!self.gl) throw new Error("WebGL could not be initialized!");
|
33
33
|
}
|
34
34
|
|
35
|
+
function updateFramerate(self) {
|
36
|
+
var current_render_start = Jax.uptime;
|
37
|
+
if (!self.last_render_start) self.last_render_start = Jax.uptime;
|
38
|
+
var time_to_render_this_frame = current_render_start - self.last_render_start;
|
39
|
+
|
40
|
+
self.time_to_render = (self.time_to_render || 0) * self.framerate_sample_ratio
|
41
|
+
+ time_to_render_this_frame * (1 - self.framerate_sample_ratio);
|
42
|
+
|
43
|
+
// frames per second = 1 second divided by time to render; time is currently in ms so 1sec = 1000ms
|
44
|
+
self.framerate = self.frames_per_second = 1.0 / self.time_to_render;
|
45
|
+
self.last_render_start = current_render_start;
|
46
|
+
}
|
47
|
+
|
48
|
+
function updateUpdateRate(self) {
|
49
|
+
var current_update_start = Jax.uptime;
|
50
|
+
if (!self.last_update_start) self.last_update_start = current_update_start;
|
51
|
+
var time_to_update_this_frame = current_update_start - self.last_update_start;
|
52
|
+
|
53
|
+
if (self.calculateUpdateRate) {
|
54
|
+
self.time_to_update = (self.time_to_update || 0) * self.framerate_sample_ratio
|
55
|
+
+ time_to_update_this_frame * (1 - self.framerate_sample_ratio);
|
56
|
+
|
57
|
+
// update rate = seconds / time
|
58
|
+
self.updates_per_second = 1.0 / self.time_to_update;
|
59
|
+
}
|
60
|
+
|
61
|
+
// in order to avoid recalculating the above for updates, we'll return the timechange
|
62
|
+
// to be used in subsequent updates.
|
63
|
+
var timechange = current_update_start - self.last_update_start;
|
64
|
+
self.last_update_start = current_update_start;
|
65
|
+
return timechange;
|
66
|
+
}
|
67
|
+
|
35
68
|
function startRendering(self) {
|
36
69
|
function render() {
|
70
|
+
if (self.calculateFramerate) updateFramerate(self);
|
37
71
|
if (self.current_view) {
|
38
|
-
|
39
|
-
self.glViewport(0, 0, self.canvas.width, self.canvas.height);
|
72
|
+
self.prepare();
|
40
73
|
self.current_view.render();
|
74
|
+
var len = self.afterRenderFuncs.length;
|
75
|
+
for (var i = 0; i < len; i++) self.afterRenderFuncs[i].call(self);
|
41
76
|
self.render_interval = requestAnimFrame(render, self.canvas);
|
42
77
|
}
|
43
78
|
else {
|
@@ -55,12 +90,11 @@ Jax.Context = (function() {
|
|
55
90
|
|
56
91
|
function startUpdating(self) {
|
57
92
|
function updateFunc() {
|
58
|
-
|
59
|
-
var now = new Date();
|
60
|
-
var timechange = (now - self.lastUpdate) / 1000.0;
|
61
|
-
self.lastUpdate = now;
|
93
|
+
var timechange = updateUpdateRate(self);
|
62
94
|
|
63
95
|
self.update(timechange);
|
96
|
+
var len = self.afterUpdateFuncs.length;
|
97
|
+
for (var i = 0; i < len; i++) self.afterUpdateFuncs[i].call(self);
|
64
98
|
self.update_interval = setTimeout(updateFunc, Jax.update_speed);
|
65
99
|
}
|
66
100
|
updateFunc();
|
@@ -86,7 +120,7 @@ Jax.Context = (function() {
|
|
86
120
|
function reloadMatrices(self) {
|
87
121
|
self.matrix_stack.reset(); // reset depth
|
88
122
|
self.matrix_stack.loadModelMatrix(Jax.IDENTITY_MATRIX);
|
89
|
-
self.matrix_stack.loadViewMatrix(self.player.camera.
|
123
|
+
self.matrix_stack.loadViewMatrix(self.player.camera.getTransformationMatrix());
|
90
124
|
self.matrix_stack.loadProjectionMatrix(self.player.camera.getProjectionMatrix());
|
91
125
|
}
|
92
126
|
|
@@ -111,18 +145,100 @@ Jax.Context = (function() {
|
|
111
145
|
this.player.camera.perspective({width:canvas.width, height:canvas.height});
|
112
146
|
this.matrix_stack = new Jax.MatrixStack();
|
113
147
|
this.current_pass = Jax.Scene.AMBIENT_PASS;
|
148
|
+
this.afterRenderFuncs = [];
|
149
|
+
this.afterUpdateFuncs = [];
|
150
|
+
this.framerate = 0;
|
151
|
+
this.frames_per_second = 0;
|
152
|
+
this.updates_per_second = 0;
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Jax.Context#framerate_sample_ratio -> Number
|
156
|
+
*
|
157
|
+
* A number between 0 and 1, to be used in updates to frames per second and updates per second.
|
158
|
+
*
|
159
|
+
* Setting this to a high value will produce "smoother" results; they will change less frequently,
|
160
|
+
* but it will take longer to get initial results. High values are better for testing framerate
|
161
|
+
* over the long term, while lower values are better for testing small disruptions in framerate
|
162
|
+
* (such as garbage collection).
|
163
|
+
*
|
164
|
+
* Defaults to 0.9.
|
165
|
+
**/
|
166
|
+
this.framerate_sample_ratio = 0.9;
|
114
167
|
|
115
168
|
startUpdating(this);
|
116
169
|
if (Jax.routes.isRouted("/"))
|
117
170
|
this.redirectTo("/");
|
118
171
|
},
|
119
172
|
|
173
|
+
/**
|
174
|
+
* Jax.Context#getFramesPerSecond() -> Number
|
175
|
+
* The average number of frames rendered in one second.
|
176
|
+
*
|
177
|
+
* Implicitly enables calculation of frames-per-second, which is initially disabled by default
|
178
|
+
* to improve performance.
|
179
|
+
**/
|
180
|
+
getFramesPerSecond: function() { this.calculateFramerate = true; return this.frames_per_second; },
|
181
|
+
|
182
|
+
/**
|
183
|
+
* Jax.Context#getUpdatesPerSecond() -> Number
|
184
|
+
* The average number of updates performed in one second. See also Jax.Context#getFramesPerSecond().
|
185
|
+
*
|
186
|
+
* Implicitly enables calculation of updates-per-second, which is initially disabled by default
|
187
|
+
* to improve performance.
|
188
|
+
**/
|
189
|
+
getUpdatesPerSecond: function() { this.calculateUpdateRate = true; return this.updates_per_second; },
|
190
|
+
|
191
|
+
/**
|
192
|
+
* Jax.Context#disableFrameSpeedCalculations() -> Jax.Context
|
193
|
+
* Disables calculation of frames-per-second. Note that this calculation is disabled by default
|
194
|
+
* to improve performance, so you should only need to call this if you've previously called
|
195
|
+
* Jax.Context#getUpdatesPerSecond().
|
196
|
+
**/
|
197
|
+
disableFrameSpeedCalculations: function() { this.calculateFramerate = false; },
|
198
|
+
|
199
|
+
/**
|
200
|
+
* Jax.Context#disableUpdateSpeedCalculations() -> Jax.Context
|
201
|
+
* Disables calculation of updates-per-second. Note that this calculation is disabled by default
|
202
|
+
* to improve performance, so you should only need to call this if you've previously called
|
203
|
+
* Jax.Context#getUpdatesPerSecond().
|
204
|
+
**/
|
205
|
+
disableUpdateSpeedCalculations: function() { this.caclulateUpdateRate = false; },
|
206
|
+
|
207
|
+
/**
|
208
|
+
* Jax.Context#afterRender(func) -> Jax.Context
|
209
|
+
*
|
210
|
+
* Registers the specified function to be called immediately after every render pass.
|
211
|
+
* Returns this context.
|
212
|
+
*
|
213
|
+
* When the function is called, its +this+ object is set to the context itself.
|
214
|
+
**/
|
215
|
+
afterRender: function(func) {
|
216
|
+
this.afterRenderFuncs.push(func);
|
217
|
+
},
|
218
|
+
|
219
|
+
/**
|
220
|
+
* Jax.Context#afterUpdate(func) -> Jax.Context
|
221
|
+
*
|
222
|
+
* Registers the specified function to be called immediately after every update pass.
|
223
|
+
* Returns this context.
|
224
|
+
*
|
225
|
+
* When the function is called, its +this+ object is set to the context itself.
|
226
|
+
**/
|
227
|
+
afterUpdate: function(func) {
|
228
|
+
this.afterUpdateFuncs.push(func);
|
229
|
+
},
|
230
|
+
|
231
|
+
/**
|
232
|
+
* Jax.Context#hasStencil() -> Boolean
|
233
|
+
*
|
234
|
+
* Returns true if this context supports stencil operations.
|
235
|
+
**/
|
120
236
|
hasStencil: function() {
|
121
237
|
return !!this.gl.stencil;
|
122
238
|
},
|
123
239
|
|
124
240
|
/**
|
125
|
-
* Jax.Context#redirectTo(path) -> Controller
|
241
|
+
* Jax.Context#redirectTo(path) -> Jax.Controller
|
126
242
|
* - path (String): the path to redirect to
|
127
243
|
*
|
128
244
|
* Redirects to the specified route, and then returns the Jax.Controller that
|
@@ -147,10 +263,36 @@ Jax.Context = (function() {
|
|
147
263
|
return this.current_controller;
|
148
264
|
},
|
149
265
|
|
266
|
+
/**
|
267
|
+
* Jax.Context#prepare() -> Jax.Context
|
268
|
+
*
|
269
|
+
* Loads the matrices from +player.camera+ into the matrix stack, then
|
270
|
+
* sets up the viewport. This should be run prior to rendering anything.
|
271
|
+
* This is done automatically when the context has a View associated
|
272
|
+
* with it, but if there is no View then the render process will be
|
273
|
+
* halted, leaving it up to you to prepare the canvas explicitly.
|
274
|
+
**/
|
275
|
+
prepare: function() {
|
276
|
+
reloadMatrices(this);
|
277
|
+
this.glViewport(0, 0, this.canvas.width, this.canvas.height);
|
278
|
+
},
|
279
|
+
|
280
|
+
/**
|
281
|
+
* Jax.Context#update(timechange) -> Jax.Context
|
282
|
+
* - timechange (Number): the amount of time, in seconds, since the previous update
|
283
|
+
*
|
284
|
+
* Automatically called over time, this function will trigger an update
|
285
|
+
* of all controllers and objects attached to this context.
|
286
|
+
*
|
287
|
+
* You can programmatically trigger updates to these objects by calling
|
288
|
+
* this method directly. Doing this is useful for constructing consistent
|
289
|
+
* test cases.
|
290
|
+
**/
|
150
291
|
update: function(timechange) {
|
151
292
|
if (this.current_controller && this.current_controller.update)
|
152
293
|
this.current_controller.update(timechange);
|
153
294
|
this.world.update(timechange);
|
295
|
+
return this;
|
154
296
|
},
|
155
297
|
|
156
298
|
/**
|
@@ -186,11 +328,30 @@ Jax.Context = (function() {
|
|
186
328
|
isDisposed: function() {
|
187
329
|
return !!this.disposed;
|
188
330
|
},
|
189
|
-
|
331
|
+
|
332
|
+
/**
|
333
|
+
* Jax.Context#pushMatrix(yield_to) -> Jax.Context
|
334
|
+
* - yield_to (Function): a function to be called
|
335
|
+
*
|
336
|
+
* Pushes a new level onto the matrix stack and then calls the given function.
|
337
|
+
* After the function completes, the matrix stack is reverted back to its
|
338
|
+
* original state, effectively undoing any modifications made to the matrices
|
339
|
+
* in the meantime.
|
340
|
+
*
|
341
|
+
* Example:
|
342
|
+
*
|
343
|
+
* context.pushMatrix(function() {
|
344
|
+
* context.loadModelMatrix(Jax.IDENTITY_MATRIX);
|
345
|
+
* context.multViewMatrix(this.camera.getTransformationMatrix());
|
346
|
+
* // do some rendering
|
347
|
+
* });
|
348
|
+
* // matrix is restored to its previous state
|
349
|
+
**/
|
190
350
|
pushMatrix: function(yield_to) {
|
191
351
|
this.matrix_stack.push();
|
192
352
|
yield_to();
|
193
353
|
this.matrix_stack.pop();
|
354
|
+
return this;
|
194
355
|
},
|
195
356
|
|
196
357
|
/**
|
@@ -245,6 +406,12 @@ Jax.Context = (function() {
|
|
245
406
|
/* set up matrix stack delegation */
|
246
407
|
klass.delegate(/^(get|load|mult)(.*)Matrix$/).into("matrix_stack");
|
247
408
|
|
409
|
+
/** alias of: Jax.Context#getFramesPerSecond
|
410
|
+
* Jax.Context#getFramerate() -> Number
|
411
|
+
* The average numebr of frames rendered in one second.
|
412
|
+
**/
|
413
|
+
klass.prototype.getFramerate = klass.prototype.getFramesPerSecond;
|
414
|
+
|
248
415
|
return klass;
|
249
416
|
})();
|
250
417
|
|
data/src/jax/core.js
CHANGED
@@ -5,9 +5,12 @@
|
|
5
5
|
//= require "core/util"
|
6
6
|
//= require "core/matrix_stack"
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
/**
|
9
|
+
* Global#debugAssert(expr[, msg]) -> undefined
|
10
|
+
* a global debugAssert method that will do nothing in production, and fail if expr is false
|
11
|
+
* in any other run mode. If msg is given, an error with that message is raised. Otherwise,
|
12
|
+
* a more generic error is raised.
|
13
|
+
**/
|
11
14
|
window.debugAssert = function(expr, msg) {
|
12
15
|
if (Jax.environment != "production" && !expr)
|
13
16
|
{
|