X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fassimp.scm;h=5c8ccd2b99df311616aa3d2eb292d1be4e818ad2;hb=3232da94d35e82b13b04e703fe68c5f1f3232838;hp=4ecbcf4e3ff3f1824972d00ded1bbf64e793afd0;hpb=37ee792898f388533d48d02b9f732769faacaa07;p=guile-assimp.git diff --git a/src/assimp.scm b/src/assimp.scm index 4ecbcf4..5c8ccd2 100644 --- a/src/assimp.scm +++ b/src/assimp.scm @@ -16,34 +16,209 @@ (define-module (assimp assimp) - #:use-module (rnrs bytevectors) + #:use-module (assimp low-level) + #:use-module (assimp low-level cimport) + #: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 types) + #:use-module (assimp low-level vector) #:use-module (system foreign)) -(define libassimp (dynamic-link "libassimp")) -(define aiImportFile - (pointer->procedure '* - (dynamic-func "aiImportFile" libassimp) - (list '* unsigned-int))) +;;; Scenes -(define-wrapped-pointer-type scene - scene? - wrap-scene unwrap-scene - (lambda (s p) - (format p "#" - (pointer-address (unwrap-scene s))))) +(define-conversion-type parse-aiScene -> ai-scene + (flags (field 'mFlags)) + (root-node (wrap (field 'mRootNode) wrap-ai-node)) + (meshes (wrap (array (field 'mNumMeshes) (field 'mMeshes)) wrap-ai-mesh)) + (materials (wrap (array (field 'mNumMaterials) (field 'mMaterials)) wrap-ai-material)) + (animations (array (field 'mNumAnimations) (field 'mAnimations))) + (textures (array (field 'mNumTextures) (field 'mTextures))) + (lights (array (field 'mNumLights) (field 'mLights))) + (cameras (array (field 'mNumCameras) (field 'mCameras)))) -(define (load-scene filename flags) - (wrap-scene - (aiImportFile (string->pointer filename) - flags))) +(export ai-scene? + ai-scene-contents + ai-scene-flags + ai-scene-root-node + ai-scene-meshes + ai-scene-materials + ai-scene-animations + ai-scene-textures + ai-scene-lights + ai-scene-cameras) + + +;;; Nodes + +(define-conversion-type parse-aiNode -> ai-node + (name (sized-string (field 'mName))) + (transformation (field 'mTransformation)) + (parent (wrap (field 'mParent) wrap-ai-node)) + (children (wrap (array (field 'mNumChildren) (field 'mChildren)) wrap-ai-node)) + (meshes (array (field 'mNumMeshes) (field 'mMeshes)))) + +(export ai-node? + ai-node-contents + ai-node-name + ai-node-transformation + ai-node-parent + ai-node-children + ai-node-meshes) + + +;;; Meshes + +(define-conversion-type parse-aiMesh -> ai-mesh + (name (sized-string (field 'mName))) + (primitive-types (field 'mPrimitiveTypes)) + (vertices (wrap + (array (field 'mNumVertices) (field 'mVertices) #:element-proc get-element-address) + wrap-ai-vector3d)) + (faces (wrap + (array (field 'mNumFaces) (field 'mFaces) #:element-size 8 #:element-proc get-element-address) + wrap-ai-face)) + (normals (wrap + (array (field 'mNumVertices) (field 'mNormals) #:element-size 12 #:element-proc get-element-address) + wrap-ai-vector3d)) + (tangents (wrap + (array (field 'mNumVertices) (field 'mTangents) #:element-size 12 #:element-proc get-element-address) + wrap-ai-vector3d)) + (bitangents (wrap + (array (field 'mNumVertices) (field 'mBitangents) #:element-size 12 #:element-proc get-element-address) + wrap-ai-vector3d)) + (colors (map + (lambda (c) + (wrap + (array (field 'mNumVertices) c #:element-size 16 #:element-proc get-element-address) + wrap-ai-color4d)) + (field 'mColors))) + (texture-coords (map + (lambda (tc) + (wrap + (array (field 'mNumVertices) tc #:element-size 12 #:element-proc get-element-address) + wrap-ai-vector3d)) + (field 'mTextureCoords))) + (num-uv-components (field 'mNumUVComponents)) + (bones (wrap (array (field 'mNumBones) (field 'mBones)) wrap-ai-bone)) + (material-index (field 'mMaterialIndex))) + +(export ai-mesh? + ai-mesh-contents + ai-mesh-name + ai-mesh-primitive-types + ai-mesh-vertices + ai-mesh-faces + ai-mesh-normals + ai-mesh-tangents + ai-mesh-bitangents + ai-mesh-colors + ai-mesh-texture-coords + ai-mesh-num-uv-components + ai-mesh-bones + ai-mesh-material-index) + + +;;; Materials + +(define-conversion-type parse-aiMaterial -> ai-material + (properties (array (field 'mNumProperties) (field 'mProperties))) + (num-allocated (field 'mNumAllocated))) + +(export ai-material? + ai-material-contents + ai-material-properties + ai-material-num-allocated) + + +;;; Faces + +(define-conversion-type parse-aiFace -> ai-face + (indices (array (field 'mNumIndices) (field 'mIndices)))) + +(export ai-face? + ai-face-contents + ai-face-indices) + + +;;; Vectors -(bytevector-uint-ref (pointer->bytevector numptob (sizeof long)) - 0 (native-endianness) - (sizeof long)) +(define-conversion-type parse-aiVector2D -> ai-vector2d + (x (field 'x)) + (y (field 'y))) -(define (scene-contents scene) - (bytevector-uint-ref (pointer->bytevector (unwrap-scene scene) 16) - 0 (native-endiannes) 4)) +(export ai-vector2d? + ai-vector2d-contents + ai-vector2d-x + ai-vector2d-y) + +(define-conversion-type parse-aiVector3D -> ai-vector3d + (x (field 'x)) + (y (field 'y)) + (z (field 'z))) + +(export ai-vector3d? + ai-vector3d-contents + ai-vector3d-x + ai-vector3d-y + ai-vector3d-z) + + +;;; Colors + +(define-conversion-type parse-aiColor4D -> ai-color4d + (r (field 'r)) + (g (field 'g)) + (b (field 'b)) + (a (field 'a))) + +(export ai-color4d? + ai-color4d-contents + ai-color4d-r + ai-color4d-g + ai-color4d-b + ai-color4d-a) + + +;;; Bones + +(define-conversion-type parse-aiBone -> ai-bone + (name (sized-string (field 'mName))) + (weights (wrap + (array (field 'mNumWeights) (field 'mWeights) #:element-size 8 #:element-proc get-element-address) + wrap-ai-vertex-weight)) + (offset-matrix (field 'mOffsetMatrix))) + +(export ai-bone? + ai-bone-contents + ai-bone-name + ai-bone-weights + ai-bone-offset-matrix) + + +;;; Weights + +(define-conversion-type parse-aiVertexWeight -> ai-vertex-weight + (vertex-id (field 'mVertexId)) + (weight (field 'mWeight))) + +(export ai-vertex-weight? + ai-vertex-weight-contents + ai-vertex-weight-vertex-id + ai-vertex-weight-weight) + + +;;; Functions + +(define-public (ai-import-file filename flags) + (wrap-ai-scene + (aiImportFile (string->pointer filename) + flags))) -(export load-scene) +(define-public (ai-multiply-matrix4 m1 m2) + (let ((cm1 (make-c-struct aiMatrix4x4-type m1)) + (cm2 (make-c-struct aiMatrix4x4-type m2))) + (aiMultiplyMatrix4 cm1 cm2) + (parse-c-struct cm1 aiMatrix4x4-type)))