-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathrender-pipeline.scm
More file actions
184 lines (168 loc) · 8.32 KB
/
Copy pathrender-pipeline.scm
File metadata and controls
184 lines (168 loc) · 8.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
;;;; render-pipeline.scm
;;;; render-pipelines combine glls pipelines with hyperscene pipelines
(module hypergiant-render-pipeline
(export-pipeline
(define-pipeline make-render-pipeline dynamic-pipeline)
(define-alpha-pipeline make-render-pipeline dynamic-alpha-pipeline)
dynamic-pipeline
dynamic-alpha-pipeline
add-node
make-render-pipeline)
(import chicken scheme foreign)
(use (prefix hyperscene scene:) (prefix glls-render glls:) gl-utils
miscmacros srfi-69 lolevel srfi-1 srfi-99)
(import-for-syntax (prefix glls-render glls:) (prefix hyperscene scene:) srfi-99)
(define-record-type render-pipeline
#t #t
(dynamic?) (shader) (scene) (scene-arrays) (make-renderable) (render-fun) (render-arrays-fun))
(define renderable-table (make-hash-table))
(define-external (dynamicRender (c-pointer renderable)) void
((hash-table-ref renderable-table renderable) renderable))
(define-external (dynamicPreRender (c-pointer renderable)) void
#f)
(define-external (dynamicPostRender) void
#f)
(define dynamic-pipeline (scene:add-pipeline #$dynamicPreRender
#$dynamicRender
#$dynamicPostRender
#f))
(define dynamic-alpha-pipeline (scene:add-pipeline #$dynamicPreRender
#$dynamicRender
#$dynamicPostRender
#t))
(define-syntax define-pipeline
(ir-macro-transformer
(lambda (exp i c)
(let* ((name (strip-syntax (cadr exp)))
(pipeline-name (symbol-append name '-render-pipeline))
(fast-draw-funs (symbol-append name '-fast-render-functions))
(draw-fun (symbol-append 'render- name))
(draw-arrays-fun (symbol-append 'render-arrays- name))
(renderable-maker (symbol-append 'make- name '-renderable)))
`(begin
(glls:define-pipeline ,@(cdr exp))
,(if (feature? compiling:)
`(define ,pipeline-name
(let-values (((_ __ ___ ____ begin render end render-arrays)
(,fast-draw-funs)))
(make-render-pipeline
#f ,name
(set-finalizer! (scene:add-pipeline begin render end #f)
scene:delete-pipeline)
(set-finalizer! (scene:add-pipeline begin render-arrays end #f)
scene:delete-pipeline)
,renderable-maker
#f #f)))
`(define ,pipeline-name
(make-render-pipeline
#t ,name
dynamic-pipeline
#f
,renderable-maker
,draw-fun
,draw-arrays-fun))))))))
(define-syntax define-alpha-pipeline
(ir-macro-transformer
(lambda (exp i c)
(let* ((name (strip-syntax (cadr exp)))
(pipeline-name (symbol-append name '-render-pipeline))
(fast-draw-funs (symbol-append name '-fast-render-functions))
(draw-fun (symbol-append 'render- name))
(draw-arrays-fun (symbol-append 'render-arrays- name))
(renderable-maker (symbol-append 'make- name '-renderable)))
`(begin
(glls:define-pipeline ,@(cdr exp))
,(if (feature? compiling:)
`(define ,pipeline-name
(let-values (((_ __ ___ ____ begin render end render-arrays)
(,fast-draw-funs)))
(make-render-pipeline
#f ,name
(set-finalizer! (scene:add-pipeline begin render end #t)
scene:delete-pipeline)
(set-finalizer! (scene:add-pipeline begin render-arrays end #t)
scene:delete-pipeline)
,renderable-maker
#f #f)))
`(define ,pipeline-name
(make-render-pipeline
#t ,name
dynamic-alpha-pipeline
#f
,renderable-maker
,draw-fun
,draw-arrays-fun))))))))
(define-syntax export-pipeline
(ir-macro-transformer
(lambda (expr i c)
(cons 'export
(flatten
(let loop ((pipelines (cdr expr)))
(if (null? pipelines)
'()
(if (not (symbol? (car pipelines)))
(syntax-error 'export-shader "Expected a pipeline name" expr)
(cons (let* ((name (strip-syntax (car pipelines)))
(render (symbol-append 'render- name))
(make-renderable (symbol-append 'make- name
'-renderable))
(fast-funs (symbol-append name
'-fast-render-functions))
(render-pipeline (symbol-append name
'-render-pipeline)))
(list name render make-renderable fast-funs
render-pipeline))
(loop (cdr pipelines)))))))))))
(define (add-node parent pipeline . args)
(let ((node (if (render-pipeline? pipeline)
(apply add-node* parent pipeline args)
(apply scene:add-node parent
(get-keyword data: args)
pipeline
(get-keyword delete: args)))))
(if* (get-keyword position: args)
(scene:set-node-position! node it))
(if* (get-keyword radius: args)
(scene:set-node-bounding-sphere! node it))
node))
(define (add-node* parent pipeline . args)
(define current-vars (list mvp: (scene:current-camera-model-view-projection)
view: (scene:current-camera-view)
projection: (scene:current-camera-projection)
view-projection: (scene:current-camera-view-projection)
camera-position: (scene:current-camera-position)
inverse-transpose-model: (scene:current-inverse-transpose-model)
n-lights: (scene:n-current-lights)
light-positions: (scene:current-light-positions)
light-colors: (scene:current-light-colors)
light-intensities: (scene:current-light-intensities)
light-directions: (scene:current-light-directions)
ambient: (scene:current-ambient-light)))
(let* ((glls-pipeline (render-pipeline-shader pipeline))
(make-renderable (render-pipeline-make-renderable pipeline))
(data (allocate (glls:renderable-size glls-pipeline)))
(mesh (get-keyword mesh: args))
(usage (get-keyword usage: args (lambda () #:static)))
(draw-arrays? (or (get-keyword draw-arrays?: args)
(not (and mesh (mesh-index-type mesh)))))
(dynamic? (render-pipeline-dynamic? pipeline))
(hps-pipeline (if (or dynamic? (not draw-arrays?))
(render-pipeline-scene pipeline)
(render-pipeline-scene-arrays pipeline)))
(node (scene:add-node parent
data
hps-pipeline
(foreign-value "&free" c-pointer))))
(when mesh
(unless (mesh-vao mesh)
(mesh-make-vao! mesh (glls:pipeline-mesh-attributes glls-pipeline) usage)))
(apply make-renderable data: data (append args
(list model: (scene:node-transform node))
current-vars))
(when dynamic?
(hash-table-set! renderable-table data
(if draw-arrays?
(render-pipeline-render-arrays-fun pipeline)
(render-pipeline-render-fun pipeline))))
node))
) ; end module hypergiant-render-pipeline