parent
bafd505145
commit
372044fc20
|
@ -187,30 +187,38 @@
|
||||||
|
|
||||||
(defmethod resume ((this actor))
|
(defmethod resume ((this actor))
|
||||||
"Initialize or restore this actor's state."
|
"Initialize or restore this actor's state."
|
||||||
; Restore self
|
;; Restore self
|
||||||
(pointerize-setf [this :slot scene])
|
(when (typep [this :slot scene] 'id-ref)
|
||||||
(pointerize-setf [this :slot parent])
|
;; relink to scene
|
||||||
|
(let ((scene (get-scene (id-ref-scene [this :slot scene]))))
|
||||||
|
(setf [this :slot scene] nil)
|
||||||
|
[scene (add-actor this)]))
|
||||||
|
(when (typep [this :slot parent] 'id-ref)
|
||||||
|
;; relink to parent
|
||||||
|
(let ((parent [this scene (get-actor (id-ref-actor [this :slot parent]))]))
|
||||||
|
(setf [this :slot parent] nil)
|
||||||
|
[parent (add-child this)]))
|
||||||
(loop for entry on [this :slot children]
|
(loop for entry on [this :slot children]
|
||||||
when (typep (car entry) 'id-ref)
|
when (typep (car entry) 'id-ref)
|
||||||
do (rplaca entry (pointerize (car entry))))
|
do (rplaca entry (pointerize (car entry))))
|
||||||
; Restore components
|
;; Restore components
|
||||||
(loop for component in [this components]
|
(loop for component in [this components]
|
||||||
do [component (resume)])
|
do [component (resume)])
|
||||||
; Restore children
|
;; Restore children
|
||||||
(loop for child-ptr in [this children]
|
(loop for child-ptr in [this children]
|
||||||
for child = (weak-pointer-value child-ptr)
|
for child = (weak-pointer-value child-ptr)
|
||||||
do [child (resume)]))
|
do [child (resume)]))
|
||||||
|
|
||||||
(defmethod suspend ((this actor))
|
(defmethod suspend ((this actor))
|
||||||
"Prepare this actor for serialization."
|
"Prepare this actor for serialization."
|
||||||
; Suspend children
|
;; Suspend children
|
||||||
(loop for child-ptr in [this children]
|
(loop for child-ptr in [this children]
|
||||||
for child = (weak-pointer-value child-ptr)
|
for child = (weak-pointer-value child-ptr)
|
||||||
do [child (suspend)])
|
do [child (suspend)])
|
||||||
; Suspend components
|
;; Suspend components
|
||||||
(loop for component in [this components]
|
(loop for component in [this components]
|
||||||
do [component (suspend)])
|
do [component (suspend)])
|
||||||
; Suspend self
|
;; Suspend self
|
||||||
(loop for child-cell on [this :slot children]
|
(loop for child-cell on [this :slot children]
|
||||||
when (typep (car child-cell) 'weak-pointer)
|
when (typep (car child-cell) 'weak-pointer)
|
||||||
do (rplaca child-cell (referize (car child-cell))))
|
do (rplaca child-cell (referize (car child-cell))))
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
referize-setf pointerize-setf
|
referize-setf pointerize-setf
|
||||||
generate-load-forms
|
generate-load-forms
|
||||||
dump-scene dump-actors
|
dump-scene dump-actors
|
||||||
|
load-resume-scene load-resume-actors
|
||||||
|
|
||||||
;; actor.lisp
|
;; actor.lisp
|
||||||
actor
|
actor
|
||||||
|
|
|
@ -14,11 +14,10 @@
|
||||||
(declare (type pointer val))
|
(declare (type pointer val))
|
||||||
(etypecase val
|
(etypecase val
|
||||||
(weak-pointer (weak-pointer-value val))
|
(weak-pointer (weak-pointer-value val))
|
||||||
(id-ref (warn "dereferencing sus pointer:~%~S" val)
|
(id-ref (warn "dereferencing sus pointer ~S" val)
|
||||||
(weak-pointer-value (pointerize val)))
|
(weak-pointer-value (pointerize val)))
|
||||||
(null nil)))
|
(null nil)))
|
||||||
|
|
||||||
|
|
||||||
(defun referize (ptr)
|
(defun referize (ptr)
|
||||||
"Convert weak-pointer ptr into an id-ref."
|
"Convert weak-pointer ptr into an id-ref."
|
||||||
(declare (type weak-pointer ptr))
|
(declare (type weak-pointer ptr))
|
||||||
|
@ -28,11 +27,17 @@
|
||||||
(scene
|
(scene
|
||||||
(make-id-ref :scene [target id]))
|
(make-id-ref :scene [target id]))
|
||||||
(actor
|
(actor
|
||||||
(make-id-ref :scene [target scene id]
|
(make-id-ref :scene (etypecase [target :slot scene]
|
||||||
|
(weak-pointer [target scene id])
|
||||||
|
(id-ref (id-ref-scene [target :slot scene])))
|
||||||
:actor [target id]))
|
:actor [target id]))
|
||||||
(component
|
(component
|
||||||
(make-id-ref :scene [target scene id]
|
(make-id-ref :scene (etypecase [target :slot actor]
|
||||||
:actor [target actor id]
|
(weak-pointer [target scene id])
|
||||||
|
(id-ref (id-ref-scene [target :slot actor])))
|
||||||
|
:actor (etypecase [target :slot actor]
|
||||||
|
(weak-pointer [target actor id])
|
||||||
|
(id-ref (id-ref-actor [target :slot actor])))
|
||||||
:component (class-name (class-of target))))
|
:component (class-name (class-of target))))
|
||||||
)))
|
)))
|
||||||
|
|
||||||
|
@ -201,9 +206,8 @@
|
||||||
(declare (type boolean destroy-after prune nice-syms))
|
(declare (type boolean destroy-after prune nice-syms))
|
||||||
|
|
||||||
;; Collect children so we serialize them as well
|
;; Collect children so we serialize them as well
|
||||||
(let ((all-actors (append actors
|
(let ((all-actors (loop for actor in actors
|
||||||
(loop for actor in actors
|
nconc (collect-descendents actor))))
|
||||||
nconc (collect-descendents actor)))))
|
|
||||||
;; Suspend
|
;; Suspend
|
||||||
(loop for actor in actors
|
(loop for actor in actors
|
||||||
do [actor (suspend)])
|
do [actor (suspend)])
|
||||||
|
@ -216,3 +220,18 @@
|
||||||
(loop for actor in actors do [actor (destroy)])
|
(loop for actor in actors do [actor (destroy)])
|
||||||
(loop for actor in actors do [actor (resume)])))
|
(loop for actor in actors do [actor (resume)])))
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(defun load-resume-scene (scene-form)
|
||||||
|
"Load and resume the scene saved in scene-form."
|
||||||
|
(let ((scene (eval scene-form)))
|
||||||
|
(add-scene scene)
|
||||||
|
[scene (resume)]
|
||||||
|
scene))
|
||||||
|
|
||||||
|
(defun load-resume-actors (actor-forms)
|
||||||
|
"Load and resume the actors saved in actor-forms."
|
||||||
|
(let ((actors (loop for actor-form in actor-forms
|
||||||
|
collect (eval actor-form))))
|
||||||
|
(loop for actor in actors
|
||||||
|
do [actor (resume)]
|
||||||
|
collect actor)))
|
||||||
|
|
Loading…
Reference in New Issue