diff --git a/worldeditadditions/lib/scale.lua b/worldeditadditions/lib/scale.lua index f76475b..a35ccfb 100644 --- a/worldeditadditions/lib/scale.lua +++ b/worldeditadditions/lib/scale.lua @@ -1,13 +1,13 @@ ---- Scales the defined region by the given scale factor in the given directions. +--- Scales the defined region by the given scale factor in the given anchors. -- Scale factor vectors containing both scale up and scale down operations are -- split into 2 different scale operations automatically. -- @param pos1 Vector Position 1 of the defined region, -- @param pos2 Vector Position 2 of the defined region. -- @param scale Vector The scale factor - as a vector - by which to scale (values between -1 and 1 are considered a scale down operation). --- @param direction Vector The direction to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and nevative z directions. +-- @param anchor Vector The anchor to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and negative z directions. -- @return boolean, string|table Whether the operation was successful or not. If not, then an error messagea as a string is also passed. If it was, then a statistics object is returned instead. -function worldeditadditions.scale(pos1, pos2, scale, direction) +function worldeditadditions.scale(pos1, pos2, scale, anchor) if scale.x == 0 or scale.y == 0 or scale.z == 0 then return false, "A component of the scale factoro was 0." end @@ -27,14 +27,14 @@ function worldeditadditions.scale(pos1, pos2, scale, direction) local success, stats if scale_up.x ~= 1 or scale_up.y ~= 1 or scale_up.z ~= 1 then - success, stats = worldeditadditions.scale_up(pos1, pos2, scale_up, direction) + success, stats = worldeditadditions.scale_up(pos1, pos2, scale_up, anchor) if not success then return success, stats end stats_total.updated = stats.updated stats_total.operations = stats_total.operations + 1 stats_total.scale_down = stats.scale end if scale_down.x ~= 1 or scale_down.y ~= 1 or scale_down.z ~= 1 then - success, stats = worldeditadditions.scale_down(pos1, pos2, scale_down, direction) + success, stats = worldeditadditions.scale_down(pos1, pos2, scale_down, anchor) if not success then return success, stats end stats_total.updated = stats_total.updated + stats.updated stats_total.operations = stats_total.operations + 1 diff --git a/worldeditadditions/lib/scale_down.lua b/worldeditadditions/lib/scale_down.lua index bc9b714..97d9168 100644 --- a/worldeditadditions/lib/scale_down.lua +++ b/worldeditadditions/lib/scale_down.lua @@ -8,15 +8,15 @@ -- @param pos1 Vector Position 1 of the defined region, -- @param pos2 Vector Position 2 of the defined region. -- @param scale Vector The scale factor - as a vector - by which to scale down. --- @param direction Vector The direction to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and nevative z directions. +-- @param anchor Vector The direction to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and nevative z directions. -- @return boolean, string|table Whether the operation was successful or not. If not, then an error messagea as a string is also passed. If it was, then a statistics object is returned instead. -function worldeditadditions.scale_down(pos1, pos2, scale, direction) +function worldeditadditions.scale_down(pos1, pos2, scale, anchor) pos1, pos2 = worldedit.sort_pos(pos1, pos2) if scale.x > 1 or scale.y > 1 or scale.z > 1 or scale.x < -1 or scale.y < -1 or scale.z < -1 then return false, "Error: Scale factor vectors may not mix values -1 < factor < 1 and (1 < factor or factor < -1) - in other words, you can't scale both up and down at the same time (try worldeditadditions.scale, which automatically applies such scale factor vectors as 2 successive operations)" end - if direction.x == 0 or direction.y == 0 or direction.z == 0 then - return false, "Error: One of the components of the direction vector was 0 (direction components should either be greater than or less than 0 to indicate the direction to scale in.)" + if anchor.x == 0 or anchor.y == 0 or anchor.z == 0 then + return false, "Error: One of the components of the anchor vector was 0 (anchor components should either be greater than or less than 0 to indicate the anchor to scale in.)" end local scale_down = { @@ -51,9 +51,9 @@ function worldeditadditions.scale_down(pos1, pos2, scale, direction) local posi_copy = worldeditadditions.shallowcopy(posi_rel) posi_copy = vector.floor(vector.divide(scale_down)) - if direction.x < 0 then posi_copy.x = size.x - posi_copy.x end - if direction.y < 0 then posi_copy.y = size.y - posi_copy.y end - if direction.z < 0 then posi_copy.z = size.z - posi_copy.z end + if anchor.x < 0 then posi_copy.x = size.x - posi_copy.x end + if anchor.y < 0 then posi_copy.y = size.y - posi_copy.y end + if anchor.z < 0 then posi_copy.z = size.z - posi_copy.z end local posi_copy = vector.add(pos1, posi_copy) diff --git a/worldeditadditions/lib/scale_up.lua b/worldeditadditions/lib/scale_up.lua index c3a8dfc..9e47521 100644 --- a/worldeditadditions/lib/scale_up.lua +++ b/worldeditadditions/lib/scale_up.lua @@ -8,27 +8,27 @@ -- @param pos1 Vector Position 1 of the defined region, -- @param pos2 Vector Position 2 of the defined region. -- @param scale Vector The scale factor - as a vector - by which to scale down. --- @param direction Vector The direction to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and nevative z directions. +-- @param anchor Vector The direction to scale in - as a vector. e.g. { x = -1, y = 1, z = -1 } would mean scale in the negative x, positive y, and nevative z directions. -- @return boolean, string|table Whether the operation was successful or not. If not, then an error messagea as a string is also passed. If it was, then a statistics object is returned instead. -function worldeditadditions.scale_up(pos1, pos2, scale, direction) +function worldeditadditions.scale_up(pos1, pos2, scale, anchor) pos1, pos2 = worldedit.sort_pos(pos1, pos2) if (scale.x < 1 and scale.x > -1) and (scale.y < 1 and scale.y > -1) and (scale.z < 1 and scale.z > -1) then return false, "Error: Scale factor vectors may not mix values -1 < factor < 1 and (1 < factor or factor < -1) - in other words, you can't scale both up and down at the same time (try worldeditadditions.scale, which automatically applies such scale factor vectors as 2 successive operations)" end - if direction.x == 0 or direction.y == 0 or direction.z == 0 then - return false, "Error: One of the components of the direction vector was 0 (direction components should either be greater than or less than 0 to indicate the direction to scale in.)" + if anchor.x == 0 or anchor.y == 0 or anchor.z == 0 then + return false, "Error: One of the components of the anchor vector was 0 (anchor components should either be greater than or less than 0 to indicate the anchor to scale in.)" end local size = vector.subtract(pos2, pos1) local pos1_big = vector.new(pos1) - local pos2_big = vector(pos2) + local pos2_big = vector.new(pos2) - if direction.x < 1 then pos1_big.x = pos1_big.x - size.x + if anchor.x < 1 then pos1_big.x = pos1_big.x - size.x else pos2_big.x = pos2_big.x + size.x end - if direction.y < 1 then pos1_big.y = pos1_big.y - size.y + if anchor.y < 1 then pos1_big.y = pos1_big.y - size.y else pos2_big.y = pos2_big.y + size.y end - if direction.z < 1 then pos1_big.z = pos1_big.z - size.z + if anchor.z < 1 then pos1_big.z = pos1_big.z - size.z else pos2_big.z = pos2_big.z + size.z end diff --git a/worldeditadditions_commands/commands/scale.lua b/worldeditadditions_commands/commands/scale.lua index a236da0..ea3412a 100644 --- a/worldeditadditions_commands/commands/scale.lua +++ b/worldeditadditions_commands/commands/scale.lua @@ -14,7 +14,7 @@ worldedit.register_command("scale", { local parts = worldeditadditions.split(params_text, "%s+", false) local scale = vector.new(1, 1, 1) - local direction = vector.new(1, 1, 1) + local anchor = vector.new(1, 1, 1) if #parts == 2 then if parts[1] ~= "x" or parts[1] ~= "y" or parts[1] ~= "z" @@ -27,7 +27,7 @@ worldedit.register_command("scale", { if axis:sub(1, 1) == "-" then axis = axis:sub(2, 2) - direction[axis] = -1 + anchor[axis] = -1 end scale[axis] = factor @@ -54,41 +54,45 @@ worldedit.register_command("scale", { if #parts == 6 then local val = tonumber(parts[4]) if not val then return false, "Error: x axis anchor wasn't a number." end - direction.x = val + anchor.x = val val = tonumber(parts[5]) if not val then return false, "Error: y axis anchor wasn't a number." end - direction.y = val + anchor.y = val val = tonumber(parts[6]) if not val then return false, "Error: z axis anchor wasn't a number." end - direction.z = val + anchor.z = val end if scale.x == 0 then return false, "Error: x scale factor was 0" end if scale.y == 0 then return false, "Error: y scale factor was 0" end if scale.z == 0 then return false, "Error: z scale factor was 0" end - if direction.x == 0 then return false, "Error: x axis anchor was 0" end - if direction.y == 0 then return false, "Error: y axis anchor was 0" end - if direction.z == 0 then return false, "Error: z axis anchor was 0" end + if anchor.x == 0 then return false, "Error: x axis anchor was 0" end + if anchor.y == 0 then return false, "Error: y axis anchor was 0" end + if anchor.z == 0 then return false, "Error: z axis anchor was 0" end - return true, scale, direction + return true, scale, anchor end, - nodes_needed = function(name, scale, direction) + nodes_needed = function(name, scale, anchor) local volume = worldedit.volume(worldedit.pos1[name], worldedit.pos2[name]) local factor = math.ceil(math.abs(scale.x)) * math.ceil(math.abs(scale.y)) * math.ceil(math.abs(scale.z)) return volume * factor end, - func = function(name, scale, direction) + func = function(name, scale, anchor) + print("initial scale: "..worldeditadditions.vector.tostring(scale)..", anchor: "..worldeditadditions.vector.tostring(anchor)) + + local start_time = worldeditadditions.get_ms_time() - local success, stats = worldeditadditions.scale(pos1, pos2, scale, direction) + local success, stats = worldeditadditions.scale( + worldedit.pos1[name], + worldedit.pos2[name], + scale, anchor + ) if not success then return success, stats end - -- TODO read stats here - - local time_taken = worldeditadditions.get_ms_time() - start_time