]> git.lizzy.rs Git - dragonfireclient.git/blob - builtin/vector.lua
Use engine.is_yes() in mainmenu
[dragonfireclient.git] / builtin / vector.lua
1
2 vector = {}
3
4 function vector.new(a, b, c)
5         v = {x=0, y=0, z=0}
6         if type(a) == "table" then
7                 v = {x=a.x, y=a.y, z=a.z}
8         elseif a and b and c then
9                 v = {x=a, y=b, z=c}
10         end
11         setmetatable(v, {
12                 __add = vector.add,
13                 __sub = vector.subtract,
14                 __mul = vector.multiply,
15                 __div = vector.divide,
16                 __umn = function(v) return vector.multiply(v, -1) end,
17                 __len = vector.length,
18                 __eq  = vector.equals,
19         })
20         return v
21 end
22
23 function vector.equals(a, b)
24         return a.x == b.x and
25                a.y == b.y and
26                a.z == b.z
27 end
28
29 function vector.length(v)
30         return math.hypot(v.x, math.hypot(v.y, v.z))
31 end
32
33 function vector.normalize(v)
34         local len = vector.length(v)
35         if len == 0 then
36                 return vector.new()
37         else
38                 return vector.divide(v, len)
39         end
40 end
41
42 function vector.round(v)
43         return {
44                 x = math.floor(v.x + 0.5),
45                 y = math.floor(v.y + 0.5),
46                 z = math.floor(v.z + 0.5)
47         }
48 end
49
50 function vector.distance(a, b)
51         local x = a.x - b.x
52         local y = a.y - b.y
53         local z = a.z - b.z
54         return math.hypot(x, math.hypot(y, z))
55 end
56
57 function vector.direction(pos1, pos2)
58         local x_raw = pos2.x - pos1.x
59         local y_raw = pos2.y - pos1.y
60         local z_raw = pos2.z - pos1.z
61         local x_abs = math.abs(x_raw)
62         local y_abs = math.abs(y_raw)
63         local z_abs = math.abs(z_raw)
64         if x_abs >= y_abs and
65            x_abs >= z_abs then
66                 y_raw = y_raw * (1 / x_abs)
67                 z_raw = z_raw * (1 / x_abs)
68                 x_raw = x_raw / x_abs
69         end
70         if y_abs >= x_abs and
71            y_abs >= z_abs then
72                 x_raw = x_raw * (1 / y_abs)
73                 z_raw = z_raw * (1 / y_abs)
74                 y_raw = y_raw / y_abs
75         end
76         if z_abs >= y_abs and
77            z_abs >= x_abs then
78                 x_raw = x_raw * (1 / z_abs)
79                 y_raw = y_raw * (1 / z_abs)
80                 z_raw = z_raw / z_abs
81         end
82         return {x=x_raw, y=y_raw, z=z_raw}
83 end
84
85
86 function vector.add(a, b)
87         if type(b) == "table" then
88                  return vector.new(
89                         a.x + b.x,
90                         a.y + b.y,
91                         a.z + b.z)
92         else
93                 return vector.new(
94                         a.x + b,
95                         a.y + b,
96                         a.z + b)
97         end
98 end
99
100 function vector.subtract(a, b)
101         if type(b) == "table" then
102                 return vector.new(
103                         a.x - b.x,
104                         a.y - b.y,
105                         a.z - b.z)
106         else
107                 return vector.new(
108                         a.x - b,
109                         a.y - b,
110                         a.z - b)
111         end
112 end
113
114 function vector.multiply(a, b)
115         if type(b) == "table" then
116                 return vector.new(
117                         a.x * b.x,
118                         a.y * b.y,
119                         a.z * b.z)
120         else
121                 return vector.new(
122                         a.x * b,
123                         a.y * b,
124                         a.z * b)
125         end
126 end
127
128 function vector.divide(a, b)
129         if type(b) == "table" then
130                 return vector.new(
131                         a.x / b.x,
132                         a.y / b.y,
133                         a.z / b.z)
134         else
135                 return vector.new(
136                         a.x / b,
137                         a.y / b,
138                         a.z / b)
139         end
140 end
141