add a barebones vector3 class
This commit is contained in:
		
							
								
								
									
										116
									
								
								data/scripts/vector3.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								data/scripts/vector3.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,116 @@
 | 
				
			|||||||
 | 
					local Vector3 = {
 | 
				
			||||||
 | 
					  x = 0,
 | 
				
			||||||
 | 
					  y = 0,
 | 
				
			||||||
 | 
					  z = 0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  _CLASS_ = "Vector3"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					setmetatable(Vector3, Vector3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function is_weak_vector3(t)
 | 
				
			||||||
 | 
					  if type(t) ~= "table" then return false end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local haskeys = t.x ~= nil and t.y ~= nil and t.z ~= nil
 | 
				
			||||||
 | 
					  if not haskeys then
 | 
				
			||||||
 | 
					    return type(t[1]) == "number" and type(t[2]) == "number" and type(t[3]) == "number"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    return type(t.x) == "number" and type(t.y) == "number" and type(t.z) == "number"
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__mul(b)
 | 
				
			||||||
 | 
					  if type(b) == "number" then
 | 
				
			||||||
 | 
					    return Vector3{
 | 
				
			||||||
 | 
					      x = self.x * b,
 | 
				
			||||||
 | 
					      y = self.y * b,
 | 
				
			||||||
 | 
					      z = self.z * b,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  elseif type(b) == "table" and is_weak_vector3(b) then
 | 
				
			||||||
 | 
					    local other = Vector3(b)
 | 
				
			||||||
 | 
					    return Vector3{
 | 
				
			||||||
 | 
					      self.x * other.x,
 | 
				
			||||||
 | 
					      self.y * other.y,
 | 
				
			||||||
 | 
					      self.z * other.z,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  error("Vector3: other must be either a number or a Vector3-like table.")
 | 
				
			||||||
 | 
					  return Vector3()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__div(b)
 | 
				
			||||||
 | 
					  if type(b) == "number" then
 | 
				
			||||||
 | 
					    return Vector3{
 | 
				
			||||||
 | 
					      x = self.x / b,
 | 
				
			||||||
 | 
					      y = self.y / b,
 | 
				
			||||||
 | 
					      z = self.z / b,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  elseif type(b) == "table" and is_weak_vector3(b) then
 | 
				
			||||||
 | 
					    local other = Vector3(b)
 | 
				
			||||||
 | 
					    return Vector3{
 | 
				
			||||||
 | 
					      self.x / other.x,
 | 
				
			||||||
 | 
					      self.y / other.y,
 | 
				
			||||||
 | 
					      self.z / other.z,
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  error("Vector3: other must be either a number or a Vector3-like table.")
 | 
				
			||||||
 | 
					  return Vector3()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__add(b)
 | 
				
			||||||
 | 
					  if not is_weak_vector3(b) then
 | 
				
			||||||
 | 
					    error("Vector3: other must be a Vector3-like table.")
 | 
				
			||||||
 | 
					    return self
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  local other = Vector3(b)
 | 
				
			||||||
 | 
					  return Vector3{
 | 
				
			||||||
 | 
					    self.x + other.x,
 | 
				
			||||||
 | 
					    self.y + other.y,
 | 
				
			||||||
 | 
					    self.z + other.z,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__sub(b)
 | 
				
			||||||
 | 
					  if not is_weak_vector3(b) then
 | 
				
			||||||
 | 
					    error("Vector3: other must be a Vector3-like table.")
 | 
				
			||||||
 | 
					    return self
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  local other = Vector3(b)
 | 
				
			||||||
 | 
					  return Vector3{
 | 
				
			||||||
 | 
					    self.x - other.x,
 | 
				
			||||||
 | 
					    self.y - other.y,
 | 
				
			||||||
 | 
					    self.z - other.z,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__unm()
 | 
				
			||||||
 | 
					  return Vector3{
 | 
				
			||||||
 | 
					    -self.x,
 | 
				
			||||||
 | 
					    -self.y,
 | 
				
			||||||
 | 
					    -self.z,
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__call(...)
 | 
				
			||||||
 | 
					  local args = ...
 | 
				
			||||||
 | 
					  local nv = {x = 0, y = 0, z = 0}
 | 
				
			||||||
 | 
					  setmetatable(nv, Vector3)
 | 
				
			||||||
 | 
					  if type(args) == "number" then
 | 
				
			||||||
 | 
					      nv.x, nv.y, nv.z = args, args, args
 | 
				
			||||||
 | 
					  elseif type(args) == "table" then
 | 
				
			||||||
 | 
					    if args.x ~= nil then
 | 
				
			||||||
 | 
					      nv.x, nv.y, nv.z = args.x, args.y, args.z
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      nv.x, nv.y, nv.z = args[1], args[2], args[3]
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  return nv
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function Vector3:__tostring()
 | 
				
			||||||
 | 
					  return "Vector3(" .. tostring(self.x) .. ", " .. tostring(self.y) .. ", " .. tostring(self.z) .. ")"
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					return Vector3
 | 
				
			||||||
							
								
								
									
										5
									
								
								data/scripts/vector3test.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								data/scripts/vector3test.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					local Vector3 = require "vector3"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local v1 = Vector3{x = 10, y = 20, z = 30}
 | 
				
			||||||
 | 
					local v2 = Vector3(5)
 | 
				
			||||||
 | 
					print(-v2)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user