Selaa lähdekoodia

Merge branch 'master' into master

Kim Kulling 5 vuotta sitten
vanhempi
commit
79aeb65ab4
7 muutettua tiedostoa jossa 159 lisäystä ja 141 poistoa
  1. 1 0
      Build.md
  2. 15 1
      CMakeLists.txt
  3. 2 2
      code/Common/Exporter.cpp
  4. 1 1
      code/M3D/M3DExporter.cpp
  5. 1 1
      code/glTF/glTFAsset.h
  6. 1 1
      code/glTF2/glTF2Asset.h
  7. 138 135
      port/PyAssimp/pyassimp/structs.py

+ 1 - 0
Build.md

@@ -77,6 +77,7 @@ The cmake-build-environment provides options to configure the build. The followi
 - **ASSIMP_BUILD_SAMPLES ( default OFF )**: If the official samples are built as well (needs Glut).
 - **ASSIMP_BUILD_TESTS ( default ON )**: If the test suite for Assimp is built in addition to the library.
 - **ASSIMP_COVERALLS ( default OFF )**: Enable this to measure test coverage.
+- **ASSIMP_ERROR_MAX( default OFF)**: Enable all warnings.
 - **ASSIMP_WERROR( default OFF )**: Treat warnings as errors.
 - **ASSIMP_ASAN ( default OFF )**: Enable AddressSanitizer.
 - **ASSIMP_UBSAN ( default OFF )**: Enable Undefined Behavior sanitizer.

+ 15 - 1
CMakeLists.txt

@@ -100,6 +100,10 @@ OPTION ( ASSIMP_COVERALLS
   "Enable this to measure test coverage."
   OFF
 )
