diff --git a/port/PyAssimp/README b/port/PyAssimp/README
index 7865455bd..1d4a71487 100644
--- a/port/PyAssimp/README
+++ b/port/PyAssimp/README
@@ -3,8 +3,13 @@
-- a simple Python wrapper for Assimp using ctypes to access
-the library. Tested for Python 2.6, should work with
-older versions as well.
+the library. Tested for Python 2.6. Known not to work with
+Python 2.4.
+
+
+Note that pyassimp is by no means considered mature. It works,
+but it is far away from wrapping Assimp perfectly.
+
USAGE
=====
@@ -58,4 +63,4 @@ There's an 'additional_dirs' list waiting for your entries.
-
\ No newline at end of file
+
diff --git a/port/PyAssimp/pyassimp/pyassimp.py b/port/PyAssimp/pyassimp/pyassimp.py
index 867df9248..36ecf22c3 100644
--- a/port/PyAssimp/pyassimp/pyassimp.py
+++ b/port/PyAssimp/pyassimp/pyassimp.py
@@ -6,6 +6,10 @@ PyAssimp
This is the main-module of PyAssimp.
"""
+import sys
+if sys.version_info < (2,5):
+ raise 'pyassimp: need python 2.5 or newer'
+
import structs
import ctypes
import os
@@ -160,7 +164,7 @@ def _init(self):
Python magic to add the _init() function to all C struct classes.
"""
for struct in dir(structs):
- if not (struct.startswith('_') or struct.startswith('c_') or struct == "Structure" or struct == "POINTER"):
+ if not (struct.startswith('_') or struct.startswith('c_') or struct == "Structure" or struct == "POINTER") and not isinstance(getattr(structs, struct),int):
setattr(getattr(structs, struct), '_init', _init)
diff --git a/port/PyAssimp/pyassimp/structs.py b/port/PyAssimp/pyassimp/structs.py
index 665a87467..283d8bc80 100644
--- a/port/PyAssimp/pyassimp/structs.py
+++ b/port/PyAssimp/pyassimp/structs.py
@@ -3,67 +3,14 @@
from ctypes import POINTER, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte
-class Matrix3x3(Structure):
+class Vector2D(Structure):
"""
- See 'aiMatrix3x3.h' for details.
+ See 'aiVector2D.h' for details.
"""
_fields_ = [
- ("a1", c_float),("a2", c_float),("a3", c_float),
- ("b1", c_float),("b2", c_float),("b3", c_float),
- ("c1", c_float),("c2", c_float),("c3", c_float),
- ]
-
-class Matrix4x4(Structure):
- """
- See 'aiMatrix4x4.h' for details.
- """
-
-
- _fields_ = [
- ("a1", c_float),("a2", c_float),("a3", c_float),("a4", c_float),
- ("b1", c_float),("b2", c_float),("b3", c_float),("b4", c_float),
- ("c1", c_float),("c2", c_float),("c3", c_float),("c4", c_float),
- ("d1", c_float),("d2", c_float),("d3", c_float),("d4", c_float),
- ]
-
-class Face(Structure):
- """
- See 'aiMesh.h' for details.
- """
-
- _fields_ = [
- # Number of indices defining this face. 3 for a triangle, >3 for polygon
- ("mNumIndices", c_uint),
-
- # Pointer to the indices array. Size of the array is given in numIndices.
- ("mIndices", POINTER(c_uint)),
- ]
-
-class VertexWeight(Structure):
- """
- See 'aiMesh.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),
- ]
-
-class Quaternion(Structure):
- """
- See 'aiQuaternion.h' for details.
- """
-
-
- _fields_ = [
- # w,x,y,z components of the quaternion
- ("w", c_float),("x", c_float),("y", c_float),("z", c_float),
+ ("x", c_float),("y", c_float),
]
class Texel(Structure):
@@ -95,16 +42,6 @@ class Color3D(Structure):
("r", c_float),("g", c_float),("b", c_float),
]
-class Color4D(Structure):
- """
- See 'aiTypes.h' for details.
- """
-
- _fields_ = [
- # Red, green, blue and alpha color values
- ("r", c_float),("g", c_float),("b", c_float),("a", c_float),
- ]
-
class String(Structure):
"""
See 'aiTypes.h' for details.
@@ -113,10 +50,8 @@ class String(Structure):
MAXLEN = 1024
_fields_ = [
- # Length of the string excluding the terminal 0
- ("length", c_uint),
-
- # String buffer. Size limit is MAXLEN
+ #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_uint),#String buffer. Size limit is MAXLEN#
("data", c_char*MAXLEN),
]
@@ -126,39 +61,61 @@ class MemoryInfo(Structure):
"""
_fields_ = [
- # Storage allocated for texture data, in bytes
- ("textures", c_uint),
-
- # Storage allocated for material data, in bytes
- ("materials", c_uint),
-
- # Storage allocated for mesh data, in bytes
- ("meshes", c_uint),
-
- # Storage allocated for node data, in bytes
- ("nodes", c_uint),
-
- # Storage allocated for animation data, in bytes
- ("animations", c_uint),
-
- # Storage allocated for camera data, in bytes
- ("cameras", c_uint),
-
- # Storage allocated for light data, in bytes
- ("lights", c_uint),
-
- # Storage allocated for the full import, in bytes
+ #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),
]
-class Vector2D(Structure):
+class Matrix3x3(Structure):
"""
- See 'aiVector2D.h' for details.
+ See 'aiMatrix3x3.h' for details.
"""
_fields_ = [
- ("x", c_float),("y", c_float),
+ ("a1", c_float),("a2", c_float),("a3", c_float),
+ ("b1", c_float),("b2", c_float),("b3", c_float),
+ ("c1", c_float),("c2", c_float),("c3", c_float),
+ ]
+
+class Color4D(Structure):
+ """
+ See 'aiColor4D.h' for details.
+ """
+
+
+ _fields_ = [
+ # Red, green, blue and alpha color values
+ ("r", c_float),("g", c_float),("b", c_float),("a", c_float),
+ ]
+
+class ExportFormatDesc(Structure):
+ """
+ See 'export.h' for details.
+ """
+
+ _fields_ = [
+ # a short string ID to uniquely identify the export format. Use this ID string to# specify which file format you want to export to when calling aiExportScene().# Example: "dae" or "obj"
+ ("id", POINTER(c_char)),# A short description of the file format to present to users. Useful if you want# to allow the user to select an export format.
+ ("description", POINTER(c_char)),# Recommended file extension for the exported file in lower case.
+ ("fileExtension", POINTER(c_char)),
+ ]
+
+class Quaternion(Structure):
+ """
+ See 'aiQuaternion.h' for details.
+ """
+
+
+ _fields_ = [
+ # w,x,y,z components of the quaternion
+ ("w", c_float),("x", c_float),("y", c_float),("z", c_float),
]
class Vector3D(Structure):
@@ -171,6 +128,52 @@ class Vector3D(Structure):
("x", c_float),("y", c_float),("z", c_float),
]
+class Face(Structure):
+ """
+ See 'aiMesh.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)),
+ ]
+
+class VertexWeight(Structure):
+ """
+ See 'aiMesh.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),
+ ]
+
+class MeshKey(Structure):
+ """
+ See 'aiAnim.h' for details.
+ """
+
+ _fields_ = [
+ #The time of this key#
+ ("mTime", c_double),#Index into the aiMesh::mAnimMeshes array of the# mesh coresponding to the #aiMeshAnim hosting this# key frame. The referenced anim mesh is evaluated# according to the rules defined in the docs for #aiAnimMesh.#
+ ("mValue", c_uint),
+ ]
+
+class Matrix4x4(Structure):
+ """
+ See 'aiMatrix4x4.h' for details.
+ """
+
+
+ _fields_ = [
+ ("a1", c_float),("a2", c_float),("a3", c_float),("a4", c_float),
+ ("b1", c_float),("b2", c_float),("b3", c_float),("b4", c_float),
+ ("c1", c_float),("c2", c_float),("c3", c_float),("c4", c_float),
+ ("d1", c_float),("d2", c_float),("d3", c_float),("d4", c_float),
+ ]
+
class Node(Structure):
"""
See 'aiScene.h' for details.
@@ -178,154 +181,16 @@ class Node(Structure):
Node._fields_ = [
- #The name of the node.
- # #The name might be empty (length of zero) but all nodes which
- #need to be accessed afterwards by bones or anims are usually named.
- #Multiple nodes may have the same name, but nodes which are accessed
- #by bones (see #aiBone and #aiMesh::mBones) *must* be unique.
- #
- #Cameras and lights are assigned to a specific node name - if there
- #are multiple nodes with this name, they're assigned to each of them.
- #
- #There are no limitations regarding the characters contained in
- #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#
+ #The name of the node.##The name might be empty (length of zero) but all nodes which#need to be accessed afterwards by bones or anims are usually named.#Multiple nodes may have the same name, but nodes which are accessed#by bones (see #aiBone and #aiMesh::mBones) *must* be unique.##Cameras and lights are assigned to a specific node name - if there#are multiple nodes with this name, they're assigned to each of them.#
#There are no limitations regarding the characters contained in#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)),
]
-class VectorKey(Structure):
- """
- See 'aiAnim.h' for details.
- """
-
- _fields_ = [
- # The time of this key
- ("mTime", c_double),
- # The value of this key
- ("mValue", Vector3D),
- ]
-
-class QuatKey(Structure):
- """
- See 'aiAnim.h' for details.
- """
-
- _fields_ = [
- # The time of this key
- ("mTime", c_double),
- # The value of this key
- ("mValue", Quaternion),
- ]
-
-class NodeAnim(Structure):
- """
- See 'aiAnim.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
- # transformation matrix of the affected node is taken).
- #
- ("mPostState", c_uint),
- ]
-
-class Animation(Structure):
- """
- See 'aiAnim.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))),
- ]
-
class Camera(Structure):
"""
See 'aiCamera.h' for details.
@@ -333,404 +198,17 @@ class Camera(Structure):
_fields_ = [
- #The name of the camera.
- # # There must be a node in the scenegraph with the same name.
- # 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
- # the cross product of the up and lookAt vectors.
- # 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 farer away than the
- #near clipping plane. The default value is 1000.f. The ratio
- #between the near and the far plane should not be too
- #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
- #0 if the aspect ratio is not defined in the source file.
- #0 is also the default value.
- #
+ #The name of the camera.## There must be a node in the scenegraph with the same name.# 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# the cross product of the up and lookAt vectors.# 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#between the near and the far plane should not be too#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#0 if the aspect ratio is not defined in the source file.#0 is also the default value.#
("mAspect", c_float),
]
-class Light(Structure):
- """
- See 'aiLight.h' for details.
- """
-
-
- _fields_ = [
- #The name of the light source.
- # # There must be a node in the scenegraph with the same name.
- # 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),
-
- #Constant light attenuation factor.
- # # The intensity of the light source at a given distance 'd' from
- # the light's position is
- # @code
- # Atten = 1/( att0 + att1#d + att2#d*d)
- # @endcode
- # 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
- # @code
- # Atten = 1/( att0 + att1#d + att2#d*d)
- # @endcode
- # 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
- # @code
- # Atten = 1/( att0 + att1#d + att2#d*d)
- # @endcode
- # 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
- # to the ambient shading term. Most renderers will ignore
- # 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
- # undefined for directional lights. The outer angle must be
- # greater than or equal to the inner angle.
- # It is assumed that the application uses a smooth
- # interpolation between the inner and the outer cone of the
- # spot light.
- #
- ("mAngleOuterCone", c_float),
- ]
-
-class UVTransform(Structure):
- """
- See 'aiMaterial.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
- # 0.f.
- #
- ("mRotation", c_float),
- ]
-
-class MaterialProperty(Structure):
- """
- See 'aiMaterial.h' for details.
- """
-
- _fields_ = [
- #Specifies the name of the property (key)
- ## Keys are case insensitive.
- #
- ("mKey", String),
-
- #Textures: Specifies the exact usage semantic.
- #
- # For non-texture properties, this member is always 0
- # or #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)),
- ]
-
-class Material(Structure):
- """
- See 'aiMaterial.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),
- ]
-
-class Bone(Structure):
- """
- See 'aiMesh.h' for details.
- """
-
- _fields_ = [
- # The name of the bone.
- ("mName", String),
-
- # The number of vertices affected by this bone
- ("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),
- ]
-
-class Mesh(Structure):
- """
- See 'aiMesh.h' for details.
- """
-
- AI_MAX_NUMBER_OF_COLOR_SETS = 0x4
- AI_MAX_NUMBER_OF_TEXTURECOORDS = 0x4
-
- _fields_ = [
- #Bitwise combination of the members of the #aiPrimitiveType enum.
- #This specifies which types of primitives are present in the mesh.
- #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
- #
- ("mNumVertices", c_uint),
-
- #The number of primitives (triangles, polygons, lines) in this mesh.
- #This is also the size of the mFaces array
- #
- ("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
- #point and line primitives. A mesh consisting of points and
- #lines only may not have normal vectors. Meshes with mixed
- #primitive types (i.e. lines and triangles) may have normals,
- #but the normals for vertices that are only referenced by
- #point or line primitives are undefined and set to QNaN (WARN:
- #qNaN compares to inequal to *everything*, even to qNaN itself.
- #Use code like this
- #@code
- ##define IS_QNAN(f) (f != f)
- #@endcode
- #to check whether a field is qnan).
- #@note Normal vectors computed by Assimp are always unit-length.
- #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
- #not present. The array is mNumVertices in size. A mesh consisting
- #of points and lines only may not have normal vectors. Meshes with
- #mixed primitive types (i.e. lines and triangles) may have
- #normals, but the normals for vertices that are only referenced by
- #point or line primitives are undefined and set to QNaN.
- #@note If the mesh contains tangents, it automatically also
- #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
- #present. The array is mNumVertices in size.
- #@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
- #component p.z of mTextureCoords[n][p] is set to 0.0f.
- #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
- #in mNumFaces. If the 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),
- ]
-
class Texture(Structure):
"""
See 'aiTexture.h' for details.
@@ -738,40 +216,10 @@ class Texture(Structure):
_fields_ = [
- #Width of the texture, in pixels
- # #If mHeight is zero the texture is compressed in a format
- #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 compressed textures.
- # #If mHeight != 0 this member is undefined. Otherwise it
- #is set set to '\\0\\0\\0\\0' if the loader has no additional
- #information about the texture file format used OR the
- #file extension of the format without a trailing dot. If there
- #are multiple file extensions for a format, the shortest
- #extension is chosen (JPEG maps to 'jpg', not to 'jpeg').
- #E.g. 'dds\\0', 'pcx\\0', 'jpg\\0'. All characters are lower-case.
- #The fourth character will always be '\\0'.
- #
- ("achFormatHint", c_char*4),
-
- #Data of the texture.
- # #Points to an array of mWidth#mHeight aiTexel's.
- #The format of the texture data is always ARGB8888 to
- #make the implementation for user of the library as easy
- #as possible. If mHeight = 0 this is a pointer to a memory
- #buffer of size mWidth containing the compressed texture
- #data. Good luck, have fun!
- #
+ #Width of the texture, in pixels##If mHeight is zero the texture is compressed in a format#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 compressed textures.##If mHeight != 0 this member is undefined. Otherwise it#is set set to '\\0\\0\\0\\0' if the loader has no additional#information about the texture file format used OR the#file extension of the format without a trailing dot. If there#are multiple file extensions for a format, the shortest#extension is chosen (JPEG maps to 'jpg', not to 'jpeg').#E.g. 'dds\\0', 'pcx\\0', 'jpg\\0'. All characters are lower-case.#The fourth character will always be '\\0'.#
+ ("achFormatHint", c_char*4),#Data of the texture.##Points to an array of mWidth#mHeight aiTexel's.#The format of the texture data is always ARGB8888 to#make the implementation for user of the library as easy#as possible. If mHeight = 0 this is a pointer to a memory#buffer of size mWidth containing the compressed texture#data. Good luck, have fun!#
("pcData", POINTER(Texel)),
]
@@ -785,6 +233,167 @@ class Ray(Structure):
("pos", Vector3D),("dir", Vector3D),
]
+class Light(Structure):
+ """
+ See 'aiLight.h' for details.
+ """
+
+
+ _fields_ = [
+ #The name of the light source.## There must be a node in the scenegraph with the same name.# 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),#Constant light attenuation factor.## The intensity of the light source at a given distance 'd' from# the light's position is# @code# Atten = 1/( att0 + att1#d + att2#d*d)# @endcode# 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# @code# Atten = 1/( att0 + att1#d + att2#d*d)# @endcode# 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# @code# Atten = 1/( att0 + att1#d + att2#d*d)# @endcode# 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# to the ambient shading term. Most renderers will ignore# 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# undefined for directional lights. The outer angle must be# greater than or equal to the inner angle.# It is assumed that the application uses a smooth# interpolation between the inner and the outer cone of the# spot light.#
+ ("mAngleOuterCone", c_float),
+ ]
+
+class Bone(Structure):
+ """
+ See 'aiMesh.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),
+ ]
+
+class Mesh(Structure):
+ """
+ See 'aiMesh.h' for details.
+ """
+
+ AI_MAX_FACE_INDICES = 0x7fff
+ AI_MAX_BONE_WEIGHTS = 0x7fffffff
+ AI_MAX_VERTICES = 0x7fffffff
+ AI_MAX_FACES = 0x7fffffff
+ AI_MAX_NUMBER_OF_COLOR_SETS = 0x8
+ AI_MAX_NUMBER_OF_TEXTURECOORDS = 0x8
+
+ _fields_ = [
+ #Bitwise combination of the members of the #aiPrimitiveType enum.#This specifies which types of primitives are present in the mesh.#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#point and line primitives. A mesh consisting of points and#lines only may not have normal vectors. Meshes with mixed#primitive types (i.e. lines and triangles) may have normals,#but the normals for vertices that are only referenced by#point or line primitives are undefined and set to QNaN (WARN:#qNaN compares to inequal to *everything*, even to qNaN itself.#Using code like this to check whether a field is qnan is:#@code##define IS_QNAN(f) (f != f)#@endcode#still dangerous because even 1.f == 1.f could evaluate to false! (#remember the subtleties of IEEE754 artithmetics). Use stuff like#@c fpclassify instead.#@note Normal vectors computed by Assimp are always unit-length.#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#not present. The array is mNumVertices in size. A mesh consisting#of points and lines only may not have normal vectors. Meshes with#mixed primitive types (i.e. lines and triangles) may have#normals, but the normals for vertices that are only referenced by#point or line primitives are undefined and set to qNaN. See#the #mNormals member for a detailled discussion of qNaNs.#@note If the mesh contains tangents, it automatically also#contains bitangents.#
+ ("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#present. The array is mNumVertices in size.#@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#component p.z of mTextureCoords[n][p] is set to 0.0f.#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#in mNumFaces. If the #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:# - some formats name nodes and meshes independently.# - importers tend to split meshes up to meet the# one-material-per-mesh requirement. Assigning# the same (dummy) name to each of the result meshes# aids the caller at recovering the original mesh# partitioning.# - Vertex animations refer to meshes by their names.#
+ ("mName", String),#NOT CURRENTLY IN USE. The number of attachment meshes#
+ ("mNumAnimMeshes", c_uint),#NOT CURRENTLY IN USE. 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).#
+ ]
+
+class VectorKey(Structure):
+ """
+ See 'aiAnim.h' for details.
+ """
+
+ _fields_ = [
+ #The time of this key#
+ ("mTime", c_double),#The value of this key#
+ ("mValue", Vector3D),
+ ]
+
+class QuatKey(Structure):
+ """
+ See 'aiAnim.h' for details.
+ """
+
+ _fields_ = [
+ #The time of this key#
+ ("mTime", c_double),#The value of this key#
+ ("mValue", Quaternion),
+ ]
+
+class NodeAnim(Structure):
+ """
+ See 'aiAnim.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# transformation matrix of the affected node is taken).#
+ ("mPostState", c_uint),
+ ]
+
+class Animation(Structure):
+ """
+ See 'aiAnim.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.#
+ ]
+
+class UVTransform(Structure):
+ """
+ See 'aiMaterial.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# 0.f.#
+ ("mRotation", c_float),
+ ]
+
+class MaterialProperty(Structure):
+ """
+ See 'aiMaterial.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)),
+ ]
+
+class Material(Structure):
+ """
+ See 'aiMaterial.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),
+ ]
+
class Scene(Structure):
"""
See 'aiScene.h' for details.
@@ -792,104 +401,24 @@ class Scene(Structure):
AI_SCENE_FLAGS_INCOMPLETE = 0x1
AI_SCENE_FLAGS_VALIDATED = 0x2
- AI_SCENE_FLAGS_VALIDATION_WARNING = 0x4
- AI_SCENE_FLAGS_NON_VERBOSE_FORMAT = 0x8
+ AI_SCENE_FLAGS_VALIDATION_WARNING = 0x4
+ AI_SCENE_FLAGS_NON_VERBOSE_FORMAT = 0x8
AI_SCENE_FLAGS_TERRAIN = 0x10
_fields_ = [
- #Any combination of the AI_SCENE_FLAGS_XXX flags. By default
- #this value is 0, no flags are set. Most applications will
- #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
- #array (if existing) is the default camera view into
- #the scene.
- #
+ #Any combination of the AI_SCENE_FLAGS_XXX flags. By default#this value is 0, no flags are set. Most applications will#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#array (if existing) is the default camera view into#the scene.#
("mCameras", POINTER(POINTER(Camera))),
]
diff --git a/port/PyAssimp/sample.py b/port/PyAssimp/sample.py
index a6e001db5..626b142f0 100644
--- a/port/PyAssimp/sample.py
+++ b/port/PyAssimp/sample.py
@@ -1,67 +1,71 @@
-#-*- coding: UTF-8 -*-
-
-"""
-This module demonstrates the functionality of PyAssimp.
-"""
-
-
-from pyassimp import pyassimp
-import os
-
-#get a model out of assimp's test-data
-MODEL = os.path.join(os.path.dirname(__file__),
- "..", "..",
- "test", "models", "MDL", "MDL3 (3DGS A4)", "minigun.MDL")
-
-def main():
- scene = pyassimp.load(MODEL)
-
- #the model we load
- print "MODEL:", MODEL
- print
-
- #write some statistics
- print "SCENE:"
- print " meshes:", len(scene.meshes)
- print " materials:", len(scene.materials)
- print " textures:", len(scene.textures)
- print
-
- print "MESHES:"
- for index, mesh in enumerate(scene.meshes):
- print " MESH", index+1
- print " material:", mesh.mMaterialIndex+1
- print " vertices:", len(mesh.vertices)
- print " first:", mesh.vertices[:3]
- print " colors:", len(mesh.colors)
- tc = mesh.texcoords
- print " texture-coords 1:", len(tc[0]), "first:", tc[0][:3]
- print " texture-coords 2:", len(tc[1]), "first:", tc[1][:3]
- print " texture-coords 3:", len(tc[2]), "first:", tc[2][:3]
- print " texture-coords 4:", len(tc[3]), "first:", tc[3][:3]
- print " uv-component-count:", len(mesh.mNumUVComponents)
- print " faces:", len(mesh.faces), "first:", [f.indices for f in mesh.faces[:3]]
- print " bones:", len(mesh.bones), "first:", [b.mName for b in mesh.bones[:3]]
- print
-
- print "MATERIALS:"
- for index, material in enumerate(scene.materials):
- print " MATERIAL", index+1
- properties = pyassimp.GetMaterialProperties(material)
- for key in properties:
- print " %s: %s" % (key, properties[key])
- print
-
- print "TEXTURES:"
- for index, texture in enumerate(scene.textures):
- print " TEXTURE", index+1
- print " width:", texture.mWidth
- print " height:", texture.mHeight
- print " hint:", texture.achFormatHint
- print " data (size):", texture.mWidth*texture.mHeight
-
- # Finally release the model
- pyassimp.release(scene)
-
-if __name__ == "__main__":
- main()
\ No newline at end of file
+#!/usr/bin/env python
+#-*- coding: UTF-8 -*-
+
+"""
+This module demonstrates the functionality of PyAssimp.
+"""
+
+
+from pyassimp import pyassimp
+import os, sys
+
+#get a model out of assimp's test-data if none is provided on the command line
+DEFAULT_MODEL = os.path.join(os.path.dirname(__file__),
+ "..", "..",
+ "test", "models", "MDL", "MDL3 (3DGS A4)", "minigun.MDL")
+
+def main(filename=None):
+ filename = filename or DEFAULT_MODEL
+ scene = pyassimp.load(filename)
+
+ #the model we load
+ print "MODEL:", filename
+ print
+
+ #write some statistics
+ print "SCENE:"
+ print " meshes:", len(scene.meshes)
+ print " materials:", len(scene.materials)
+ print " textures:", len(scene.textures)
+ print
+
+ print "MESHES:"
+ for index, mesh in enumerate(scene.meshes):
+ print " MESH", index+1
+ print " material:", mesh.mMaterialIndex+1
+ print " vertices:", len(mesh.vertices)
+ print " first 3 verts:", mesh.vertices[:3]
+ #if len(mesh.normals):
+ # print " first 3 normals:", mesh.normals[:3]
+ print " colors:", len(mesh.colors)
+ tc = mesh.texcoords
+ print " texture-coords 1:", len(tc[0]), "first3:", tc[0][:3]
+ print " texture-coords 2:", len(tc[1]), "first3:", tc[1][:3]
+ print " texture-coords 3:", len(tc[2]), "first3:", tc[2][:3]
+ print " texture-coords 4:", len(tc[3]), "first3:", tc[3][:3]
+ print " uv-component-count:", len(mesh.mNumUVComponents)
+ print " faces:", len(mesh.faces), "first:", [f.indices for f in mesh.faces[:3]]
+ print " bones:", len(mesh.bones), "first:", [b.mName for b in mesh.bones[:3]]
+ print
+
+ print "MATERIALS:"
+ for index, material in enumerate(scene.materials):
+ print " MATERIAL", index+1
+ properties = pyassimp.GetMaterialProperties(material)
+ for key in properties:
+ print " %s: %s" % (key, properties[key])
+ print
+
+ print "TEXTURES:"
+ for index, texture in enumerate(scene.textures):
+ print " TEXTURE", index+1
+ print " width:", texture.mWidth
+ print " height:", texture.mHeight
+ print " hint:", texture.achFormatHint
+ print " data (size):", texture.mWidth*texture.mHeight
+
+ # Finally release the model
+ pyassimp.release(scene)
+
+if __name__ == "__main__":
+ main(sys.argv[1] if len(sys.argv)>1 else None)
diff --git a/scripts/structsgen.py b/scripts/structsgen.py
index 44128751e..8c356b0ba 100644
--- a/scripts/structsgen.py
+++ b/scripts/structsgen.py
@@ -79,7 +79,7 @@ RErmifdef = re.compile(r''
# Replace comments
RErpcom = re.compile(r''
- r'[ ]*(/\*\*\s|\*/|\B\*\s|//!)' # /**
+ r'\s*(/\*+\s|\*+/|\B\*\s|///?!?)' # /**
r'(?P.*?)' # * line
, re.IGNORECASE + re.DOTALL)
@@ -88,6 +88,14 @@ def GetType(type, prefix='c_'):
t = type
while t.endswith('*'):
t = t[:-1]
+ if t[:5] == 'const':
+ t = t[5:]
+
+ # skip some types
+ if t in skiplist:
+ return None
+
+ t = t.strip()
types = {'unsigned int':'uint', 'unsigned char':'ubyte', 'size_t':'uint',}
if t in types:
t = types[t]
@@ -105,6 +113,8 @@ def restructure( match ):
type = "c_uint"
else:
type = GetType(type[2:], '')
+ if type is None:
+ return ''
if match.group("index"):
type = type + "*" + match.group("index")
@@ -144,6 +154,9 @@ $NAME$._fields_ = [
$FIELDS$
]
"""
+
+skiplist = ("FileIO", "File", "locateFromAssimpHeap",'LogStream','MeshAnim','AnimMesh')
+
#============================================================
def Structify(fileName):
file = open(fileName, 'r')
@@ -160,7 +173,14 @@ def Structify(fileName):
# Replace comments
desc = RErpcom.sub('#\g', desc)
defines += desc
- defines += " "*4 + define[1] + " = " + define[2] + "\n"
+ if len(define[2].strip()):
+ # skip non-integral defines, we can support them right now
+ try:
+ int(define[2],0)
+ except:
+ continue
+ defines += " "*4 + define[1] + " = " + define[2] + "\n"
+
# Get structs
rs = REstructs.finditer(text)
@@ -172,7 +192,7 @@ def Structify(fileName):
desc = r.group('desc')
# Skip some structs
- if name == "FileIO" or name == "File" or name == "locateFromAssimpHeap":
+ if name in skiplist:
continue
text = r.group('code')