diff options
author | David Thompson <dthompson2@worcester.edu> | 2015-09-09 09:02:40 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2015-09-09 09:02:40 -0400 |
commit | 5b8f43d7a5cad91e81e85b81f3fc41a80f84c647 (patch) | |
tree | 3ba066b99d19bbb650238a5e862e2bfa6f81fb69 /sly/render | |
parent | afe98dbcd760a15eb70b8f39cddf34a8dddd761f (diff) |
render: Add separate projection and model-view matrix stacks.
Just like the Opengl 2.x days! ;)
* sly/render.scm (graphics-transform, graphics-transform-mul!,
graphics-transform-identity!): Delete.
(graphics-model-view-transform, graphics-model-view-mul!,
graphics-model-view-identity!, graphics-projection-transform,
graphics-projection-mul!, graphics-projection-identity!): New
procedures.
(with-model-view-excursion, with-projection-excursion): New syntax.
(call-with-transform-excursion): Move matrix copying out of the "in
guard."
(draw-scene): Use new matrix stacks.
Diffstat (limited to 'sly/render')
-rw-r--r-- | sly/render/model.scm | 18 | ||||
-rw-r--r-- | sly/render/scene.scm | 22 |
2 files changed, 18 insertions, 22 deletions
diff --git a/sly/render/model.scm b/sly/render/model.scm index 77c550e..d18ace5 100644 --- a/sly/render/model.scm +++ b/sly/render/model.scm @@ -139,8 +139,8 @@ changing the fields specified in KWARGS." (define draw-sub-scene (delay (module-ref (resolve-interface '(sly render scene)) 'draw-scene))) -(define (draw-model model view gfx) - "Render MODEL by applying its transform (multiplied by VIEW), texture, +(define (draw-model model gfx) + "Render MODEL by applying its transformation, texture, shader, vertex array, uniforms, blend mode, etc. using GFX." (match model ((? model-null? _) @@ -152,26 +152,24 @@ shader, vertex array, uniforms, blend mode, etc. using GFX." (with-graphics-excursion gfx ((force draw-sub-scene) sub-scene gfx))) - (with-transform-excursion gfx - (graphics-transform-mul! gfx local-transform) - (with-transform-excursion gfx - (graphics-transform-mul! gfx view) + (with-model-view-excursion gfx + (graphics-model-view-mul! gfx local-transform) + (with-model-view-excursion gfx + (graphics-model-view-mul! gfx (graphics-projection-transform gfx)) (set-graphics-depth-test! gfx depth-test?) (set-graphics-blend-mode! gfx blend-mode) (set-graphics-shader! gfx shader) (set-graphics-mesh! gfx mesh) (set-graphics-texture! gfx texture) ;; TODO: Support user-defined uniforms. - (uniform-set! shader "mvp" (graphics-transform gfx)) + (uniform-set! shader "mvp" (graphics-model-view-transform gfx)) (uniform-set! shader "color" color) (uniform-set! shader "use_texture" (not (texture-null? texture))) (glDrawElements (begin-mode triangles) (mesh-length mesh) (data-type unsigned-int) %null-pointer)) - (for-each (lambda (child) - (draw-model child view gfx)) - children))))) + (for-each (lambda (child) (draw-model child gfx)) children))))) ;;; ;;; Utility Procedures diff --git a/sly/render/scene.scm b/sly/render/scene.scm index 48e8af7..b46baae 100644 --- a/sly/render/scene.scm +++ b/sly/render/scene.scm @@ -58,18 +58,16 @@ scene is drawn to directly to the OpenGL window." "Render SCENE with the given rendering GFX." (match scene (($ <scene> camera model framebuffer) - (with-transform-excursion gfx - (graphics-transform-identity! gfx) - (let ((view (graphics-transform gfx))) - (transform*! view - (camera-location camera) - (camera-projection camera)) - (with-transform-excursion gfx - (graphics-transform-identity! gfx) - (set-graphics-framebuffer! gfx framebuffer) - (set-graphics-viewport! gfx (camera-viewport camera)) - (clear-viewport (camera-viewport camera)) - (draw-model model view gfx))))))) + (with-projection-excursion gfx + (graphics-projection-identity! gfx) + (graphics-projection-mul! gfx (camera-projection camera)) + (with-model-view-excursion gfx + (graphics-model-view-identity! gfx) + (graphics-model-view-mul! gfx (camera-location camera)) + (set-graphics-framebuffer! gfx framebuffer) + (set-graphics-viewport! gfx (camera-viewport camera)) + (clear-viewport (camera-viewport camera)) + (draw-model model gfx)))))) (define* (scene->sprite scene #:key (anchor 'center)) "Create a sprite that renders the framebuffer texture for SCENE." |