Skip to content

Commit

Permalink
pulling the context apart for VR
Browse files Browse the repository at this point in the history
  • Loading branch information
nebogeo committed Nov 5, 2021
1 parent 8c90f92 commit cb816c5
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 30 deletions.
44 changes: 30 additions & 14 deletions scm/fluxus.jscm
Original file line number Diff line number Diff line change
Expand Up @@ -520,22 +520,38 @@
near
far))))

(define external-gl-context #f)

(define (fluxus-init-with-gl gl)
(set! external-gl-context #t)
(set! the-renderer (renderer gl))
;; set up camera transform
(mat4.translate (renderer-camera the-renderer) (list 0 0 0))
(set! the-renderer (renderer-build-prefab the-renderer))
(gl.clearColor 0.0 0.0 0.0 1.0)
(gl.enable gl.DEPTH_TEST)
(gl.disable gl.CULL_FACE)
;; make sure the default texture is loaded
(texture (load-texture "white.png")))

(define (clear)
(let ((canvas (document.getElementById "webgl-canvas")))
(let ((gl (canvas.getContext "experimental-webgl")))
(set! gl.viewportWidth canvas.width)
(set! gl.viewportHeight canvas.height)
(set! the-renderer (renderer gl))
;; set up camera transform
(mat4.translate (renderer-camera the-renderer) (list 0 0 0))
(set! the-renderer (renderer-build-prefab the-renderer))
(gl.clearColor 0.0 0.0 0.0 1.0)
(gl.enable gl.DEPTH_TEST)
(gl.disable gl.CULL_FACE)
;; make sure the default texture is loaded
(texture (load-texture "white.png"))
)))
(let ((gl (if external-gl-context
(renderer-gl the-renderer)
(let ((canvas (document.getElementById "webgl-canvas")))
(canvas.getContext "experimental-webgl")))))
(when (not external-gl-context)
(let ((canvas (document.getElementById "webgl-canvas")))
(set! gl.viewportWidth canvas.width)
(set! gl.viewportHeight canvas.height)))
(set! the-renderer (renderer gl))
;; set up camera transform
(mat4.translate (renderer-camera the-renderer) (list 0 0 0))
(set! the-renderer (renderer-build-prefab the-renderer))
(gl.clearColor 0.0 0.0 0.0 1.0)
(gl.enable gl.DEPTH_TEST)
(gl.disable gl.CULL_FACE)
;; make sure the default texture is loaded
(texture (load-texture "white.png"))))

(define (resize-glcanvas canvas)
;; ;; Lookup the size the browser is displaying the canvas.
Expand Down
86 changes: 70 additions & 16 deletions scm/renderer.jscm
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
(define (renderer-list r) (list-ref r 1))
(define (renderer-modify-list r v) (list-replace r 1 v))
(define (renderer-view r) (list-ref r 2))
(define (renderer-modify-view r v) (list-replace r 2 v))
(define (renderer-camera r) (list-ref r 3))
(define (renderer-modify-camera r v) (list-replace r 3 v))
(define (renderer-world-to-screen r) (list-ref r 4))
Expand Down Expand Up @@ -135,37 +136,90 @@
#f
(car (renderer-grab-stack r))))

(define (renderer-frustum-apply gl r)
;; create the projection matrix and apply it to view
(define (renderer-calc-frustum gl r)
(let ((aspect (/ gl.viewportWidth gl.viewportHeight))
(frustum (renderer-frustum r)))
(frustum (renderer-frustum r)))
(if (frustum-ortho? frustum)
(mat4.ortho (* (frustum-top frustum) aspect -1)
(* (frustum-top frustum) aspect)
(- (frustum-top frustum)) (frustum-top frustum)
(frustum-near frustum)
(frustum-far frustum)
(renderer-view r))
(mat4.perspective
(renderer-view-angle r)
aspect
(frustum-near frustum)
(frustum-far frustum)
(renderer-view r)))))
(mat4.ortho (* (frustum-top frustum) aspect -1)
(* (frustum-top frustum) aspect)
(- (frustum-top frustum)) (frustum-top frustum)
(frustum-near frustum)
(frustum-far frustum)
(renderer-view r))
(mat4.perspective
(renderer-view-angle r)
aspect
(frustum-near frustum)
(frustum-far frustum)
(renderer-view r)))))

(define (renderer-render r)
(let ((gl (renderer-gl r)))
(renderer-render-outer
r 0 0 gl.viewportWidth gl.viewportHeight
(renderer-calc-frustum gl r)
(renderer-camera r))))

(define (renderer-render-outer r vpx vpy vpw vph projection camera)
(let ((gl (renderer-gl r)))
(gl.viewport vpx vpy vpw vph)
(renderer-modify-view r projection)
(renderer-modify-camera r camera)
(renderer-render-inner r)))

(define (renderer-render-inner r)
(let ((gl (renderer-gl r))
(hook (renderer-hook r))
(view-camera (mat4.create))
(camera-pos (vector 0 0 0)))

(msg "renderin")

(gl.clearColor (vx (renderer-clear-colour r))
(vy (renderer-clear-colour r))
(vz (renderer-clear-colour r))
(list-ref (renderer-clear-colour r) 3))
(gl.clear (js "gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT"))

(gl.enable gl.BLEND)
(gl.blendFunc gl.SRC_ALPHA gl.ONE_MINUS_SRC_ALPHA)

;; for scene inspection purposes...
(mat4.multiply (renderer-view r) (renderer-camera r) (renderer-world-to-screen r))
(mat4.multiply (renderer-view r) (renderer-camera r) view-camera)
(mat4.multiplyVec3 view-camera (vector 0 0 0) camera-pos)

(mat4.identity (renderer-top-tx r))

(when hook (js "try{") (hook) (js "} catch(e) { ") (display e) (js "}"))

;; immediate mode
(let ((ident (mat4.identity (mat4.create))))
(for-each
(lambda (p)
(let ((state (car p))
(prim (cadr p)))
(primitive-render prim gl view-camera camera-pos state ident)))
(renderer-immediate-prims r))

;; retained mode
(scenegraph-render (renderer-scenegraph r) gl view-camera camera-pos ident))
(renderer-immediate-clear r)))


(define (renderer-render-old r)
(let ((gl (renderer-gl r))
(hook (renderer-hook r))
(view-camera (mat4.create))
(camera-pos (vector 0 0 0)))

(gl.viewport 0 0 gl.viewportWidth gl.viewportHeight)
(gl.clearColor (vx (renderer-clear-colour r))
(vy (renderer-clear-colour r))
(vz (renderer-clear-colour r))
(list-ref (renderer-clear-colour r) 3))
(gl.clear (js "gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT"))

(renderer-frustum-apply gl r)

(gl.enable gl.BLEND)
(gl.blendFunc gl.SRC_ALPHA gl.ONE_MINUS_SRC_ALPHA)
Expand Down

0 comments on commit cb816c5

Please sign in to comment.