X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2Fassimp.scm;h=9f6bfc2a3959bdee06358a4175b0374aa866305b;hb=cc3b67814bd3d1d26e1d1d5523db7bf19384bf33;hp=4ecbcf4e3ff3f1824972d00ded1bbf64e793afd0;hpb=37ee792898f388533d48d02b9f732769faacaa07;p=guile-assimp.git diff --git a/src/assimp.scm b/src/assimp.scm index 4ecbcf4..9f6bfc2 100644 --- a/src/assimp.scm +++ b/src/assimp.scm @@ -16,7 +16,10 @@ (define-module (assimp assimp) - #:use-module (rnrs bytevectors) + #:use-module (assimp low-level) + #:use-module (assimp low-level material) + #:use-module (assimp low-level mesh) + #:use-module (assimp low-level scene) #:use-module (system foreign)) (define libassimp (dynamic-link "libassimp")) @@ -26,24 +29,104 @@ (dynamic-func "aiImportFile" libassimp) (list '* unsigned-int))) -(define-wrapped-pointer-type scene - scene? - wrap-scene unwrap-scene - (lambda (s p) - (format p "#" - (pointer-address (unwrap-scene s))))) + +;;; Scenes + +(define-conversion-type parse-aiScene -> scene + (flags (field 'mFlags)) + (root-node (wrap (field 'mRootNode) wrap-node)) + (meshes (wrap (array (field 'mNumMeshes) (field 'mMeshes)) wrap-mesh)) + (materials (wrap (array (field 'mNumMaterials) (field 'mMaterials)) wrap-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))) + flags))) + +(export load-scene + scene? + scene-contents + scene-flags + scene-root-node + scene-meshes + scene-materials + scene-animations + scene-textures + scene-lights + scene-cameras) + + +;;; Nodes + +(define-conversion-type parse-aiNode -> node + (name (sized-string (field 'mName))) + (transformation (field 'mTransformation)) + (parent (wrap (field 'mParent) wrap-node)) + (children (wrap (array (field 'mNumChildren) (field 'mChildren)) wrap-node)) + (meshes (array (field 'mNumMeshes) (field 'mMeshes)))) + +(export node? + node-contents + node-name + node-transformation + node-parent + node-children + node-meshes) + + +;;; Meshes + +(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)) + (num-uv-components (field 'mNumUVComponents)) + (bones (array (field 'mNumBones) (field 'mBones))) + (material-index (field 'mMaterialIndex))) + +(export mesh? + mesh-contents + mesh-name + mesh-primitive-types + mesh-vertices + mesh-faces + mesh-normals + mesh-tangents + mesh-bitangents + mesh-colors + mesh-texture-coords + mesh-num-uv-components + mesh-bones + mesh-material-index) + + +;;; Materials + +(define-conversion-type parse-aiMaterial -> material + (properties (array (field 'mNumProperties) (field 'mProperties))) + (num-allocated (field 'mNumAllocated))) + +(export material? + material-contents + material-properties + material-num-allocated) + -(bytevector-uint-ref (pointer->bytevector numptob (sizeof long)) - 0 (native-endianness) - (sizeof long)) +;;; Faces -(define (scene-contents scene) - (bytevector-uint-ref (pointer->bytevector (unwrap-scene scene) 16) - 0 (native-endiannes) 4)) +(define-conversion-type parse-aiFace -> face + (indices (array (field 'mNumIndices) (field 'mIndices)))) -(export load-scene) +(export face? + face-contents + face-indices)