def test_set_translate(self): self.assertEqual((mat4().set_translate((1, 2, 3)) * (3, 3, 3)), (4, 5, 6)) with self.assertRaises(TypeError): mat4().set_translate(1) with self.assertRaises(TypeError): mat4().set_translate((1, 2))
def test_modulo(self): self.assertEqual( mat4(1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0), mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) % 4) self.assertEqual( mat4(3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0, 3, 2, 1, 0), mat4(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16) % 4)
def test_position(self): self.assertEqual(mat4().translate((1, 2, 3)).position(), (1, 2, 3)) self.assertEqual(mat4().rotate_x(90).translate((1, 2, 3)).position(), (1, -3, 2)) self.assertEqual(mat4().translate((1, 2, 3)).rotate_x(90).position(), (1, 2, 3)) a = mat4().rotate_x(90).translate((1, 2, 3)) self.assertEqual(a.position(), a * (0, 0, 0))
def test_compare_rotate_vec(self): v = vec3((1, 2, 3)) self.assertAlmostEqual(mat4().rotate_x(90) * v, v.rotated_x(90)) self.assertAlmostEqual(mat4().rotate_y(90) * v, v.rotated_y(90)) self.assertAlmostEqual(mat4().rotate_z(90) * v, v.rotated_z(90)) self.assertAlmostEqual(mat4().rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90)) self.assertAlmostEqual( mat4().rotate_x(90).rotate_y(-90).rotate_z(90) * v, v.rotated_z(90).rotated_y(-90).rotated_x(90))
def test_rotate(self): self.assertEqual((mat4().rotate_x(90) * (1, 2, 3)).round(), vec3((1, -3, 2))) self.assertEqual( (mat4().rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((2, -3, -1))) self.assertEqual((mat4().rotate_z(90).rotate_y(90).rotate_x(90) * (1, 2, 3)).round(), vec3((3, 2, -1))) self.assertEqual((mat4().rotate_axis((0, 0, 1), 90).rotate_axis( (0, 1, 0), 90).rotate_axis((1, 0, 0), 90) * (1, 2, 3)).round(), vec3((3, 2, -1)))
def test_copy_vs_inplace(self): m = mat4() m += 1 self.assertEqual(mat4() + 1, m) m = mat4() m -= 1 self.assertEqual(mat4() - 1, m) m = mat4() m *= 2 self.assertEqual(mat4() * 2, m) m = mat4() m /= 2 self.assertEqual(mat4() / 2, m) m = mat4(1.5) m %= 1 self.assertEqual(mat4(1.5) % 1, m)
def test_scalar_aritm(self): self.assertEqual( mat4(1) + 1, mat4( (2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2))) self.assertEqual(mat4(1) * 3, mat4(3)) self.assertEqual( mat4(2) - 1, mat4((1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1))) self.assertEqual(mat4(2) / 4, mat4(.5))
def as_mat4(self): from pector import mat4 """ Returns a 4x4 rotation matrix from the quaternion. :return: mat4 """ m3 = self.as_mat3() return mat4(m3[0], m3[1], m3[2], 0., m3[3], m3[4], m3[5], 0., m3[6], m3[7], m3[8], 0., 0., 0., 0., 1.)
def test_scalar_aritm_inpl(self): a = mat4(1) a += 1 self.assertEqual( a, mat4((2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2))) a = mat4(1) a *= 3 self.assertEqual(a, mat4(3)) a = mat4(2) a -= 1 self.assertEqual( a, mat4((1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1, -1, -1, 1))) a = mat4(2) a /= 4 self.assertEqual(a, mat4(.5))
def test_transpose(self): self.assertEqual( mat4((1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16)), mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)).transpose()) self.assertEqual( mat4((1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16)), mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)).transposed()) self.assertEqual( mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)), mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)).transposed().transposed())
def test_assignment(self): self.assertEqual("mat4(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1)", str(mat4())) self.assertEqual("mat4(2,0,0,0, 0,2,0,0, 0,0,2,0, 0,0,0,2)", str(mat4(2))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str(mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str(mat4((1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str( mat4((1, 2, 3, 4), (5, 6, 7, 8), (9, 10, 11, 12), (13, 14, 15, 16)))) self.assertEqual( "mat4(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16)", str( mat4(1, vec3(2, 3, 4), 5, 6, (7, 8), (9, ), 10, 11, (12, ), 13, (14, 15), 16)))
def test_scale(self): self.assertEqual((mat4().init_scale(2) * (1, 2, 3)), (2, 4, 6)) self.assertEqual((mat4().scale(2) * (1, 2, 3)), (2, 4, 6)) self.assertEqual((mat4().scale(2).scale(2) * (1, 2, 3)), (4, 8, 12)) self.assertEqual((mat4().scale(10).init_scale(2) * (1, 2, 3)), (2, 4, 6))
def test_equal(self): self.assertEqual(mat4(1), (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1))
def test_trace(self): self.assertEqual( 34, mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16).trace())
def test_translate(self): self.assertEqual((mat4().translate((1, 2, 3)) * (3, 3, 3)), (4, 5, 6)) self.assertEqual((mat4().translate((1, 2, 3)).translate( (1, 2, 3)) * (3, 3, 3)), (5, 7, 9))
def test_floor(self): self.assertEqual(mat4(1), mat4(1.4).floor()) self.assertEqual(mat4(1), mat4(1.5).floor()) self.assertEqual(mat4(1), mat4(1.6).floor()) self.assertEqual(mat4(-2), mat4(-1.4).floor()) self.assertEqual(mat4(-2), mat4(-1.5).floor()) self.assertEqual(mat4(-2), mat4(-1.6).floor())
def test_has_rotation(self): self.assertFalse(mat4(1).has_rotation()) self.assertFalse(mat4(1).translate((1, 2, 3)).has_rotation()) self.assertTrue(mat4(1).rotate_x(0.01).has_rotation())
def test_mat4_x_mat4(self): self.assertEqual( mat4(28, 32, 36, 40, 56, 64, 72, 80, 84, 96, 108, 120, 112, 128, 144, 160), mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) * mat4(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4))
def test_dot(self): m = mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) self.assertEqual( 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 + 5 * 5 + 6 * 6 + 7 * 7 + 8 * 8 + 9 * 9 + 10 * 10 + 11 * 11 + 12 * 12 + 13 * 13 + 14 * 14 + 15 * 15 + 16 * 16, m.dot(m))
def test_round(self): self.assertEqual(mat4(0), mat4(0.49).round()) self.assertEqual(mat4(0), mat4(0.5).round()) self.assertEqual(mat4(1), mat4(0.51).round()) self.assertEqual(mat4(0), mat4(-0.49).round()) self.assertEqual(mat4(0), mat4(-0.5).round()) self.assertEqual(mat4(-1), mat4(-0.51).round()) self.assertEqual(mat4(0.5), mat4(0.49).round(1)) self.assertEqual(mat4(0.5), mat4(0.5).round(1)) self.assertEqual(mat4(0.5), mat4(0.51).round(1)) self.assertEqual(mat4(-0.5), mat4(-0.49).round(1)) self.assertEqual(mat4(-0.5), mat4(-0.5).round(1)) self.assertEqual(mat4(-0.5), mat4(-0.51).round(1))
def test_mat4_mat3_conversion(self): self.assertEqual(mat4(1, 2, 3, 0, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 1), mat4(mat3(1, 2, 3, 4, 5, 6, 7, 8, 9))) self.assertEqual( mat3(1, 2, 3, 5, 6, 7, 9, 10, 11), mat3(mat4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)))
def test_aritm(self): self.assertEqual(mat4(3), mat4(1) + mat4(2)) self.assertEqual(mat4(1), mat4(2) - mat4(1))
def __init__(self, name, transform=mat4()): super(CsgBase, self).__init__(name) self._has_transform = transform != mat4() self._transform = mat4(transform) self._itransform = self._transform.inversed_simple() self._id = abs(self.__hash__())
def test_mat4_x_vec3(self): self.assertEqual(mat4(1) * (1, 2, 3), vec3(1, 2, 3)) self.assertEqual(mat4(2) * (1, 2, 3), vec3(2, 4, 6))
def set_transform(self, mat): self._has_transform = mat != mat4() self._transform = mat4(mat) self._itransform = self._transform.inversed_simple() return self
def test_has_translation(self): self.assertFalse(mat4(1).has_translation()) self.assertFalse(mat4(2).has_translation()) self.assertFalse(mat4(1).rotate_axis((1, 2, 3), 23.).has_translation()) self.assertTrue(mat4(1).translate((1, 2, 3)).has_translation())