From cadeeae0f2c406db3caf39bc634fd1288fbce277 Mon Sep 17 00:00:00 2001 From: Gellule Xg Date: Mon, 12 Dec 2011 20:38:26 -1000 Subject: [PATCH] There is a type mismatch for the length parameter of aiString between the strings used in materials and elsewhere in assimp. Because of this, in PyAssimp3 strings in materials don't work properly on 64 bits platforms. This commit adds a StringUInt32 ctypes structure and use it in GetMaterialProperties as a workaround. --- port/PyAssimp3/pyassimp/pyassimp.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/port/PyAssimp3/pyassimp/pyassimp.py b/port/PyAssimp3/pyassimp/pyassimp.py index 0b4f221ae..decb290c6 100644 --- a/port/PyAssimp3/pyassimp/pyassimp.py +++ b/port/PyAssimp3/pyassimp/pyassimp.py @@ -119,7 +119,20 @@ class aiTuple: def __repr__(self): return str([x for x in self]) - + +class StringUInt32(ctypes.Structure): + """ + A ctypes structure used for material strings. + This is a workaround for a type mismatch for the length field between strings used for materials and elsewhere. + """ + + MAXLEN = 1024 + + _fields_ = [ + ("length", ctypes.c_uint32), + ("data", ctypes.c_char*MAXLEN), + ] + def _init(self): """ Custom initialize() for C structs, adds safely accessable member functionality. @@ -253,7 +266,7 @@ def GetMaterialProperties(material): value = [x for x in arr] elif p.mType == 3: #string can't be an array try: - value = cast(p.mData, POINTER(structs.String)).contents.data + value = cast(p.mData, POINTER(StringUInt32)).contents.data except UnicodeDecodeError: print('UnicodeDecodeError reading material property, ignoring.') continue