]> git.jsancho.org Git - gacela.git/commitdiff
Engine definition functions
authorJavier Sancho <jsf@jsancho.org>
Mon, 7 Oct 2013 15:55:14 +0000 (17:55 +0200)
committerJavier Sancho <jsf@jsancho.org>
Mon, 7 Oct 2013 15:55:14 +0000 (17:55 +0200)
* src/engine.scm: functions for creating new engines (make-engine,
  define-engine) and for working with entities and components
  inside them (with-engine)

src/engine.scm [new file with mode: 0644]

diff --git a/src/engine.scm b/src/engine.scm
new file mode 100644 (file)
index 0000000..13b5dc8
--- /dev/null
@@ -0,0 +1,66 @@
+;;; Gacela, a GNU Guile extension for fast games development
+;;; Copyright (C) 2013 by Javier Sancho Fernandez <jsf at jsancho dot org>
+;;;
+;;; This program is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+(define-module (gacela engine)
+  #:use-module (gacela system)
+  #:use-module (ice-9 receive)
+  #:use-module (ice-9 threads)
+  #:use-module (srfi srfi-9)
+  #:use-module (srfi srfi-9 gnu))
+
+
+;;; Engine definitions
+
+(define-record-type engine
+  (make-engine-record entities mutex system)
+  engine?
+  (entities engine-entities set-engine-entities!)
+  (mutex engine-mutex set-engine-mutex!)
+  (system engine-system set-engine-system!))
+
+(set-record-type-printer! engine
+  (lambda (record port)
+    (format port "#<[engine] entities: ~a>"
+           (length (car (engine-entities record))))))
+
+(define (make-engine . systems)
+  (make-engine-record
+   '(() ())
+   (make-mutex)
+   (if (not (= (length systems) 1))
+       (join-systems systems)
+       (car systems))))
+
+(define-syntax define-engine
+  (syntax-rules ()
+    ((_ name system ...)
+     (define name
+       (make-engine system ...)))))
+
+(export make-engine
+       define-engine)
+
+
+;;; Engine Access Protocol Interface
+
+(define (with-engine engine . changes)
+  (with-mutex (engine-mutex engine)
+    (let ((entities (engine-entities engine)))
+      (receive (e c) (modify-entities changes (car entities) (cadr entities))
+        (set-engine-entities! engine (list e c))))))
+
+(export with-engine)