-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscene.lisp
110 lines (96 loc) · 4.44 KB
/
scene.lisp
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
(in-package #:org.shirakumo.fraf.vtryout)
(define-event change-scene () file scene camera actors)
(defclass room (prefab basic-node)
((prefab-asset :initarg :asset :accessor prefab-asset)
(scene-name :initarg :scene-name :initform T :accessor scene-name)))
(defmethod stage :after ((room room) (area staging-area))
(org.shirakumo.fraf.trial.notify:watch room)
(register-load-observer area room (prefab-asset room))
(stage (prefab-asset room) area))
(defun actor-p (child)
(typep child 'basic-animation-controller))
(define-prefab-instantiation room ()
(enter T :children-only T :scene (scene-name room))
(change-class #'actor-p actor))
(defclass scene (pipelined-scene)
((camera :initform (make-instance 'editor-camera :name :editor :move-speed 0.1))
(transparent-p :initform T :initarg :transparent :accessor transparent-p)))
(defmethod setup-scene ((main trial:main) (scene scene))
(enter (make-instance 'display-controller) scene)
(enter (camera scene) scene)
(setup-pipeline scene))
(defmethod setup-pipeline ((scene scene))
(construct-pipeline scene
(z-prepass
(ssao-pbr-render-pass
:name 'render
:ssao-radius 0.3
:ssao-bias 0.1
:allow-other-keys T)
(bloom-cutoff-pass :name 'bloom-cutoff-pass
:threshold 1.0)
(bloom-merge-pass :name 'bloom-merge-pass
:intensity 2.0)
(hable :name 'tone-map)
fxaa-pass
(ui :name 'trial-alloy:ui)
(post-effects-pass :name 'post))
((z-prepass NIL depth) (render depth-map))
((z-prepass NIL depth) (post depth-map))
(render bloom-merge-pass)
(render bloom-cutoff-pass (bloom-merge-pass bloom-cutoff color) tone-map)
(tone-map fxaa-pass post)
(trial-alloy:ui (post ui-map))))
(defmethod object-renderable-p ((_ fps-counter) (pass standard-render-pass)) NIL)
(defmethod object-renderable-p ((_ system-stats) (pass standard-render-pass)) NIL)
(defmethod object-renderable-p ((_ debug-draw) (pass standard-render-pass)) NIL)
(defmethod object-renderable-p ((_ debug-text) (pass standard-render-pass)) NIL)
(defmethod render :after ((scene scene) (target null))
(let ((passes (passes scene)))
(bind (framebuffer (aref passes (1- (length passes)))) :framebuffer))
(flet ((maybe-render (name)
(let ((node (node name scene)))
(when (typep node 'renderable) (render node target)))))
(maybe-render 'debug-draw)
(maybe-render 'system-stats)
(maybe-render 'fps-counter)
(maybe-render :controller)))
(defmethod in-view-p ((skybox skybox) camera)
(not (transparent-p (trial:scene skybox))))
(define-handler (scene change-scene) (file (name scene) camera actors)
(setf (camera scene) (node :editor scene))
(leave* 'room scene)
(enter (make-instance 'room :name 'room
:asset (make-instance 'model-file :input file :pool (find-pool 'vtryout))
:scene-name name)
scene)
(ensure-entity 'ambient-light scene 'ambient-light :color (vec3 0.01))
(loop for pass across (passes scene)
do (dolist (thing (to-preload scene))
(when (typep thing '(or class entity))
(enter thing pass))))
(commit scene (loader +main+))
(when camera
(activate-camera camera scene))
(loop for (name args) on actors by #'cddr
for actor = (actor name)
do (if actor
(apply #'reinitialize-instance actor args)
(cerror "Ignore the setting" "No actor named ~s found!" name)))
(ignore-errors (reset-render-loop)))
(define-shader-pass post-effects-pass (post-effect-pass)
((ui-map :port-type input :accessor ui-map)
(depth-map :port-type input :accessor depth-map)
(previous-pass :port-type input :accessor previous-pass)
(color :port-type output :accessor color)
(midpoint :uniform T :initform (vec3 0.5) :accessor midpoint)
(color-filter :uniform T :initform (vec3 1) :accessor color-filter)
(exposure :uniform T :initform (vec3 1) :accessor exposure)
(contrast :uniform T :initform (vec3 1) :accessor contrast)
(brightness :uniform T :initform (vec3 0) :accessor brightness)
(saturation :uniform T :initform (vec3 1) :accessor saturation)
(temperature :uniform T :initform 0.0 :accessor temperature)
(tint :uniform T :initform 0.0 :accessor tint)
(hue :uniform T :initform 0.0 :accessor hue))
(:shader-file (vtryout "shaders/post.glsl"))
(:buffers (trial standard-environment-information)))