Просмотр исходного кода

prepare for supporting camera movement via mouse & keyboard

Lucas Stadler лет назад: 10
Родитель
Сommit
161dc64a1a
1 измененных файлов с 50 добавлено и 0 удалено
  1. 50 0
      glsl/raymarching.js

+ 50 - 0
glsl/raymarching.js

@ -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;