diff --git a/init.lua b/init.lua index 45ccfe2..eca3de2 100644 --- a/init.lua +++ b/init.lua @@ -41,11 +41,12 @@ local files = { "vec3", "quat", "simplex", - "intersect" + "intersect", + "mesh" } for _, v in ipairs(files) do - cpml[v] = require(current_folder .. "cpml." .. v) + cpml[v] = require(current_folder .. "modules." .. v) end return cpml diff --git a/cpml/constants.lua b/modules/constants.lua similarity index 100% rename from cpml/constants.lua rename to modules/constants.lua diff --git a/cpml/intersect.lua b/modules/intersect.lua similarity index 100% rename from cpml/intersect.lua rename to modules/intersect.lua diff --git a/cpml/mat4.lua b/modules/mat4.lua similarity index 100% rename from cpml/mat4.lua rename to modules/mat4.lua diff --git a/modules/mesh.lua b/modules/mesh.lua new file mode 100644 index 0000000..e883a04 --- /dev/null +++ b/modules/mesh.lua @@ -0,0 +1,18 @@ +local current_folder = (...):gsub('%.[^%.]+$', '') .. "." +local vec3 = require(current_folder .. "vec3") + +local mesh = {} + +function mesh.compute_normal(a, b, c) + return (c - a):cross(b - a):normalize() +end + +function mesh.average(vertices) + local avg = vec3(0,0,0) + for _, v in ipairs(vertices) do + avg = avg + v + end + return avg / #vertices +end + +return mesh diff --git a/cpml/quat.lua b/modules/quat.lua similarity index 94% rename from cpml/quat.lua rename to modules/quat.lua index 4ca377f..015dcda 100644 --- a/cpml/quat.lua +++ b/modules/quat.lua @@ -8,8 +8,8 @@ This is a class for handling quaternion numbers. It was originally designed as a way of encoding rotations of 3 dimensional space. --]] -local Class = require "libs.hump.class" -local quaternion = Class {} +local quaternion = {} +quaternion.__index = quaternion local FLT_EPSILON = 1.19209290e-07 --[[ @@ -17,32 +17,33 @@ A quaternion can either be specified by giving the four coordinates as real numbers or by giving the scalar part and the vector part. --]] - -function quaternion:init(...) +local function new(...) + local a, b, c, d -- copy local arg = {...} if #arg == 1 and type(arg[1]) == "table" then - self.a = arg[1].a - self.b = arg[1].b - self.c = arg[1].c - self.d = arg[1].d + a = arg[1].a + b = arg[1].b + c = arg[1].c + d = arg[1].d -- four numbers elseif #arg == 4 then - self.a = arg[1] - self.b = arg[2] - self.c = arg[3] - self.d = arg[4] + a = arg[1] + b = arg[2] + c = arg[3] + d = arg[4] -- real number plus vector elseif #arg == 2 then - self.a = arg[1] - self.b = arg[2].x - self.c = arg[2].y - self.d = arg[2].z + a = arg[1] + b = arg[2].x + c = arg[2].y + d = arg[2].z else error("Incorrect number of arguments to quaternion") end -end + return setmetatable({ a = a or 0, b = b or 0, c = c or 0, d = d or 0 }, quaternion) +end function quaternion:to_axis_angle() local tmp = self @@ -64,7 +65,6 @@ function quaternion:to_axis_angle() return angle, { x, y, z } end - --[[ Test if we are zero. --]] @@ -497,4 +497,7 @@ function quaternion.unit() return quaternion(1,0,0,0) end -return quaternion +--return quaternion +-- the module +return setmetatable({ new = new }, +{ __call = function(_, ...) return new(...) end }) diff --git a/cpml/simplex.lua b/modules/simplex.lua similarity index 100% rename from cpml/simplex.lua rename to modules/simplex.lua diff --git a/cpml/vec3.lua b/modules/vec3.lua similarity index 100% rename from cpml/vec3.lua rename to modules/vec3.lua