]> git.jsancho.org Git - guile-assimp.git/blobdiff - src/assimp.scm
Add new types and structs parsers
[guile-assimp.git] / src / assimp.scm
index 9f6bfc2a3959bdee06358a4175b0374aa866305b..81329da4bde097335c13c03cc079d38a3050136f 100644 (file)
 
 (define-module (assimp assimp)
   #:use-module (assimp low-level)
+  #:use-module (assimp low-level color)
   #:use-module (assimp low-level material)
   #:use-module (assimp low-level mesh)
   #:use-module (assimp low-level scene)
+  #:use-module (assimp low-level vector)
   #:use-module (system foreign))
 
 (define libassimp (dynamic-link "libassimp"))
 (define-conversion-type parse-aiMesh -> mesh
   (name (sized-string (field 'mName)))
   (primitive-types (field 'mPrimitiveTypes))
-  (vertices (array (field 'mNumVertices) (field 'mVertices) #:element-proc get-element-address))
-  (faces (wrap (array (field 'mNumFaces) (field 'mFaces) #:element-size 8 #:element-proc get-element-address) wrap-face))
-  (normals (array (field 'mNumVertices) (field 'mNormals) #:element-size 12 #:element-proc get-element-address))
-  (tangents (array (field 'mNumVertices) (field 'mTangents) #:element-size 12 #:element-proc get-element-address))
-  (bitangents (array (field 'mNumVertices) (field 'mBitangents) #:element-size 12 #:element-proc get-element-address))
-  (colors (field 'mColors))
-  (texture-coords (field 'mTextureCoords))
+  (vertices (wrap
+            (array (field 'mNumVertices) (field 'mVertices) #:element-proc get-element-address)
+            wrap-vector3d))
+  (faces (wrap
+         (array (field 'mNumFaces) (field 'mFaces) #:element-size 8 #:element-proc get-element-address)
+         wrap-face))
+  (normals (wrap
+           (array (field 'mNumVertices) (field 'mNormals) #:element-size 12 #:element-proc get-element-address)
+           wrap-vector3d))
+  (tangents (wrap
+            (array (field 'mNumVertices) (field 'mTangents) #:element-size 12 #:element-proc get-element-address)
+            wrap-vector3d))
+  (bitangents (wrap
+              (array (field 'mNumVertices) (field 'mBitangents) #:element-size 12 #:element-proc get-element-address)
+              wrap-vector3d))
+  (colors (map
+          (lambda (c)
+            (wrap
+             (array (field 'mNumVertices) c #:element-size 16 #:element-proc get-element-address)
+             wrap-color4d))
+          (field 'mColors)))
+  (texture-coords (map
+                  (lambda (tc)
+                    (wrap
+                     (array (field 'mNumVertices) tc #:element-size 12 #:element-proc get-element-address)
+                     wrap-vector3d))
+                  (field 'mTextureCoords)))
   (num-uv-components (field 'mNumUVComponents))
-  (bones (array (field 'mNumBones) (field 'mBones)))
+  (bones (wrap (array (field 'mNumBones) (field 'mBones)) wrap-bone))
   (material-index (field 'mMaterialIndex)))
 
 (export mesh?
 (export face?
        face-contents
        face-indices)
+
+
+;;; Vectors
+
+(define-conversion-type parse-aiVector2D -> vector2d
+  (x (field 'x))
+  (y (field 'y)))
+
+(export vector2d?
+       vector2d-contents
+       vector2d-x
+       vector2d-y)
+
+(define-conversion-type parse-aiVector3D -> vector3d
+  (x (field 'x))
+  (y (field 'y))
+  (z (field 'z)))
+
+(export vector3d?
+       vector3d-contents
+       vector3d-x
+       vector3d-y
+       vector3d-z)
+
+
+;;; Colors
+
+(define-conversion-type parse-aiColor4D -> color4d
+  (r (field 'r))
+  (g (field 'g))
+  (b (field 'b))
+  (a (field 'a)))
+
+(export color4d?
+       color4d-contents
+       color4d-r
+       color4d-g
+       color4d-b
+       color4d-a)
+
+
+;;; Bones
+
+(define-conversion-type parse-aiBone -> bone
+  (name (sized-string (field 'mName)))
+  (weights (wrap
+           (array (field 'mNumWeights) (field 'mWeights) #:element-size 8 #:element-proc get-element-address)
+           wrap-vertex-weight))
+  (offset-matrix (field 'mOffsetMatrix)))
+
+(export bone?
+       bone-contents
+       bone-name
+       bone-weights
+       bone-offset-matrix)
+
+
+;;; Weights
+
+(define-conversion-type parse-aiVertexWeight -> vertex-weight
+  (vertex-id (field 'mVertexId))
+  (weight (field 'mWeight)))
+
+(export vertex-weight?
+       vertex-weight-contents
+       vertex-weight-vertex-id 
+       vertex-weight-weight)