+OPTION ( ASSIMP_ERROR_MAX
+  "Enable all warnings."
+  OFF
+)
 OPTION ( ASSIMP_WERROR
   "Treat warnings as errors."
   OFF
@@ -253,7 +257,7 @@ ELSEIF(MSVC)
   IF(MSVC12)
     ADD_COMPILE_OPTIONS(/wd4351)
   ENDIF()
-  SET(CMAKE_CXX_FLAGS_DEBUG "/D_DEBUG /MDd /Zi /Od")
+  SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_DEBUG /Zi /Od")
 ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
   IF(NOT HUNTER_ENABLED)
     SET(CMAKE_CXX_FLAGS "-fPIC -std=c++11 ${CMAKE_CXX_FLAGS}")
@@ -294,6 +298,16 @@ IF (ASSIMP_COVERALLS)
   SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
 ENDIF()
 
+IF (ASSIMP_ERROR_MAX)
+  MESSAGE(STATUS "Turning on all warnings")
+  IF (MSVC)
+    ADD_COMPILE_OPTIONS(/W4) # NB: there is a /Wall option, pedantic mode
+  ELSE()
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
+  ENDIF()
+ENDIF()
+
 IF (ASSIMP_WERROR)
   MESSAGE(STATUS "Treating warnings as errors")
   IF (MSVC)

+ 2 - 2
code/Common/Exporter.cpp

@@ -103,7 +103,7 @@ void ExportSceneFBX(const char*, IOSystem*, const aiScene*, const ExportProperti
 void ExportSceneFBXA(const char*, IOSystem*, const aiScene*, const ExportProperties*);
 void ExportScene3MF( const char*, IOSystem*, const aiScene*, const ExportProperties* );
 void ExportSceneM3D(const char*, IOSystem*, const aiScene*, const ExportProperties*);
-void ExportSceneA3D(const char*, IOSystem*, const aiScene*, const ExportProperties*);
+void ExportSceneM3DA(const char*, IOSystem*, const aiScene*, const ExportProperties*);
 void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::ExportProperties*);
 
 
@@ -177,7 +177,7 @@ static void setupExporterArray(std::vector<Exporter::ExportFormatEntry> &exporte
 
 #ifndef ASSIMP_BUILD_NO_M3D_EXPORTER
 	exporters.push_back(Exporter::ExportFormatEntry("m3d", "Model 3D (binary)", "m3d", &ExportSceneM3D, 0));
-	exporters.push_back(Exporter::ExportFormatEntry("a3d", "Model 3D (ascii)", "m3d", &ExportSceneA3D, 0));
+	exporters.push_back(Exporter::ExportFormatEntry("m3da", "Model 3D (ascii)", "a3d", &ExportSceneM3DA, 0));
 #endif
 
 #ifndef ASSIMP_BUILD_NO_3MF_EXPORTER

+ 1 - 1
code/M3D/M3DExporter.cpp

@@ -289,7 +289,7 @@ void ExportSceneM3D(
 // ---------------------------------------------------------------------
 // Worker function for exporting a scene to ASCII A3D.
 // Prototyped and registered in Exporter.cpp
-void ExportSceneA3D(
+void ExportSceneM3DA(
 		const char *pFile,
 		IOSystem *pIOSystem,
 		const aiScene *pScene,

+ 1 - 1
code/glTF/glTFAsset.h

@@ -749,7 +749,7 @@ namespace glTF
 		/// \fn void Read(Value& pJSON_Object, Asset& pAsset_Root)
 		/// Get mesh data from JSON-object and place them to root asset.
 		/// \param [in] pJSON_Object - reference to pJSON-object from which data are read.
-		/// \param [out] pAsset_Root - reference to root assed where data will be stored.
+		/// \param [out] pAsset_Root - reference to root asset where data will be stored.
 		void Read(Value& pJSON_Object, Asset& pAsset_Root);
 
 		#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC

+ 1 - 1
code/glTF2/glTF2Asset.h

@@ -783,7 +783,7 @@ namespace glTF2
 		/// \fn void Read(Value& pJSON_Object, Asset& pAsset_Root)
 		/// Get mesh data from JSON-object and place them to root asset.
 		/// \param [in] pJSON_Object - reference to pJSON-object from which data are read.
-		/// \param [out] pAsset_Root - reference to root assed where data will be stored.
+		/// \param [out] pAsset_Root - reference to root asset where data will be stored.
 		void Read(Value& pJSON_Object, Asset& pAsset_Root);
     };
 

+ 138 - 135
port/PyAssimp/pyassimp/structs.py

@@ -1,4 +1,4 @@
-#-*- coding: UTF-8 -*-
+#-*- coding: utf-8 -*-
 
 from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte, c_size_t, c_uint32
 
@@ -6,7 +6,7 @@ from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_char
 class Vector2D(Structure):
     """
     See 'vector2.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -16,7 +16,7 @@ class Vector2D(Structure):
 class Matrix3x3(Structure):
     """
     See 'matrix3x3.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -28,7 +28,7 @@ class Matrix3x3(Structure):
 class Texel(Structure):
     """
     See 'texture.h' for details.
-    """ 
+    """
 
     _fields_ = [
             ("b", c_ubyte),("g", c_ubyte),("r", c_ubyte),("a", c_ubyte),
@@ -37,7 +37,7 @@ class Texel(Structure):
 class Color4D(Structure):
     """
     See 'color4.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -48,7 +48,7 @@ class Color4D(Structure):
 class Plane(Structure):
     """
     See 'types.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  Plane equation
@@ -58,7 +58,7 @@ class Plane(Structure):
 class Color3D(Structure):
     """
     See 'types.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  Red, green and blue color values
@@ -68,7 +68,7 @@ class Color3D(Structure):
 class String(Structure):
     """
     See 'types.h' for details.
-    """ 
+    """
 
     MAXLEN = 1024
 
@@ -76,8 +76,8 @@ class String(Structure):
             # Binary length of the string excluding the terminal 0. This is NOT the
             #  logical length of strings containing UTF-8 multibyte sequences! It's
             #  the number of bytes from the beginning of the string to its end.
-            ("length", c_size_t),
-            
+            ("length", c_uint32),
+
             # String buffer. Size limit is MAXLEN
             ("data", c_char*MAXLEN),
         ]
@@ -85,7 +85,7 @@ class String(Structure):
 class MaterialPropertyString(Structure):
     """
     See 'MaterialSystem.cpp' for details.
-    
+
     The size of length is truncated to 4 bytes on 64-bit platforms when used as a
     material property (see MaterialSystem.cpp aiMaterial::AddProperty() for details).
     """
@@ -97,7 +97,7 @@ class MaterialPropertyString(Structure):
             #  logical length of strings containing UTF-8 multibyte sequences! It's
             #  the number of bytes from the beginning of the string to its end.
             ("length", c_uint32),
-            
+
             # String buffer. Size limit is MAXLEN
             ("data", c_char*MAXLEN),
         ]
@@ -105,30 +105,30 @@ class MaterialPropertyString(Structure):
 class MemoryInfo(Structure):
     """
     See 'types.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # Storage allocated for texture data
             ("textures", c_uint),
-            
+
             # Storage allocated for material data
             ("materials", c_uint),
-            
+
             # Storage allocated for mesh data
             ("meshes", c_uint),
-            
+
             # Storage allocated for node data
             ("nodes", c_uint),
-            
+
             # Storage allocated for animation data
             ("animations", c_uint),
-            
+
             # Storage allocated for camera data
             ("cameras", c_uint),
-            
+
             # Storage allocated for light data
             ("lights", c_uint),
-            
+
             # Total storage allocated for the full import.
             ("total", c_uint),
         ]
@@ -136,7 +136,7 @@ class MemoryInfo(Structure):
 class Quaternion(Structure):
     """
     See 'quaternion.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -147,14 +147,14 @@ class Quaternion(Structure):
 class Face(Structure):
     """
     See 'mesh.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  Number of indices defining this face.
             #  The maximum value for this member is
             #AI_MAX_FACE_INDICES.
             ("mNumIndices", c_uint),
-            
+
             #  Pointer to the indices array. Size of the array is given in numIndices.
             ("mIndices", POINTER(c_uint)),
         ]
@@ -162,12 +162,12 @@ class Face(Structure):
 class VertexWeight(Structure):
     """
     See 'mesh.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  Index of the vertex which is influenced by the bone.
             ("mVertexId", c_uint),
-            
+
             #  The strength of the influence in the range (0...1).
             #  The influence from all bones at one vertex amounts to 1.
             ("mWeight", c_float),
@@ -176,7 +176,7 @@ class VertexWeight(Structure):
 class Matrix4x4(Structure):
     """
     See 'matrix4x4.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -189,7 +189,7 @@ class Matrix4x4(Structure):
 class Vector3D(Structure):
     """
     See 'vector3.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -199,12 +199,12 @@ class Vector3D(Structure):
 class MeshKey(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The time of this key
             ("mTime", c_double),
-            
+
             # Index into the aiMesh::mAnimMeshes array of the
             #  mesh corresponding to the
             #aiMeshAnim hosting this
@@ -252,7 +252,7 @@ class Metadata(Structure):
 class Node(Structure):
     """
     See 'scene.h' for details.
-    """ 
+    """
 
 
 Node._fields_ = [
@@ -270,22 +270,22 @@ Node._fields_ = [
             # this text. You should be able to handle stuff like whitespace, tabs,
             # linefeeds, quotation marks, ampersands, ... .
             ("mName", String),
-            
+
             # The transformation relative to the node's parent.
             ("mTransformation", Matrix4x4),
-            
+
             # Parent node. NULL if this node is the root node.
             ("mParent", POINTER(Node)),
-            
+
             # The number of child nodes of this node.
             ("mNumChildren", c_uint),
-            
+
             # The child nodes of this node. NULL if mNumChildren is 0.
             ("mChildren", POINTER(POINTER(Node))),
-            
+
             # The number of meshes of this node.
             ("mNumMeshes", c_uint),
-            
+
             # The meshes of this node. Each entry is an index into the mesh
             ("mMeshes", POINTER(c_uint)),
 
@@ -297,7 +297,7 @@ Node._fields_ = [
 class Light(Structure):
     """
     See 'light.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -306,22 +306,22 @@ class Light(Structure):
             #  This node specifies the position of the light in the scene
             #  hierarchy and can be animated.
             ("mName", String),
-            
+
             # The type of the light source.
             # aiLightSource_UNDEFINED is not a valid value for this member.
             ("mType", c_uint),
-            
+
             # Position of the light source in space. Relative to the
             #  transformation of the node corresponding to the light.
             #  The position is undefined for directional lights.
             ("mPosition", Vector3D),
-            
+
             # Direction of the light source in space. Relative to the
             #  transformation of the node corresponding to the light.
             #  The direction is undefined for point lights. The vector
             #  may be normalized, but it needn't.
             ("mDirection", Vector3D),
-            
+
             # Up direction of the light source in space. Relative to the
             #  transformation of the node corresponding to the light.
             #
@@ -340,7 +340,7 @@ class Light(Structure):
             #  This member corresponds to the att0 variable in the equation.
             #  Naturally undefined for directional lights.
             ("mAttenuationConstant", c_float),
-            
+
             # Linear light attenuation factor.
             #  The intensity of the light source at a given distance 'd' from
             #  the light's position is
@@ -352,7 +352,7 @@ class Light(Structure):
             #  This member corresponds to the att1 variable in the equation.
             #  Naturally undefined for directional lights.
             ("mAttenuationLinear", c_float),
-            
+
             # Quadratic light attenuation factor.
             #  The intensity of the light source at a given distance 'd' from
             #  the light's position is
@@ -364,19 +364,19 @@ class Light(Structure):
             #  This member corresponds to the att2 variable in the equation.
             #  Naturally undefined for directional lights.
             ("mAttenuationQuadratic", c_float),
-            
+
             # Diffuse color of the light source
             #  The diffuse light color is multiplied with the diffuse
             #  material color to obtain the final color that contributes
             #  to the diffuse shading term.
             ("mColorDiffuse", Color3D),
-            
+
             # Specular color of the light source
             #  The specular light color is multiplied with the specular
             #  material color to obtain the final color that contributes
             #  to the specular shading term.
             ("mColorSpecular", Color3D),
-            
+
             # Ambient color of the light source
             #  The ambient light color is multiplied with the ambient
             #  material color to obtain the final color that contributes
@@ -384,13 +384,13 @@ class Light(Structure):
             #  this value it, is just a remaining of the fixed-function pipeline
             #  that is still supported by quite many file formats.
             ("mColorAmbient", Color3D),
-            
+
             # Inner angle of a spot light's light cone.
             #  The spot light has maximum influence on objects inside this
             #  angle. The angle is given in radians. It is 2PI for point
             #  lights and undefined for directional lights.
             ("mAngleInnerCone", c_float),
-            
+
             # Outer angle of a spot light's light cone.
             #  The spot light does not affect objects outside this angle.
             #  The angle is given in radians. It is 2PI for point lights and
@@ -408,7 +408,7 @@ class Light(Structure):
 class Texture(Structure):
     """
     See 'texture.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -417,15 +417,15 @@ class Texture(Structure):
             # like JPEG. In this case mWidth specifies the size of the
             # memory area pcData is pointing to, in bytes.
             ("mWidth", c_uint),
-            
+
             # Height of the texture, in pixels
             # If this value is zero, pcData points to an compressed texture
             # in any format (e.g. JPEG).
             ("mHeight", c_uint),
-            
+
             # A hint from the loader to make it easier for applications
             # to determine the type of embedded textures.
-            # 
+            #
             # If mHeight != 0 this member is show how data is packed. Hint will consist of
             # two parts: channel order and channel bitness (count of the bits for every
             # color channel). For simple parsing by the viewer it's better to not omit
@@ -443,7 +443,7 @@ class Texture(Structure):
             # E.g. 'dds\\0', 'pcx\\0', 'jpg\\0'.  All characters are lower-case.
             # The fourth character will always be '\\0'.
             ("achFormatHint", c_char*9),
-            
+
             # Data of the texture.
             # Points to an array of mWidth
             # mHeight aiTexel's.
@@ -462,7 +462,7 @@ class Texture(Structure):
 class Ray(Structure):
     """
     See 'types.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  Position and direction of the ray
@@ -472,17 +472,17 @@ class Ray(Structure):
 class UVTransform(Structure):
     """
     See 'material.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # Translation on the u and v axes.
             #  The default value is (0|0).
             ("mTranslation", Vector2D),
-            
+
             # Scaling on the u and v axes.
             #  The default value is (1|1).
             ("mScaling", Vector2D),
-            
+
             # Rotation - in counter-clockwise direction.
             #  The rotation angle is specified in radians. The
             #  rotation center is 0.5f|0.5f. The default value
@@ -493,34 +493,34 @@ class UVTransform(Structure):
 class MaterialProperty(Structure):
     """
     See 'material.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # Specifies the name of the property (key)
             #  Keys are generally case insensitive.
             ("mKey", String),
-            
+
             # Textures: Specifies their exact usage semantic.
             # For non-texture properties, this member is always 0
             # (or, better-said,
             #aiTextureType_NONE).
             ("mSemantic", c_uint),
-            
+
             # Textures: Specifies the index of the texture.
             #  For non-texture properties, this member is always 0.
             ("mIndex", c_uint),
-            
+
             # Size of the buffer mData is pointing to, in bytes.
             #  This value may not be 0.
             ("mDataLength", c_uint),
-            
+
             # Type information for the property.
             # Defines the data layout inside the data buffer. This is used
             # by the library internally to perform debug checks and to
             # utilize proper type conversions.
             # (It's probably a hacky solution, but it works.)
             ("mType", c_uint),
-            
+
             # Binary buffer to hold the property's value.
             # The size of the buffer is always mDataLength.
             ("mData", POINTER(c_char)),
@@ -529,15 +529,15 @@ class MaterialProperty(Structure):
 class Material(Structure):
     """
     See 'material.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # List of all material properties loaded.
             ("mProperties", POINTER(POINTER(MaterialProperty))),
-            
+
             # Number of properties in the data base
             ("mNumProperties", c_uint),
-            
+
             # Storage allocated
             ("mNumAllocated", c_uint),
         ]
@@ -545,20 +545,20 @@ class Material(Structure):
 class Bone(Structure):
     """
     See 'mesh.h' for details.
-    """ 
+    """
 
     _fields_ = [
             #  The name of the bone.
             ("mName", String),
-            
+
             #  The number of vertices affected by this bone
             #  The maximum value for this member is
             #AI_MAX_BONE_WEIGHTS.
             ("mNumWeights", c_uint),
-            
+
             #  The vertices affected by this bone
             ("mWeights", POINTER(VertexWeight)),
-            
+
             #  Matrix that transforms from mesh space to bone space in bind pose
             ("mOffsetMatrix", Matrix4x4),
         ]
@@ -567,12 +567,15 @@ class Bone(Structure):
 class AnimMesh(Structure):
     """
     See 'mesh.h' for details.
-    """ 
+    """
 
     AI_MAX_NUMBER_OF_TEXTURECOORDS = 0x8
     AI_MAX_NUMBER_OF_COLOR_SETS = 0x8
 
     _fields_ = [
+            #  Anim Mesh name
+            ("mName", String),
+
             # Replacement for aiMesh::mVertices. If this array is non-NULL,
             # it *must* contain mNumVertices entries. The corresponding
             # array in the host mesh must be non-NULL as well - animation
@@ -613,7 +616,7 @@ class AnimMesh(Structure):
 class Mesh(Structure):
     """
     See 'mesh.h' for details.
-    """ 
+    """
 
     AI_MAX_FACE_INDICES = 0x7fff
     AI_MAX_BONE_WEIGHTS = 0x7fffffff
@@ -628,24 +631,24 @@ class Mesh(Structure):
             # The "SortByPrimitiveType"-Step can be used to make sure the
             # output meshes consist of one primitive type each.
             ("mPrimitiveTypes", c_uint),
-            
+
             # The number of vertices in this mesh.
             # This is also the size of all of the per-vertex data arrays.
             # The maximum value for this member is
             #AI_MAX_VERTICES.
             ("mNumVertices", c_uint),
-            
+
             # The number of primitives (triangles, polygons, lines) in this  mesh.
             # This is also the size of the mFaces array.
             # The maximum value for this member is
             #AI_MAX_FACES.
             ("mNumFaces", c_uint),
-            
+
             # Vertex positions.
             # This array is always present in a mesh. The array is
             # mNumVertices in size.
             ("mVertices", POINTER(Vector3D)),
-            
+
             # Vertex normals.
             # The array contains normalized vectors, NULL if not present.
             # The array is mNumVertices in size. Normals are undefined for
@@ -666,7 +669,7 @@ class Mesh(Structure):
             # However, this needn't apply for normals that have been taken
             #   directly from the model file.
             ("mNormals", POINTER(Vector3D)),
-            
+
             # Vertex tangents.
             # The tangent of a vertex points in the direction of the positive
             # X texture axis. The array contains normalized vectors, NULL if
@@ -681,7 +684,7 @@ class Mesh(Structure):
             # contains bitangents (the bitangent is just the cross product of
             # tangent and normal vectors).
             ("mTangents", POINTER(Vector3D)),
-            
+
             # Vertex bitangents.
             # The bitangent of a vertex points in the direction of the positive
             # Y texture axis. The array contains normalized vectors, NULL if not
@@ -689,19 +692,19 @@ class Mesh(Structure):
             # @note If the mesh contains tangents, it automatically also contains
             # bitangents.
             ("mBitangents", POINTER(Vector3D)),
-            
+
             # Vertex color sets.
             # A mesh may contain 0 to
             #AI_MAX_NUMBER_OF_COLOR_SETS vertex
             # colors per vertex. NULL if not present. Each array is
             # mNumVertices in size if present.
             ("mColors", POINTER(Color4D)*AI_MAX_NUMBER_OF_COLOR_SETS),
-            
+
             # Vertex texture coords, also known as UV channels.
             # A mesh may contain 0 to AI_MAX_NUMBER_OF_TEXTURECOORDS per
             # vertex. NULL if not present. The array is mNumVertices in size.
             ("mTextureCoords", POINTER(Vector3D)*AI_MAX_NUMBER_OF_TEXTURECOORDS),
-            
+
             # Specifies the number of components for a given UV channel.
             # Up to three channels are supported (UVW, for accessing volume
             # or cube maps). If the value is 2 for a given channel n, the
@@ -709,7 +712,7 @@ class Mesh(Structure):
             # If the value is 1 for a given channel, p.y is set to 0.0f, too.
             # @note 4D coords are not supported
             ("mNumUVComponents", c_uint*AI_MAX_NUMBER_OF_TEXTURECOORDS),
-            
+
             # The faces the mesh is constructed from.
             # Each face refers to a number of vertices by their indices.
             # This array is always present in a mesh, its size is given
@@ -717,22 +720,22 @@ class Mesh(Structure):
             #AI_SCENE_FLAGS_NON_VERBOSE_FORMAT
             # is NOT set each face references an unique set of vertices.
             ("mFaces", POINTER(Face)),
-            
+
             # The number of bones this mesh contains.
             # Can be 0, in which case the mBones array is NULL.
             ("mNumBones", c_uint),
-            
+
             # The bones of this mesh.
             # A bone consists of a name by which it can be found in the
             # frame hierarchy and a set of vertex weights.
             ("mBones", POINTER(POINTER(Bone))),
-            
+
             # The material used by this mesh.
             # A mesh does use only a single material. If an imported model uses
             # multiple materials, the import splits up the mesh. Use this value
             # as index into the scene's material list.
             ("mMaterialIndex", c_uint),
-            
+
             # Name of the mesh. Meshes can be named, but this is not a
             #  requirement and leaving this field empty is totally fine.
             #  There are mainly three uses for mesh names:
@@ -744,15 +747,15 @@ class Mesh(Structure):
             #      partitioning.
             #   - Vertex animations refer to meshes by their names.
             ("mName", String),
-            
+
             # The number of attachment meshes. Note! Currently only works with Collada loader.
             ("mNumAnimMeshes", c_uint),
-            
+
             # Attachment meshes for this mesh, for vertex-based animation.
             # Attachment meshes carry replacement data for some of the
             # mesh'es vertex components (usually positions, normals).
             # Note! Currently only works with Collada loader.
-            ("mAnimMesh", POINTER(POINTER(AnimMesh))),
+            ("mAnimMeshes", POINTER(POINTER(AnimMesh))),
 
             # Method of morphing when animeshes are specified.
             ("mMethod", c_uint),
@@ -762,7 +765,7 @@ class Mesh(Structure):
 class Camera(Structure):
     """
     See 'camera.h' for details.
-    """ 
+    """
 
 
     _fields_ = [
@@ -771,12 +774,12 @@ class Camera(Structure):
             #  This node specifies the position of the camera in the scene
             #  hierarchy and can be animated.
             ("mName", String),
-            
+
             # Position of the camera relative to the coordinate space
             #  defined by the corresponding node.
             #  The default value is 0|0|0.
             ("mPosition", Vector3D),
-            
+
             # 'Up' - vector of the camera coordinate system relative to
             #  the coordinate space defined by the corresponding node.
             #  The 'right' vector of the camera coordinate system is
@@ -784,25 +787,25 @@ class Camera(Structure):
             #  The default value is 0|1|0. The vector
             #  may be normalized, but it needn't.
             ("mUp", Vector3D),
-            
+
             # 'LookAt' - vector of the camera coordinate system relative to
             #  the coordinate space defined by the corresponding node.
             #  This is the viewing direction of the user.
             #  The default value is 0|0|1. The vector
             #  may be normalized, but it needn't.
             ("mLookAt", Vector3D),
-            
+
             # Half horizontal field of view angle, in radians.
             #  The field of view angle is the angle between the center
             #  line of the screen and the left or right border.
             #  The default value is 1/4PI.
             ("mHorizontalFOV", c_float),
-            
+
             # Distance of the near clipping plane from the camera.
             # The value may not be 0.f (for arithmetic reasons to prevent
             # a division through zero). The default value is 0.1f.
             ("mClipPlaneNear", c_float),
-            
+
             # Distance of the far clipping plane from the camera.
             # The far clipping plane must, of course, be further away than the
             # near clipping plane. The default value is 1000.f. The ratio
@@ -810,7 +813,7 @@ class Camera(Structure):
             # large (between 1000-10000 should be ok) to avoid floating-point
             # inaccuracies which could lead to z-fighting.
             ("mClipPlaneFar", c_float),
-            
+
             # Screen aspect ratio.
             # This is the ration between the width and the height of the
             # screen. Typical values are 4/3, 1/2 or 1/1. This value is
@@ -822,12 +825,12 @@ class Camera(Structure):
 class VectorKey(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The time of this key
             ("mTime", c_double),
-            
+
             # The value of this key
             ("mValue", Vector3D),
         ]
@@ -835,12 +838,12 @@ class VectorKey(Structure):
 class QuatKey(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The time of this key
             ("mTime", c_double),
-            
+
             # The value of this key
             ("mValue", Quaternion),
         ]
@@ -848,7 +851,7 @@ class QuatKey(Structure):
 class MeshMorphKey(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The time of this key
@@ -866,47 +869,47 @@ class MeshMorphKey(Structure):
 class NodeAnim(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The name of the node affected by this animation. The node
             #  must exist and it must be unique.
             ("mNodeName", String),
-            
+
             # The number of position keys
             ("mNumPositionKeys", c_uint),
-            
+
             # The position keys of this animation channel. Positions are
             # specified as 3D vector. The array is mNumPositionKeys in size.
             # If there are position keys, there will also be at least one
             # scaling and one rotation key.
             ("mPositionKeys", POINTER(VectorKey)),
-            
+
             # The number of rotation keys
             ("mNumRotationKeys", c_uint),
-            
+
             # The rotation keys of this animation channel. Rotations are
             #  given as quaternions,  which are 4D vectors. The array is
             #  mNumRotationKeys in size.
             # If there are rotation keys, there will also be at least one
             # scaling and one position key.
             ("mRotationKeys", POINTER(QuatKey)),
-            
+
             # The number of scaling keys
             ("mNumScalingKeys", c_uint),
-            
+
             # The scaling keys of this animation channel. Scalings are
             #  specified as 3D vector. The array is mNumScalingKeys in size.
             # If there are scaling keys, there will also be at least one
             # position and one rotation key.
             ("mScalingKeys", POINTER(VectorKey)),
-            
+
             # Defines how the animation behaves before the first
             #  key is encountered.
             #  The default value is aiAnimBehaviour_DEFAULT (the original
             #  transformation matrix of the affected node is used).
             ("mPreState", c_uint),
-            
+
             # Defines how the animation behaves after the last
             #  key was processed.
             #  The default value is aiAnimBehaviour_DEFAULT (the original
@@ -917,7 +920,7 @@ class NodeAnim(Structure):
 class MeshAnim(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # Name of the mesh to be animated. An empty string is not allowed,
@@ -936,7 +939,7 @@ class MeshAnim(Structure):
 class MeshMorphAnim(Structure):
     """
     See 'anim.h' for details.
-    """     
+    """
 
     _fields_ = [
             # Name of the mesh to be animated. An empty string is not allowed,
@@ -956,32 +959,32 @@ class MeshMorphAnim(Structure):
 class Animation(Structure):
     """
     See 'anim.h' for details.
-    """ 
+    """
 
     _fields_ = [
             # The name of the animation. If the modeling package this data was
             #  exported from does support only a single animation channel, this
             #  name is usually empty (length is zero).
             ("mName", String),
-            
+
             # Duration of the animation in ticks.
             ("mDuration", c_double),
-            
+
             # Ticks per second. 0 if not specified in the imported file
             ("mTicksPerSecond", c_double),
-            
+
             # The number of bone animation channels. Each channel affects
             #  a single node.
             ("mNumChannels", c_uint),
-            
+
             # The node animation channels. Each channel affects a single node.
             #  The array is mNumChannels in size.
             ("mChannels", POINTER(POINTER(NodeAnim))),
-            
+
             # The number of mesh animation channels. Each channel affects
             #  a single mesh and defines vertex-based animation.
             ("mNumMeshChannels", c_uint),
-            
+
             # The mesh animation channels. Each channel affects a single mesh.
             #  The array is mNumMeshChannels in size.
             ("mMeshChannels", POINTER(POINTER(MeshAnim))),
@@ -991,7 +994,7 @@ class Animation(Structure):
             ("mNumMorphMeshChannels", c_uint),
 
             # The morph mesh animation channels. Each channel affects a single mesh.
-            # The array is mNumMorphMeshChannels in size. 
+            # The array is mNumMorphMeshChannels in size.
             ("mMorphMeshChannels", POINTER(POINTER(MeshMorphAnim))),
 
         ]
@@ -1032,7 +1035,7 @@ ExportDataBlob._fields_ = [
 class Scene(Structure):
     """
     See 'aiScene.h' for details.
-    """ 
+    """
 
     AI_SCENE_FLAGS_INCOMPLETE = 0x1
     AI_SCENE_FLAGS_VALIDATED = 0x2
@@ -1047,64 +1050,64 @@ class Scene(Structure):
             # want to reject all scenes with the AI_SCENE_FLAGS_INCOMPLETE
             # bit set.
             ("mFlags", c_uint),
-            
+
             # The root node of the hierarchy.
             # There will always be at least the root node if the import
             # was successful (and no special flags have been set).
             # Presence of further nodes depends on the format and content
             # of the imported file.
             ("mRootNode", POINTER(Node)),
-            
+
             # The number of meshes in the scene.
             ("mNumMeshes", c_uint),
-            
+
             # The array of meshes.
             # Use the indices given in the aiNode structure to access
             # this array. The array is mNumMeshes in size. If the
             # AI_SCENE_FLAGS_INCOMPLETE flag is not set there will always
             # be at least ONE material.
             ("mMeshes", POINTER(POINTER(Mesh))),
-            
+
             # The number of materials in the scene.
             ("mNumMaterials", c_uint),
-            
+
             # The array of materials.
             # Use the index given in each aiMesh structure to access this
             # array. The array is mNumMaterials in size. If the
             # AI_SCENE_FLAGS_INCOMPLETE flag is not set there will always
             # be at least ONE material.
             ("mMaterials", POINTER(POINTER(Material))),
-            
+
             # The number of animations in the scene.
             ("mNumAnimations", c_uint),
-            
+
             # The array of animations.
             # All animations imported from the given file are listed here.
             # The array is mNumAnimations in size.
             ("mAnimations", POINTER(POINTER(Animation))),
-            
+
             # The number of textures embedded into the file
             ("mNumTextures", c_uint),
-            
+
             # The array of embedded textures.
             # Not many file formats embed their textures into the file.
             # An example is Quake's MDL format (which is also used by
             # some GameStudio versions)
             ("mTextures", POINTER(POINTER(Texture))),
-            
+
             # The number of light sources in the scene. Light sources
             # are fully optional, in most cases this attribute will be 0
             ("mNumLights", c_uint),
-            
+
             # The array of light sources.
             # All light sources imported from the given file are
             # listed here. The array is mNumLights in size.
             ("mLights", POINTER(POINTER(Light))),
-            
+
             # The number of cameras in the scene. Cameras
             # are fully optional, in most cases this attribute will be 0
             ("mNumCameras", c_uint),
-            
+
             # The array of cameras.
             # All cameras imported from the given file are listed here.
             # The array is mNumCameras in size. The first camera in the