summaryrefslogtreecommitdiff
path: root/chickadee/graphics/model.scm
diff options
context:
space:
mode:
Diffstat (limited to 'chickadee/graphics/model.scm')
-rw-r--r--chickadee/graphics/model.scm65
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)