]> git.lizzy.rs Git - worldedit.git/commitdiff
Super-speed a few primitives and visualization functions, including hollowsphere...
authorAnthony Zhang <azhang9@gmail.com>
Sun, 23 Jun 2013 03:08:51 +0000 (23:08 -0400)
committerAnthony Zhang <azhang9@gmail.com>
Sun, 23 Jun 2013 03:08:51 +0000 (23:08 -0400)
worldedit/manipulations.lua
worldedit/primitives.lua
worldedit/visualization.lua

index 0a13206c4a5f4ad90f0e396d59b0b4e7d97271a8..73ec72a9724f8b70e259f4634d1659c95c05203b 100644 (file)
@@ -67,7 +67,7 @@ worldedit.replaceinverse = function(pos1, pos2, searchnode, replacenode, env)
        local pos = {x=pos1.x, y=0, z=0}\r
        local node = {name=replacenode}\r
        local count = 0\r
-       while pos.x <= pos2.x do --wip: see if this can be sped up like worldedit.replace\r
+       while pos.x <= pos2.x do --wip: see if this can be sped up like worldedit.replace, except with hashed found node positions and testing against the set\r
                pos.y = pos1.y\r
                while pos.y <= pos2.y do\r
                        pos.z = pos1.z\r
index 4513e8f0ec4dbdae4c279abf32b7ca32f8538941..4401e18192a72fce9b36a90a80fcefd573f4c1f8 100644 (file)
 worldedit = worldedit or {}\r
 \r
 --adds a hollow sphere centered at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added\r
-worldedit.hollow_sphere = function(pos, radius, nodename, env)\r
-       local node = {name=nodename}\r
-       local pos1 = {x=0, y=0, z=0}\r
-       local min_radius = radius * (radius - 1)\r
-       local max_radius = radius * (radius + 1)\r
-       local count = 0\r
-       if env == nil then env = minetest.env end\r
+worldedit.hollow_sphere = function(pos, radius, nodename)\r
+       local insert = table.insert\r
+       local node = {nodename, 0, 0}\r
+       local ignore = {"ignore", 0, 0}\r
+       local nodes = {}\r
+       local min_radius, max_radius = radius * (radius - 1), radius * (radius + 1)\r
        for x = -radius, radius do\r
-               pos1.x = pos.x + x\r
                for y = -radius, radius do\r
-                       pos1.y = pos.y + y\r
                        for z = -radius, radius do\r
-                               if x*x+y*y+z*z >= min_radius and x*x+y*y+z*z <= max_radius then\r
-                                       pos1.z = pos.z + z\r
-                                       env:add_node(pos1, node)\r
-                                       count = count + 1\r
+                               local squared = x * x + y * y + z * z\r
+                               if squared >= min_radius and squared <= max_radius then\r
+                                       insert(nodes, node)\r
+                               else\r
+                                       insert(nodes, ignore)\r
                                end\r
                        end\r
                end\r
        end\r
-       return count\r
+       minetest.place_schematic({x=pos.x - radius, y=pos.y - radius, z=pos.z - radius}, {size={x=radius * 2, y=radius * 2, z=radius * 2}, data=nodes})\r
+       return #nodes\r
 end\r
 \r
 --adds a sphere centered at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added\r
-worldedit.sphere = function(pos, radius, nodename, env)\r
-       local node = {name=nodename}\r
-       local pos1 = {x=0, y=0, z=0}\r
+worldedit.sphere = function(pos, radius, nodename)\r
+       local insert = table.insert\r
+       local node = {nodename, 0, 0}\r
+       local ignore = {"ignore", 0, 0}\r
+       local nodes = {}\r
        local max_radius = radius * (radius + 1)\r
-       local count = 0\r
-       if env == nil then env = minetest.env end\r
        for x = -radius, radius do\r
-               pos1.x = pos.x + x\r
                for y = -radius, radius do\r
-                       pos1.y = pos.y + y\r
                        for z = -radius, radius do\r
-                               if x*x+y*y+z*z <= max_radius then\r
-                                       pos1.z = pos.z + z\r
-                                       env:add_node(pos1, node)\r
-                                       count = count + 1\r
+                               if x * x + y * y + z * z <= max_radius then\r
+                                       insert(nodes, node)\r
+                               else\r
+                                       insert(nodes, ignore)\r
                                end\r
                        end\r
                end\r
        end\r
