diff --git a/b3d.lua b/b3d.lua index 8afe538..11ffd81 100644 --- a/b3d.lua +++ b/b3d.lua @@ -1,4 +1,7 @@ -local metatable = {__index = getfenv(1)} +local class = getfenv(1) +local metatable = {__index = function(_self, key) + return rawget(class, key) +end} --! experimental --+ Reads a single BB3D chunk from a stream @@ -195,12 +198,17 @@ function read(stream) flags = flags } while content() do - table.insert(bone, { - frame = int(), - position = position and vector3() or nil, - scale = scale and vector3() or nil, - rotation = rotation and quaternion() or nil - }) + local frame = {frame = int()} + if position then + frame.position = vector3() + end + if scale then + frame.scale = vector3() + end + if rotation then + frame.rotation = quaternion() + end + table.insert(bone, frame) end -- Ensure frames are sorted ascending table.sort(bone, function(a, b) return a.frame < b.frame end) diff --git a/kdtree.lua b/kdtree.lua index 73b3873..c36d107 100644 --- a/kdtree.lua +++ b/kdtree.lua @@ -1,4 +1,7 @@ -local metatable = {__index = getfenv(1)} +local class = getfenv(1) +local metatable = {__index = function(_self, key) + return rawget(class, key) +end} distance = modlib.vector.distance diff --git a/ranked_set.lua b/ranked_set.lua index 2b5208f..46f5346 100644 --- a/ranked_set.lua +++ b/ranked_set.lua @@ -1,5 +1,7 @@ local class = getfenv(1) -local metatable = {__index = class} +local metatable = {__index = function(_self, key) + return rawget(class, key) +end} comparator = modlib.table.default_comparator diff --git a/schema.lua b/schema.lua index 31081a2..82e4e50 100644 --- a/schema.lua +++ b/schema.lua @@ -1,8 +1,11 @@ -local schema = getfenv(1) +local class = getfenv(1) +local metatable = {__index = function(_self, key) + return rawget(class, key) +end} function new(def) -- TODO type inference, sanity checking etc. - return setmetatable(def, {__index = schema}) + return setmetatable(def, metatable) end local function field_name_to_title(name) diff --git a/trie.lua b/trie.lua index badc9e5..5581b89 100644 --- a/trie.lua +++ b/trie.lua @@ -1,6 +1,9 @@ -local trie = getfenv(1) +local class = getfenv(1) +local metatable = {__index = function(_self, key) + return rawget(class, key) +end} -function new(table) return setmetatable(table or {}, trie) end +function new(table) return setmetatable(table or {}, metatable) end function insert(self, word, value, overwrite) for i = 1, word:len() do diff --git a/vector.lua b/vector.lua index 60379cc..9f2162a 100644 --- a/vector.lua +++ b/vector.lua @@ -1,5 +1,5 @@ local mt_vector = vector -local vector = getfenv(1) +local class = getfenv(1) index_aliases = { x = 1, @@ -16,7 +16,7 @@ metatable = { if index ~= nil then return table[index] end - return vector[key] + return rawget(class, key) end, __newindex = function(table, key, value) local index = letters[key]