Colours are now Vectors, added rainbow pigment.
[raymarcher.git] / Vector.lua
1 -- Small package of 3D vector functions
2
3 local mt = {}
4
5 local function new(v)
6    local vec = {v[1], v[2], v[3]}
7    setmetatable(vec, mt)
8    return vec
9 end
10
11 local function addvec(v, w)
12    return new{v[1]+w[1], v[2]+w[2], v[3]+w[3]}
13 end
14
15 local function subvec(v, w)
16    return new{v[1]-w[1], v[2]-w[2], v[3]-w[3]}
17 end
18
19 local function addnum(v, n)
20    return new{v[1] + n, v[2] + n, v[3] + n}
21 end
22
23 local function subnum(v, n)
24    return new{v[1] - n, v[2] - n, v[3] - n}
25 end
26
27 local function addany(v, x)
28    if type(x) == "table" then
29       return addvec(v, x)
30    else
31       return addnum(v, x)
32    end
33 end
34
35 local function subany(v, x)
36    if type(x) == "table" then
37       return subvec(v, x)
38    else
39       return subnum(v, x)
40    end
41 end
42
43 local function scale(v, n)
44    return new{v[1]*n, v[2]*n, v[3]*n}
45 end
46
47 local function dot(v, w)
48    return v[1]*w[1] +v[2]*w[2] + v[3]*w[3]
49 end
50
51 local function mulany(v, x)
52    if type(x) == "table" then
53       return dot(v, x)
54    else
55       return scale(v, x)
56    end
57 end
58
59 local function cross(v, w)
60    return new {v[2]*w[3] - w[2]*v[3],
61                w[1]*v[3] - v[1]*w[3],
62                v[1]*w[2] - w[1]*v[2]}
63 end
64
65 local function scaleinv(v,n)
66    return new{v[1]/n, v[2]/n, v[3]/n}
67 end
68
69 local function neg(v)
70    return v*(-1)
71 end
72
73 local function norm2(v)
74    return dot(v,v)
75 end
76
77 local function norm(v)
78    return math.sqrt(norm2(v))
79 end
80
81 local function normalize(v)
82    return v/norm(v)
83 end
84
85 local function vectostring(v)
86    return "{" .. v[1] .. ", " .. v[2] .. ", " .. v[3] .. "}"
87 end
88
89 mt.__add = addany
90 mt.__sub = subany
91 mt.__mul = mulany
92 mt.__div = scaleinv
93 mt.__unm = neg
94 mt.__tostring = vectostring
95
96 Vector = {
97    new = new,
98    norm = norm,
99    norm2 = norm2,
100    cross = cross,
101    normalize = normalize,
102    x = new{1,0,0},
103    y = new{0,1,0},
104    z = new{0,0,1},
105    origin = new{0,0,0}
106 }
107
108 return Vector