ya2 · news · projects · code · about

renamed lib to ya2
[pmachines.git] / ya2 / lib / p3d / vec.py
1 from panda3d.core import Vec2, Vec3, Mat4, LVector2f, LVector3f
2
3
4 class P3dVec2:
5
6 attr_lst = ['x', 'y']
7 p3d_cls = Vec2
8
9 def __init__(self, *args):
10 self._vec = self.p3d_cls(*args)
11
12 @property
13 def x(self): return self._vec.x
14
15 @property
16 def y(self): return self._vec.y
17
18 @property
19 def xy(self): return P3dVec2(self._vec.x, self._vec.y)
20
21 def signed_angle_deg(self, vec):
22 return self._vec.signed_angle_deg(LVector2f(vec.x, vec.y))
23
24 def dot(self, other):
25 if isinstance(other, tuple): other = self.__class__(*other)
26 return self._vec.dot(other._vec)
27 #TODO: don't access a protected member
28
29 def __neg__(self):
30 nvec = - self._vec
31 return self.__class__(*[getattr(nvec, attr) for attr in self.attr_lst])
32
33 def __add__(self, vec):
34 if isinstance(vec, tuple): vec = self.__class__(*vec)
35 svec = self._vec + vec._vec #TODO: don't access a protected member
36 return self.__class__(*[getattr(svec, attr) for attr in self.attr_lst])
37
38 def __sub__(self, vec):
39 if isinstance(vec, tuple): vec = self.__class__(*vec)
40 svec = self._vec - vec._vec #TODO: don't access a protected member
41 return self.__class__(*[getattr(svec, attr) for attr in self.attr_lst])
42
43 def __mul__(self, val):
44 svec = self._vec * val
45 return self.__class__(*[getattr(svec, attr) for attr in self.attr_lst])
46
47 def normalize(self):
48 self._vec.normalize()
49 return self.__class__(*self.attrs)
50
51 @property
52 def attrs(self): return [getattr(self._vec, fld) for fld in self.attr_lst]
53
54 @property
55 def normalized(self):
56 vec = self.p3d_cls(*self.attrs)
57 vec.normalize()
58 return self.__class__(*[getattr(vec, fld) for fld in self.attr_lst])
59
60 def rotate(self, deg):
61 rot_mat = Mat4()
62 rot_mat.set_rotate_mat(deg, (0, 0, 1))
63 self._vec = rot_mat.xform_vec(self._vec)
64
65 def length(self): return self._vec.length()
66
67 def __repr__(self):
68 tmpl = '%s(' + \
69 ', '.join(['%s' for _ in range(len(self.attr_lst))]) + ')'
70 rnd = lambda x: round(x, 3)
71 vals = [rnd(getattr(self._vec, attr)) for attr in self.attr_lst]
72 pars = tuple([self.__class__.__name__] + vals)
73 return tmpl % pars
74
75
76 class P3dVec3(P3dVec2):
77
78 attr_lst = ['x', 'y', 'z']
79 p3d_cls = Vec3
80
81 @property
82 def z(self): return self._vec.z
83
84 def signed_angle_deg(self, vec):
85 v_up = LVector3f(0, 0, 1)
86 return self._vec.signed_angle_deg(LVector3f(vec.x, vec.y, vec.z), v_up)