From b50b8b3f4376ea34a4d8110f1b2689a7d4596280 Mon Sep 17 00:00:00 2001 From: sebastianhempel Date: Thu, 18 Sep 2008 13:17:44 +0000 Subject: [PATCH] new helper module; faces git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@150 67173fc5-114c-0410-ac8e-9d2fd5bffc1f --- port/PyAssimp/pyassimp/helper.py | 12 +++++++ port/PyAssimp/pyassimp/pyassimp.py | 54 ++++++++++++++++++++++++------ port/PyAssimp/pyassimp/structs.py | 9 ++--- port/PyAssimp/sample.py | 1 + 4 files changed, 62 insertions(+), 14 deletions(-) create mode 100644 port/PyAssimp/pyassimp/helper.py diff --git a/port/PyAssimp/pyassimp/helper.py b/port/PyAssimp/pyassimp/helper.py new file mode 100644 index 000000000..58e1c6167 --- /dev/null +++ b/port/PyAssimp/pyassimp/helper.py @@ -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) \ No newline at end of file diff --git a/port/PyAssimp/pyassimp/pyassimp.py b/port/PyAssimp/pyassimp/pyassimp.py index 9b3e7170d..ada709711 100644 --- a/port/PyAssimp/pyassimp/pyassimp.py +++ b/port/PyAssimp/pyassimp/pyassimp.py @@ -9,7 +9,7 @@ This is the main-module of PyAssimp. import structs import ctypes import os -from ctypes import POINTER, c_int, c_uint, c_double, c_char, c_float +import helper #get the assimp path @@ -25,6 +25,8 @@ class AssimpError(BaseException): class AssimpLib(object): + from ctypes import POINTER + #open library _dll = ctypes.cdll.LoadLibrary(LIBRARY) @@ -103,6 +105,27 @@ class Scene(AssimpBase): 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): """ A mesh represents a geometry or model with a single material. @@ -130,28 +153,25 @@ class Mesh(AssimpBase): mesh - raw mesh-data """ - #converts a VECTOR3D-struct to a tuple - vec2tuple = lambda x: (x.x, x.y, x.z) - #load vertices self.vertices = self._load_array(mesh.mVertices, mesh.mNumVertices, - vec2tuple) + helper.vec2tuple) #load normals self.normals = self._load_array(mesh.mNormals, mesh.mNumVertices, - vec2tuple) + helper.vec2tuple) #load tangents self.tangents = self._load_array(mesh.mTangents, mesh.mNumVertices, - vec2tuple) + helper.vec2tuple) #load bitangents self.bitangents = self._load_array(mesh.mBitangents, mesh.mNumVertices, - vec2tuple) + helper.vec2tuple) #vertex color sets self.colors = self._load_colors(mesh) @@ -163,7 +183,21 @@ class Mesh(AssimpBase): self.texcoords = self._load_texture_coords(mesh) #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): @@ -191,7 +225,7 @@ class Mesh(AssimpBase): for i in range(structs.MESH.AI_MAX_NUMBER_OF_TEXTURECOORDS): result.append(self._load_array(mesh.mTextureCoords[i], mesh.mNumVertices, - lambda x: (x.x, x.y, x.z))) + helper.vec2tuple)) return result diff --git a/port/PyAssimp/pyassimp/structs.py b/port/PyAssimp/pyassimp/structs.py index a29d32080..64d4f5902 100644 --- a/port/PyAssimp/pyassimp/structs.py +++ b/port/PyAssimp/pyassimp/structs.py @@ -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 + class STRING(Structure): """ Represents a String in ASSIMP. @@ -111,10 +112,10 @@ class FACE(Structure): _fields_ = [ #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. - ("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. #This is also the size of the mFaces array - ("mNumFaces", c_uint), + ("mNumFaces", c_uint), #OK #Vertex positions. #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. #This array is always present in a mesh, its size is given #in mNumFaces. - ("mFaces", POINTER(FACE)), + ("mFaces", POINTER(FACE)), #OK #The number of bones this mesh contains. #Can be 0, in which case the mBones array is NULL. diff --git a/port/PyAssimp/sample.py b/port/PyAssimp/sample.py index bd8b9bdb1..4d1c6983d 100644 --- a/port/PyAssimp/sample.py +++ b/port/PyAssimp/sample.py @@ -37,6 +37,7 @@ def main(): print " texture-coords 3:", len(tc[2]), "first:", tc[2][:3] print " texture-coords 4:", len(tc[3]), "first:", tc[3][:3] print " uv-counts:", mesh.uvsize + print " faces:", len(mesh.faces), "first:", mesh.faces[:3] print