(define-module (assimp assimp)
+ #:use-module (ice-9 iconv)
#:use-module (rnrs bytevectors)
#:use-module (system foreign))
(native-endianness)
4))
-(define* (get-pointer-of-pointers-procedure num-index root-index #:optional wrap-proc)
+(define (get-aiString index)
+ (lambda (pointer)
+ (let* ((length (bv-uint-ref pointer index))
+ (data (pointer->bytevector pointer length (+ index 4))))
+ (bytevector->string data (fluid-ref %default-port-encoding)))))
+
+(define* (get-pointer index #:optional wrap-proc)
+ (lambda (pointer)
+ (let ((p (bv-uint-ref pointer index)))
+ (cond ((= p 0) '())
+ (else
+ (let ((p2 (make-pointer p)))
+ (list
+ (cond (wrap-proc (wrap-proc p2))
+ (else p2)))))))))
+
+(define (get-array num-index root-index type)
+ (lambda (pointer)
+ (let ((num (bv-uint-ref pointer num-index))
+ (rootp (make-pointer (bv-uint-ref pointer root-index))))
+ (cond ((> num 0)
+ (array->list
+ (pointer->bytevector rootp num 0 type)))
+ (else
+ '())))))
+
+(define* (get-structs-array num-index root-index struct-size #:optional wrap-proc)
+ (lambda (pointer)
+ (let ((num (bv-uint-ref pointer num-index))
+ (rootp (bv-uint-ref pointer root-index)))
+ (let loop ((i (- num 1)))
+ (cond ((< i 0)
+ '())
+ (else
+ (let* ((p (make-pointer (+ rootp (* i struct-size))))
+ (wp (if wrap-proc (wrap-proc p) p)))
+ (cons wp (loop (- i 1))))))))))
+
+(define* (get-pointer-of-pointers num-index root-index #:optional wrap-proc)
(lambda (pointer)
(let* ((num (bv-uint-ref pointer num-index))
(rootp (make-pointer (bv-uint-ref pointer root-index))))
(define-type scene
(flags (lambda (p) (bv-uint-ref p 0)))
(root-node (lambda (p) (wrap-node (make-pointer (bv-uint-ref p 4)))))
- (meshes (get-pointer-of-pointers-procedure 8 12 wrap-mesh))
- (materials (get-pointer-of-pointers-procedure 16 20))
- (animations (get-pointer-of-pointers-procedure 24 28))
- (textures (get-pointer-of-pointers-procedure 32 36))
- (lights (get-pointer-of-pointers-procedure 40 44))
- (cameras (get-pointer-of-pointers-procedure 48 52)))
+ (meshes (get-pointer-of-pointers 8 12 wrap-mesh))
+ (materials (get-pointer-of-pointers 16 20 wrap-material))
+ (animations (get-pointer-of-pointers 24 28))
+ (textures (get-pointer-of-pointers 32 36))
+ (lights (get-pointer-of-pointers 40 44))
+ (cameras (get-pointer-of-pointers 48 52)))
(define (load-scene filename flags)
(wrap-scene
;;; Nodes
(define-type node
- (name (lambda (p) (bv-uint-ref p 0))) ;check, it's a struct
- (transformation (lambda (p) (bv-uint-ref p 1028))) ;check, it's a struct
- (parent (lambda (p) (bv-uint-ref p 1092)))
- (children (get-pointer-of-pointers-procedure 1096 1100))
- (meshes (get-pointer-of-pointers-procedure 1104 1108)))
+ (name (get-aiString 0))
+ (transformation (lambda (p) (array->list (pointer->bytevector p 16 1028 'f32))))
+ (parent (get-pointer 1092 wrap-node))
+ (children (get-pointer-of-pointers 1096 1100 wrap-node))
+ (meshes (get-array 1104 1108 'u32)))
(export node?
node-contents)
(define-type mesh
(num-primitive-types (lambda (p) (bv-uint-ref p 0)))
- (vertices (get-pointer-of-pointers-procedure 4 12))
- (faces (get-pointer-of-pointers-procedure 8 124))
+ (vertices (get-pointer-of-pointers 4 12))
+ (faces (get-structs-array 8 124 8 wrap-face))
(normals (lambda (p) (bv-uint-ref p 16)))
(tangents (lambda (p) (bv-uint-ref p 20)))
(bitangents (lambda (p) (bv-uint-ref p 24)))
(colors (lambda (p) (bv-uint-ref p 28))) ;AI_MAX_NUMBER_OF_COLOR_SETS
(texture-coords (lambda (p) (bv-uint-ref p 60))) ;AI_MAX_NUMBER_OF_TEXTURECOORDS
(num-uv-components (lambda (p) (bv-uint-ref p 92))) ;AI_MAX_NUMBER_OF_TEXTURECOORDS
- (bones (get-pointer-of-pointers-procedure 128 132))
+ (bones (get-pointer-of-pointers 128 132))
(material-index (lambda (p) (bv-uint-ref p 136))))
(export mesh?
mesh-contents)
+
+
+;;; Materials
+
+(define-type material
+ (properties (get-pointer-of-pointers 4 0))
+ (allocated (lambda (p) (bv-uint-ref p 8))))
+
+(export material?
+ material-contents)
+
+
+;;; Faces
+
+(define-type face
+ (indices (get-array 0 4 'u32)))
+
+(export face?
+ face-contents)