aboutsummaryrefslogtreecommitdiff
path: root/entity.scm
blob: 7c29bf7ad4c566935cef3d8604ee60868dd620eb (plain)
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
(module downstroke-entity
    *
  (import scheme
	  (chicken base)
	  (chicken keyword)
	  (only srfi-1 fold))

  ;; Entities = plists with shared keys (#:type, #:x, #:y, #:width, #:height, ...).

(define (make-entity x y w h)
  (list #:type 'none #:x x #:y y #:width w #:height h))

(define (entity-ref entity key #!optional default)
  (get-keyword key entity (if (procedure? default) default (lambda () default))))

  (define (entity-type entity)
    (entity-ref entity #:type #f))

  (define (entity-set entity key val)
    (let ((cleaned (let loop ((lst entity) (acc '()))
                     (if (null? lst)
                         (reverse acc)
                         (let ((k (car lst))
                               (v (cadr lst)))
                           (if (eq? k key)
                               (loop (cddr lst) acc)
                               (loop (cddr lst) (cons v (cons k acc)))))))))
      (cons key (cons val cleaned))))

(define (entity-set-many entity pairs)
  (fold (lambda (pair working-ent)
	  (entity-set working-ent (car pair) (if (list? (cdr pair)) (cadr pair) (cdr pair))))
	entity
	pairs))

(define (entity-update entity key proc #!optional default)
  (entity-set entity key (proc (entity-ref entity key default))))

  ;; #:skip-pipelines — list of symbols naming frame pipeline steps to skip for this
  ;; entity. Physics documents the built-in step names (see docs/physics.org). Other
  ;; subsystems (e.g. animation, rendering) may reserve additional symbols later and
  ;; use the same predicate and define-pipeline macro.

  (define (entity-skips-pipeline? entity step)
    (let ((skips (entity-ref entity #:skip-pipelines '())))
      (and (pair? skips) (memq step skips))))

(define-syntax define-pipeline
  (syntax-rules ()
    ((define-pipeline (identifier name) (scene entity dt) :guard guard (body ...))
     (define (identifier scene entity dt)
       (if (or (not guard) (entity-skips-pipeline? entity (quote name)))
	   entity
	   (body ...))))
    ((define-pipeline (identifier name) (scene entity dt) (body ...))
     (define (identifier scene entity dt)
       (if (entity-skips-pipeline? entity (quote name))
	   entity
	   (body ...))))))

) ;; End of entity