|
|
@ -155,6 +155,8 @@ void main() {
|
|
155
|
155
|
gl.uniform2f(iResolution, canvas.width, canvas.height);
|
|
156
|
156
|
gl.uniform1f(iGlobalTime, 0.0);
|
|
157
|
157
|
gl.uniform3f(iMouse, 0.0, 0.0, 0.0);
|
|
|
158
|
|
|
|
159
|
tt.origin = gl.getUniformLocation(program, 'origin');
|
|
158
|
160
|
|
|
159
|
161
|
// two triangles
|
|
160
|
162
|
var positions = new Float32Array([
|
|
|
@ -206,12 +208,60 @@ void main() {
|
|
206
|
208
|
}
|
|
207
|
209
|
});
|
|
208
|
210
|
|
|
|
211
|
tt.direction = [0, 0, 1];
|
|
|
212
|
tt.angle = {horizontal: 0.0, vertical: 0.0};
|
|
|
213
|
|
|
|
214
|
var iDirection = gl.getUniformLocation(program, 'iDirection');
|
|
|
215
|
gl.uniform3f(iDirection, tt.direction[0], tt.direction[1], tt.direction[2]);
|
|
|
216
|
|
|
|
217
|
var mousePressed = false;
|
|
|
218
|
tt.canvas.addEventListener("mousedown", function(ev) { if (ev.button == 0) { mousePressed = true; }});
|
|
|
219
|
tt.canvas.addEventListener("mouseup", function(ev) { mousePressed = false; });
|
|
|
220
|
|
|
209
|
221
|
tt.canvas.addEventListener("mousemove", function(ev) {
|
|
210
|
222
|
gl.uniform3f(iMouse, ev.clientX, canvas.clientHeight - ev.clientY, 0.0);
|
|
|
223
|
|
|
|
224
|
if (!mousePressed || !iDirection) {
|
|
|
225
|
return;
|
|
|
226
|
}
|
|
|
227
|
|
|
|
228
|
tt.angle.horizontal += 0.0001 * (tt.w/2 - ev.clientX);
|
|
|
229
|
tt.angle.vertical += 0.0001 * (tt.h/2 - ev.clientY);
|
|
|
230
|
tt.direction = [Math.cos(tt.angle.vertical) * Math.sin(tt.angle.horizontal),
|
|
|
231
|
Math.sin(tt.angle.vertical),
|
|
|
232
|
Math.cos(tt.angle.vertical) * Math.cos(tt.angle.horizontal)];
|
|
|
233
|
|
|
|
234
|
gl.uniform3f(iDirection, tt.direction[0], tt.direction[1], tt.direction[2]);
|
|
|
235
|
|
|
211
|
236
|
requestAnimationFrame(tt.render);
|
|
212
|
237
|
});
|
|
213
|
238
|
|
|
|
239
|
window.addEventListener('keydown', function(ev) {
|
|
|
240
|
if (document.activeElement != document.body) {
|
|
|
241
|
return;
|
|
|
242
|
}
|
|
|
243
|
|
|
|
244
|
var origin = tt.gl.getUniform(tt.program, tt.origin);
|
|
|
245
|
|
|
|
246
|
switch (ev.keyCode) {
|
|
|
247
|
case 87: // W
|
|
|
248
|
origin = [origin[0]+tt.direction[0], origin[1]+tt.direction[1], origin[2]+tt.direction[2]];
|
|
|
249
|
break;
|
|
|
250
|
case 65: // A
|
|
|
251
|
break;
|
|
|
252
|
case 83: // S
|
|
|
253
|
origin = [origin[0]-tt.direction[0], origin[1]-tt.direction[1], origin[2]-tt.direction[2]];
|
|
|
254
|
break;
|
|
|
255
|
case 68: // D
|
|
|
256
|
break;
|
|
|
257
|
default:
|
|
|
258
|
return
|
|
|
259
|
}
|
|
214
|
260
|
|
|
|
261
|
gl.uniform3f(tt.origin, origin[0], origin[1], origin[2]);
|
|
|
262
|
requestAnimationFrame(tt.render);
|
|
|
263
|
});
|
|
|
264
|
|
|
215
|
265
|
window.onresize = function(ev) {
|
|
216
|
266
|
tt.w = tt.canvas.width = window.innerWidth;
|
|
217
|
267
|
tt.h = tt.canvas.height = window.innerHeight;
|