diff options
Diffstat (limited to 'chickadee/graphics/model.scm')
-rw-r--r-- | chickadee/graphics/model.scm | 65 |
1 files changed, 29 insertions, 36 deletions
diff --git a/chickadee/graphics/model.scm b/chickadee/graphics/model.scm index 8fce4ba..0aff08d 100644 --- a/chickadee/graphics/model.scm +++ b/chickadee/graphics/model.scm @@ -34,6 +34,7 @@ #:use-module (chickadee graphics phong) #:use-module (chickadee graphics shader) #:use-module (chickadee graphics texture) + #:use-module (chickadee utils) #:use-module (ice-9 format) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) @@ -514,35 +515,31 @@ ;; - 2 floats for texture coordinate ;; - 3 floats for normal ;; - repeat for each face - (let loop ((i 0)) - (when (< i vertex-count) - (let ((offset (* i stride))) - (match (array-list-ref faces i) - ((vert-index tex-index norm-index) - ;; Vertex - (let ((v (array-list-ref vertices vert-index))) - (f32vector-set! mesh-data offset (vec3-x v)) - (f32vector-set! mesh-data (+ offset 1) (vec3-y v)) - (f32vector-set! mesh-data (+ offset 2) (vec3-z v))) - ;; Texture coordinate - (let ((t (if tex-index - (array-list-ref texcoords tex-index) - null-texcoord))) - (f32vector-set! mesh-data (+ offset 3) (vec2-x t)) - (f32vector-set! mesh-data (+ offset 4) (vec2-y t))) - ;; Normal - (let ((n (if norm-index - (array-list-ref normals norm-index) - null-normal))) - (f32vector-set! mesh-data (+ offset 5) (vec3-x n)) - (f32vector-set! mesh-data (+ offset 6) (vec3-y n)) - (f32vector-set! mesh-data (+ offset 7) (vec3-z n)))))) - (loop (+ i 1)))) + (for-range ((i vertex-count)) + (let ((offset (* i stride))) + (match (array-list-ref faces i) + ((vert-index tex-index norm-index) + ;; Vertex + (let ((v (array-list-ref vertices vert-index))) + (f32vector-set! mesh-data offset (vec3-x v)) + (f32vector-set! mesh-data (+ offset 1) (vec3-y v)) + (f32vector-set! mesh-data (+ offset 2) (vec3-z v))) + ;; Texture coordinate + (let ((t (if tex-index + (array-list-ref texcoords tex-index) + null-texcoord))) + (f32vector-set! mesh-data (+ offset 3) (vec2-x t)) + (f32vector-set! mesh-data (+ offset 4) (vec2-y t))) + ;; Normal + (let ((n (if norm-index + (array-list-ref normals norm-index) + null-normal))) + (f32vector-set! mesh-data (+ offset 5) (vec3-x n)) + (f32vector-set! mesh-data (+ offset 6) (vec3-y n)) + (f32vector-set! mesh-data (+ offset 7) (vec3-z n))))))) ;; Pack indices. - (let loop ((i 0)) - (when (< i index-count) - (u32vector-set! mesh-indices i (array-list-ref face-indices i)) - (loop (+ i 1)))) + (for-range ((i index-count)) + (u32vector-set! mesh-indices i (array-list-ref face-indices i))) ;; Construct vertex array. ;; TODO: Add names to buffers and views. (let* ((index-buffer (make-buffer mesh-indices #:target 'index)) @@ -1004,10 +1001,8 @@ meshes))) (vector-set! nodes i node) node)))) - (let loop ((i 0)) - (when (< i (vector-length array)) - (parse-node* i) - (loop (+ i 1)))) + (for-range ((i (vector-length array))) + (parse-node* i)) nodes) (define (parse-scene obj nodes) (let ((name (or (string-ref/optional obj "name") "anonymous")) @@ -1019,10 +1014,8 @@ (make-scene-node #:name name #:children children))) (define (vector-map proc v) (let ((new-v (make-vector (vector-length v)))) - (let loop ((i 0)) - (when (< i (vector-length v)) - (vector-set! new-v i (proc (vector-ref v i))) - (loop (+ i 1)))) + (for-range ((i (vector-length v))) + (vector-set! new-v i (proc (vector-ref v i)))) new-v)) (call-with-input-file file-name (lambda (port) |