X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fengine.scm;h=33c8a6f0f190b02ddb3ef4cac12568bc6bfebf13;hb=c62dceb1471afb94efa57eef5506fbdf6f2ef679;hp=0770e09c217bc7446312c90db6ded657c794e14f;hpb=2a4f421a74b6e31e7718d206be704f1d42a268a2;p=gacela.git diff --git a/src/engine.scm b/src/engine.scm index 0770e09..33c8a6f 100644 --- a/src/engine.scm +++ b/src/engine.scm @@ -25,25 +25,32 @@ ;;; Engine definitions +(define (default-delay) 0.1) + +(define-component engine-inner-properties + delay) + (define-record-type engine - (make-engine-record entities mutex system) + (make-engine-record entities mutex running-mutex system) engine? (entities engine-entities set-engine-entities!) (mutex engine-mutex set-engine-mutex!) + (running-mutex engine-running-mutex set-engine-running-mutex!) (system engine-system set-engine-system!)) (set-record-type-printer! engine (lambda (record port) - (format port "#<[engine] entities: ~a>" + (format port "#<[engine] state: ~a, entities: ~a>" + (if (engine-running? record) "Running" "Stopped") (length (car (engine-entities record)))))) (define (make-engine . systems) (make-engine-record - '(() ()) + (receive (e c) ((new-entity (make-engine-inner-properties (default-delay))) '() '()) + (list e c)) (make-mutex) - (if (not (= (length systems) 1)) - (join-systems systems) - (car systems)))) + (make-mutex) + (apply group-systems systems))) (define-syntax define-engine (syntax-rules () @@ -51,8 +58,14 @@ (define name (make-engine system ...))))) +(define (engine-running? engine) + (mutex-locked? (engine-running-mutex engine))) + (export make-engine - define-engine) + define-engine + engine-running?) + +(export-component engine-inner-properties) ;;; Engine Access Protocol Interface @@ -75,6 +88,11 @@ (define* (get-entity key #:key (engine (current-engine))) (assoc key (car (engine-entities engine)))) +(define* (get-entities-by-components component-types #:key (engine (current-engine))) + (map (lambda (e) + (get-entity e #:engine engine)) + (find-entities-by-components (cadr (engine-entities engine)) component-types))) + (define-syntax define-entity-setter (syntax-rules () ((_ name! name) @@ -102,12 +120,54 @@ (set-current-engine! old-engine) res))))) +(define (set-engine-systems! engine . systems) + (with-mutex (engine-mutex engine) + (set-engine-system! engine (apply group-systems systems)))) + (export current-engine set-current-engine! get-entity + get-entities-by-components new-entity! remove-entity! set-entity! set-entity-components! remove-entity-components! - with-engine) + with-engine + set-engine-systems!) + + +;;; Engine execution + +(define (start-engine engine) + (cond ((not (engine-running? engine)) + (with-mutex (engine-running-mutex engine) + (let loop () + (let ((delay 0)) + (with-engine engine + (receive (e c) ((apply (engine-system engine) (engine-entities engine))) + (set-engine-entities! engine (list e c))) + (set! delay (engine-inner-properties-delay (get-component 'engine-inner-properties (car (get-entities-by-components '(engine-inner-properties))))))) + (usleep (inexact->exact (* delay 1000000)))) + (if (not (engine-stopping? engine #:clean #t)) + (loop))))))) + +(define (stop-engine engine) + (with-engine engine + (new-entity! '(engine-halt . #t))) + 'engine-halt) + +(define* (engine-stopping? engine #:key (clean #f)) + (let ((halt #f)) + (with-engine engine + (let halt-engine ((halts (get-entities-by-components '(engine-halt)))) + (cond ((not (null? halts)) + (set! halt #t) + (cond (clean + (remove-entity! (caar halts)) + (halt-engine (cdr halts)))))))) + halt)) + +(export start-engine + stop-engine + engine-stopping?)