-       return count\r
+       minetest.place_schematic({x=pos.x - radius, y=pos.y - radius, z=pos.z - radius}, {size={x=radius * 2, y=radius * 2, z=radius * 2}, data=nodes})\r
+       return #nodes\r
 end\r
 \r
 --adds a hollow dome centered at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added\r
-worldedit.hollow_dome = function(pos, radius, nodename, env) --wip: use bresenham sphere for maximum speed\r
-       local node = {name=nodename}\r
-       local pos1 = {x=0, y=0, z=0}\r
-       local min_radius = radius * (radius - 1)\r
-       local max_radius = radius * (radius + 1)\r
-       local count = 0\r
-       if env == nil then env = minetest.env end\r
+worldedit.hollow_dome = function(pos, radius, nodename) --wip: use bresenham sphere for maximum speed\r
+       local insert = table.insert\r
+       local node = {nodename, 0, 0}\r
+       local ignore = {"ignore", 0, 0}\r
+       local nodes = {}\r
+       local min_radius, max_radius = radius * (radius - 1), radius * (radius + 1)\r
        for x = -radius, radius do\r
-               pos1.x = pos.x + x\r
                for y = 0, radius do\r
-                       pos1.y = pos.y + y\r
                        for z = -radius, radius do\r
-                               if x*x+y*y+z*z >= min_radius and x*x+y*y+z*z <= max_radius then\r
-                                       pos1.z = pos.z + z\r
-                                       env:add_node(pos1, node)\r
-                                       count = count + 1\r
+                               local squared = x * x + y * y + z * z\r
+                               if squared >= min_radius and squared <= max_radius then\r
+                                       insert(nodes, node)\r
+                               else\r
+                                       insert(nodes, ignore)\r
                                end\r
                        end\r
                end\r
        end\r
-       return count\r
+       minetest.place_schematic({x=pos.x - radius, y=pos.y, z=pos.z - radius}, {size={x=radius * 2, y=radius * 2, z=radius * 2}, data=nodes})\r
+       return #nodes\r
 end\r
 \r
 --adds a dome centered at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added\r
-worldedit.dome = function(pos, radius, nodename, env) --wip: use bresenham sphere for maximum speed\r
-       local node = {name=nodename}\r
-       local pos1 = {x=0, y=0, z=0}\r
+worldedit.dome = function(pos, radius, nodename) --wip: use bresenham sphere for maximum speed\r
+       local insert = table.insert\r
+       local node = {nodename, 0, 0}\r
+       local ignore = {"ignore", 0, 0}\r
+       local nodes = {}\r
        local max_radius = radius * (radius + 1)\r
-       local count = 0\r
-       if env == nil then env = minetest.env end\r
        for x = -radius, radius do\r
-               pos1.x = pos.x + x\r
                for y = 0, radius do\r
-                       pos1.y = pos.y + y\r
                        for z = -radius, radius do\r
-                               if x*x+y*y+z*z <= max_radius then\r
-                                       pos1.z = pos.z + z\r
-                                       env:add_node(pos1, node)\r
-                                       count = count + 1\r
+                               if x * x + y * y + z * z <= max_radius then\r
+                                       insert(nodes, node)\r
+                               else\r
+                                       insert(nodes, ignore)\r
                                end\r
                        end\r
                end\r
        end\r
-       return count\r
+       minetest.place_schematic({x=pos.x - radius, y=pos.y, z=pos.z - radius}, {size={x=radius * 2, y=radius * 2, z=radius * 2}, data=nodes})\r
+       return #nodes\r
 end\r
 \r
 --adds a hollow cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length `length` and radius `radius`, composed of `nodename`, returning the number of nodes added\r
-worldedit.hollow_cylinder = function(pos, axis, length, radius, nodename, env)\r
+worldedit.hollow_cylinder = function(pos, axis, length, radius, nodename)\r
        local other1, other2\r
        if axis == "x" then\r
                other1, other2 = "y", "z"\r
index 9e99659de1adc5da6a5274e9777bce67dcd901e3..8e27c2733dc856e50fe7d6884a3d1ae378c655d2 100644 (file)
@@ -63,35 +63,18 @@ worldedit.suppress = function(pos1, pos2, nodename, tenv)
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
        if env == nil then env = minetest.env end\r
 \r
-       if minetest.registered_nodes[nodename] == nil then\r
-               nodename = "default:" .. nodename\r
-       end\r
-\r
-       local pos = {x=pos1.x, y=0, z=0}\r
        local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
