Screwdriver: use table lookup for facedir rotations.
authorAuke Kok <sofar@foo-projects.org>
Sat, 25 Feb 2017 08:27:19 +0000 (00:27 -0800)
committerparamat <mat.gregory@virginmedia.com>
Sun, 12 Mar 2017 10:20:19 +0000 (10:20 +0000)
The table was generated using the old code. A table lookup
should be faster than lots of math and branches.

Allows us to drop `nextrange()` as well.

mods/screwdriver/init.lua

index 696637a021056efb51ff13257fb2f5452da8b193..94964605c220dc8935d05fc91e53a5c4dafdb4df 100644 (file)
@@ -1,13 +1,5 @@
 screwdriver = {}
 
-local function nextrange(x, max)
-       x = x + 1
-       if x > max then
-               x = 0
-       end
-       return x
-end
-
 screwdriver.ROTATE_FACE = 1
 screwdriver.ROTATE_AXIS = 2
 screwdriver.disallow = function(pos, node, user, mode, new_param2)
@@ -21,19 +13,27 @@ end
 
 screwdriver.rotate = {}
 
-screwdriver.rotate.facedir = function(node, mode)
-       -- Compute param2
-       local rotationPart = node.param2 % 32 -- get first 4 bits
-       local preservePart = node.param2 - rotationPart
-       local axisdir = math.floor(rotationPart / 4)
-       local rotation = rotationPart - axisdir * 4
-       if mode == screwdriver.ROTATE_FACE then
-               rotationPart = axisdir * 4 + nextrange(rotation, 3)
-       elseif mode == screwdriver.ROTATE_AXIS then
-               rotationPart = nextrange(axisdir, 5) * 4
-       end
+local facedir_tbl = {
+       [screwdriver.ROTATE_FACE] = {
+               [0] = 1, [1] = 2, [2] = 3, [3] = 0,
+               [4] = 5, [5] = 6, [6] = 7, [7] = 4,
+               [8] = 9, [9] = 10, [10] = 11, [11] = 8,
+               [12] = 13, [13] = 14, [14] = 15, [15] = 12,
+               [16] = 17, [17] = 18, [18] = 19, [19] = 16,
+               [20] = 21, [21] = 22, [22] = 23, [23] = 20,
+       },
+       [screwdriver.ROTATE_AXIS] = {
+               [0] = 4, [1] = 4, [2] = 4, [3] = 4,
+               [4] = 8, [5] = 8, [6] = 8, [7] = 8,
+               [8] = 12, [9] = 12, [10] = 12, [11] = 12,
+               [12] = 16, [13] = 16, [14] = 16, [15] = 16,
+               [16] = 20, [17] = 20, [18] = 20, [19] = 20,
+               [20] = 0, [21] = 0, [22] = 0, [23] = 0,
+       },
+}
 
-       return preservePart + rotationPart
+screwdriver.rotate.facedir = function(node, mode)
+       return facedir_tbl[mode][node.param2]
 end
 
 local wallmounted_tbl = {