<s> """<STR_LIT>""" <EOL> from __future__ import absolute_import , division , print_function <EOL> import numpy as np <EOL> from . import matrix33 <EOL> from . utils import all_parameters_as_numpy_arrays , parameters_as_numpy_arrays <EOL> def create_identity ( dtype = None ) : <EOL> """<STR_LIT>""" <EOL> return np . identity ( <NUM_LIT:4> , dtype = dtype ) <EOL> def create_from_matrix33 ( mat , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> mat4 = np . identity ( <NUM_LIT:4> , dtype = dtype ) <EOL> mat4 [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = mat <EOL> return mat4 <EOL> def create_matrix33_view ( mat ) : <EOL> """<STR_LIT>""" <EOL> return mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] <EOL> @ parameters_as_numpy_arrays ( '<STR_LIT>' ) <EOL> def create_from_eulers ( eulers , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> dtype = dtype or eulers . dtype <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_eulers ( eulers , dtype ) <EOL> return mat <EOL> @ parameters_as_numpy_arrays ( '<STR_LIT>' ) <EOL> def create_from_axis_rotation ( axis , theta , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> dtype = dtype or axis . dtype <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_axis_rotation ( axis , theta , dtype ) <EOL> return mat <EOL> @ parameters_as_numpy_arrays ( '<STR_LIT>' ) <EOL> def create_from_quaternion ( quat , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> dtype = dtype or quat . dtype <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_quaternion ( quat , dtype ) <EOL> return mat <EOL> @ parameters_as_numpy_arrays ( '<STR_LIT>' ) <EOL> def create_from_inverse_of_quaternion ( quat , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> dtype = dtype or quat . dtype <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_inverse_of_quaternion ( quat , dtype ) <EOL> return mat <EOL> @ parameters_as_numpy_arrays ( '<STR_LIT>' ) <EOL> def create_from_translation ( vec , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> dtype = dtype or vec . dtype <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = vec [ : <NUM_LIT:3> ] <EOL> return mat <EOL> def create_from_scale ( scale , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> m = np . diagflat ( [ scale [ <NUM_LIT:0> ] , scale [ <NUM_LIT:1> ] , scale [ <NUM_LIT:2> ] , <NUM_LIT:1.0> ] ) <EOL> if dtype : <EOL> m = m . astype ( dtype ) <EOL> return m <EOL> def create_from_x_rotation ( theta , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_x_rotation ( theta , dtype ) <EOL> return mat <EOL> def create_from_y_rotation ( theta , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_y_rotation ( theta , dtype ) <EOL> return mat <EOL> def create_from_z_rotation ( theta , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> mat = create_identity ( dtype ) <EOL> mat [ <NUM_LIT:0> : <NUM_LIT:3> , <NUM_LIT:0> : <NUM_LIT:3> ] = matrix33 . create_from_z_rotation ( theta , dtype ) <EOL> return mat <EOL> @ all_parameters_as_numpy_arrays <EOL> def apply_to_vector ( mat , vec ) : <EOL> """<STR_LIT>""" <EOL> if vec . size == <NUM_LIT:3> : <EOL> vec4 = np . array ( [ vec [ <NUM_LIT:0> ] , vec [ <NUM_LIT:1> ] , vec [ <NUM_LIT:2> ] , <NUM_LIT:1.> ] , dtype = vec . dtype ) <EOL> vec4 = np . dot ( vec4 , mat ) <EOL> if np . allclose ( vec4 [ <NUM_LIT:3> ] , <NUM_LIT:0.> ) : <EOL> vec4 [ : ] = [ np . inf , np . inf , np . inf , np . inf ] <EOL> else : <EOL> vec4 /= vec4 [ <NUM_LIT:3> ] <EOL> return vec4 [ : <NUM_LIT:3> ] <EOL> elif vec . size == <NUM_LIT:4> : <EOL> return np . dot ( vec , mat ) <EOL> else : <EOL> raise ValueError ( "<STR_LIT>" ) <EOL> def multiply ( m1 , m2 ) : <EOL> """<STR_LIT>""" <EOL> return np . dot ( m1 , m2 ) <EOL> def create_perspective_projection_matrix ( fovy , aspect , near , far , dtype = None ) : <EOL> """<STR_LIT>""" <EOL> ymax = near * np . tan ( fovy * np . pi / <NUM_LIT> ) <EOL> xmax = ymax * aspect <EOL> return create_perspective_projection_matrix_from_bounds ( - xmax , xmax , - ymax , ymax , near , far ) <EOL> def create_perspective_projection_matrix_from_bounds ( <EOL> left , <EOL> right , <EOL> bottom , <EOL> top , <EOL> near , <EOL> far , <EOL> dtype = None <EOL> ) : <EOL> """<STR_LIT>""" <EOL> """<STR_LIT>""" <EOL> A = ( right + left ) / ( right - left ) <EOL> B = ( top + bottom ) / ( top - bottom ) <EOL> C = - ( far + near ) / ( far - near ) <EOL> D = - <NUM_LIT> * far * near / ( far - near ) <EOL> E = <NUM_LIT> * near / ( right - left ) <EOL> F = <NUM_LIT> * near / ( top - bottom ) <EOL> return np . array ( ( <EOL> ( E , <NUM_LIT:0.> , <NUM_LIT:0.> , <NUM_LIT:0.> ) , <EOL> ( <NUM_LIT:0.> , F , <NUM_LIT:0.> , <NUM_LIT:0.> ) , <EOL> ( A , B , C , - <NUM_LIT:1.> ) , <EOL> ( <NUM_LIT:0.> , <NUM_LIT:0.> , D , <NUM_LIT:0.> ) , <EOL> ) , dtype = dtype ) <EOL> def create_orthogonal_projection_matrix ( <EOL> left , <EOL> right , <EOL> bottom , <EOL> top , <EOL> near , <EOL> far , <EOL> dtype = None <EOL> ) : <EOL> """<STR_LIT>""" <EOL> """<STR_LIT>""" <EOL> rml = right - left <EOL> tmb = top - bottom <EOL> fmn = far - near <EOL> A = <NUM_LIT> / rml <EOL> B = <NUM_LIT> / tmb <EOL> C = - <NUM_LIT> / fmn <EOL> Tx = - ( right + left ) / rml <EOL> Ty = - ( top + bottom ) / tmb <EOL> Tz = - ( far + near ) / fmn <EOL> return np . array ( ( <EOL> ( A , <NUM_LIT:0.> , <NUM_LIT:0.> , <NUM_LIT:0.> ) , <EOL> ( <NUM_LIT:0.> , B , <NUM_LIT:0.> , <NUM_LIT:0.> ) , <EOL> ( <NUM_LIT:0.> , <NUM_LIT:0.> , C , <NUM_LIT:0.> ) , <EOL> ( Tx , Ty , Tz , <NUM_LIT:1.> ) , <EOL> ) , dtype = dtype ) <EOL> def inverse ( m ) : <EOL> """<STR_LIT>""" <EOL> return np . linalg . inv ( m ) </s>
