port/PyAssimp/pyassimp/core.py & helper.py: catch specific exceptions instead of BaseException
parent
0292acd5a9
commit
e849b94f68
|
@ -15,7 +15,7 @@ if sys.version_info >= (3,0):
|
||||||
|
|
||||||
|
|
||||||
try: import numpy
|
try: import numpy
|
||||||
except: numpy = None
|
except ImportError: numpy = None
|
||||||
import logging
|
import logging
|
||||||
import ctypes
|
import ctypes
|
||||||
logger = logging.getLogger("pyassimp")
|
logger = logging.getLogger("pyassimp")
|
||||||
|
@ -67,7 +67,7 @@ def make_tuple(ai_obj, type = None):
|
||||||
def _convert_assimp_string(assimp_string):
|
def _convert_assimp_string(assimp_string):
|
||||||
try:
|
try:
|
||||||
return unicode(assimp_string.data, errors='ignore')
|
return unicode(assimp_string.data, errors='ignore')
|
||||||
except:
|
except UnicodeError:
|
||||||
return str(assimp_string.data, errors='ignore')
|
return str(assimp_string.data, errors='ignore')
|
||||||
|
|
||||||
# It is faster and more correct to have an init function for each assimp class
|
# It is faster and more correct to have an init function for each assimp class
|
||||||
|
|
|
@ -1,280 +1,280 @@
|
||||||
#-*- coding: UTF-8 -*-
|
#-*- coding: UTF-8 -*-
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Some fancy helper functions.
|
Some fancy helper functions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import ctypes
|
import ctypes
|
||||||
from ctypes import POINTER
|
from ctypes import POINTER
|
||||||
import operator
|
import operator
|
||||||
|
|
||||||
from distutils.sysconfig import get_python_lib
|
from distutils.sysconfig import get_python_lib
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
try: import numpy
|
try: import numpy
|
||||||
except: numpy = None
|
except ImportError: numpy = None
|
||||||
|
|
||||||
import logging;logger = logging.getLogger("pyassimp")
|
import logging;logger = logging.getLogger("pyassimp")
|
||||||
|
|
||||||
from .errors import AssimpError
|
from .errors import AssimpError
|
||||||
|
|
||||||
additional_dirs, ext_whitelist = [],[]
|
additional_dirs, ext_whitelist = [],[]
|
||||||
|
|
||||||
# populate search directories and lists of allowed file extensions
|
# populate search directories and lists of allowed file extensions
|
||||||
# depending on the platform we're running on.
|
# depending on the platform we're running on.
|
||||||
if os.name=='posix':
|
if os.name=='posix':
|
||||||
additional_dirs.append('./')
|
additional_dirs.append('./')
|
||||||
additional_dirs.append('/usr/lib/')
|
additional_dirs.append('/usr/lib/')
|
||||||
additional_dirs.append('/usr/lib/x86_64-linux-gnu/')
|
additional_dirs.append('/usr/lib/x86_64-linux-gnu/')
|
||||||
additional_dirs.append('/usr/local/lib/')
|
additional_dirs.append('/usr/local/lib/')
|
||||||
|
|
||||||
if 'LD_LIBRARY_PATH' in os.environ:
|
if 'LD_LIBRARY_PATH' in os.environ:
|
||||||
additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
|
additional_dirs.extend([item for item in os.environ['LD_LIBRARY_PATH'].split(':') if item])
|
||||||
|
|
||||||
# check if running from anaconda.
|
# check if running from anaconda.
|
||||||
if "conda" or "continuum" in sys.version.lower():
|
if "conda" or "continuum" in sys.version.lower():
|
||||||
cur_path = get_python_lib()
|
cur_path = get_python_lib()
|
||||||
pattern = re.compile('.*\/lib\/')
|
pattern = re.compile('.*\/lib\/')
|
||||||
conda_lib = pattern.match(cur_path).group()
|
conda_lib = pattern.match(cur_path).group()
|
||||||
logger.info("Adding Anaconda lib path:"+ conda_lib)
|
logger.info("Adding Anaconda lib path:"+ conda_lib)
|
||||||
additional_dirs.append(conda_lib)
|
additional_dirs.append(conda_lib)
|
||||||
|
|
||||||
# note - this won't catch libassimp.so.N.n, but
|
# note - this won't catch libassimp.so.N.n, but
|
||||||
# currently there's always a symlink called
|
# currently there's always a symlink called
|
||||||
# libassimp.so in /usr/local/lib.
|
# libassimp.so in /usr/local/lib.
|
||||||
ext_whitelist.append('.so')
|
ext_whitelist.append('.so')
|
||||||
# libassimp.dylib in /usr/local/lib
|
# libassimp.dylib in /usr/local/lib
|
||||||
ext_whitelist.append('.dylib')
|
ext_whitelist.append('.dylib')
|
||||||
|
|
||||||
elif os.name=='nt':
|
elif os.name=='nt':
|
||||||
ext_whitelist.append('.dll')
|
ext_whitelist.append('.dll')
|
||||||
path_dirs = os.environ['PATH'].split(';')
|
path_dirs = os.environ['PATH'].split(';')
|
||||||
additional_dirs.extend(path_dirs)
|
additional_dirs.extend(path_dirs)
|
||||||
|
|
||||||
def vec2tuple(x):
|
def vec2tuple(x):
|
||||||
""" Converts a VECTOR3D to a Tuple """
|
""" Converts a VECTOR3D to a Tuple """
|
||||||
return (x.x, x.y, x.z)
|
return (x.x, x.y, x.z)
|
||||||
|
|
||||||
def transform(vector3, matrix4x4):
|
def transform(vector3, matrix4x4):
|
||||||
""" Apply a transformation matrix on a 3D vector.
|
""" Apply a transformation matrix on a 3D vector.
|
||||||
|
|
||||||
:param vector3: array with 3 elements
|
:param vector3: array with 3 elements
|
||||||
:param matrix4x4: 4x4 matrix
|
:param matrix4x4: 4x4 matrix
|
||||||
"""
|
"""
|
||||||
if numpy:
|
if numpy:
|
||||||
return numpy.dot(matrix4x4, numpy.append(vector3, 1.))
|
return numpy.dot(matrix4x4, numpy.append(vector3, 1.))
|
||||||
else:
|
else:
|
||||||
m0,m1,m2,m3 = matrix4x4; x,y,z = vector3
|
m0,m1,m2,m3 = matrix4x4; x,y,z = vector3
|
||||||
return [
|
return [
|
||||||
m0[0]*x + m0[1]*y + m0[2]*z + m0[3],
|
m0[0]*x + m0[1]*y + m0[2]*z + m0[3],
|
||||||
m1[0]*x + m1[1]*y + m1[2]*z + m1[3],
|
m1[0]*x + m1[1]*y + m1[2]*z + m1[3],
|
||||||
m2[0]*x + m2[1]*y + m2[2]*z + m2[3],
|
m2[0]*x + m2[1]*y + m2[2]*z + m2[3],
|
||||||
m3[0]*x + m3[1]*y + m3[2]*z + m3[3]
|
m3[0]*x + m3[1]*y + m3[2]*z + m3[3]
|
||||||
]
|
]
|
||||||
|
|
||||||
def _inv(matrix4x4):
|
def _inv(matrix4x4):
|
||||||
m0,m1,m2,m3 = matrix4x4
|
m0,m1,m2,m3 = matrix4x4
|
||||||
|
|
||||||
det = m0[3]*m1[2]*m2[1]*m3[0] - m0[2]*m1[3]*m2[1]*m3[0] - \
|
det = m0[3]*m1[2]*m2[1]*m3[0] - m0[2]*m1[3]*m2[1]*m3[0] - \
|
||||||
m0[3]*m1[1]*m2[2]*m3[0] + m0[1]*m1[3]*m2[2]*m3[0] + \
|
m0[3]*m1[1]*m2[2]*m3[0] + m0[1]*m1[3]*m2[2]*m3[0] + \
|
||||||
m0[2]*m1[1]*m2[3]*m3[0] - m0[1]*m1[2]*m2[3]*m3[0] - \
|
m0[2]*m1[1]*m2[3]*m3[0] - m0[1]*m1[2]*m2[3]*m3[0] - \
|
||||||
m0[3]*m1[2]*m2[0]*m3[1] + m0[2]*m1[3]*m2[0]*m3[1] + \
|
m0[3]*m1[2]*m2[0]*m3[1] + m0[2]*m1[3]*m2[0]*m3[1] + \
|
||||||
m0[3]*m1[0]*m2[2]*m3[1] - m0[0]*m1[3]*m2[2]*m3[1] - \
|
m0[3]*m1[0]*m2[2]*m3[1] - m0[0]*m1[3]*m2[2]*m3[1] - \
|
||||||
m0[2]*m1[0]*m2[3]*m3[1] + m0[0]*m1[2]*m2[3]*m3[1] + \
|
m0[2]*m1[0]*m2[3]*m3[1] + m0[0]*m1[2]*m2[3]*m3[1] + \
|
||||||
m0[3]*m1[1]*m2[0]*m3[2] - m0[1]*m1[3]*m2[0]*m3[2] - \
|
m0[3]*m1[1]*m2[0]*m3[2] - m0[1]*m1[3]*m2[0]*m3[2] - \
|
||||||
m0[3]*m1[0]*m2[1]*m3[2] + m0[0]*m1[3]*m2[1]*m3[2] + \
|
m0[3]*m1[0]*m2[1]*m3[2] + m0[0]*m1[3]*m2[1]*m3[2] + \
|
||||||
m0[1]*m1[0]*m2[3]*m3[2] - m0[0]*m1[1]*m2[3]*m3[2] - \
|
m0[1]*m1[0]*m2[3]*m3[2] - m0[0]*m1[1]*m2[3]*m3[2] - \
|
||||||
m0[2]*m1[1]*m2[0]*m3[3] + m0[1]*m1[2]*m2[0]*m3[3] + \
|
m0[2]*m1[1]*m2[0]*m3[3] + m0[1]*m1[2]*m2[0]*m3[3] + \
|
||||||
m0[2]*m1[0]*m2[1]*m3[3] - m0[0]*m1[2]*m2[1]*m3[3] - \
|
m0[2]*m1[0]*m2[1]*m3[3] - m0[0]*m1[2]*m2[1]*m3[3] - \
|
||||||
m0[1]*m1[0]*m2[2]*m3[3] + m0[0]*m1[1]*m2[2]*m3[3]
|
m0[1]*m1[0]*m2[2]*m3[3] + m0[0]*m1[1]*m2[2]*m3[3]
|
||||||
|
|
||||||
return[[( m1[2]*m2[3]*m3[1] - m1[3]*m2[2]*m3[1] + m1[3]*m2[1]*m3[2] - m1[1]*m2[3]*m3[2] - m1[2]*m2[1]*m3[3] + m1[1]*m2[2]*m3[3]) /det,
|
return[[( m1[2]*m2[3]*m3[1] - m1[3]*m2[2]*m3[1] + m1[3]*m2[1]*m3[2] - m1[1]*m2[3]*m3[2] - m1[2]*m2[1]*m3[3] + m1[1]*m2[2]*m3[3]) /det,
|
||||||
( m0[3]*m2[2]*m3[1] - m0[2]*m2[3]*m3[1] - m0[3]*m2[1]*m3[2] + m0[1]*m2[3]*m3[2] + m0[2]*m2[1]*m3[3] - m0[1]*m2[2]*m3[3]) /det,
|
( m0[3]*m2[2]*m3[1] - m0[2]*m2[3]*m3[1] - m0[3]*m2[1]*m3[2] + m0[1]*m2[3]*m3[2] + m0[2]*m2[1]*m3[3] - m0[1]*m2[2]*m3[3]) /det,
|
||||||
( m0[2]*m1[3]*m3[1] - m0[3]*m1[2]*m3[1] + m0[3]*m1[1]*m3[2] - m0[1]*m1[3]*m3[2] - m0[2]*m1[1]*m3[3] + m0[1]*m1[2]*m3[3]) /det,
|
( m0[2]*m1[3]*m3[1] - m0[3]*m1[2]*m3[1] + m0[3]*m1[1]*m3[2] - m0[1]*m1[3]*m3[2] - m0[2]*m1[1]*m3[3] + m0[1]*m1[2]*m3[3]) /det,
|
||||||
( m0[3]*m1[2]*m2[1] - m0[2]*m1[3]*m2[1] - m0[3]*m1[1]*m2[2] + m0[1]*m1[3]*m2[2] + m0[2]*m1[1]*m2[3] - m0[1]*m1[2]*m2[3]) /det],
|
( m0[3]*m1[2]*m2[1] - m0[2]*m1[3]*m2[1] - m0[3]*m1[1]*m2[2] + m0[1]*m1[3]*m2[2] + m0[2]*m1[1]*m2[3] - m0[1]*m1[2]*m2[3]) /det],
|
||||||
[( m1[3]*m2[2]*m3[0] - m1[2]*m2[3]*m3[0] - m1[3]*m2[0]*m3[2] + m1[0]*m2[3]*m3[2] + m1[2]*m2[0]*m3[3] - m1[0]*m2[2]*m3[3]) /det,
|
[( m1[3]*m2[2]*m3[0] - m1[2]*m2[3]*m3[0] - m1[3]*m2[0]*m3[2] + m1[0]*m2[3]*m3[2] + m1[2]*m2[0]*m3[3] - m1[0]*m2[2]*m3[3]) /det,
|
||||||
( m0[2]*m2[3]*m3[0] - m0[3]*m2[2]*m3[0] + m0[3]*m2[0]*m3[2] - m0[0]*m2[3]*m3[2] - m0[2]*m2[0]*m3[3] + m0[0]*m2[2]*m3[3]) /det,
|
( m0[2]*m2[3]*m3[0] - m0[3]*m2[2]*m3[0] + m0[3]*m2[0]*m3[2] - m0[0]*m2[3]*m3[2] - m0[2]*m2[0]*m3[3] + m0[0]*m2[2]*m3[3]) /det,
|
||||||
( m0[3]*m1[2]*m3[0] - m0[2]*m1[3]*m3[0] - m0[3]*m1[0]*m3[2] + m0[0]*m1[3]*m3[2] + m0[2]*m1[0]*m3[3] - m0[0]*m1[2]*m3[3]) /det,
|
( m0[3]*m1[2]*m3[0] - m0[2]*m1[3]*m3[0] - m0[3]*m1[0]*m3[2] + m0[0]*m1[3]*m3[2] + m0[2]*m1[0]*m3[3] - m0[0]*m1[2]*m3[3]) /det,
|
||||||
( m0[2]*m1[3]*m2[0] - m0[3]*m1[2]*m2[0] + m0[3]*m1[0]*m2[2] - m0[0]*m1[3]*m2[2] - m0[2]*m1[0]*m2[3] + m0[0]*m1[2]*m2[3]) /det],
|
( m0[2]*m1[3]*m2[0] - m0[3]*m1[2]*m2[0] + m0[3]*m1[0]*m2[2] - m0[0]*m1[3]*m2[2] - m0[2]*m1[0]*m2[3] + m0[0]*m1[2]*m2[3]) /det],
|
||||||
[( m1[1]*m2[3]*m3[0] - m1[3]*m2[1]*m3[0] + m1[3]*m2[0]*m3[1] - m1[0]*m2[3]*m3[1] - m1[1]*m2[0]*m3[3] + m1[0]*m2[1]*m3[3]) /det,
|
[( m1[1]*m2[3]*m3[0] - m1[3]*m2[1]*m3[0] + m1[3]*m2[0]*m3[1] - m1[0]*m2[3]*m3[1] - m1[1]*m2[0]*m3[3] + m1[0]*m2[1]*m3[3]) /det,
|
||||||
( m0[3]*m2[1]*m3[0] - m0[1]*m2[3]*m3[0] - m0[3]*m2[0]*m3[1] + m0[0]*m2[3]*m3[1] + m0[1]*m2[0]*m3[3] - m0[0]*m2[1]*m3[3]) /det,
|
( m0[3]*m2[1]*m3[0] - m0[1]*m2[3]*m3[0] - m0[3]*m2[0]*m3[1] + m0[0]*m2[3]*m3[1] + m0[1]*m2[0]*m3[3] - m0[0]*m2[1]*m3[3]) /det,
|
||||||
( m0[1]*m1[3]*m3[0] - m0[3]*m1[1]*m3[0] + m0[3]*m1[0]*m3[1] - m0[0]*m1[3]*m3[1] - m0[1]*m1[0]*m3[3] + m0[0]*m1[1]*m3[3]) /det,
|
( m0[1]*m1[3]*m3[0] - m0[3]*m1[1]*m3[0] + m0[3]*m1[0]*m3[1] - m0[0]*m1[3]*m3[1] - m0[1]*m1[0]*m3[3] + m0[0]*m1[1]*m3[3]) /det,
|
||||||
( m0[3]*m1[1]*m2[0] - m0[1]*m1[3]*m2[0] - m0[3]*m1[0]*m2[1] + m0[0]*m1[3]*m2[1] + m0[1]*m1[0]*m2[3] - m0[0]*m1[1]*m2[3]) /det],
|
( m0[3]*m1[1]*m2[0] - m0[1]*m1[3]*m2[0] - m0[3]*m1[0]*m2[1] + m0[0]*m1[3]*m2[1] + m0[1]*m1[0]*m2[3] - m0[0]*m1[1]*m2[3]) /det],
|
||||||
[( m1[2]*m2[1]*m3[0] - m1[1]*m2[2]*m3[0] - m1[2]*m2[0]*m3[1] + m1[0]*m2[2]*m3[1] + m1[1]*m2[0]*m3[2] - m1[0]*m2[1]*m3[2]) /det,
|
[( m1[2]*m2[1]*m3[0] - m1[1]*m2[2]*m3[0] - m1[2]*m2[0]*m3[1] + m1[0]*m2[2]*m3[1] + m1[1]*m2[0]*m3[2] - m1[0]*m2[1]*m3[2]) /det,
|
||||||
( m0[1]*m2[2]*m3[0] - m0[2]*m2[1]*m3[0] + m0[2]*m2[0]*m3[1] - m0[0]*m2[2]*m3[1] - m0[1]*m2[0]*m3[2] + m0[0]*m2[1]*m3[2]) /det,
|
( m0[1]*m2[2]*m3[0] - m0[2]*m2[1]*m3[0] + m0[2]*m2[0]*m3[1] - m0[0]*m2[2]*m3[1] - m0[1]*m2[0]*m3[2] + m0[0]*m2[1]*m3[2]) /det,
|
||||||
( m0[2]*m1[1]*m3[0] - m0[1]*m1[2]*m3[0] - m0[2]*m1[0]*m3[1] + m0[0]*m1[2]*m3[1] + m0[1]*m1[0]*m3[2] - m0[0]*m1[1]*m3[2]) /det,
|
( m0[2]*m1[1]*m3[0] - m0[1]*m1[2]*m3[0] - m0[2]*m1[0]*m3[1] + m0[0]*m1[2]*m3[1] + m0[1]*m1[0]*m3[2] - m0[0]*m1[1]*m3[2]) /det,
|
||||||
( m0[1]*m1[2]*m2[0] - m0[2]*m1[1]*m2[0] + m0[2]*m1[0]*m2[1] - m0[0]*m1[2]*m2[1] - m0[1]*m1[0]*m2[2] + m0[0]*m1[1]*m2[2]) /det]]
|
( m0[1]*m1[2]*m2[0] - m0[2]*m1[1]*m2[0] + m0[2]*m1[0]*m2[1] - m0[0]*m1[2]*m2[1] - m0[1]*m1[0]*m2[2] + m0[0]*m1[1]*m2[2]) /det]]
|
||||||
|
|
||||||
def get_bounding_box(scene):
|
def get_bounding_box(scene):
|
||||||
bb_min = [1e10, 1e10, 1e10] # x,y,z
|
bb_min = [1e10, 1e10, 1e10] # x,y,z
|
||||||
bb_max = [-1e10, -1e10, -1e10] # x,y,z
|
bb_max = [-1e10, -1e10, -1e10] # x,y,z
|
||||||
inv = numpy.linalg.inv if numpy else _inv
|
inv = numpy.linalg.inv if numpy else _inv
|
||||||
return get_bounding_box_for_node(scene.rootnode, bb_min, bb_max, inv(scene.rootnode.transformation))
|
return get_bounding_box_for_node(scene.rootnode, bb_min, bb_max, inv(scene.rootnode.transformation))
|
||||||
|
|
||||||
def get_bounding_box_for_node(node, bb_min, bb_max, transformation):
|
def get_bounding_box_for_node(node, bb_min, bb_max, transformation):
|
||||||
|
|
||||||
if numpy:
|
if numpy:
|
||||||
transformation = numpy.dot(transformation, node.transformation)
|
transformation = numpy.dot(transformation, node.transformation)
|
||||||
else:
|
else:
|
||||||
t0,t1,t2,t3 = transformation
|
t0,t1,t2,t3 = transformation
|
||||||
T0,T1,T2,T3 = node.transformation
|
T0,T1,T2,T3 = node.transformation
|
||||||
transformation = [ [
|
transformation = [ [
|
||||||
t0[0]*T0[0] + t0[1]*T1[0] + t0[2]*T2[0] + t0[3]*T3[0],
|
t0[0]*T0[0] + t0[1]*T1[0] + t0[2]*T2[0] + t0[3]*T3[0],
|
||||||
t0[0]*T0[1] + t0[1]*T1[1] + t0[2]*T2[1] + t0[3]*T3[1],
|
t0[0]*T0[1] + t0[1]*T1[1] + t0[2]*T2[1] + t0[3]*T3[1],
|
||||||
t0[0]*T0[2] + t0[1]*T1[2] + t0[2]*T2[2] + t0[3]*T3[2],
|
t0[0]*T0[2] + t0[1]*T1[2] + t0[2]*T2[2] + t0[3]*T3[2],
|
||||||
t0[0]*T0[3] + t0[1]*T1[3] + t0[2]*T2[3] + t0[3]*T3[3]
|
t0[0]*T0[3] + t0[1]*T1[3] + t0[2]*T2[3] + t0[3]*T3[3]
|
||||||
],[
|
],[
|
||||||
t1[0]*T0[0] + t1[1]*T1[0] + t1[2]*T2[0] + t1[3]*T3[0],
|
t1[0]*T0[0] + t1[1]*T1[0] + t1[2]*T2[0] + t1[3]*T3[0],
|
||||||
t1[0]*T0[1] + t1[1]*T1[1] + t1[2]*T2[1] + t1[3]*T3[1],
|
t1[0]*T0[1] + t1[1]*T1[1] + t1[2]*T2[1] + t1[3]*T3[1],
|
||||||
t1[0]*T0[2] + t1[1]*T1[2] + t1[2]*T2[2] + t1[3]*T3[2],
|
t1[0]*T0[2] + t1[1]*T1[2] + t1[2]*T2[2] + t1[3]*T3[2],
|
||||||
t1[0]*T0[3] + t1[1]*T1[3] + t1[2]*T2[3] + t1[3]*T3[3]
|
t1[0]*T0[3] + t1[1]*T1[3] + t1[2]*T2[3] + t1[3]*T3[3]
|
||||||
],[
|
],[
|
||||||
t2[0]*T0[0] + t2[1]*T1[0] + t2[2]*T2[0] + t2[3]*T3[0],
|
t2[0]*T0[0] + t2[1]*T1[0] + t2[2]*T2[0] + t2[3]*T3[0],
|
||||||
t2[0]*T0[1] + t2[1]*T1[1] + t2[2]*T2[1] + t2[3]*T3[1],
|
t2[0]*T0[1] + t2[1]*T1[1] + t2[2]*T2[1] + t2[3]*T3[1],
|
||||||
t2[0]*T0[2] + t2[1]*T1[2] + t2[2]*T2[2] + t2[3]*T3[2],
|
t2[0]*T0[2] + t2[1]*T1[2] + t2[2]*T2[2] + t2[3]*T3[2],
|
||||||
t2[0]*T0[3] + t2[1]*T1[3] + t2[2]*T2[3] + t2[3]*T3[3]
|
t2[0]*T0[3] + t2[1]*T1[3] + t2[2]*T2[3] + t2[3]*T3[3]
|
||||||
],[
|
],[
|
||||||
t3[0]*T0[0] + t3[1]*T1[0] + t3[2]*T2[0] + t3[3]*T3[0],
|
t3[0]*T0[0] + t3[1]*T1[0] + t3[2]*T2[0] + t3[3]*T3[0],
|
||||||
t3[0]*T0[1] + t3[1]*T1[1] + t3[2]*T2[1] + t3[3]*T3[1],
|
t3[0]*T0[1] + t3[1]*T1[1] + t3[2]*T2[1] + t3[3]*T3[1],
|
||||||
t3[0]*T0[2] + t3[1]*T1[2] + t3[2]*T2[2] + t3[3]*T3[2],
|
t3[0]*T0[2] + t3[1]*T1[2] + t3[2]*T2[2] + t3[3]*T3[2],
|
||||||
t3[0]*T0[3] + t3[1]*T1[3] + t3[2]*T2[3] + t3[3]*T3[3]
|
t3[0]*T0[3] + t3[1]*T1[3] + t3[2]*T2[3] + t3[3]*T3[3]
|
||||||
] ]
|
] ]
|
||||||
|
|
||||||
for mesh in node.meshes:
|
for mesh in node.meshes:
|
||||||
for v in mesh.vertices:
|
for v in mesh.vertices:
|
||||||
v = transform(v, transformation)
|
v = transform(v, transformation)
|
||||||
bb_min[0] = min(bb_min[0], v[0])
|
bb_min[0] = min(bb_min[0], v[0])
|
||||||
bb_min[1] = min(bb_min[1], v[1])
|
bb_min[1] = min(bb_min[1], v[1])
|
||||||
bb_min[2] = min(bb_min[2], v[2])
|
bb_min[2] = min(bb_min[2], v[2])
|
||||||
bb_max[0] = max(bb_max[0], v[0])
|
bb_max[0] = max(bb_max[0], v[0])
|
||||||
bb_max[1] = max(bb_max[1], v[1])
|
bb_max[1] = max(bb_max[1], v[1])
|
||||||
bb_max[2] = max(bb_max[2], v[2])
|
bb_max[2] = max(bb_max[2], v[2])
|
||||||
|
|
||||||
|
|
||||||
for child in node.children:
|
for child in node.children:
|
||||||
bb_min, bb_max = get_bounding_box_for_node(child, bb_min, bb_max, transformation)
|
bb_min, bb_max = get_bounding_box_for_node(child, bb_min, bb_max, transformation)
|
||||||
|
|
||||||
return bb_min, bb_max
|
return bb_min, bb_max
|
||||||
|
|
||||||
def try_load_functions(library_path, dll):
|
def try_load_functions(library_path, dll):
|
||||||
'''
|
'''
|
||||||
Try to bind to aiImportFile and aiReleaseImport
|
Try to bind to aiImportFile and aiReleaseImport
|
||||||
|
|
||||||
Arguments
|
Arguments
|
||||||
---------
|
---------
|
||||||
library_path: path to current lib
|
library_path: path to current lib
|
||||||
dll: ctypes handle to library
|
dll: ctypes handle to library
|
||||||
|
|
||||||
Returns
|
Returns
|
||||||
---------
|
---------
|
||||||
If unsuccessful:
|
If unsuccessful:
|
||||||
None
|
None
|
||||||
If successful:
|
If successful:
|
||||||
Tuple containing (library_path,
|
Tuple containing (library_path,
|
||||||
load from filename function,
|
load from filename function,
|
||||||
load from memory function,
|
load from memory function,
|
||||||
export to filename function,
|
export to filename function,
|
||||||
export to blob function,
|
export to blob function,
|
||||||
release function,
|
release function,
|
||||||
ctypes handle to assimp library)
|
ctypes handle to assimp library)
|
||||||
'''
|
'''
|
||||||
|
|
||||||
try:
|
try:
|
||||||
load = dll.aiImportFile
|
load = dll.aiImportFile
|
||||||
release = dll.aiReleaseImport
|
release = dll.aiReleaseImport
|
||||||
load_mem = dll.aiImportFileFromMemory
|
load_mem = dll.aiImportFileFromMemory
|
||||||
export = dll.aiExportScene
|
export = dll.aiExportScene
|
||||||
export2blob = dll.aiExportSceneToBlob
|
export2blob = dll.aiExportSceneToBlob
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
#OK, this is a library, but it doesn't have the functions we need
|
#OK, this is a library, but it doesn't have the functions we need
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# library found!
|
# library found!
|
||||||
from .structs import Scene, ExportDataBlob
|
from .structs import Scene, ExportDataBlob
|
||||||
load.restype = POINTER(Scene)
|
load.restype = POINTER(Scene)
|
||||||
load_mem.restype = POINTER(Scene)
|
load_mem.restype = POINTER(Scene)
|
||||||
export2blob.restype = POINTER(ExportDataBlob)
|
export2blob.restype = POINTER(ExportDataBlob)
|
||||||
return (library_path, load, load_mem, export, export2blob, release, dll)
|
return (library_path, load, load_mem, export, export2blob, release, dll)
|
||||||
|
|
||||||
def search_library():
|
def search_library():
|
||||||
'''
|
'''
|
||||||
Loads the assimp library.
|
Loads the assimp library.
|
||||||
Throws exception AssimpError if no library_path is found
|
Throws exception AssimpError if no library_path is found
|
||||||
|
|
||||||
Returns: tuple, (load from filename function,
|
Returns: tuple, (load from filename function,
|
||||||
load from memory function,
|
load from memory function,
|
||||||
export to filename function,
|
export to filename function,
|
||||||
export to blob function,
|
export to blob function,
|
||||||
release function,
|
release function,
|
||||||
dll)
|
dll)
|
||||||
'''
|
'''
|
||||||
#this path
|
#this path
|
||||||
folder = os.path.dirname(__file__)
|
folder = os.path.dirname(__file__)
|
||||||
|
|
||||||
# silence 'DLL not found' message boxes on win
|
# silence 'DLL not found' message boxes on win
|
||||||
try:
|
try:
|
||||||
ctypes.windll.kernel32.SetErrorMode(0x8007)
|
ctypes.windll.kernel32.SetErrorMode(0x8007)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
candidates = []
|
candidates = []
|
||||||
# test every file
|
# test every file
|
||||||
for curfolder in [folder]+additional_dirs:
|
for curfolder in [folder]+additional_dirs:
|
||||||
if os.path.isdir(curfolder):
|
if os.path.isdir(curfolder):
|
||||||
for filename in os.listdir(curfolder):
|
for filename in os.listdir(curfolder):
|
||||||
# our minimum requirement for candidates is that
|
# our minimum requirement for candidates is that
|
||||||
# they should contain 'assimp' somewhere in
|
# they should contain 'assimp' somewhere in
|
||||||
# their name
|
# their name
|
||||||
if filename.lower().find('assimp')==-1 :
|
if filename.lower().find('assimp')==-1 :
|
||||||
continue
|
continue
|
||||||
is_out=1
|
is_out=1
|
||||||
for et in ext_whitelist:
|
for et in ext_whitelist:
|
||||||
if et in filename.lower():
|
if et in filename.lower():
|
||||||
is_out=0
|
is_out=0
|
||||||
break
|
break
|
||||||
if is_out:
|
if is_out:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
library_path = os.path.join(curfolder, filename)
|
library_path = os.path.join(curfolder, filename)
|
||||||
logger.debug('Try ' + library_path)
|
logger.debug('Try ' + library_path)
|
||||||
try:
|
try:
|
||||||
dll = ctypes.cdll.LoadLibrary(library_path)
|
dll = ctypes.cdll.LoadLibrary(library_path)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(str(e))
|
logger.warning(str(e))
|
||||||
# OK, this except is evil. But different OSs will throw different
|
# OK, this except is evil. But different OSs will throw different
|
||||||
# errors. So just ignore any errors.
|
# errors. So just ignore any errors.
|
||||||
continue
|
continue
|
||||||
# see if the functions we need are in the dll
|
# see if the functions we need are in the dll
|
||||||
loaded = try_load_functions(library_path, dll)
|
loaded = try_load_functions(library_path, dll)
|
||||||
if loaded: candidates.append(loaded)
|
if loaded: candidates.append(loaded)
|
||||||
|
|
||||||
if not candidates:
|
if not candidates:
|
||||||
# no library found
|
# no library found
|
||||||
raise AssimpError("assimp library not found")
|
raise AssimpError("assimp library not found")
|
||||||
else:
|
else:
|
||||||
# get the newest library_path
|
# get the newest library_path
|
||||||
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
|
candidates = map(lambda x: (os.lstat(x[0])[-2], x), candidates)
|
||||||
res = max(candidates, key=operator.itemgetter(0))[1]
|
res = max(candidates, key=operator.itemgetter(0))[1]
|
||||||
logger.debug('Using assimp library located at ' + res[0])
|
logger.debug('Using assimp library located at ' + res[0])
|
||||||
|
|
||||||
# XXX: if there are 1000 dll/so files containing 'assimp'
|
# XXX: if there are 1000 dll/so files containing 'assimp'
|
||||||
# in their name, do we have all of them in our address
|
# in their name, do we have all of them in our address
|
||||||
# space now until gc kicks in?
|
# space now until gc kicks in?
|
||||||
|
|
||||||
# XXX: take version postfix of the .so on linux?
|
# XXX: take version postfix of the .so on linux?
|
||||||
return res[1:]
|
return res[1:]
|
||||||
|
|
||||||
def hasattr_silent(object, name):
|
def hasattr_silent(object, name):
|
||||||
"""
|
"""
|
||||||
Calls hasttr() with the given parameters and preserves the legacy (pre-Python 3.2)
|
Calls hasttr() with the given parameters and preserves the legacy (pre-Python 3.2)
|
||||||
functionality of silently catching exceptions.
|
functionality of silently catching exceptions.
|
||||||
|
|
||||||
Returns the result of hasatter() or False if an exception was raised.
|
Returns the result of hasatter() or False if an exception was raised.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return hasattr(object, name)
|
return hasattr(object, name)
|
||||||
except:
|
except AttributeError:
|
||||||
return False
|
return False
|
||||||
|
|
Loading…
Reference in New Issue