Tiny proof of concept demo
author |
Steve Losh <steve@stevelosh.com> |
date |
Sat, 11 Feb 2017 14:37:44 +0000 |
parents |
f61929db839b
|
children |
7d9a9d2a4af2
|
branches/tags |
(none) |
files |
docs/03-reference.markdown examples/terrain.lisp src/high-level/bearlibterminal.lisp |
Changes
--- a/docs/03-reference.markdown Sat Feb 11 00:52:24 2017 +0000
+++ b/docs/03-reference.markdown Sat Feb 11 14:37:44 2017 +0000
@@ -1,6 +1,6 @@
# API Reference
-The following is a list of all user-facing parts of `cl-pcg`.
+The following is a list of all user-facing parts of `cl-blt`.
If there are backwards-incompatible changes to anything listed here, they will
be noted in the changelog and the author will feel bad.
@@ -10,5 +10,561 @@
[TOC]
-## Package `PCG`
+## Package `BEARLIBTERMINAL/HIGH-LEVEL`
+
+This package contains a high-level, lispy interface to bearlibterminal. It has the nickname `blt` for easy prefixing.
+
+## Package `BEARLIBTERMINAL/LOW-LEVEL`
+
+This package contains the low-level, SWIG-generated wrapper functions for bearlibterminal.
+
+### `+--SIZEOF-WCHAR-T--+` (variable)
+
+### `+TERMINAL-VSPRINTF-MAXIMUM-BUFFER-SIZE+` (variable)
+
+### `+TERMINAL-WCHAR-SUFFIX+` (variable)
+
+### `+TK-0+` (variable)
+
+### `+TK-1+` (variable)
+
+### `+TK-2+` (variable)
+
+### `+TK-3+` (variable)
+
+### `+TK-4+` (variable)
+
+### `+TK-5+` (variable)
+
+### `+TK-6+` (variable)
+
+### `+TK-7+` (variable)
+
+### `+TK-8+` (variable)
+
+### `+TK-9+` (variable)
+
+### `+TK-A+` (variable)
+
+### `+TK-ALIGN-BOTTOM+` (variable)
+
+### `+TK-ALIGN-CENTER+` (variable)
+
+### `+TK-ALIGN-DEFAULT+` (variable)
+
+### `+TK-ALIGN-LEFT+` (variable)
+
+### `+TK-ALIGN-MIDDLE+` (variable)
+
+### `+TK-ALIGN-RIGHT+` (variable)
+
+### `+TK-ALIGN-TOP+` (variable)
+
+### `+TK-ALT+` (variable)
+
+### `+TK-APOSTROPHE+` (variable)
+
+### `+TK-B+` (variable)
+
+### `+TK-BACKSLASH+` (variable)
+
+### `+TK-BACKSPACE+` (variable)
+
+### `+TK-BKCOLOR+` (variable)
+
+### `+TK-C+` (variable)
+
+### `+TK-CELL-HEIGHT+` (variable)
+
+### `+TK-CELL-WIDTH+` (variable)
+
+### `+TK-CHAR+` (variable)
+
+### `+TK-CLOSE+` (variable)
+
+### `+TK-COLOR+` (variable)
+
+### `+TK-COMMA+` (variable)
+
+### `+TK-COMPOSITION+` (variable)
+
+### `+TK-CONTROL+` (variable)
+
+### `+TK-D+` (variable)
+
+### `+TK-DELETE+` (variable)
+
+### `+TK-DOWN+` (variable)
+
+### `+TK-E+` (variable)
+
+### `+TK-END+` (variable)
+
+### `+TK-ENTER+` (variable)
+
+### `+TK-EQUALS+` (variable)
+
+### `+TK-ESCAPE+` (variable)
+
+### `+TK-EVENT+` (variable)
+
+### `+TK-F+` (variable)
+
+### `+TK-F-1+` (variable)
+
+### `+TK-F-10+` (variable)
+
+### `+TK-F-11+` (variable)
+
+### `+TK-F-12+` (variable)
+
+### `+TK-F-2+` (variable)
+
+### `+TK-F-3+` (variable)
+
+### `+TK-F-4+` (variable)
+
+### `+TK-F-5+` (variable)
+
+### `+TK-F-6+` (variable)
+
+### `+TK-F-7+` (variable)
+
+### `+TK-F-8+` (variable)
+
+### `+TK-F-9+` (variable)
+
+### `+TK-FULLSCREEN+` (variable)
+
+### `+TK-G+` (variable)
+
+### `+TK-GRAVE+` (variable)
+
+### `+TK-H+` (variable)
+
+### `+TK-HEIGHT+` (variable)
+
+### `+TK-HOME+` (variable)
+
+### `+TK-I+` (variable)
+
+### `+TK-INPUT-CANCELLED+` (variable)
+
+### `+TK-INPUT-NONE+` (variable)
+
+### `+TK-INSERT+` (variable)
+
+### `+TK-J+` (variable)
+
+### `+TK-K+` (variable)
+
+### `+TK-KEY-RELEASED+` (variable)
+
+### `+TK-KP-0+` (variable)
+
+### `+TK-KP-1+` (variable)
+
+### `+TK-KP-2+` (variable)
+
+### `+TK-KP-3+` (variable)
+
+### `+TK-KP-4+` (variable)
+
+### `+TK-KP-5+` (variable)
+
+### `+TK-KP-6+` (variable)
+
+### `+TK-KP-7+` (variable)
+
+### `+TK-KP-8+` (variable)
+
+### `+TK-KP-9+` (variable)
+
+### `+TK-KP-DIVIDE+` (variable)
+
+### `+TK-KP-ENTER+` (variable)
+
+### `+TK-KP-MINUS+` (variable)
+
+### `+TK-KP-MULTIPLY+` (variable)
+
+### `+TK-KP-PERIOD+` (variable)
+
+### `+TK-KP-PLUS+` (variable)
+
+### `+TK-L+` (variable)
+
+### `+TK-LAYER+` (variable)
+
+### `+TK-LBRACKET+` (variable)
+
+### `+TK-LEFT+` (variable)
+
+### `+TK-M+` (variable)
+
+### `+TK-MINUS+` (variable)
+
+### `+TK-MOUSE-CLICKS+` (variable)
+
+### `+TK-MOUSE-LEFT+` (variable)
+
+### `+TK-MOUSE-MIDDLE+` (variable)
+
+### `+TK-MOUSE-MOVE+` (variable)
+
+### `+TK-MOUSE-PIXEL-X+` (variable)
+
+### `+TK-MOUSE-PIXEL-Y+` (variable)
+
+### `+TK-MOUSE-RIGHT+` (variable)
+
+### `+TK-MOUSE-SCROLL+` (variable)
+
+### `+TK-MOUSE-WHEEL+` (variable)
+
+### `+TK-MOUSE-X+` (variable)
+
+### `+TK-MOUSE-X-1+` (variable)
+
+### `+TK-MOUSE-X-2+` (variable)
+
+### `+TK-MOUSE-Y+` (variable)
+
+### `+TK-N+` (variable)
+
+### `+TK-O+` (variable)
+
+### `+TK-OFF+` (variable)
+
+### `+TK-ON+` (variable)
+
+### `+TK-P+` (variable)
+
+### `+TK-PAGEDOWN+` (variable)
+
+### `+TK-PAGEUP+` (variable)
+
+### `+TK-PAUSE+` (variable)
+
+### `+TK-PERIOD+` (variable)
+
+### `+TK-Q+` (variable)
+
+### `+TK-R+` (variable)
+
+### `+TK-RBRACKET+` (variable)
+
+### `+TK-RESIZED+` (variable)
+
+### `+TK-RETURN+` (variable)
+
+### `+TK-RIGHT+` (variable)
+
+### `+TK-S+` (variable)
+
+### `+TK-SEMICOLON+` (variable)
+
+### `+TK-SHIFT+` (variable)
+
+### `+TK-SLASH+` (variable)
+
+### `+TK-SPACE+` (variable)
+
+### `+TK-T+` (variable)
+
+### `+TK-TAB+` (variable)
+
+### `+TK-U+` (variable)
+
+### `+TK-UP+` (variable)
+
+### `+TK-V+` (variable)
+
+### `+TK-W+` (variable)
+
+### `+TK-WCHAR+` (variable)
+
+### `+TK-WIDTH+` (variable)
+
+### `+TK-X+` (variable)
+### `+TK-Y+` (variable)
+
+### `+TK-Z+` (variable)
+
+### `COLOR-FROM-ARGB` (function)
+
+ (COLOR-FROM-ARGB)
+
+### `COLOR-FROM-NAME` (function)
+
+ (COLOR-FROM-NAME)
+
+### `COLOR-FROM-NAME-16` (function)
+
+ (COLOR-FROM-NAME-16)
+
+### `COLOR-FROM-NAME-32` (function)
+
+ (COLOR-FROM-NAME-32)
+
+### `COLOR-FROM-NAME-8` (function)
+
+ (COLOR-FROM-NAME-8)
+
+### `COLOR-FROM-WNAME` (function)
+
+ (COLOR-FROM-WNAME)
+
+### `DIMENSIONS-T`
+
+`#<STANDARD-CLASS DOCPARSER:CFFI-STRUCT>`
+
+### `TERMINAL-BKCOLOR` (function)
+
+ (TERMINAL-BKCOLOR)
+
+### `TERMINAL-CHECK` (function)
+
+ (TERMINAL-CHECK)
+
+### `TERMINAL-CLEAR` (function)
+
+ (TERMINAL-CLEAR)
+
+### `TERMINAL-CLEAR-AREA` (function)
+
+ (TERMINAL-CLEAR-AREA)
+
+### `TERMINAL-CLOSE` (function)
+
+ (TERMINAL-CLOSE)
+
+### `TERMINAL-COLOR` (function)
+
+ (TERMINAL-COLOR)
+
+### `TERMINAL-COMPOSITION` (function)
+
+ (TERMINAL-COMPOSITION)
+
+### `TERMINAL-CROP` (function)
+
+ (TERMINAL-CROP)
+
+### `TERMINAL-DELAY` (function)
+
+ (TERMINAL-DELAY)
+
+### `TERMINAL-GET` (function)
+
+ (TERMINAL-GET)
+
+### `TERMINAL-GET-16` (function)
+
+ (TERMINAL-GET-16)
+
+### `TERMINAL-GET-32` (function)
+
+ (TERMINAL-GET-32)
+
+### `TERMINAL-GET-8` (function)
+
+ (TERMINAL-GET-8)
+
+### `TERMINAL-HAS-INPUT` (function)
+
+ (TERMINAL-HAS-INPUT)
+
+### `TERMINAL-LAYER` (function)
+
+ (TERMINAL-LAYER)
+
+### `TERMINAL-MEASURE` (function)
+
+ (TERMINAL-MEASURE)
+
+### `TERMINAL-MEASURE-EXT` (function)
+
+ (TERMINAL-MEASURE-EXT)
+
+### `TERMINAL-MEASURE-EXT-16` (function)
+
+ (TERMINAL-MEASURE-EXT-16)
+
+### `TERMINAL-MEASURE-EXT-32` (function)
+
+ (TERMINAL-MEASURE-EXT-32)
+
+### `TERMINAL-MEASURE-EXT-8` (function)
+
+ (TERMINAL-MEASURE-EXT-8)
+
+### `TERMINAL-MEASUREF` (function)
+
+ (TERMINAL-MEASUREF)
+
+### `TERMINAL-MEASUREF-EXT` (function)
+
+ (TERMINAL-MEASUREF-EXT)
+
+### `TERMINAL-OPEN` (function)
+
+ (TERMINAL-OPEN)
+
+### `TERMINAL-PEEK` (function)
+
+ (TERMINAL-PEEK)
+
+### `TERMINAL-PICK` (function)
+
+ (TERMINAL-PICK)
+
+### `TERMINAL-PICK-BKCOLOR` (function)
+
+ (TERMINAL-PICK-BKCOLOR)
+
+### `TERMINAL-PICK-COLOR` (function)
+
+ (TERMINAL-PICK-COLOR)
+
+### `TERMINAL-PRINT` (function)
+
+ (TERMINAL-PRINT)
+
+### `TERMINAL-PRINT-EXT` (function)
+
+ (TERMINAL-PRINT-EXT)
+
+### `TERMINAL-PRINT-EXT-16` (function)
+
+ (TERMINAL-PRINT-EXT-16)
+
+### `TERMINAL-PRINT-EXT-32` (function)
+
+ (TERMINAL-PRINT-EXT-32)
+
+### `TERMINAL-PRINT-EXT-8` (function)
+
+ (TERMINAL-PRINT-EXT-8)
+
+### `TERMINAL-PRINTF` (function)
+
+ (TERMINAL-PRINTF)
+
+### `TERMINAL-PRINTF-EXT` (function)
+
+ (TERMINAL-PRINTF-EXT)
+
+### `TERMINAL-PUT` (function)
+
+ (TERMINAL-PUT)
+
+### `TERMINAL-PUT-EXT` (function)
+
+ (TERMINAL-PUT-EXT)
+
+### `TERMINAL-READ` (function)
+
+ (TERMINAL-READ)
+
+### `TERMINAL-READ-STR` (function)
+
+ (TERMINAL-READ-STR)
+
+### `TERMINAL-READ-STR-16` (function)
+
+ (TERMINAL-READ-STR-16)
+
+### `TERMINAL-READ-STR-32` (function)
+
+ (TERMINAL-READ-STR-32)
+
+### `TERMINAL-READ-STR-8` (function)
+
+ (TERMINAL-READ-STR-8)
+
+### `TERMINAL-READ-WSTR` (function)
+
+ (TERMINAL-READ-WSTR)
+
+### `TERMINAL-REFRESH` (function)
+
+ (TERMINAL-REFRESH)
+
+### `TERMINAL-SET` (function)
+
+ (TERMINAL-SET)
+
+### `TERMINAL-SET-16` (function)
+
+ (TERMINAL-SET-16)
+
+### `TERMINAL-SET-32` (function)
+
+ (TERMINAL-SET-32)
+
+### `TERMINAL-SET-8` (function)
+
+ (TERMINAL-SET-8)
+
+### `TERMINAL-SETF` (function)
+
+ (TERMINAL-SETF)
+
+### `TERMINAL-STATE` (function)
+
+ (TERMINAL-STATE)
+
+### `TERMINAL-VSPRINTF` (function)
+
+ (TERMINAL-VSPRINTF)
+
+### `TERMINAL-VSWPRINTF` (function)
+
+ (TERMINAL-VSWPRINTF)
+
+### `TERMINAL-WGET` (function)
+
+ (TERMINAL-WGET)
+
+### `TERMINAL-WMEASURE` (function)
+
+ (TERMINAL-WMEASURE)
+
+### `TERMINAL-WMEASURE-EXT` (function)
+
+ (TERMINAL-WMEASURE-EXT)
+
+### `TERMINAL-WMEASUREF` (function)
+
+ (TERMINAL-WMEASUREF)
+
+### `TERMINAL-WMEASUREF-EXT` (function)
+
+ (TERMINAL-WMEASUREF-EXT)
+
+### `TERMINAL-WPRINT` (function)
+
+ (TERMINAL-WPRINT)
+
+### `TERMINAL-WPRINT-EXT` (function)
+
+ (TERMINAL-WPRINT-EXT)
+
+### `TERMINAL-WPRINTF` (function)
+
+ (TERMINAL-WPRINTF)
+
+### `TERMINAL-WPRINTF-EXT` (function)
+
+ (TERMINAL-WPRINTF-EXT)
+
+### `TERMINAL-WSET` (function)
+
+ (TERMINAL-WSET)
+
+### `TERMINAL-WSETF` (function)
+
+ (TERMINAL-WSETF)
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/terrain.lisp Sat Feb 11 14:37:44 2017 +0000
@@ -0,0 +1,128 @@
+(in-package :cl-user)
+
+(ql:quickload '(:cl-blt :losh :iterate))
+
+(use-package :losh)
+(use-package :iterate)
+
+;;;; Heightmap ----------------------------------------------------------------
+(defconstant +world-exponent+ 9)
+(defconstant +world-size+ (expt 2 +world-exponent+))
+
+
+(defun allocate-heightmap ()
+ (make-array (list +world-size+ +world-size+)
+ :element-type 'single-float
+ :initial-element 0.0
+ :adjustable nil))
+
+
+(defun average4 (a b c d)
+ (/ (+ a b c d) 4))
+
+(defun hm-ref (heightmap x y)
+ (flet ((ref (n)
+ (cond
+ ((< -1 n +world-size+) n)
+ ((= n +world-size+) 0)
+ (t (mod n +world-size+)))))
+ (aref heightmap (ref x) (ref y))))
+
+
+(defun heightmap-extrema (heightmap)
+ (iterate
+ (for v :across-flat-array heightmap :with-index i)
+ (maximize v :into max)
+ (minimize v :into min)
+ (finally (return (values min max)))))
+
+(defun normalize-heightmap (heightmap)
+ (multiple-value-bind (min max) (heightmap-extrema heightmap)
+ (iterate
+ (with span = (- max min))
+ (for v :across-flat-array heightmap :with-index i)
+ (setf (row-major-aref heightmap i)
+ (/ (- v min) span)))))
+
+
+(defun ds-init (heightmap)
+ (setf (aref heightmap 0 0) 0.5))
+
+
+(defun ds-square (heightmap x y radius spread)
+ (setf (aref heightmap x y)
+ (random-around (average4 (hm-ref heightmap (- x radius) (- y radius))
+ (hm-ref heightmap (- x radius) (+ y radius))
+ (hm-ref heightmap (+ x radius) (- y radius))
+ (hm-ref heightmap (+ x radius) (+ y radius)))
+ spread)))
+
+(defun ds-diamond (heightmap x y radius spread)
+ (setf (aref heightmap x y)
+ (random-around (average4 (hm-ref heightmap (- x radius) y)
+ (hm-ref heightmap (+ x radius) y)
+ (hm-ref heightmap x (- y radius))
+ (hm-ref heightmap x (+ y radius)))
+ spread)))
+
+(defun ds-squares (heightmap radius spread)
+ (iterate
+ (for-nested ((x :from radius :below +world-size+ :by (* 2 radius))
+ (y :from radius :below +world-size+ :by (* 2 radius))))
+ (ds-square heightmap x y radius spread)))
+
+(defun ds-diamonds (heightmap radius spread)
+ (iterate
+ (for i :from 0)
+ (for y :from 0 :below +world-size+ :by radius)
+ (iterate
+ (with shift = (if (evenp i) radius 0))
+ (for x :from shift :below +world-size+ :by (* 2 radius))
+ (ds-diamond heightmap x y radius spread))))
+
+
+(defun diamond-square (heightmap)
+ (ds-init heightmap)
+ (let ((spread 0.8)
+ (spread-reduction 0.7))
+ (recursively ((radius (floor +world-size+ 2))
+ (spread spread))
+ (when (>= radius 1)
+ (ds-squares heightmap radius spread)
+ (ds-diamonds heightmap radius spread)
+ (recur (/ radius 2)
+ (* spread spread-reduction)))))
+ (normalize-heightmap heightmap)
+ heightmap)
+
+
+;;;; GUI ----------------------------------------------------------------------
+(defun terrain-char (height)
+ (cond ((< height 0.4) #\~)
+ ((< height 0.7) #\.)
+ ((< height 0.9) #\#)
+ (t #\*)))
+
+(defparameter *heightmap* (allocate-heightmap))
+
+(defun draw ()
+ (iterate
+ (for-nested ((x :from 0 :below (blt::terminal-width))
+ (y :from 0 :below (blt::terminal-height))))
+ (blt::terminal-put-char x y (terrain-char (aref *heightmap* x y))))
+ (blt::terminal-refresh))
+
+(defun config ()
+ (blt::terminal-set "window.resizeable = true")
+ (blt::terminal-set "window.cellsize = 10x10")
+ (blt::terminal-set "window.title = Terrain Gen Demo"))
+
+(defun main ()
+ (blt::with-terminal
+ (config)
+ (iterate
+ (draw)
+ (blt::key-case (blt::terminal-read)
+ (:space (diamond-square *heightmap*))
+ (:escape (return))
+ (:close (return))))))
--- a/src/high-level/bearlibterminal.lisp Sat Feb 11 00:52:24 2017 +0000
+++ b/src/high-level/bearlibterminal.lisp Sat Feb 11 14:37:44 2017 +0000
@@ -126,6 +126,19 @@
(blt/ll:terminal-delay (truncate (* seconds 1000))))
+(defun terminal-put-char (x y char)
+ (blt/ll:terminal-put x y (char-code char)))
+
+(defun terminal-put-code (x y code-point)
+ (blt/ll:terminal-put x y code-point))
+
+(defun terminal-width ()
+ (blt/ll:terminal-state blt/ll:+tk-width+))
+
+(defun terminal-height ()
+ (blt/ll:terminal-state blt/ll:+tk-height+))
+
+
;;;; Higher-Level API ---------------------------------------------------------
(defmacro defuck-floats (&body body)
#+sbcl