]> git.jsancho.org Git - gacela.git/blob - src/engine.scm
13b5dc83ff6c80db717656fd10d28d97263161a9
[gacela.git] / src / engine.scm
1 ;;; Gacela, a GNU Guile extension for fast games development
2 ;;; Copyright (C) 2013 by Javier Sancho Fernandez <jsf at jsancho dot org>
3 ;;;
4 ;;; This program is free software: you can redistribute it and/or modify
5 ;;; it under the terms of the GNU General Public License as published by
6 ;;; the Free Software Foundation, either version 3 of the License, or
7 ;;; (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ;;; GNU General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17
18 (define-module (gacela engine)
19   #:use-module (gacela system)
20   #:use-module (ice-9 receive)
21   #:use-module (ice-9 threads)
22   #:use-module (srfi srfi-9)
23   #:use-module (srfi srfi-9 gnu))
24
25
26 ;;; Engine definitions
27
28 (define-record-type engine
29   (make-engine-record entities mutex system)
30   engine?
31   (entities engine-entities set-engine-entities!)
32   (mutex engine-mutex set-engine-mutex!)
33   (system engine-system set-engine-system!))
34
35 (set-record-type-printer! engine
36   (lambda (record port)
37     (format port "#<[engine] entities: ~a>"
38             (length (car (engine-entities record))))))
39
40 (define (make-engine . systems)
41   (make-engine-record
42    '(() ())
43    (make-mutex)
44    (if (not (= (length systems) 1))
45        (join-systems systems)
46        (car systems))))
47
48 (define-syntax define-engine
49   (syntax-rules ()
50     ((_ name system ...)
51      (define name
52        (make-engine system ...)))))
53
54 (export make-engine
55         define-engine)
56
57
58 ;;; Engine Access Protocol Interface
59
60 (define (with-engine engine . changes)
61   (with-mutex (engine-mutex engine)
62     (let ((entities (engine-entities engine)))
63       (receive (e c) (modify-entities changes (car entities) (cadr entities))
64         (set-engine-entities! engine (list e c))))))
65
66 (export with-engine)