-       local count = 0\r
-       while pos.x <= pos2.x do\r
-               pos.y = pos1.y\r
-               while pos.y <= pos2.y do\r
-                       pos.z = pos1.z\r
-                       while pos.z <= pos2.z do\r
-                               local node = env:get_node(pos)\r
-                               if node.name == nodename then\r
-                                       placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
-                                       local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
-                                       env:add_node(pos, placeholder) --add placeholder node\r
-                                       local meta = env:get_meta(pos) --obtain placeholder meta\r
-                                       meta:from_table(data) --set placeholder metadata to the original node's metadata\r
-                                       meta:set_string("worldedit_placeholder", nodename)  --add the node's name\r
-                                       count = count + 1\r
-                               end\r
-                               pos.z = pos.z + 1\r
-                       end\r
-                       pos.y = pos.y + 1\r
-               end\r
-               pos.x = pos.x + 1\r
+       local nodes = minetest.find_nodes_in_area(pos1, pos2, nodename)\r
+       for _, pos in ipairs(nodes) do\r
+               local node = env:get_node(pos)\r
+               placeholder.param1, placeholder.param2 = node.param1, node.param2 --copy node's param1 and param2\r
+               local data = env:get_meta(pos):to_table() --obtain metadata of original node\r
+               env:add_node(pos, placeholder) --add placeholder node\r
+               local meta = env:get_meta(pos) --obtain placeholder meta\r
+               meta:from_table(data) --set placeholder metadata to the original node's metadata\r
+               meta:set_string("worldedit_placeholder", nodename)  --add the node's name\r
        end\r
-       return count\r
+       return #nodes\r
 end\r
 \r
 --highlights all instances of `nodename` in a region defined by positions `pos1` and `pos2` by non-destructively hiding all other nodes, returning the number of nodes found\r
@@ -106,7 +89,7 @@ worldedit.highlight = function(pos1, pos2, nodename, tenv)
        local pos = {x=pos1.x, y=0, z=0}\r
        local placeholder = {name="worldedit:placeholder", param1=0, param2=0}\r
        local count = 0\r
-       while pos.x <= pos2.x do\r
+       while pos.x <= pos2.x do --wip: see if this can be sped up like worldedit.suppress, except with hashed found node positions and testing against the set\r
                pos.y = pos1.y\r
                while pos.y <= pos2.y do\r
                        pos.z = pos1.z\r
@@ -136,29 +119,16 @@ worldedit.restore = function(pos1, pos2, tenv)
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
        if env == nil then env = minetest.env end\r
 \r
-       local pos = {x=pos1.x, y=0, z=0}\r
        local node = {name="", param1=0, param2=0}\r
-       local count = 0\r
-       while pos.x <= pos2.x do\r
-               pos.y = pos1.y\r
-               while pos.y <= pos2.y do\r
-                       pos.z = pos1.z\r
-                       while pos.z <= pos2.z do\r
-                               local currentnode = env:get_node(pos)\r
-                               if currentnode.name == "worldedit:placeholder" then\r
-                                       node.param1, node.param2 = currentnode.param1, currentnode.param2 --copy node's param1 and param2\r
-                                       local data = env:get_meta(pos):to_table() --obtain node metadata\r
-                                       node.name = data.fields.worldedit_placeholder --set node name\r
-                                       data.fields.worldedit_placeholder = nil --delete old nodename\r
-                                       env:add_node(pos, node) --add original node\r
-                                       env:get_meta(pos):from_table(data) --set original node metadata\r
-                                       count = count + 1\r
-                               end\r
-                               pos.z = pos.z + 1\r
-                       end\r
-                       pos.y = pos.y + 1\r
-               end\r
-               pos.x = pos.x + 1\r
+       local nodes = minetest.find_nodes_in_area(pos1, pos2, nodename)\r
+       for _, pos in ipairs(nodes) do\r
+               local currentnode = env:get_node(pos)\r
+               node.param1, node.param2 = currentnode.param1, currentnode.param2 --copy node's param1 and param2\r
+               local data = env:get_meta(pos):to_table() --obtain node metadata\r
+               node.name = data.fields.worldedit_placeholder --set node name\r
+               data.fields.worldedit_placeholder = nil --delete old nodename\r
+               env:add_node(pos, placeholder) --add original node\r
+               env:get_meta(pos):from_table(data) --set original node metadata\r
        end\r
-       return count\r
+       return #nodes\r
 end\r