1204 lines
42 KiB
Python
1204 lines
42 KiB
Python
#-*- coding: utf-8 -*-
|
|
|
|
from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_double, c_ubyte, c_size_t, c_uint32, c_int
|
|
|
|
|
|
class Vector2D(Structure):
|
|
"""
|
|
See 'vector2.h' for details.
|
|
"""
|
|
|
|
|
|
_fields_ = [
|
|
("x", c_float),("y", c_float),
|
|
]
|
|
|
|
class Matrix3x3(Structure):
|
|
"""
|
|
See 'matrix3x3.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 Texel(Structure):
|
|
"""
|
|
See 'texture.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
("b", c_ubyte),("g", c_ubyte),("r", c_ubyte),("a", c_ubyte),
|
|
]
|
|
|
|
class Color4D(Structure):
|
|
"""
|
|
See 'color4.h' for details.
|
|
"""
|
|
|
|
|
|
_fields_ = [
|
|
# Red, green, blue and alpha color values
|
|
("r", c_float),("g", c_float),("b", c_float),("a", c_float),
|
|
]
|
|
|
|
class Plane(Structure):
|
|
"""
|
|
See 'types.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# Plane equation
|
|
("a", c_float),("b", c_float),("c", c_float),("d", c_float),
|
|
]
|
|
|
|
class Color3D(Structure):
|
|
"""
|
|
See 'types.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# Red, green and blue color values
|
|
("r", c_float),("g", c_float),("b", c_float),
|
|
]
|
|
|
|
class String(Structure):
|
|
"""
|
|
See 'types.h' for details.
|
|
"""
|
|
|
|
AI_MAXLEN = 1024
|
|
|
|
_fields_ = [
|
|
# 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_uint32),
|
|
|
|
# String buffer. Size limit is AI_MAXLEN
|
|
("data", c_char*AI_MAXLEN),
|
|
]
|
|
|
|
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).
|
|
"""
|
|
|
|
AI_MAXLEN = 1024
|
|
|
|
_fields_ = [
|
|
# 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_uint32),
|
|
|
|
# String buffer. Size limit is AI_MAXLEN
|
|
("data", c_char*AI_MAXLEN),
|
|
]
|
|
|
|
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),
|
|
]
|
|
|
|
class Quaternion(Structure):
|
|
"""
|
|
See 'quaternion.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 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)),
|
|
]
|
|
|
|
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),
|
|
]
|
|
|
|
class Matrix4x4(Structure):
|
|
"""
|
|
See 'matrix4x4.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 Vector3D(Structure):
|
|
"""
|
|
See 'vector3.h' for details.
|
|
"""
|
|
|
|
|
|
_fields_ = [
|
|
("x", c_float),("y", c_float),("z", c_float),
|
|
]
|
|
|
|
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
|
|
# key frame. The referenced anim mesh is evaluated
|
|
# according to the rules defined in the docs for
|
|
#aiAnimMesh.
|
|
("mValue", c_uint),
|
|
]
|
|
|
|
class MetadataEntry(Structure):
|
|
"""
|
|
See 'metadata.h' for details
|
|
"""
|
|
AI_BOOL = 0
|
|
AI_INT32 = 1
|
|
AI_UINT64 = 2
|
|
AI_FLOAT = 3
|
|
AI_DOUBLE = 4
|
|
AI_AISTRING = 5
|
|
AI_AIVECTOR3D = 6
|
|
AI_META_MAX = 7
|
|
_fields_ = [
|
|
# The type field uniquely identifies the underlying type of the data field
|
|
("mType", c_uint),
|
|
("mData", c_void_p),
|
|
]
|
|
|
|
class Metadata(Structure):
|
|
"""
|
|
See 'metadata.h' for details
|
|
"""
|
|
_fields_ = [
|
|
# Length of the mKeys and mValues arrays, respectively
|
|
("mNumProperties", c_uint),
|
|
|
|
# Arrays of keys, may not be NULL. Entries in this array may not be NULL
|
|
# as well.
|
|
("mKeys", POINTER(String)),
|
|
|
|
# Arrays of values, may not be NULL. Entries in this array may be NULL
|
|
# if the corresponding property key has no assigned value.
|
|
("mValues", POINTER(MetadataEntry)),
|
|
]
|
|
|
|
class Node(Structure):
|
|
"""
|
|
See 'scene.h' for details.
|
|
"""
|
|
|
|
|
|
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.
|
|
# <br>
|
|
# 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)),
|
|
|
|
# Metadata associated with this node or NULL if there is no metadata.
|
|
# Whether any metadata is generated depends on the source file format.
|
|
("mMetadata", POINTER(Metadata)),
|
|
]
|
|
|
|
class Light(Structure):
|
|
"""
|
|
See 'light.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),
|
|
|
|
# Up 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.
|
|
("mUp", 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),
|
|
|
|
# Size of area light source.
|
|
("mSize", Vector2D),
|
|
]
|
|
|
|
class Texture(Structure):
|
|
"""
|
|
See 'texture.h' for details.
|
|
"""
|
|
|
|
|
|
_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 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
|
|
# absent color channel and just use 0 for bitness. For example:
|
|
# 1. Image contain RGBA and 8 bit per channel, achFormatHint == "rgba8888";
|
|
# 2. Image contain ARGB and 8 bit per channel, achFormatHint == "argb8888";
|
|
# 3. Image contain RGB and 5 bit for R and B channels and 6 bit for G channel,
|
|
# achFormatHint == "rgba5650";
|
|
# 4. One color image with B channel and 1 bit for it, achFormatHint == "rgba0010";
|
|
# If mHeight == 0 then achFormatHint 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*9),
|
|
|
|
# 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)),
|
|
|
|
# Texture original filename
|
|
# Used to get the texture reference
|
|
("mFilename", String),
|
|
]
|
|
|
|
class Ray(Structure):
|
|
"""
|
|
See 'types.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# Position and direction of the ray
|
|
("pos", Vector3D),("dir", Vector3D),
|
|
]
|
|
|
|
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
|
|
# 0.f.
|
|
("mRotation", c_float),
|
|
]
|
|
|
|
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)),
|
|
]
|
|
|
|
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),
|
|
]
|
|
|
|
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),
|
|
]
|
|
|
|
|
|
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
|
|
# meshes may neither add or nor remove vertex components (if
|
|
# a replacement array is NULL and the corresponding source
|
|
# array is not, the source data is taken instead)
|
|
("mVertices", POINTER(Vector3D)),
|
|
|
|
# Replacement for aiMesh::mNormals.
|
|
("mNormals", POINTER(Vector3D)),
|
|
|
|
# Replacement for aiMesh::mTangents.
|
|
("mTangents", POINTER(Vector3D)),
|
|
|
|
# Replacement for aiMesh::mBitangents.
|
|
("mBitangents", POINTER(Vector3D)),
|
|
|
|
# Replacement for aiMesh::mColors
|
|
("mColors", POINTER(Color4D) * AI_MAX_NUMBER_OF_COLOR_SETS),
|
|
|
|
# Replacement for aiMesh::mTextureCoords
|
|
("mTextureCoords", POINTER(Vector3D) * AI_MAX_NUMBER_OF_TEXTURECOORDS),
|
|
|
|
# The number of vertices in the aiAnimMesh, and thus the length of all
|
|
# the member arrays.
|
|
#
|
|
# This has always the same value as the mNumVertices property in the
|
|
# corresponding aiMesh. It is duplicated here merely to make the length
|
|
# of the member arrays accessible even if the aiMesh is not known, e.g.
|
|
# from language bindings.
|
|
("mNumVertices", c_uint),
|
|
|
|
# Weight of the AnimMesh.
|
|
("mWeight", c_float),
|
|
]
|
|
|
|
|
|
class Mesh(Structure):
|
|
"""
|
|
See 'mesh.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 detailed discussion of qNaNs.
|
|
# @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),
|
|
|
|
# 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),
|
|
|
|
# The number of attachment meshes.
|
|
# Currently known to work with loaders:
|
|
# - Collada
|
|
# - gltf
|
|
("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).
|
|
# Currently known to work with loaders:
|
|
# - Collada
|
|
# - gltf
|
|
("mAnimMeshes", POINTER(POINTER(AnimMesh))),
|
|
|
|
# Method of morphing when animeshes are specified.
|
|
("mMethod", c_uint),
|
|
|
|
# The bounding box.
|
|
("mAABB", 2 * Vector3D),
|
|
|
|
# Vertex UV stream names. Pointer to array of size AI_MAX_NUMBER_OF_TEXTURECOORDS
|
|
("mTextureCoordsNames", POINTER(POINTER(String)))
|
|
|
|
]
|
|
|
|
class Camera(Structure):
|
|
"""
|
|
See 'camera.h' for details.
|
|
"""
|
|
|
|
|
|
_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 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 VectorKey(Structure):
|
|
"""
|
|
See 'anim.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# The time of this key
|
|
("mTime", c_double),
|
|
|
|
# The value of this key
|
|
("mValue", Vector3D),
|
|
]
|
|
|
|
class QuatKey(Structure):
|
|
"""
|
|
See 'anim.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# The time of this key
|
|
("mTime", c_double),
|
|
|
|
# The value of this key
|
|
("mValue", Quaternion),
|
|
]
|
|
|
|
class MeshMorphKey(Structure):
|
|
"""
|
|
See 'anim.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# The time of this key
|
|
("mTime", c_double),
|
|
|
|
# The values and weights at the time of this key
|
|
("mValues", POINTER(c_uint)),
|
|
("mWeights", POINTER(c_double)),
|
|
|
|
# The number of values and weights
|
|
("mNumValuesAndWeights", c_uint),
|
|
|
|
]
|
|
|
|
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
|
|
# transformation matrix of the affected node is taken).
|
|
("mPostState", c_uint),
|
|
]
|
|
|
|
class MeshAnim(Structure):
|
|
"""
|
|
See 'anim.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# Name of the mesh to be animated. An empty string is not allowed,
|
|
# animated meshes need to be named (not necessarily uniquely,
|
|
# the name can basically serve as wild-card to select a group
|
|
# of meshes with similar animation setup)
|
|
("mName", String),
|
|
|
|
# Size of the #mKeys array. Must be 1, at least.
|
|
("mNumKeys", c_uint),
|
|
|
|
# Key frames of the animation. May not be NULL.
|
|
("mKeys", POINTER(MeshKey)),
|
|
]
|
|
|
|
class MeshMorphAnim(Structure):
|
|
"""
|
|
See 'anim.h' for details.
|
|
"""
|
|
|
|
_fields_ = [
|
|
# Name of the mesh to be animated. An empty string is not allowed,
|
|
# animated meshes need to be named (not necessarily uniquely,
|
|
# the name can basically serve as wildcard to select a group
|
|
# of meshes with similar animation setup)
|
|
("mName", String),
|
|
|
|
# Size of the #mKeys array. Must be 1, at least.
|
|
("mNumKeys", c_uint),
|
|
|
|
# Key frames of the animation. May not be NULL.
|
|
("mKeys", POINTER(MeshMorphKey)),
|
|
]
|
|
|
|
|
|
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))),
|
|
|
|
# The number of mesh animation channels. Each channel affects
|
|
# a single mesh and defines morphing animation.
|
|
("mNumMorphMeshChannels", c_uint),
|
|
|
|
# The morph mesh animation channels. Each channel affects a single mesh.
|
|
# The array is mNumMorphMeshChannels in size.
|
|
("mMorphMeshChannels", POINTER(POINTER(MeshMorphAnim))),
|
|
|
|
]
|
|
|
|
class SkeletonBone(Structure):
|
|
"""
|
|
See 'mesh.h' for details
|
|
"""
|
|
_fields_ = [
|
|
# The parent bone index, is -1 one if this bone represents the root bone.
|
|
("mParent", c_int),
|
|
|
|
# The number of weights
|
|
("mNumnWeights", c_uint),
|
|
|
|
# The mesh index, which will get influenced by the weight
|
|
("mMeshId", POINTER(Mesh)),
|
|
|
|
# The influence weights of this bone, by vertex index.
|
|
("mWeights", POINTER(VertexWeight)),
|
|
|
|
# Matrix that transforms from bone space to mesh space in bind pose.
|
|
#
|
|
# This matrix describes the position of the mesh
|
|
# in the local space of this bone when the skeleton was bound.
|
|
# Thus it can be used directly to determine a desired vertex position,
|
|
# given the world-space transform of the bone when animated,
|
|
# and the position of the vertex in mesh space.
|
|
#
|
|
# It is sometimes called an inverse-bind matrix,
|
|
# or inverse bind pose matrix
|
|
("mOffsetMatrix", Matrix4x4),
|
|
|
|
# Matrix that transforms the locale bone in bind pose.
|
|
("mLocalMatrix", Matrix4x4)
|
|
]
|
|
|
|
class Skeleton(Structure):
|
|
"""
|
|
See 'mesh.h' for details
|
|
"""
|
|
_fields_ = [
|
|
# Name
|
|
("mName", String),
|
|
|
|
# Number of bones
|
|
("mNumBones", c_uint),
|
|
|
|
# Bones
|
|
("mBones", POINTER(POINTER(SkeletonBone)))
|
|
]
|
|
|
|
class ExportDataBlob(Structure):
|
|
"""
|
|
See 'cexport.h' for details.
|
|
|
|
Note that the '_fields_' definition is outside the class to allow the 'next' field to be recursive
|
|
"""
|
|
pass
|
|
|
|
ExportDataBlob._fields_ = [
|
|
# Size of the data in bytes
|
|
("size", c_size_t),
|
|
|
|
# The data.
|
|
("data", c_void_p),
|
|
|
|
# Name of the blob. An empty string always
|
|
# indicates the first (and primary) blob,
|
|
# which contains the actual file data.
|
|
# Any other blobs are auxiliary files produced
|
|
# by exporters (i.e. material files). Existence
|
|
# of such files depends on the file format. Most
|
|
# formats don't split assets across multiple files.
|
|
#
|
|
# If used, blob names usually contain the file
|
|
# extension that should be used when writing
|
|
# the data to disc.
|
|
("name", String),
|
|
|
|
# Pointer to the next blob in the chain or NULL if there is none.
|
|
("next", POINTER(ExportDataBlob)),
|
|
]
|
|
|
|
|
|
class Scene(Structure):
|
|
"""
|
|
See 'aiScene.h' for details.
|
|
"""
|
|
|
|
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_TERRAIN = 0x10
|
|
AI_SCENE_FLAGS_ALLOW_SHARED = 0x20
|
|
|
|
_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.
|
|
("mCameras", POINTER(POINTER(Camera))),
|
|
|
|
# This data contains global metadata which belongs to the scene like
|
|
# unit-conversions, versions, vendors or other model-specific data. This
|
|
# can be used to store format-specific metadata as well.
|
|
("mMetadata", POINTER(Metadata)),
|
|
|
|
# The name of the scene itself
|
|
("mName", String),
|
|
|
|
# Number of skeletons
|
|
("mNumSkeletons", c_uint),
|
|
|
|
# Skeletons
|
|
("mSkeletons", POINTER(POINTER(Skeleton))),
|
|
|
|
# Internal data, do not touch
|
|
("mPrivate", POINTER(c_char)),
|
|
]
|
|
|
|
assimp_structs_as_tuple = (Matrix4x4,
|
|
Matrix3x3,
|
|
Vector2D,
|
|
Vector3D,
|
|
Color3D,
|
|
Color4D,
|
|
Quaternion,
|
|
Plane,
|
|
Texel)
|