1
1
from dataclasses import dataclass
2
2
from math import sqrt
3
+ from typing import Sequence
3
4
4
5
5
6
kEpsilon = 0.00001
6
7
7
8
8
9
@dataclass
9
10
class Vector3 :
11
+ '''https://github.com/Unity-Technologies/UnityCsReference/blob/master/Runtime/Export/Math/Vector3.cs'''
12
+
10
13
X : float = 0.0
11
14
Y : float = 0.0
12
15
Z : float = 0.0
13
16
14
17
def __init__ (self , * args ):
15
- if len (args ) == 3 or len (args ) == 1 and isinstance (args [0 ], (tuple , list )):
16
- self .X , self .Y , self .Z = args
17
- elif len (args ) == 1 :
18
- # dirty patch for Vector4
19
- self .__dict__ = args [0 ].__dict__
18
+ if len (args ) == 1 :
19
+ args = args [0 ]
20
+
21
+ if isinstance (args , Sequence ):
22
+ if len (args ) == 3 : # args=(x, y, z)
23
+ self .X , self .Y , self .Z = args
24
+ return
25
+ if len (args ) == 0 : # args=()
26
+ self .X = self .Y = self .Z = 0.0
27
+ return
28
+ else : # dirty patch for Vector4
29
+ self .X , self .Y , self .Z = args .X , args .Y , args .Z
30
+ return
31
+
32
+ raise TypeError ("Invalid arguments for Vector3" )
20
33
21
34
def __getitem__ (self , index ):
22
35
return (self .X , self .Y , self .Z )[index ]
@@ -32,13 +45,11 @@ def __setitem__(self, index, value):
32
45
raise IndexError ("Index out of range" )
33
46
34
47
def __hash__ (self ):
35
- return self .X .__hash__ () ^ (self .Y .__hash__ () << 2 ) ^ (self .Z .__hash__ () >> 2 )
36
-
37
- def __eq__ (self , other ):
38
- if isinstance (other , Vector3 ):
39
- return self .X == other .X and self .Y == other .Y and self .Z == other .Z
40
- else :
41
- return False
48
+ return (
49
+ self .X .__hash__ () ^
50
+ (self .Y .__hash__ () << 2 ) ^
51
+ (self .Z .__hash__ () >> 2 )
52
+ )
42
53
43
54
def normalize (self ):
44
55
length = self .length ()
@@ -48,21 +59,19 @@ def normalize(self):
48
59
self .Y *= invNorm
49
60
self .Z *= invNorm
50
61
else :
51
- X = 0
52
- Y = 0
53
- Z = 0
62
+ self .X = self .Y = self .Z = 0.0
54
63
55
- def Normalize (self ):
56
- self .normalize ()
64
+ Normalize = normalize
57
65
58
66
def length (self ):
59
- return sqrt (self .LengthSquared ())
67
+ return sqrt (self .lengthSquared ())
68
+
69
+ Length = length
60
70
61
- def Length (self ):
62
- return self .length ()
71
+ def lengthSquared (self ):
72
+ return self .X ** 2 + self . Y ** 2 + self . Z ** 2
63
73
64
- def LengthSquared (self ):
65
- return self .X ** 2 + self .Y ** 2 + self .Y ** 2
74
+ LengthSquared = lengthSquared
66
75
67
76
@staticmethod
68
77
def Zero ():
@@ -81,11 +90,14 @@ def __sub__(a, b):
81
90
def __mul__ (a , d ):
82
91
return Vector3 (a .X * d , a .Y * d , a .Z * d )
83
92
84
- def __div__ (a , d ):
93
+ def __truediv__ (a , d ):
85
94
return Vector3 (a .X / d , a .Y / d , a .Z / d )
86
95
87
96
def __eq__ (lhs , rhs ):
88
- return (lhs - rhs ).LengthSquared () < kEpsilon
97
+ if isinstance (rhs , Vector3 ):
98
+ diff = lhs - rhs
99
+ return diff .lengthSquared () < kEpsilon * kEpsilon
100
+ return False
89
101
90
102
def __ne__ (lhs , rhs ):
91
103
return not (lhs == rhs )
0 commit comments