[docs]class ivec2:
"""
2D integer vector class
"""
def __init__(self, x, y):
self.x = x
self.y = y
[docs] def X(self):
return int(self.x)
[docs] def Y(self):
return int(self.y)
[docs] def to_dict(self):
return [self.X(), self.Y()]
def __repr__(self):
return '<ivec2 {} {}>'.format(*self.to_dict())
[docs]class vec2:
"""Float version of ivec2"""
def __init__(self, x, y):
self.x = x
self.y = y
[docs] def X(self):
return float(self.x)
[docs] def Y(self):
return float(self.y)
[docs] def to_dict(self):
return [self.X(), self.Y()]
def __repr__(self):
return '<vec2 {} {}>'.format(*self.to_dict())
[docs]class vec3:
"""
3D vector class
"""
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
[docs] def X(self):
return float(self.x)
[docs] def Y(self):
return float(self.y)
[docs] def Z(self):
return float(self.z)
[docs] def to_dict(self):
return [self.X(), self.Y(), self.Z()]
def __repr__(self):
return '<vec3 {} {} {}>'.format(*self.to_dict())
[docs]class ivec3:
"""
3D integer vector class
"""
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
[docs] def X(self):
return int(self.x)
[docs] def Y(self):
return int(self.y)
[docs] def Z(self):
return int(self.z)
[docs] @classmethod
def ivec5(cls, i, x, y, z, s):
return ivec3(
x + ((i & 1) >> 0) * s,
y + ((i & 2) >> 1) * s,
z + ((i & 4) >> 2) * s
)
[docs] def mask(self, mask):
return ivec3(
self.X() & mask,
self.Y() & mask,
self.Z() & mask
)
[docs] def shl(self, shift):
return ivec3(
self.X() << shift,
self.Y() << shift,
self.Z() << shift,
)
[docs] def sub(self, b):
return ivec3(
self.X() - b.X(),
self.Y() - b.Y(),
self.Z() - b.Z()
)
[docs] def mul(self, s):
return ivec3(
self.X() * s,
self.Y() * s,
self.Z() * s
)
[docs] def add(self, b):
return ivec3(
self.X() + b.x,
self.Y() + b.y,
self.Z() + b.z
)
[docs] def gg(self, idx):
if idx == 0:
return self.X()
elif idx == 1:
return self.Y()
elif idx == 2:
return self.Z()
[docs] def dot(self, o):
return self.X() * o.x + self.Y() * o.y + self.Z() * o.z
[docs] def iszero(self):
return self.X() == 0 and self.Y() == 0 and self.Z() == 0
[docs] def to_dict(self):
return [self.X(), self.Y(), self.Z()]
def __repr__(self):
return '<ivec3 {} {} {}>'.format(*self.to_dict())
[docs]def cross(a, b):
"""
cross product of two ivec3/ivec
"""
if isinstance(a, ivec3):
return ivec3(
a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.x,
)
else:
return vec3(
a.y * b.z - a.z * b.y,
a.z * b.x - a.x * b.z,
a.x * b.y - a.y * b.x,
)