From 11aa5c339d17577dd287603304cbbd57a4c433fb Mon Sep 17 00:00:00 2001 From: klickverbot Date: Fri, 12 Mar 2010 17:26:57 +0000 Subject: [PATCH] On request, merged current state of the SWIG bindings for the D programming language. The interface files are by no means complete yet and only work with the not-yet-released D SWIG backend, although adding support for other languages should not be too much of problem via #ifdefs. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@596 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- port/swig/DONOTUSEYET | 0 port/swig/assimp.i | 134 ++++++++++++++++++++++++++++ port/swig/d/build.sh | 2 + port/swig/d/generate.sh | 4 + port/swig/interface/DefaultLogger.i | 5 ++ port/swig/interface/IOStream.i | 5 ++ port/swig/interface/IOSystem.i | 11 +++ port/swig/interface/LogStream.i | 5 ++ port/swig/interface/Logger.i | 5 ++ port/swig/interface/NullLogger.i | 5 ++ port/swig/interface/aiAnim.i | 7 ++ port/swig/interface/aiAssert.i | 5 ++ port/swig/interface/aiCamera.i | 5 ++ port/swig/interface/aiColor4D.i | 5 ++ port/swig/interface/aiConfig.i | 5 ++ port/swig/interface/aiDefines.i | 5 ++ port/swig/interface/aiFileIO.i | 5 ++ port/swig/interface/aiLight.i | 5 ++ port/swig/interface/aiMaterial.i | 18 ++++ port/swig/interface/aiMatrix3x3.i | 5 ++ port/swig/interface/aiMatrix4x4.i | 5 ++ port/swig/interface/aiMesh.i | 16 ++++ port/swig/interface/aiPostProcess.i | 7 ++ port/swig/interface/aiQuaternion.i | 5 ++ port/swig/interface/aiScene.i | 17 ++++ port/swig/interface/aiTexture.i | 5 ++ port/swig/interface/aiTypes.i | 8 ++ port/swig/interface/aiVector2D.i | 5 ++ port/swig/interface/aiVector3D.i | 5 ++ port/swig/interface/aiVersion.i | 5 ++ port/swig/interface/assimp.i | 41 +++++++++ 31 files changed, 360 insertions(+) create mode 100644 port/swig/DONOTUSEYET create mode 100644 port/swig/assimp.i create mode 100755 port/swig/d/build.sh create mode 100755 port/swig/d/generate.sh create mode 100644 port/swig/interface/DefaultLogger.i create mode 100644 port/swig/interface/IOStream.i create mode 100644 port/swig/interface/IOSystem.i create mode 100644 port/swig/interface/LogStream.i create mode 100644 port/swig/interface/Logger.i create mode 100644 port/swig/interface/NullLogger.i create mode 100644 port/swig/interface/aiAnim.i create mode 100644 port/swig/interface/aiAssert.i create mode 100644 port/swig/interface/aiCamera.i create mode 100644 port/swig/interface/aiColor4D.i create mode 100644 port/swig/interface/aiConfig.i create mode 100644 port/swig/interface/aiDefines.i create mode 100644 port/swig/interface/aiFileIO.i create mode 100644 port/swig/interface/aiLight.i create mode 100644 port/swig/interface/aiMaterial.i create mode 100644 port/swig/interface/aiMatrix3x3.i create mode 100644 port/swig/interface/aiMatrix4x4.i create mode 100644 port/swig/interface/aiMesh.i create mode 100644 port/swig/interface/aiPostProcess.i create mode 100644 port/swig/interface/aiQuaternion.i create mode 100644 port/swig/interface/aiScene.i create mode 100644 port/swig/interface/aiTexture.i create mode 100644 port/swig/interface/aiTypes.i create mode 100644 port/swig/interface/aiVector2D.i create mode 100644 port/swig/interface/aiVector3D.i create mode 100644 port/swig/interface/aiVersion.i create mode 100644 port/swig/interface/assimp.i diff --git a/port/swig/DONOTUSEYET b/port/swig/DONOTUSEYET new file mode 100644 index 000000000..e69de29bb diff --git a/port/swig/assimp.i b/port/swig/assimp.i new file mode 100644 index 000000000..9dd3eeff3 --- /dev/null +++ b/port/swig/assimp.i @@ -0,0 +1,134 @@ +%module assimp + +// SWIG helpers for std::string and std::vector wrapping. +%include +%include + +// Globally enable enum prefix stripping. +%dstripprefix; + + +// PACK_STRUCT is a no-op for SWIG – it does not matter for the generated +// bindings how the underlying C++ code manages its memory. +#define PACK_STRUCT + + +// Helper macros for wrapping the pointer-and-length arrays used in the +// Assimp API. + +%define ASSIMP_ARRAY(CLASS, TYPE, NAME, LENGTH) +%newobject CLASS::NAME; +%extend CLASS { + std::vector *NAME() { + std::vector *result = new std::vector; + result->reserve(LENGTH); + + for (unsigned int i = 0; i < LENGTH; ++i) { + result->push_back($self->NAME[i]); + } + + return result; + } +} +%ignore CLASS::NAME; +%enddef + +%define ASSIMP_POINTER_ARRAY(CLASS, TYPE, NAME, LENGTH) +%newobject CLASS::NAME; +%extend CLASS { + std::vector *NAME() { + std::vector *result = new std::vector; + result->reserve(LENGTH); + + TYPE *currentValue = $self->NAME; + TYPE *valueLimit = $self->NAME + LENGTH; + while (currentValue < valueLimit) { + result->push_back(currentValue); + ++currentValue; + } + + return result; + } +} +%ignore CLASS::NAME; +%enddef + +%define ASSIMP_POINTER_ARRAY_ARRAY(CLASS, TYPE, NAME, OUTER_LENGTH, INNER_LENGTH) +%newobject CLASS::NAME; +%extend CLASS { + std::vector > *NAME() { + std::vector > *result = new std::vector >; + result->reserve(OUTER_LENGTH); + + for (unsigned int i = 0; i < OUTER_LENGTH; ++i) { + std::vector currentElements; + + if ($self->NAME[i] != 0) { + currentElements.reserve(INNER_LENGTH); + + TYPE *currentValue = $self->NAME[i]; + TYPE *valueLimit = $self->NAME[i] + INNER_LENGTH; + while (currentValue < valueLimit) { + currentElements.push_back(currentValue); + ++currentValue; + } + } + + result->push_back(currentElements); + } + + return result; + } +} +%ignore CLASS::NAME; +%enddef + + +%include "interface/aiDefines.i" +%include "interface/aiTypes.i" +%include "interface/assimp.i" +%include "interface/aiTexture.i" +%include "interface/aiMatrix4x4.i" +%include "interface/aiMatrix3x3.i" +%include "interface/aiVector3D.i" +%include "interface/aiVector2D.i" +%include "interface/aiColor4D.i" +%include "interface/aiLight.i" +%include "interface/aiCamera.i" +%include "interface/aiFileIO.i" +%include "interface/aiAssert.i" +%include "interface/aiVersion.i" +%include "interface/aiAnim.i" +%include "interface/aiMaterial.i" +%include "interface/aiMesh.i" +%include "interface/aiPostProcess.i" +%include "interface/aiConfig.i" +%include "interface/assimp.i" +%include "interface/aiQuaternion.i" +%include "interface/aiScene.i" +%include "interface/Logger.i" +%include "interface/DefaultLogger.i" +%include "interface/NullLogger.i" +%include "interface/LogStream.i" +%include "interface/IOStream.i" +%include "interface/IOSystem.i" + + +// We have to "instanciate" the templates at the end to avoid running into +// forward reference issues (SWIG would spit out the vector helper functions +// before the header includes otherwise). + +%template(UintVector) std::vector; +%template(aiAnimationVector) std::vector; +%template(aiCameraVector) std::vector; +%template(aiColor4DVector) std::vector; +%template(aiColor4DVectorVector) std::vector >; +%template(aiFaceVector) std::vector; +%template(aiLightVector) std::vector; +%template(aiMaterialVector) std::vector; +%template(aiMeshVector) std::vector; +%template(aiNodeVector) std::vector; +%template(aiNodeAnimVector) std::vector; +%template(aiTextureVector) std::vector; +%template(aiVector3DVector) std::vector; +%template(aiVector3DVectorVector) std::vector >; diff --git a/port/swig/d/build.sh b/port/swig/d/build.sh new file mode 100755 index 000000000..0bf6bff6a --- /dev/null +++ b/port/swig/d/build.sh @@ -0,0 +1,2 @@ +#!/bin/sh +gcc -shared -fPIC -g3 -I../../../include/ -lassimp -olibassimp_wrap.so assimp_wrap.cxx diff --git a/port/swig/d/generate.sh b/port/swig/d/generate.sh new file mode 100755 index 000000000..7de66b1ff --- /dev/null +++ b/port/swig/d/generate.sh @@ -0,0 +1,4 @@ +#!/bin/sh +rm -rf assimp/ +mkdir assimp +swig -c++ -d -outcurrentdir -I../../../include -splitproxy -package assimp $@ ../assimp.i diff --git a/port/swig/interface/DefaultLogger.i b/port/swig/interface/DefaultLogger.i new file mode 100644 index 000000000..600d28e84 --- /dev/null +++ b/port/swig/interface/DefaultLogger.i @@ -0,0 +1,5 @@ +%{ +#include "DefaultLogger.h" +%} + +%include "DefaultLogger.h" diff --git a/port/swig/interface/IOStream.i b/port/swig/interface/IOStream.i new file mode 100644 index 000000000..baca5ef45 --- /dev/null +++ b/port/swig/interface/IOStream.i @@ -0,0 +1,5 @@ +%{ +#include "IOStream.h" +%} + +%include "IOStream.h" diff --git a/port/swig/interface/IOSystem.i b/port/swig/interface/IOSystem.i new file mode 100644 index 000000000..3e3e04a67 --- /dev/null +++ b/port/swig/interface/IOSystem.i @@ -0,0 +1,11 @@ +%{ +#include "IOSystem.h" +%} + +// The const char* overload is used instead. +%ignore Assimp::IOSystem::Exists(const std::string&) const; +%ignore Assimp::IOSystem::Open(const std::string& pFile); +%ignore Assimp::IOSystem::Open(const std::string& pFile, const std::string& pMode); +%ignore Assimp::IOSystem::ComparePaths(const std::string& one, const std::string& second) const; + +%include "IOSystem.h" diff --git a/port/swig/interface/LogStream.i b/port/swig/interface/LogStream.i new file mode 100644 index 000000000..022f8e586 --- /dev/null +++ b/port/swig/interface/LogStream.i @@ -0,0 +1,5 @@ +%{ +#include "LogStream.h" +%} + +%include "LogStream.h" diff --git a/port/swig/interface/Logger.i b/port/swig/interface/Logger.i new file mode 100644 index 000000000..cadc50b8e --- /dev/null +++ b/port/swig/interface/Logger.i @@ -0,0 +1,5 @@ +%{ +#include "Logger.h" +%} + +%include "Logger.h" diff --git a/port/swig/interface/NullLogger.i b/port/swig/interface/NullLogger.i new file mode 100644 index 000000000..5cf42edf5 --- /dev/null +++ b/port/swig/interface/NullLogger.i @@ -0,0 +1,5 @@ +%{ +#include "NullLogger.h" +%} + +%include "NullLogger.h" diff --git a/port/swig/interface/aiAnim.i b/port/swig/interface/aiAnim.i new file mode 100644 index 000000000..fa5b5476e --- /dev/null +++ b/port/swig/interface/aiAnim.i @@ -0,0 +1,7 @@ +%{ +#include "aiAnim.h" +%} + +ASSIMP_ARRAY(aiAnimation, aiNodeAnim*, mChannels, $self->mNumChannels); + +%include "aiAnim.h" diff --git a/port/swig/interface/aiAssert.i b/port/swig/interface/aiAssert.i new file mode 100644 index 000000000..bc8a9b88c --- /dev/null +++ b/port/swig/interface/aiAssert.i @@ -0,0 +1,5 @@ +%{ +#include "aiAssert.h" +%} + +%include "aiAssert.h" diff --git a/port/swig/interface/aiCamera.i b/port/swig/interface/aiCamera.i new file mode 100644 index 000000000..5c2124501 --- /dev/null +++ b/port/swig/interface/aiCamera.i @@ -0,0 +1,5 @@ +%{ +#include "aiCamera.h" +%} + +%include "aiCamera.h" diff --git a/port/swig/interface/aiColor4D.i b/port/swig/interface/aiColor4D.i new file mode 100644 index 000000000..3c009168b --- /dev/null +++ b/port/swig/interface/aiColor4D.i @@ -0,0 +1,5 @@ +%{ +#include "aiColor4D.h" +%} + +%include "aiColor4D.h" diff --git a/port/swig/interface/aiConfig.i b/port/swig/interface/aiConfig.i new file mode 100644 index 000000000..110abb3d6 --- /dev/null +++ b/port/swig/interface/aiConfig.i @@ -0,0 +1,5 @@ +%{ +#include "aiConfig.h" +%} + +%include "aiConfig.h" diff --git a/port/swig/interface/aiDefines.i b/port/swig/interface/aiDefines.i new file mode 100644 index 000000000..3a61ea62f --- /dev/null +++ b/port/swig/interface/aiDefines.i @@ -0,0 +1,5 @@ +%{ +#include "aiDefines.h" +%} + +%include "aiDefines.h" diff --git a/port/swig/interface/aiFileIO.i b/port/swig/interface/aiFileIO.i new file mode 100644 index 000000000..5a1e0923e --- /dev/null +++ b/port/swig/interface/aiFileIO.i @@ -0,0 +1,5 @@ +%{ +#include "aiFileIO.h" +%} + +%include "aiFileIO.h" diff --git a/port/swig/interface/aiLight.i b/port/swig/interface/aiLight.i new file mode 100644 index 000000000..fbefde7c0 --- /dev/null +++ b/port/swig/interface/aiLight.i @@ -0,0 +1,5 @@ +%{ +#include "aiLight.h" +%} + +%include "aiLight.h" diff --git a/port/swig/interface/aiMaterial.i b/port/swig/interface/aiMaterial.i new file mode 100644 index 000000000..5d6154f00 --- /dev/null +++ b/port/swig/interface/aiMaterial.i @@ -0,0 +1,18 @@ +%{ +#include "aiMaterial.h" +%} + +%include "aiMaterial.h" + +%include +%apply int &OUTPUT { int &pOut }; +%apply float &OUTPUT { float &pOut }; + +%template(GetInteger) aiMaterial::Get; +%template(GetFloat) aiMaterial::Get; +%template(GetColor4D) aiMaterial::Get; +%template(GetColor3D) aiMaterial::Get; +%template(GetString) aiMaterial::Get; + +%clear int &pOut; +%clear float &pOut; diff --git a/port/swig/interface/aiMatrix3x3.i b/port/swig/interface/aiMatrix3x3.i new file mode 100644 index 000000000..8336d447a --- /dev/null +++ b/port/swig/interface/aiMatrix3x3.i @@ -0,0 +1,5 @@ +%{ +#include "aiMatrix3x3.h" +%} + +%include "aiMatrix3x3.h" diff --git a/port/swig/interface/aiMatrix4x4.i b/port/swig/interface/aiMatrix4x4.i new file mode 100644 index 000000000..976c56b03 --- /dev/null +++ b/port/swig/interface/aiMatrix4x4.i @@ -0,0 +1,5 @@ +%{ +#include "aiMatrix4x4.h" +%} + +%include "aiMatrix4x4.h" diff --git a/port/swig/interface/aiMesh.i b/port/swig/interface/aiMesh.i new file mode 100644 index 000000000..baea9f8cd --- /dev/null +++ b/port/swig/interface/aiMesh.i @@ -0,0 +1,16 @@ +%{ +#include "aiMesh.h" +%} + + +ASSIMP_ARRAY(aiMesh, unsigned int, mNumUVComponents, AI_MAX_NUMBER_OF_TEXTURECOORDS); +ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mVertices, $self->mNumVertices); +ASSIMP_POINTER_ARRAY(aiMesh, aiVector3D, mNormals, $self->mNumVertices); +ASSIMP_POINTER_ARRAY(aiMesh, aiFace, mFaces, $self->mNumFaces); +ASSIMP_POINTER_ARRAY_ARRAY(aiMesh, aiVector3D, mTextureCoords, AI_MAX_NUMBER_OF_TEXTURECOORDS, $self->mNumVertices); +ASSIMP_POINTER_ARRAY_ARRAY(aiMesh, aiColor4D, mColors, AI_MAX_NUMBER_OF_COLOR_SETS, $self->mNumVertices); + +ASSIMP_ARRAY(aiFace, unsigned int, mIndices, $self->mNumIndices); + + +%include "aiMesh.h" diff --git a/port/swig/interface/aiPostProcess.i b/port/swig/interface/aiPostProcess.i new file mode 100644 index 000000000..5f64ec53a --- /dev/null +++ b/port/swig/interface/aiPostProcess.i @@ -0,0 +1,7 @@ +%{ +#include "aiPostProcess.h" +%} + +%feature("d:stripprefix", "aiProcess_") aiPostProcessSteps; + +%include "aiPostProcess.h" diff --git a/port/swig/interface/aiQuaternion.i b/port/swig/interface/aiQuaternion.i new file mode 100644 index 000000000..256057a22 --- /dev/null +++ b/port/swig/interface/aiQuaternion.i @@ -0,0 +1,5 @@ +%{ +#include "aiQuaternion.h" +%} + +%include "aiQuaternion.h" diff --git a/port/swig/interface/aiScene.i b/port/swig/interface/aiScene.i new file mode 100644 index 000000000..7278f3368 --- /dev/null +++ b/port/swig/interface/aiScene.i @@ -0,0 +1,17 @@ +%{ +#include "aiScene.h" +%} + + +ASSIMP_ARRAY(aiScene, aiAnimation*, mAnimations, $self->mNumAnimations); +ASSIMP_ARRAY(aiScene, aiCamera*, mCameras, $self->mNumCameras); +ASSIMP_ARRAY(aiScene, aiLight*, mLights, $self->mNumLights); +ASSIMP_ARRAY(aiScene, aiMaterial*, mMaterials, $self->mNumMaterials); +ASSIMP_ARRAY(aiScene, aiMesh*, mMeshes, $self->mNumMeshes); +ASSIMP_ARRAY(aiScene, aiTexture*, mTextures, $self->mNumTextures); + +ASSIMP_ARRAY(aiNode, aiNode*, mChildren, $self->mNumChildren); +ASSIMP_ARRAY(aiNode, unsigned int, mMeshes, $self->mNumMeshes); + + +%include "aiScene.h" diff --git a/port/swig/interface/aiTexture.i b/port/swig/interface/aiTexture.i new file mode 100644 index 000000000..d07d00190 --- /dev/null +++ b/port/swig/interface/aiTexture.i @@ -0,0 +1,5 @@ +%{ +#include "aiTexture.h" +%} + +%include "aiTexture.h" diff --git a/port/swig/interface/aiTypes.i b/port/swig/interface/aiTypes.i new file mode 100644 index 000000000..a086dfd30 --- /dev/null +++ b/port/swig/interface/aiTypes.i @@ -0,0 +1,8 @@ +%{ +#include "aiTypes.h" +%} + +// The const char* overload is used instead. +%ignore aiString::Set(const std::string& pString); + +%include "aiTypes.h" diff --git a/port/swig/interface/aiVector2D.i b/port/swig/interface/aiVector2D.i new file mode 100644 index 000000000..5db15c0e6 --- /dev/null +++ b/port/swig/interface/aiVector2D.i @@ -0,0 +1,5 @@ +%{ +#include "aiVector2D.h" +%} + +%include "aiVector2D.h" diff --git a/port/swig/interface/aiVector3D.i b/port/swig/interface/aiVector3D.i new file mode 100644 index 000000000..2c83f605f --- /dev/null +++ b/port/swig/interface/aiVector3D.i @@ -0,0 +1,5 @@ +%{ +#include "aiVector3D.h" +%} + +%include "aiVector3D.h" diff --git a/port/swig/interface/aiVersion.i b/port/swig/interface/aiVersion.i new file mode 100644 index 000000000..9ddd532ef --- /dev/null +++ b/port/swig/interface/aiVersion.i @@ -0,0 +1,5 @@ +%{ +#include "aiVersion.h" +%} + +%include "aiVersion.h" diff --git a/port/swig/interface/assimp.i b/port/swig/interface/assimp.i new file mode 100644 index 000000000..932726bdf --- /dev/null +++ b/port/swig/interface/assimp.i @@ -0,0 +1,41 @@ +%{ +#include "assimp.hpp" +%} + + +namespace Assimp { + +// See docs in assimp.hpp. +%ignore Importer::ReadFile(const std::string& pFile, unsigned int pFlags); +%ignore Importer::GetExtensionList(std::string& szOut); +%ignore Importer::IsExtensionSupported(const std::string& szExtension); + +// These are only neccessary for extending Assimp with custom importers or post +// processing steps, which would require wrapping the internal BaseImporter and +// BaseProcess classes. +%ignore Importer::RegisterLoader(BaseImporter* pImp); +%ignore Importer::UnregisterLoader(BaseImporter* pImp); +%ignore Importer::RegisterPPStep(BaseProcess* pImp); +%ignore Importer::UnregisterPPStep(BaseProcess* pImp); +%ignore Importer::FindLoader(const char* szExtension); + +} + + +// Each aiScene has to keep a reference to the Importer to prevent it from +// being garbage collected, whose destructor would release the underlying +// C++ memory the scene is stored in. +%typemap(dcode) aiScene "package Object m_importer;" +%typemap(dout) + aiScene* GetScene, + aiScene* ReadFile, + aiScene* ApplyPostProcessing, + aiScene* ReadFileFromMemory { + void* cPtr = $wcall; + $dclassname ret = (cPtr is null) ? null : new $dclassname(cPtr, $owner);$excode + ret.m_importer = this; + return ret; +} + + +%include "assimp.hpp"