Guile verzija v chickadee (+ zametek risalnika)

kegel
Jurij Podgoršek 2025-02-27 20:31:45 +01:00
parent 8c6c5c33ec
commit e5f481c4ec
10 changed files with 473 additions and 159 deletions

View File

@ -1,3 +1,6 @@
play:
chickadee play ww.scm --repl-server
risalnik:
chickadee play risalnik.scm --repl-server

87
guile/risalnik.scm 100644
View File

@ -0,0 +1,87 @@
(add-to-load-path (dirname (current-filename)))
(use-modules (chickadee)
(chickadee graphics color)
(chickadee math vector)
(system repl coop-server)
(ww copic))
;; Hitra pomoc:
;;
;; chickadee play anim.scm --repl-server
;; ^ pozene fajl z repl serverjem v ozadju
(define repl (spawn-coop-repl-server))
;; Stevec izrisanih frejmov
(define stevec 0)
;; copic za risanje - kazalnik
(define copic (make-copic (kazalnik 50) (vec2 300 300)))
(define (prestavi-copic! nov-polozaj)
(copic-polozaj-set! copic (vec2+ (copic-polozaj copic)
nov-polozaj)))
(define (input-handle)
(when (key-pressed? 'e)
(prestavi-copic! (vec2 0 3)))
(when (key-pressed? 'd)
(prestavi-copic! (vec2 0 -3)))
(when (key-pressed? 's)
(prestavi-copic! (vec2 -3 0)))
(when (key-pressed? 'f)
(prestavi-copic! (vec2 3 0))))
(define tekst "")
(set! stevec 6000)
(define (update dt)
;; REPL!
(poll-coop-repl-server repl)
;; Stevec gor
(set! stevec (+ stevec 1))
;(display (string-append (number->string stevec) "\n"))
(input-handle)
(set! tekst (string-append "Stevec:" (number->string stevec))))
(define (key-press key modifiers repeat?)
(cond
;; Quit!
((eq? key 'q)
(abort-game))
;; Reload!
((eq? key 'r)
(load))))
(define (reset-stevec!)
(set! stevec 1))
(define (draw alpha)
;; izpisi tekst
(draw-text tekst (vec2 3 3) #:color black)
;; kurzor
(izrisi-kazalnik copic))
(define (load)
(reset-stevec!))
(run-game
#:draw draw
#:update update
#:key-press key-press
#:load load
;; Okno init
#:window-resizable? #f
#:window-title "risalnik"
#:clear-color (rgb #xFFFFFF))
;(reset-stevec!)

158
guile/risalnik.ww 100644
View File

@ -0,0 +1,158 @@
(add-to-load-path (dirname (current-filename)))
(use-modules (chickadee)
(chickadee graphics color)
(chickadee math vector)
(srfi srfi-28) ;; format funkcija
(ice-9 receive) ;; receive za multiple return
(ice-9 string-fun) ;; string-replace-substring
(system repl coop-server)
(ww scena)
(ww obj)
(ww izris)
(ww copic))
;; Hitra pomoc:
;;
;; chickadee play anim.scm --repl-server
;; ^ pozene fajl z repl serverjem v ozadju
(define repl (spawn-coop-repl-server))
;; Stevec izrisanih frejmov
(define stevec 0)
(define (input-handle)
(cond ((key-pressed? 'h)
(set! rotX (+ rotX 0.0001)))
((key-pressed? 'l)
(set! rotX (- rotX 0.0001)))))
(define objekti '())
(define (dodaj-objekt! velikost)
(set! objekti (cons (ustvari-kocko velikost) objekti)))
(define tekst "")
(define (matrix->string m)
(string-replace-substring
(format "~a" m)
"]" "]\n"))
(define (zaokrozi n st)
(receive (vrednost faktor)
(round/ n st)
(/ vrednost (/ 1 st))))
(define (zaokrozi-matrico m)
(apply make-matrix4
(map (lambda (f) (zaokrozi f 0.01))
(list
(matrix4-x m)
(matrix4-y m)
(matrix4-z m)))))
(define (update dt)
;; REPL!
(poll-coop-repl-server repl)
;; Stevec gor
(set! stevec (+ stevec 1))
;(display (string-append (number->string stevec) "\n"))
(input-handle)
(obj-anim dt)
;(dodaj-objekt! (/ stevec 1000))
(set! tekst (string-append "Stevec:" (number->string stevec)
"\n"
"Stevilo objektov: "
(number->string (length objekti))
"\n"
(matrix->string
;(zaokrozi-matrico
(objekt-polozaj prvi)))));)
(define rotX 0.0)
(define rotY 0.07)
(define rotZ 0.02)
(define (obj-anim dt)
;(set! rotX (+ rotX (/ dt 0.2)))
;(set! rotY (+ rotY (/ dt 0.1)))
;(set! rotZ (+ rotZ (/ dt 0.5)))
(map (lambda (objekt)
(matrix4-copy! (matrix4*
;(matrix4-scale (/ stevec 100))
(matrix4-rotate-x rotX)
(matrix4-rotate-y rotY)
(matrix4-rotate-z rotZ)
(objekt-polozaj objekt))
(objekt-polozaj objekt)))
objekti))
(define (key-press key modifiers repeat?)
(cond
((eq? key 'q)
(abort-game))
((eq? key 'k)
(begin
(display "dodam objekt!\n")
(dodaj-objekt! stevec)))
((eq? key 'r)
(load))))
(define (reset-stevec!)
(set! stevec 1))
(define scena %privzeta-scena)
(define (draw alpha)
;; izpisi tekst
(draw-text tekst (vec2 3 3) #:color black)
;; izrsi modele
(with-projection
(scena-projekcija scena)
;; kurzor
(izrisi-kazalnik 50)))
;; objekti
;(map (lambda (o)
; (begin
; #nil
;(izrisi-objekt o scena)
;(izrisi-objekt-wf o scena)
; ))
; objekti)))
(define prvi #f)
(define (load)
(reset-stevec!)
(set! objekti (list (ustvari-kocko 0.8)))
(set! prvi (list-ref objekti 0))
(scena-kamera-set! %privzeta-scena
(vec3 0
0
-10.0))
;; Moramo pogledat model
(poglej! (vec3 0 0 0)
scena))
(run-game
#:draw draw
#:update update
#:key-press key-press
#:load load
;; Okno init
#:window-resizable? #f
#:window-title "wavey wind"
#:clear-color (rgb #xFFFFFF))
;(reset-stevec!)

View File

@ -1,38 +1,55 @@
(add-to-load-path (dirname (current-filename)))
(use-modules (chickadee)
(chickadee config)
(chickadee graphics text)
(chickadee graphics phong)
(chickadee graphics engine)
(chickadee graphics model)
(chickadee graphics mesh)
(chickadee graphics light)
(chickadee graphics shader)
(chickadee graphics buffer)
(chickadee graphics polygon)
(chickadee math)
(chickadee graphics color)
(chickadee math vector)
(chickadee math matrix)
(srfi srfi-28) ;; format funkcija
(ice-9 receive) ;; receive za multiple return
(ice-9 string-fun) ;; string-replace-substring
(system repl coop-server)
(ww init)
(ww kamera)
(ww obj))
(ww scena)
(ww obj)
(ww izris))
;; Hitra pomoc:
;;
;; chickadee play anim.scm --repl-server
;; ^ pozene fajl z repl serverjem v ozadju
;;
;;
(define repl (spawn-coop-repl-server))
;; Stevec izrisanih frejmov
(define stevec 0)
(define (input-handle)
(cond ((key-pressed? 'h)
(set! dX (+ dX 0.1)))
(set! rotX (+ rotX 0.0001)))
((key-pressed? 'l)
(set! dX (- dX 0.1)))))
(set! rotX (- rotX 0.0001)))))
(define objekti '())
(define (dodaj-objekt! velikost)
(set! objekti (cons (ustvari-kocko velikost) objekti)))
(define tekst "")
(define (matrix->string m)
(string-replace-substring
(format "~a" m)
"]" "]\n"))
(define (zaokrozi n st)
(receive (vrednost faktor)
(round/ n st)
(/ vrednost (/ 1 st))))
(define (zaokrozi-matrico m)
(apply make-matrix4
(map (lambda (f) (zaokrozi f 0.01))
(list
(matrix4-x m)
(matrix4-y m)
(matrix4-z m)))))
(define (update dt)
;; REPL!
@ -40,108 +57,86 @@
;; Stevec gor
(set! stevec (+ stevec 1))
(display (string-append (number->string stevec) "\n"))
;(display (string-append (number->string stevec) "\n"))
(input-handle)
(obj-anim dt))
(obj-anim dt)
(define rotX 0)
(define rotY 0)
(define rotZ 0)
;(dodaj-objekt! (/ stevec 1000))
(define dX 0)
(define dY 0)
(define dZ 0)
(set! tekst (string-append "Stevec:" (number->string stevec)
"\n"
"Stevilo objektov: "
(number->string (length objekti))
"\n"
(matrix->string
;(zaokrozi-matrico
(objekt-polozaj prvi)))));)
(define rotX 0.0)
(define rotY 0.07)
(define rotZ 0.02)
(define (obj-anim dt)
(set! rotX (+ rotX (/ dt 0.2) (* dt dX)))
(set! rotY (+ rotY (/ dt 0.1)))
(set! rotZ (+ rotZ (/ dt 0.5)))
(matrix4-copy! (matrix4* (matrix4-scale stevec)
(matrix4-rotate-x rotX)
(matrix4-rotate-y rotY)
(matrix4-rotate-z rotZ))
model-matrix)
(matrix4-copy! (matrix4* (matrix4-scale stevec)
(matrix4-rotate-x rotY)
(matrix4-rotate-y rotZ)
(matrix4-rotate-z rotX))
tla-matrix)
;(matrix4-scale! model-matrix stevec)
;(matrix4-mult! model-matrix model-matrix (matrix4-scale stevec))
;(matrix4-rotate-x! model-matrix rotX)
;(matrix4-rotate-y! model-matrix rotY)
;(matrix4-rotate-z! model-matrix rotZ))
)
;(set! rotX (+ rotX (/ dt 0.2)))
;(set! rotY (+ rotY (/ dt 0.1)))
;(set! rotZ (+ rotZ (/ dt 0.5)))
(map (lambda (objekt)
(matrix4-copy! (matrix4*
;(matrix4-scale (/ stevec 100))
(matrix4-rotate-x rotX)
(matrix4-rotate-y rotY)
(matrix4-rotate-z rotZ)
(objekt-polozaj objekt))
(objekt-polozaj objekt)))
objekti))
(define (key-press key modifiers repeat?)
(cond
((eq? key 'q)
(abort-game))
((eq? key 'k)
(set! obj (cons (ustvari-objekt stevec) obj)))
(begin
(display "dodam objekt!\n")
(dodaj-objekt! stevec)))
((eq? key 'r)
(load))))
(define (reset-stevec!)
(set! stevec 1))
(define tla-matrix (make-identity-matrix4))
(define position (vec3 0.0 0.0 -4.0))
(define obj #f)
(define tla #f)
(define nebo #f)
(define wireframe-shader
(load-shader (scope-datadir "shaders/path-stroke-vert.glsl")
(scope-datadir "shaders/path-stroke-frag.glsl")))
(define scena %privzeta-scena)
(define (draw alpha)
(with-graphics-state
((g:polygon-mode line-polygon-mode))
(with-projection
projection
;; izpisi tekst
(draw-text tekst (vec2 3 3) #:color black)
;; objekti
(map (lambda (o)
(draw-mesh o
#:model-matrix model-matrix
#:view-matrix view-matrix
#:camera-position position
#:lights (list (ustvari-luc))))
obj)
;; izrsi modele
(with-projection
(scena-projekcija scena)
;; objekti
(map (lambda (o)
(begin
(izrisi-objekt o scena)
;(izrisi-objekt-wf o scena)
))
objekti)))
;; "tla"
(draw-mesh tla
#:model-matrix tla-matrix
#:view-matrix view-matrix
#:camera-position position
#:lights (list (ustvari-luc)))
;; wireframe test?
(map
(lambda (p)
(shader-apply
my-shader
(primitive-vertex-array p)))
(mesh-primitives tla)))))
;; :( ne dela?
(define prvi #f)
(define (load)
;; Moramo pogledat model
(poglej! position)
(reset-stevec!)
(ustvari-luc)
(set! obj (list (ustvari-objekt stevec)))
(set! tla (ustvari-tla))
(set! nebo (ustvari-nebo)))
(set! objekti (list (ustvari-kocko 0.8)))
(set! prvi (list-ref objekti 0))
(scena-kamera-set! %privzeta-scena
(vec3 0
0
-10.0))
;; Moramo pogledat model
(poglej! (vec3 0 0 0)
scena))
(run-game
#:draw draw
@ -149,8 +144,9 @@
#:key-press key-press
#:load load
;; Okno init
#:window-resizable? #t
#:window-resizable? #f
#:window-title "wavey wind"
#:clear-color (rgb #xFFFFFF))
;(reset-stevec!)

33
guile/ww/copic.scm 100644
View File

@ -0,0 +1,33 @@
(define-module (ww copic)
#:use-module (srfi srfi-9) ;; records
#:use-module (chickadee math vector)
#:use-module (chickadee graphics path)
#:use-module (chickadee graphics color)
#:export (kazalnik izrisi-kazalnik
make-copic copic?
copic-lik copic-lik-set!
copic-polozaj copic-polozaj-set!))
(define-record-type <copic>
(make-copic lik polozaj)
copic?
(lik copic-lik copic-lik-set!)
(polozaj copic-polozaj copic-polozaj-set!))
(define (kazalnik-barva sirina)
(radial-gradient #:start-color (rgba #x000000FF)
#:end-color (rgba #x00000000)
#:radius sirina
#:origin (vec2 sirina sirina)))
;; Krog z gradientom kot copic
(define (kazalnik sirina)
(with-style
((fill-color (kazalnik-barva sirina)))
(fill (circle (vec2 sirina sirina) sirina))))
(define (izrisi-kazalnik copic)
(draw-canvas
(make-canvas
(translate (copic-polozaj copic)
(copic-lik copic)))))

View File

@ -1,35 +0,0 @@
(define-module (ww init)
#:use-module (chickadee math vector)
#:use-module (chickadee graphics color)
#:use-module (chickadee graphics mesh)
#:use-module (chickadee graphics light)
#:use-module (chickadee graphics pbr)
#:use-module (chickadee graphics polygon)
#:use-module (chickadee graphics skybox)
#:use-module (chickadee graphics texture)
#:export (ustvari-tla
ustvari-nebo
ustvari-luc))
(define (ustvari-tla)
(make-plane 0.002
0.002
(make-pbr-material #:base-color-factor (vec3 1.0 0 0)
#:polygon-mode line-polygon-mode)))
;; (define (ustvari-kvadrat sirina)
;; (build-mesh
;; "kvadrat"
;; (let* ((polovica (/ sirina 2.0))
;; (levo-zgoraj (vec3 (- polovica) 0.0 (- polovica))
;; (vec2 )))
;; (list (vertex (vec3 (- sirina)))))))
(define (ustvari-nebo)
(default-skybox))
(define (ustvari-luc)
(make-directional-light
#:direction (vec3 1 1 1)
#:color white
#:intensity 10))

36
guile/ww/izris.scm 100644
View File

@ -0,0 +1,36 @@
(define-module (ww izris)
#:use-module (chickadee config)
#:use-module (chickadee graphics engine)
#:use-module (chickadee math matrix)
#:use-module (chickadee graphics mesh)
#:use-module (chickadee graphics polygon)
#:use-module (chickadee graphics shader)
#:use-module (ww obj)
#:use-module (ww scena)
#:export (izrisi-objekt izrisi-objekt-wf))
(define wireframe-shader
(load-shader (scope-datadir "shaders/path-stroke-vert.glsl")
(scope-datadir "shaders/path-stroke-frag.glsl")))
(define (izrisi-objekt o scena)
(draw-mesh (objekt-geo o)
#:model-matrix (objekt-polozaj o)
#:view-matrix (scena-pogled scena)
#:camera-position (scena-kamera scena)
#:lights (list (scena-luc scena))))
(define (izrisi-objekt-wf o scena)
;; Izrisi WF vsakega primitiva v geometriji objekta
(with-graphics-state
((g:polygon-mode line-polygon-mode))
(map (lambda (p)
(shader-apply wireframe-shader
(primitive-vertex-array p)
#:model-matrix (objekt-polozaj o)
#:view-matrix (scena-pogled scena)
#:camera-position (scena-kamera scena)
#:projection (current-projection)))
;#:mvp (matrix4* (objekt-polozaj o)
; (current-projection))))
(mesh-primitives (objekt-geo o)))))

View File

@ -1,14 +0,0 @@
(define-module (ww kamera)
#:use-module (chickadee math)
#:use-module (chickadee math vector)
#:use-module (chickadee math matrix)
#:export (poglej! view-matrix projection))
(define projection (perspective-projection (/ pi 3.0) (/ 4.0 3.0) 0.1 10.0))
(define view-matrix (make-identity-matrix4))
(define (poglej! position)
(look-at! view-matrix
position
(vec3+ position (vec3 0.0 0.0 1.0))
(vec3 0.0 1.0 0.0)))

View File

@ -1,23 +1,35 @@
(define-module (ww obj)
#:use-module (srfi srfi-9) ;; records
#:use-module (chickadee math matrix)
#:use-module (chickadee math vector)
#:use-module (chickadee graphics mesh)
#:use-module (chickadee graphics pbr)
#:use-module (chickadee graphics phong)
#:use-module (chickadee graphics polygon)
#:export (ustvari-objekt model-matrix))
#:export (%privzet-material
ustvari-okvir ustvari-kocko
ustvari-objekt objekt? objekt-geo objekt-geo-set! objekt-polozaj objekt-polozaj-set!))
(define model-matrix (make-identity-matrix4))
(define-record-type <objekt>
(make-objekt geo polozaj)
objekt?
(geo objekt-geo objekt-geo-set!)
(polozaj objekt-polozaj objekt-polozaj-set!))
(define (ustvari-objekt stevec)
(let ((velikost (/ stevec 2000.0))
(barva (vec3 0.2 0.8 0.4)))
(make-cube velikost
(make-pbr-material #:base-color-factor barva
#:polygon-mode line-polygon-mode
#:metallic-factor 0.1))
(define %privzet-material
(make-pbr-material
#:base-color-factor (vec3 0.2 0.8 0.4)
#:polygon-mode line-polygon-mode))
;(make-plane velikost
; velikost
; (make-pbr-material))
))
(define* (ustvari-kocko velikost #:optional (material %privzet-material))
(ustvari-objekt
(make-cube velikost material)))
(define* (ustvari-okvir velikost #:optional (material %privzet-material))
(ustvari-objekt
(make-plane velikost
velikost
material)))
;; Objekt je par geometrije (mesh) in matrike za polozaj
(define* (ustvari-objekt geo #:optional (polozaj (make-identity-matrix4)))
(make-objekt geo polozaj))

38
guile/ww/scena.scm 100644
View File

@ -0,0 +1,38 @@
(define-module (ww scena)
#:use-module (srfi srfi-9)
#:use-module (chickadee graphics color)
#:use-module (chickadee graphics light)
#:use-module (chickadee math)
#:use-module (chickadee math matrix)
#:use-module (chickadee math vector)
#:export (%privzeta-scena
make-scena scena? scena-kamera scena-kamera-set! scena-pogled-set! scena-pogled scena-luc scena-projekcija
poglej! ustvari-luc))
(define-record-type <scena>
(make-scena pogled luc kamera projekcija)
scena?
(pogled scena-pogled scena-pogled-set!)
(luc scena-luc)
(kamera scena-kamera scena-kamera-set!)
(projekcija scena-projekcija))
(define (ustvari-luc)
(make-directional-light
#:direction (vec3 1 1 1)
#:color white
#:intensity 10))
(define %privzeta-scena
(make-scena (make-identity-matrix4) ;; pogled
(ustvari-luc) ;; luc
(vec3 0.0 0.0 -4.0) ;; polozaj kamere
(perspective-projection ;; projekcija
(/ pi 3.0) (/ 4.0 3.0) 0.1 500.0)))
;; Usmeri kamero na polozaj
(define* (poglej! polozaj #:optional (scena %privzeta-scena))
(look-at! (scena-pogled scena)
polozaj ;; poglej na polozaj
(scena-kamera scena) ;; s polozaja kamere
(vec3 0.0 1.0 0.0))) ;; gor je gor