diff --git a/comm/examples.scm b/comm/examples.scm index ba22650..fe58caf 100644 --- a/comm/examples.scm +++ b/comm/examples.scm @@ -2,7 +2,7 @@ ;; exmaple chat client -(require "xmpp.scm") +(require "xmpp.ss") (require openssl) (define (read-input prompt) diff --git a/comm/xmpp.ss b/comm/xmpp.ss index 9a3110e..3dd3e46 100644 --- a/comm/xmpp.ss +++ b/comm/xmpp.ss @@ -297,8 +297,8 @@ (define xmpp-in-port (make-parameter (current-input-port))) (define xmpp-out-port (make-parameter (current-output-port))) - (define (send str) - (printf "sending iO: ~a ~%~%" str) + (define (xmpp-send str) + ; (printf "sending iO: ~a ~%~%" str) (fprintf (xmpp-out-port) "~A~%" str) (flush-output (xmpp-out-port))) (defmacro with-xmpp-session (jid pass . body) @@ -312,13 +312,13 @@ (xmpp-out-port out)) (file-stream-buffer-mode out 'line) (xmpp-response-handler in) - (send (xmpp-stream host)) - (send (xmpp-session host)) + (xmpp-send (xmpp-stream host)) + (xmpp-send (xmpp-session host)) ;(starttls in out) - (send (xmpp-auth user ,pass resource)) - (send (presence)) - (send (presence #:status "Available")) + (xmpp-send (xmpp-auth user ,pass resource)) + (xmpp-send (presence)) + (xmpp-send (presence #:status "Available")) ,@body (close-output-port out) (close-input-port in))))) diff --git a/hayfever/hayfever2.scm b/hayfever/hayfever2.scm index 67e8b5e..3ae12ac 100644 --- a/hayfever/hayfever2.scm +++ b/hayfever/hayfever2.scm @@ -2,9 +2,9 @@ (require scheme/class) (require mzlib/string) +(require openssl) -(osc-destination "osc.udp://127.0.0.255:4001") -(osc-source "4002") +(require "xmpp-dave.ss") ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; pixel primitive things for getting connection points @@ -190,7 +190,7 @@ (with-primitive pollen (pdata-map! (lambda (p) - (vmul (vector (crndf) (crndf) (+ 0.2 (* (rndf) 0.01))) 10)) + (vmul (srndvec) 5)) "p") (pdata-map! (lambda (c) @@ -200,31 +200,7 @@ (lambda (c) (let ((s (* 0.2 (grndf)))) (vector s s 1))) - "s")) - - - #;(set! root (with-state - - (rotate (vector 90 0 0)) - (scale 100) - (build-plane))) - #;(with-state - ; (parent root) - (with-state - (colour (vector 0.5 1 0.5)) - (scale (vector 20 13 1)) - (translate (vector 0 0.2 0)) - (rotate (vector 0 0 180)) -; (texture (load-texture "textures/hills.png")) - (hint-unlit) - (build-plane)) - #;(with-state - (scale (vector 14 15 1)) - (translate (vector 0 0.3 4.5)) - (rotate (vector 0 0 180)) - (texture (load-texture "textures/fg.png")) - (hint-unlit) - (build-plane)))) + "s"))) (define/public (get-entity-list) entity-list) @@ -289,11 +265,16 @@ (define (animate-pollen) (pdata-map! (lambda (p) - (let* ((pp (vmul p 0.5)) - (v (vector (- (noise (vx pp) (vy pp) (time)) 0.5) - (- (noise (vx pp) (+ (vy pp) 112.3) (time)) 0.5) 0))) + (let* ((pp (vadd (vmul p 1) (vector 0 (- (time)) 0))) + (v (cond + ((< (vy p) 0) (vmul (vector (crndf) 1 (crndf)) 0.1)) + ((> (vmag p) 8) (vmul p -0.1)) + (else + (vector (- (noise (vx pp) (vy pp) (vz pp)) 0.5) + (- (noise (vx pp) (+ (vy pp) 112.3) (vz pp)) 0.5) + (- (noise (+ (vx pp) 393.2) (vy pp) (vz pp)) 0.5)))))) (vadd (vadd p (vmul v 0.2)) - (vmul (vector (crndf) (crndf) 0) 0.01)))) + (vmul (srndvec) 0.01)))) "p")) (define (cirndvec) @@ -447,104 +428,204 @@ ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +; things changed in xmpp +; * removed printf +; * renamed send to xmpp-send + +(define jabberer% + (class object% + (field + (incoming '()) + (outgoing '()) + (thr 0)) + + (define/public (get-incoming) + incoming) + + (define/public (clear-incoming) + (set! incoming '())) + + (define/public (msg-waiting?) + (not (null? incoming))) + + (define/public (get-msg) + (let ((msg (car incoming))) + (set! incoming (cdr incoming)) + msg)) + + (define/public (send-msg to msg) + (printf "~a ~a~n" to msg) + (set! outgoing (cons (list to msg) outgoing))) + + (define (message-handler sz) + (set! incoming (cons (list (message-from sz) (message-body sz)) incoming))) + + (define/public (start) + (set! thr (thread run))) + + (define/public (stop) + (kill-thread thr)) + + (define (run) + (printf "running xmpp~n") + (with-xmpp-session "plant0000001@fo.am" "plant0000001" + (printf "xmpp sesh~n") + (set-xmpp-handler 'message message-handler) + + (printf "xmpp sesh~n") + + (let loop () + (when (not (null? outgoing)) + (for-each + (lambda (msg) + (printf "---- ~a~n" (cadr msg)) + (xmpp-send (message (car msg) (cadr msg)))) + outgoing) + (set! outgoing '())) + (sleep 2) + (loop)))) + (super-new))) + (define network-dispatch% - (class object% + (class object% + + (field + (waiting #f) + (wait-till 0) + (jab (make-object jabberer%)) + (send-to "dave@fo.am")) + + (define (stringify l) + (cond + ((null? l) l) + ((symbol? (car l)) + (cons (symbol->string (car l)) + (stringify (cdr l)))) + ((number? (car l)) + (cons (number->string (car l)) + (stringify (cdr l)))) + ((vector? (car l)) + (cons (car l) + (stringify (cdr l)))) + ((list? (car l)) + (cons (stringify (car l)) (stringify (cdr l)))) + (else (error "oops")))) + + (define (split-string str) + (let* ((l (string->list str)) + (cur "") + (r (reverse (foldl + (lambda (c l) + (cond + ((char=? #\ c) + (let ((r (cons cur l))) + (set! cur "") + r)) + (else + (set! cur (string-append cur (string c))) + l))) + '() + l)))) + (if (not (string=? cur "")) + (append r (list cur)) + r))) + + (define (dispatch world) + (for-each + (lambda (msg) + (let ((command (list-ref (cadr msg) 0)) + (args (cdr (cadr msg)))) + (cond + ((string=? command "join-game") + (printf "a new plant has joined the game~n") + ; send a plant update for the new player + (update-plant world) ) + + ((string=? command "plant") + (printf "add plant message recieved : ~a~n" (list-ref args 0)) + (send world set-entity (string->number (list-ref args 0)) (make-object plant% + (vector (string->number (list-ref args 1)) + (string->number (list-ref args 2)) + (string->number (list-ref args 3))) + (vector (string->number (list-ref args 4)) + (string->number (list-ref args 5)) + (string->number (list-ref args 6))) + (stringify (eval-string (list-ref args 7)))))) + + ((string=? command "flower") + ;(printf "flower change msg recieved~n") + (send (send world get-entity (string->number (list-ref args 0))) flower-update + (list-ref args 1) (vector (string->number (list-ref args 2)) + (string->number (list-ref args 3)) + (string->number (list-ref args 4))))) + + ((string=? command "destroy-plant") + (printf "destroy plant message recieved...~n") + (send world destroy-entity (string->number (list-ref args 0)))) + + ((string=? command "spray") + ; (printf "destroy plant message recieved...~n") + (let ((e (send world get-entity (string->number (list-ref args 0))))) + ; it's possible to get spray events before the + ; plant has been created... + (when e + (send e spray world (string->number (list-ref args 1)) + (string->number (list-ref args 2))))))))) + (send jab get-incoming)) + (send jab clear-incoming)) + + (define/public (join-game world) + (send jab start) + (send jab send-msg send-to "join-game") + (set! wait-till (+ (time) 2)) + (set! waiting #t)) + + (define/public (update-plant world) + (let* ((my-plant (send world get-entity (send world get-my-id))) + (pos (send my-plant get-pos)) + (col (send my-plant get-col)) + (desc-str (format "'~a" (send my-plant get-desc)))) - (field - (waiting #f) - (wait-till 0)) - - (define (stringify l) - (cond - ((null? l) l) - ((symbol? (car l)) - (cons (symbol->string (car l)) - (stringify (cdr l)))) - ((number? (car l)) - (cons (number->string (car l)) - (stringify (cdr l)))) - ((vector? (car l)) - (cons (car l) - (stringify (cdr l)))) - ((list? (car l)) - (cons (stringify (car l)) (stringify (cdr l)))) - (else (error "oops")))) - - - (define (dispatch world) - (cond - ((osc-msg "/join-game") - (printf "a new plant has joined the game~n") - ; send a plant update for the new player - (update-plant world) ) - - ((osc-msg "/plant") - (printf "add plant message recieved : ~a~n" (osc 0)) - (send world set-entity (osc 0) (make-object plant% - (vector (osc 1) (osc 2) (osc 3)) - (vector (osc 4) (osc 5) (osc 6)) - (stringify (eval-string (osc 7)))))) + (send jab send-msg send-to (string-append "plant " (number->string (send world get-my-id)) + (number->string (vx pos)) + (number->string (vy pos)) + (number->string (vz pos)) + (number->string (vx col)) + (number->string (vy col)) + (number->string (vz col)) + desc-str)))) + + (define/public (destroy-plant world id) + (send jab send-msg send-to (string-append "destroy-plant " (number->string id))) + (send world destroy-entity id)) + + (define/public (spray world id flower type) + (send jab send-msg send-to (string-append "spray " + (number->string id) + (number->string flower) + (number->string type))) + (send (send world get-entity id) spray world flower type)) + + (define/public (flower-update world id flower col) + (send jab send-msg send-to (string-append "flower " + (number->string id) + (number->string flower) + (number->string (vx col)) + (number->string (vy col)) + (number->string (vz col)))) + (send (send world get-entity id) flower-update flower col)) + + + (define/public (update world) + ; wait for all other players to register their plants + (when (and waiting (< wait-till (time))) + (set! waiting #f) + (send world make-my-plant) + (update-plant world)) + (dispatch world)) + (super-new))) - ((osc-msg "/flower") - ;(printf "flower change msg recieved~n") - (send (send world get-entity (osc 0)) flower-update - (osc 1) (vector (osc 2) (osc 3) (osc 4)))) - - ((osc-msg "/destroy-plant") - (printf "destroy plant message recieved...~n") - (send world destroy-entity (osc 0))) - - ((osc-msg "/spray") - ; (printf "destroy plant message recieved...~n") - (let ((e (send world get-entity (osc 0)))) - ; it's possible to get spray events before the - ; plant has been created... - (when e - (send e spray world (osc 1) (osc 2))))))) - - (define/public (join-game world) - (printf "sending join-game~n") - (osc-send "/join-game" "" (list)) - (set! wait-till (+ (time) 2)) - (set! waiting #t)) - - (define/public (update-plant world) - (printf "sending /plant...~n") - - (let* ((my-plant (send world get-entity (send world get-my-id))) - (pos (send my-plant get-pos)) - (col (send my-plant get-col)) - (desc-str (format "'~a" (send my-plant get-desc)))) - - (osc-send "/plant" "iffffffs" (list (send world get-my-id) - (vx pos) (vy pos) (vz pos) - (vx col) (vy col) (vz col) - desc-str)))) - - (define/public (destroy-plant world id) - (printf "sending destroy plant...~n") - (osc-send "/destroy-plant" "i" (list id)) - (send world destroy-entity id)) - - (define/public (spray world id flower type) - (osc-send "/spray" "iii" (list id flower type)) - (send (send world get-entity id) spray world flower type)) - (define/public (flower-update world id flower col) - (osc-send "/flower" "iifff" (list id flower (vx col) (vy col) (vz col))) - (send (send world get-entity id) flower-update flower col)) - - - (define/public (update world) - ; wait for all other players to register their plants - (when (and waiting (< wait-till (time))) - (set! waiting #f) - (send world make-my-plant) - (update-plant world)) - (dispatch world)) - - - (super-new))) ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; things needed for the set @@ -716,8 +797,7 @@ ;---------------------------------------- -(rotate (vector 0 0 0)) -(scale 0.5) + (hint-depth-sort) (define w (make-object world% 1))