ham/simulation.lisp

38 lines
1.0 KiB
Common Lisp

;; Copyright (c) Camden Dixie O'Brien
;; SPDX-License-Identifier: AGPL-3.0-only
(in-package :ham)
(defclass simulation ()
((state :initarg :start)
(params :initarg :params)
(width :initarg :width :initform 800)
(height :initarg :height :initform 600)
(running :initform nil)
simulation-thread))
(defgeneric update (simulation dt))
(defgeneric render (simulation))
(defmethod run ((sim simulation))
(sdl2:make-this-thread-main
(lambda ()
(with-slots (width height running) sim
(with-graphics-context (ctx :width width :height height)
(loop while running do
(update sim (/ 1.0 60.0)) ; assume 60 Hz
(let ((frame (render sim)))
(display-frame ctx frame))))))))
(defmethod start ((sim simulation))
(with-slots (running simulation-thread) sim
(setf running t)
(setf simulation-thread
(sb-thread:make-thread (lambda () (run sim))
:name "ham-simulation-thread"))))
(defmethod stop ((sim simulation))
(with-slots (running simulation-thread) sim
(setf running nil)
(sb-thread:join-thread simulation-thread)))