summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sly/render/renderer.scm24
-rw-r--r--sly/scene.scm21
2 files changed, 22 insertions, 23 deletions
diff --git a/sly/render/renderer.scm b/sly/render/renderer.scm
index 76cc4aa..d71b89a 100644
--- a/sly/render/renderer.scm
+++ b/sly/render/renderer.scm
@@ -33,14 +33,13 @@
#:use-module (sly transform)
#:use-module (sly math vector)
#:use-module (sly render utils)
- #:use-module (sly render camera)
#:use-module (sly render vertex-array)
#:export (make-render-op render-op?
render-op-transform render-op-vertex-array
render-op-texture render-op-shader
render-op-blend-mode render-op-uniforms
make-renderer renderer?
- renderer-cameras renderer-ops
+ renderer-ops
render))
;; Representation of a single OpenGL render call.
@@ -74,10 +73,9 @@ activated or not."
(with-texture texture body ...)
(begin body ...)))
-(define (apply-render-op view op)
- "Render the contents of OP. The transform of OP is multiplied by
-the VIEW transform before rendering and passed to the shader as the
-uniform variable 'mvp'."
+(define (apply-render-op op)
+ "Render OP by applying its texture, shader, vertex array, uniforms,
+blend mode, etc.."
(match op
(($ <render-op> transform vertex-array texture shader uniforms
blend-mode depth-test?)
@@ -93,7 +91,7 @@ uniform variable 'mvp'."
(match uniform
((name value)
(uniform-set! shader name value))))
- `(("mvp" ,(transform* view transform))
+ `(("mvp" ,transform)
,@uniforms))
(with-vertex-array vertex-array
(with-texture-maybe texture
@@ -105,18 +103,12 @@ uniform variable 'mvp'."
(gl-disable (enable-cap depth-test))))))
(define-record-type <renderer>
- (make-renderer cameras ops)
+ (make-renderer ops)
renderer?
- (cameras renderer-cameras)
(ops renderer-ops))
(define (render renderer)
"Apply all of the render operations in RENDERER. The render
operations are applied once for each camera."
- (define (render-with-camera camera)
- (apply-viewport (camera-viewport camera))
- (let ((view (transform* (camera-projection camera)
- (camera-location camera))))
- (for-each (cut apply-render-op view <>)
- (renderer-ops renderer))))
- (for-each render-with-camera (renderer-cameras renderer)))
+ (for-each (cut apply-render-op <>)
+ (renderer-ops renderer)))
diff --git a/sly/scene.scm b/sly/scene.scm
index 8b58d10..e068e60 100644
--- a/sly/scene.scm
+++ b/sly/scene.scm
@@ -31,12 +31,13 @@
#:use-module (sly transform)
#:use-module (sly math vector)
#:use-module (sly render utils)
+ #:use-module (sly render camera)
#:use-module (sly render renderer)
#:export (scene-node make-scene-node
scene-node?
scene-node-object scene-node-transform
scene-node-visible? scene-node-children
- scene->render-list))
+ draw-scene))
(define-record-type <scene-node>
(%make-scene-node object transform visible? children)
@@ -66,11 +67,10 @@ whether to draw the node and all of its children or not."
(cons elem memo)))
'() lst))
-(define (scene->render-list node)
- "Traverse the scene graph defined by NODE and its children and
-return a list of the render operations needed to display the scene.
-Additionally, NODE or any of its children may be a signal to allow for
-dynamic changes to the scene."
+(define (scene->renderer node camera)
+ "Traverse the scene graph defined by NODE and its children, as seen
+by CAMERA, and return a list of the render operations needed to
+display the scene."
(define (iter node parent-transform)
(signal-let ((node node))
(if (scene-node-visible? node)
@@ -83,4 +83,11 @@ dynamic changes to the scene."
(map (cut iter <> transform)
(scene-node-children node))))
'())))
- (flatten (iter node identity-transform)))
+ (let ((view (transform* (camera-projection camera)
+ (camera-location camera))))
+ (make-renderer (flatten (iter node view)))))
+
+(define (draw-scene node camera)
+ "Draw the scene defined by NODE, as seen by CAMERA."
+ (apply-viewport (camera-viewport camera))
+ (render (scene->renderer node camera)))