new helper module; faces

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@150 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
pull/1/head
sebastianhempel 2008-09-18 13:17:44 +00:00
parent d7bc843ae6
commit b50b8b3f43
4 changed files with 62 additions and 14 deletions

View File

@ -0,0 +1,12 @@
#-*- coding: UTF-8 -*-
"""
Some fancy helper functions.
"""
def vec2tuple(x):
"""
Converts a VECTOR3D to a Tuple
"""
return (x.x, x.y, x.z)

View File

@ -9,7 +9,7 @@ This is the main-module of PyAssimp.
import structs import structs
import ctypes import ctypes
import os import os
from ctypes import POINTER, c_int, c_uint, c_double, c_char, c_float import helper
#get the assimp path #get the assimp path
@ -25,6 +25,8 @@ class AssimpError(BaseException):
class AssimpLib(object): class AssimpLib(object):
from ctypes import POINTER
#open library #open library
_dll = ctypes.cdll.LoadLibrary(LIBRARY) _dll = ctypes.cdll.LoadLibrary(LIBRARY)
@ -103,6 +105,27 @@ class Scene(AssimpBase):
if (key & self.flags)>0] if (key & self.flags)>0]
class Face(AssimpBase):
"""
A single face in a mesh, referring to multiple vertices.
If the number of indices is 3, the face is a triangle,
for more than 3 it is a polygon.
Point and line primitives are rarely used and are NOT supported. However,
a load could pass them as degenerated triangles.
"""
def __init__(self, face):
"""
Loads a face from raw-data.
"""
self.indices = [face.mIndices[i] for i in range(face.mNumIndices)]
def __repr__(self):
return str(self.indices)
class Mesh(AssimpBase): class Mesh(AssimpBase):
""" """
A mesh represents a geometry or model with a single material. A mesh represents a geometry or model with a single material.
@ -130,28 +153,25 @@ class Mesh(AssimpBase):
mesh - raw mesh-data mesh - raw mesh-data
""" """
#converts a VECTOR3D-struct to a tuple
vec2tuple = lambda x: (x.x, x.y, x.z)
#load vertices #load vertices
self.vertices = self._load_array(mesh.mVertices, self.vertices = self._load_array(mesh.mVertices,
mesh.mNumVertices, mesh.mNumVertices,
vec2tuple) helper.vec2tuple)
#load normals #load normals
self.normals = self._load_array(mesh.mNormals, self.normals = self._load_array(mesh.mNormals,
mesh.mNumVertices, mesh.mNumVertices,
vec2tuple) helper.vec2tuple)
#load tangents #load tangents
self.tangents = self._load_array(mesh.mTangents, self.tangents = self._load_array(mesh.mTangents,
mesh.mNumVertices, mesh.mNumVertices,
vec2tuple) helper.vec2tuple)
#load bitangents #load bitangents
self.bitangents = self._load_array(mesh.mBitangents, self.bitangents = self._load_array(mesh.mBitangents,
mesh.mNumVertices, mesh.mNumVertices,
vec2tuple) helper.vec2tuple)
#vertex color sets #vertex color sets
self.colors = self._load_colors(mesh) self.colors = self._load_colors(mesh)
@ -163,7 +183,21 @@ class Mesh(AssimpBase):
self.texcoords = self._load_texture_coords(mesh) self.texcoords = self._load_texture_coords(mesh)
#the used material #the used material
self.material_index = mesh.mMaterialIndex self.material_index = int(mesh.mMaterialIndex)
#faces
self.faces = self._load_faces(mesh)
def _load_faces(self, mesh):
"""
Loads all faces.
mesh - mesh-data
result faces
"""
return [Face(mesh.mFaces[i]) for i in range(mesh.mNumFaces)]
def _load_uv_component_count(self, mesh): def _load_uv_component_count(self, mesh):
@ -191,7 +225,7 @@ class Mesh(AssimpBase):
for i in range(structs.MESH.AI_MAX_NUMBER_OF_TEXTURECOORDS): for i in range(structs.MESH.AI_MAX_NUMBER_OF_TEXTURECOORDS):
result.append(self._load_array(mesh.mTextureCoords[i], result.append(self._load_array(mesh.mTextureCoords[i],
mesh.mNumVertices, mesh.mNumVertices,
lambda x: (x.x, x.y, x.z))) helper.vec2tuple))
return result return result

View File

@ -7,6 +7,7 @@ All ASSIMP C-structures. See the Assimp-headers for all formats.
from ctypes import POINTER, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte from ctypes import POINTER, c_int, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte
class STRING(Structure): class STRING(Structure):
""" """
Represents a String in ASSIMP. Represents a String in ASSIMP.
@ -111,10 +112,10 @@ class FACE(Structure):
_fields_ = [ _fields_ = [
#Number of indices defining this face. 3 for a triangle, >3 for polygon #Number of indices defining this face. 3 for a triangle, >3 for polygon
("mNumIndices", c_uint), ("mNumIndices", c_uint), #OK
#Pointer to the indices array. Size of the array is given in numIndices. #Pointer to the indices array. Size of the array is given in numIndices.
("mIndices", POINTER(c_uint)) ("mIndices", POINTER(c_uint)) #OK
] ]
@ -187,7 +188,7 @@ class MESH(Structure):
#The number of primitives (triangles, polygones, lines) in this mesh. #The number of primitives (triangles, polygones, lines) in this mesh.
#This is also the size of the mFaces array #This is also the size of the mFaces array
("mNumFaces", c_uint), ("mNumFaces", c_uint), #OK
#Vertex positions. #Vertex positions.
#This array is always present in a mesh. The array is #This array is always present in a mesh. The array is
@ -238,7 +239,7 @@ class MESH(Structure):
#Each face referres to a number of vertices by their indices. #Each face referres to a number of vertices by their indices.
#This array is always present in a mesh, its size is given #This array is always present in a mesh, its size is given
#in mNumFaces. #in mNumFaces.
("mFaces", POINTER(FACE)), ("mFaces", POINTER(FACE)), #OK
#The number of bones this mesh contains. #The number of bones this mesh contains.
#Can be 0, in which case the mBones array is NULL. #Can be 0, in which case the mBones array is NULL.

View File

@ -37,6 +37,7 @@ def main():
print " texture-coords 3:", len(tc[2]), "first:", tc[2][:3] print " texture-coords 3:", len(tc[2]), "first:", tc[2][:3]
print " texture-coords 4:", len(tc[3]), "first:", tc[3][:3] print " texture-coords 4:", len(tc[3]), "first:", tc[3][:3]
print " uv-counts:", mesh.uvsize print " uv-counts:", mesh.uvsize
print " faces:", len(mesh.faces), "first:", mesh.faces[:3]
print print