X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fviews.scm;h=b45fa91f4c24e387be36cb344b3ad6312bbd28e2;hb=4b594802583a1a160325baba108061574d613876;hp=b86af82b70854ccf1099d9dc7078c086f724f1d4;hpb=116bad1867d3517df596dc004ef0f6e54bb7d290;p=gacela.git diff --git a/src/views.scm b/src/views.scm index b86af82..b45fa91 100644 --- a/src/views.scm +++ b/src/views.scm @@ -22,19 +22,89 @@ #:use-module (ice-9 optargs)) -(define default-view (make-hash-table)) +;;; Views -(define* (draw-meshes #:optional (meshes (hash-map->list (lambda (k v) v) default-view))) +(define view-type + (make-record-type "view" + '(id controllers meshes priority) + (lambda (record port) + (format port "#" + (length (view-meshes record)))))) + +(define (make-view controllers meshes priority) ((record-constructor view-type) (gensym) controllers meshes priority)) +(define view? (record-predicate view-type)) +(define view-id (record-accessor view-type 'id)) +(define view-meshes (record-accessor view-type 'meshes)) +(define view-meshes-set! (record-modifier view-type 'meshes)) +(define view-controllers (record-accessor view-type 'controllers)) +(define view-controllers-set! (record-modifier view-type 'controllers)) +(define view-priority (record-accessor view-type 'priority)) + +;(defmacro* view (#:key (priority 0) . elements) +(define-macro (view-elements . elements) + (cond ((null? elements) `'(() ())) + (else + `(let ((l (view-elements ,@(cdr elements)))) + ,(let ((e (car elements))) + `(cond ((mesh? ,e) + (list (car l) (cons ,e (cadr l)))) + ((procedure? ,e) + (list (cons ,(if (list? e) e `(lambda () (,e))) (car l)) + (cadr l))) + (else l))))))) + +(define* (view2 #:key (priority 0) . elements) + (let ((controllers '()) + (meshes '())) + (define (f elements) + (cond ((not (null? elements)) + (cond ((mesh? (car elements)) (set! meshes (cons (car elements) meshes))) + ((procedure? (car elements)) (set! controllers (cons (car elements) controllers)))) + (f (cdr elements))))) + (f elements) + (display controllers) + (newline) + (display meshes) + (newline))) + +(define activated-views '()) + +(define (sort-views views-alist) + (sort views-alist + (lambda (v1 v2) + (< (view-priority (cdr v1)) (view-priority (cdr v2)))))) + +(define (activate-view view) + (set! activated-views + (sort-views (assoc-set! activated-views (view-id view) view))) + view) + +(define (view-actived? view) + (and (assoc (view-id view) activated-views) #t)) + +(define (view-priority-set! view priority) + ((record-modifier view-type 'priority) view priority) + (if (view-actived? view) + (set! activated-views (sort-views activated-views)))) + +(define current-view #f) + +(define* (run-views #:optional (views activated-views)) + (cond ((not (null? views)) + (set! current-view (cdar views)) + ;((view-body current-view)) + (draw-meshes (view-meshes current-view)) + (run-views (cdr views))))) + +(define (draw-meshes meshes) (cond ((not (null? meshes)) (catch #t - (lambda () (mesh-draw (car meshes))) + (lambda () (mesh-draw (cdar meshes))) (lambda (key . args) #f)) (draw-meshes (cdr meshes))))) -(define-macro (define-view name content) - `(begin - (hash-set! active-views ',name (lambda () (video:glmatrix-block ,content))) - ',name)) + +;(define default-view (activate-view (make-view (lambda () #f)))) ;;; Meshes @@ -51,16 +121,15 @@ (display ">" port)))) -(define mesh-constructor (record-constructor mesh-type)) (define mesh? (record-predicate mesh-type)) -(define* (mesh proc #:optional mesh-type) +(define* (make-mesh proc #:optional type) (apply - mesh-constructor + (record-constructor mesh-type) (let ((px 0) (py 0) (pz 0) (ax 0) (ay 0) (az 0) (rx 0) (ry 0) (rz 0) - (id (gensym)) (type mesh-type) + (id (gensym)) (properties '())) (let ((inner-properties (lambda () @@ -128,13 +197,19 @@ (define (mesh-property-set! mesh prop-name value) (((record-accessor mesh-type 'property-set!) mesh) prop-name value)) -(define* (show mesh #:optional (view default-view)) - (let ((id (mesh-inner-property mesh 'id))) - (if (not (hash-ref view id)) - (hash-set! view id mesh)))) +(define* (show mesh #:optional (view current-view)) + (let ((id (mesh-inner-property mesh 'id)) + (table (view-meshes view))) + (if (not (assoc-ref table id)) + (view-meshes-set! view (assoc-set! table id mesh)))) + mesh) -(define* (hide mesh #:optional (view default-view)) - (hash-remove! view (mesh-inner-property mesh 'id))) +(define* (hide mesh #:optional (view current-view)) + (let ((id (mesh-inner-property mesh 'id)) + (table (view-meshes view))) + (if (assoc-ref table id) + (view-meshes-set! view (assoc-remove! table id)))) + mesh) (define* (translate mesh x y #:optional (z 0)) (((record-accessor mesh-type 'translate) mesh) x y z) @@ -157,9 +232,9 @@ ;;; Primitives -(defmacro* primitive (proc #:optional type) +(defmacro* define-primitive (proc #:optional type) `(lambda (. params) - (let ((m (mesh (lambda (props) (apply ,proc ((@ (gacela utils) arguments-apply) ,proc props))) ,type))) + (let ((m (make-mesh (lambda (props) (apply ,proc ((@ (gacela utils) arguments-apply) ,proc props))) ,type))) (mesh-properties-set! m ((@ (gacela utils) arguments-calling) ,proc params)) m))) @@ -170,7 +245,7 @@ (let ((origin (caar symbols)) (dest (cadar symbols))) `(begin - (define ,origin (primitive ,dest ',origin)) + (define ,origin (define-primitive ,dest ',origin)) (define-primitives ,@(cdr symbols))))))) (define-primitives @@ -178,11 +253,11 @@ (square video:draw-square)) +;;; Adding extensions to the main loop +(add-extension! run-views 10) + + (module-map (lambda (sym var) (if (not (eq? sym '%module-public-interface)) (module-export! (current-module) (list sym)))) (current-module)) - - -;;; Adding extensions to the main loop -(add-extension! draw-meshes 50)