Guest User

Untitled

a guest
Dec 11th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 7.01 KB | None | 0 0
  1. #lang racket/gui
  2. (require racket/math
  3.          racket/flonum
  4.          racket/fixnum)
  5.          ;racket/require (for-syntax racket/base)
  6.          ;(filtered-in
  7.          ; (lambda (name) (regexp-replace #rx"unsafe-" name ""))
  8.          ; racket/unsafe/ops)
  9.          ;(only-in racket/flonum make-flvector))
  10.  
  11. (define *width* 160)
  12. (define *height* 120)
  13. (define *scale* 4)
  14. (define (make-trig-lookup-table fn)
  15.   ((lambda ()
  16.      (let ((lookup (make-flvector 2000)))
  17.        (begin
  18.          (let loop
  19.            ((i -1000.0))
  20.            (when (fl< i 1000.0)
  21.              (flvector-set! lookup (fl->fx (flfloor (fl+ i 1000.0))) (fn (fl* pi (fl/ i 1000.0))))
  22.              (loop (fl+ 1.0 i))))
  23.          (lambda (x)
  24.            (flvector-ref
  25.             lookup
  26.             (fxremainder
  27.              (fl->fx (flfloor (fl+ (fl* 1000.0 (fl/ x pi)) 1000.0)))
  28.              2000))))))))
  29.  
  30. (define :sin (make-trig-lookup-table flsin))
  31. (define :cos (make-trig-lookup-table flcos))
  32.  
  33. (define screen%
  34.   (class object%
  35.     (init w h)
  36.     (define width w)
  37.     (define height h)
  38.     (define width.0 (fx->fl w))
  39.     (define height.0 (fx->fl h))
  40.     (define z-buffer (make-flvector (* width height) 10000.0))
  41.     (define z-buffer-wall (make-flvector width))
  42.     (define texture
  43.       (bytes-append #"\377\311\311\310\377\277\300\277\377\266\267\266\377\255\255"
  44.                     #"\256\377\244\244\244\377\233\233\232\377\221\221\222\377\210"
  45.                     #"\211\210\377\277\275\275\377\266\265\265\377\254\254\254\377"
  46.                     #"\242\242\242\377\230\232\231\377\217\220\217\377\206\206\205"
  47.                     #"\377}|{\377\263\263\262\377\251\251\252\377\241\240\240\377"
  48.                     #"\226\227\226\377\216\215\216\377\202\202\204\377yzz\377ooq"
  49.                     #"\377\250\250\250\377\236\237\235\377\225\225\224\377\213\213"
  50.                     #"\213\377\202\201\201\377wxw\377non\377ecd\377\235\233\234\377"
  51.                     #"\223\222\223\377\211\211\211\377~\200\200\377vuu\377klk\377bc"
  52.                     #"b\377XZX\377\220\220\217\377\206\207\206\377}}}\377str\377jij"
  53.                     #"\377``a\377VVV\377LMM\377\205\204\204\377zzy\377qpq\377ggg\377"
  54.                     #"^^^\377STU\377KJJ\377CCC\377wxx\377ono\377eee\377[\\[\377RRS"
  55.                     #"\377HII\377AA?\377877"))
  56.     (define viewport (make-object bitmap% width height))
  57.     (define vbytes (make-bytes (fx* 4 (fx* width height))))
  58.    
  59.     (define/public (render game)
  60.       (begin (render-floor game)
  61.              (post-process)
  62.              (send viewport set-argb-pixels 0 0 width height vbytes)))
  63.    
  64.     (define/private (render-floor game)
  65.       (let* ((rot (send game get-rot))
  66.              (x-cam (fl- (send game get-px)
  67.                          (fl* 0.3 (:sin rot))))
  68.              (y-cam (fl- (send game get-py)
  69.                          (fl* 0.3 (:cos rot))))
  70.              (z-cam 0.0)
  71.              (r-cos (:cos rot))
  72.              (r-sin (:sin rot)))
  73.         (for ([y (in-range (- height 1) -1 -1)])
  74.           (let* ((yd (fl/ (fl- (fl+ (fx->fl y) 0.5) (fl/ height.0 2.0)) height.0))
  75.                  (zd (if (fl>= yd 0.0)
  76.                          (fl/ (fl+ 4.0 (fl* z-cam 8.0)) yd)
  77.                          (fl/ (fl- 4.0 (fl* z-cam 8.0))
  78.                               (fl- 0.0 yd)))))
  79.             (for ([x (in-range (- width 1) -1 -1)])
  80.               (let* ((xd (fl* (fl/ (fl- (fx->fl x) (fl/ width.0 2.0)) height.0) zd))
  81.                      (xx (fxand
  82.                           (fl->fx (flfloor (fl+ x-cam
  83.                                          (fl+ (fl* xd r-cos)
  84.                                               (fl* zd r-sin)))))
  85.                           7))
  86.                      (yy (fxand
  87.                           (fl->fx (flfloor
  88.                                    (fl+ y-cam
  89.                                         (fl- (fl* zd r-cos)
  90.                                              (fl* xd r-sin)))))
  91.                           7))
  92.                      (st (fx+ xx (fx* yy 8))))
  93.                 (begin
  94.                   (flvector-set! z-buffer (fx+ x (fx* y width)) zd)
  95.                   (bytes-copy! vbytes
  96.                                (fx* 4 (fx+ x (fx* y width)))
  97.                                (subbytes texture (fx* st 4) (fx* (fx+ st 1) 4))))))))))
  98.     (define/private (post-process)
  99.       (for ([i (in-range (fx- (fx* width height) 1) -1 -1)])
  100.         (let ((r (bytes-ref vbytes (fx+ 1 (fx* 4 i))))
  101.               (g (bytes-ref vbytes (fx+ 2 (fx* 4 i))))
  102.               (b (bytes-ref vbytes (fx+ 3 (fx* 4 i)))))
  103.           (let* ((br (fl->fx (flfloor (fl/ 60000.0
  104.                                   ((lambda (x) (fl* x x))
  105.                                    (flvector-ref z-buffer i))))))
  106.                  (br (if (fx< br 0) 0 br))
  107.                  (br (if (fx> br 255) 255 br)))
  108.             (let ((r (fxquotient (fx* r br) 255))
  109.                   (g (fxquotient (fx* g br) 255))
  110.                   (b (fxquotient (fx* b br) 255)))
  111.               (begin
  112.                 (bytes-set! vbytes (fx+ 1 (fx* 4 i)) r)
  113.                 (bytes-set! vbytes (fx+ 2 (fx* 4 i)) g)
  114.                 (bytes-set! vbytes (fx+ 3 (fx* 4 i)) b)))))))
  115.    
  116.     (define/public get-bitmap
  117.       (lambda () viewport))
  118.     (super-new)))
  119.  
  120. (define game%
  121.   (class object%
  122.     (define px 4.0)
  123.     (define py 0.0)
  124.     (define rot 0.0)
  125.     (define/public (tick)
  126.       (begin
  127.         (set! rot (fl+ 0.05 rot))
  128.         (set! py (fl+ 0.3 py))))
  129.     (define/public (get-px) px)
  130.     (define/public (get-py) py)
  131.     (define/public (get-rot) rot)
  132.     (super-new)))
  133.  
  134. (define game-canvas%
  135.   (class canvas%
  136.     (inherit get-dc refresh)
  137.     (define bmp (make-object bitmap% *width* *height*))
  138.     (define game (make-object game%))
  139.     (define screen (make-object screen% *width* *height*))
  140.     (define tick? #f)
  141.     (define/override (on-paint)
  142.       (let ((thedc (get-dc)))
  143.         (copy-screen-bitmap)
  144.         (send thedc draw-bitmap bmp 0 0))
  145.       (when tick?
  146.         (set! tick? #f)
  147.         (queue-callback (lambda x (send this run)) #f)))
  148.  
  149.     (define/private (copy-screen-bitmap)
  150.       (send
  151.        (make-object bitmap-dc% bmp)
  152.        draw-bitmap
  153.        (send screen get-bitmap)
  154.        0 0))
  155.    
  156.     (define/public (run)
  157.       (begin
  158.         (send game tick)
  159.         (send screen render game)
  160.         (set! tick? #t)
  161.         (refresh)))
  162.    
  163.     (super-new [style '(no-autoclear)])
  164.     (send (get-dc) set-scale *scale* *scale*)))
  165.  
  166. (define (main)
  167.   (let* ((sphore (make-semaphore 0))
  168.          (frame
  169.           (make-object
  170.               (class frame%
  171.                 (define/augment on-close
  172.                   (lambda ()
  173.                     (semaphore-post sphore)
  174.                     (inner (void) on-close)))
  175.                 (super-new)) "092311"))
  176.          (canvas (make-object game-canvas% frame)))
  177.     (begin
  178.       (send canvas min-width (* *width* *scale*))
  179.       (send canvas min-height (* *height* *scale*))
  180.       (send frame show #t)
  181.       (send canvas run)
  182.       (void (yield sphore)))))
  183. (main)
Add Comment
Please, Sign In to add comment