kpoppel
2013-07-02 053fa59739f4b772174bf0a090969b3395ab3f98
technic/cnc_api.lua
@@ -6,928 +6,330 @@
----------------------------------------
technic_cnc_api.detail_level = 16 -- 16; 1-32
-- HERE YOU CAN DE/ACTIVATE BACKGROUND FOR CNC MENU:
--------------------------------------------------------
technic_cnc_api.allow_menu_background = false
-- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
------------------------------------------------------
local cnc_sphere =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      local sehne
      for i = 1, detail-1 do
    sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
    nodebox[i]={-sehne, (i/detail)-0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
      end
      return nodebox
   end
-- SLOPE
--------
function technic_cnc_api.register_slope(recipeitem, groups, images, description)
local cnc_cylinder_horizontal =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      local sehne
      for i = 1, detail-1 do
    sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
    nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
      end
      return nodebox
   end
local slopebox = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        slopebox[i+1]={-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
local cnc_cylinder =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      local sehne
      for i = 1, detail-1 do
    sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
    nodebox[i]={(i/detail)-0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
      end
      return nodebox
   end
local cnc_twocurvededge =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level*2
      local sehne
      for i = (detail/2)-1, detail-1 do
    sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
    nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
      end
      return nodebox
   end
local cnc_onecurvededge =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level*2
      local sehne
      for i = (detail/2)-1, detail-1 do
    sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
    nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
      end
     return nodebox
   end
local cnc_spike =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)}
end
      return nodebox
   end
local cnc_pyramid =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level/2
      for i = 0, detail-1 do
    nodebox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)}
      end
      return nodebox
   end
local cnc_slope_inner_edge_upsdown =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={0.5-(i/detail)-(1/detail), (i/detail)-0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
    nodebox[i+detail+1]={-0.5, (i/detail)-0.5, 0.5-(i/detail)-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
local cnc_slope_edge_upsdown =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
local cnc_slope_inner_edge =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
    nodebox[i+detail+1]={-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
local cnc_slope_edge =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
local cnc_slope_upsdown =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
local cnc_slope_lying =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
      end
      return nodebox
   end
local cnc_slope =
   function()
      local nodebox = {}
      local detail = technic_cnc_api.detail_level
      for i = 0, detail-1 do
    nodebox[i+1]={-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
      end
      return nodebox
   end
-- Define slope boxes for the various nodes
-------------------------------------------
technic_cnc_api.cnc_programs = {
   {suffix  = "technic_cnc_stick",
    nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
    desc    = "Stick"},
   {suffix  = "technic_cnc_element_end_double",
    nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
    desc    = "Element End Double"},
   {suffix  = "technic_cnc_element_cross_double",
    nodebox = {
       {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
       {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
       {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
    desc    = "Element Cross Double"},
   {suffix  = "technic_cnc_element_t_double",
    nodebox = {
       {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
       {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
       {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
    desc    = "Element T Double"},
   {suffix  = "technic_cnc_element_edge_double",
    nodebox = {
       {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
       {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
    desc    = "Element Edge Double"},
   {suffix  = "technic_cnc_element_straight_double",
    nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
    desc    = "Element Straight Double"},
   {suffix  = "technic_cnc_element_end",
    nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
    desc    = "Element End"},
   {suffix  = "technic_cnc_element_cross",
    nodebox = {
       {0.3, -0.5, -0.3, 0.5, 0, 0.3},
       {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
       {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
    desc    = "Element Cross"},
   {suffix  = "technic_cnc_element_t",
    nodebox = {
       {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
       {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
       {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
    desc    = "Element T"},
   {suffix  = "technic_cnc_element_edge",
    nodebox = {
       {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
       {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
    desc    = "Element Edge"},
   {suffix  = "technic_cnc_element_straight",
    nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
    desc    = "Element Straight"},
   {suffix  = "technic_cnc_sphere",
    nodebox = cnc_sphere(),
    desc    = "Sphere"},
   {suffix  = "technic_cnc_cylinder_horizontal",
    nodebox = cnc_cylinder_horizontal(),
    desc    = "Cylinder Horizontal"},
   {suffix  = "technic_cnc_cylinder",
    nodebox = cnc_cylinder(),
    desc    = ""},
   {suffix  = "technic_cnc_twocurvededge",
    nodebox = cnc_twocurvededge(),
    desc    = "One Curved Edge Block"},
   {suffix  = "technic_cnc_onecurvededge",
    nodebox = cnc_onecurvededge(),
    desc    = "Two Curved Edge Block"},
   {suffix  = "technic_cnc_spike",
    nodebox = cnc_spike(),
    desc    = "Spike"},
   {suffix  = "technic_cnc_pyramid",
    nodebox = cnc_pyramid(),
    desc    = "Pyramid"},
   {suffix  = "technic_cnc_slope_inner_edge_upsdown",
    nodebox = cnc_slope_inner_edge_upsdown(),
    desc    = "Slope Upside Down Inner Edge"},
   {suffix  = "technic_cnc_slope_edge_upsdown",
    nodebox = cnc_slope_edge_upsdown(),
    desc    = "Slope Upside Down Edge"},
   {suffix  = "technic_cnc_slope_inner_edge",
    nodebox = cnc_slope_inner_edge(),
    desc    = "Slope Inner Edge"},
   {suffix  = "technic_cnc_slope_edge",
    nodebox = cnc_slope_edge(),
    desc    = "Slope Edge"},
   {suffix  = "technic_cnc_slope_upsdown",
    nodebox = cnc_slope_upsdown(),
    desc    = "Slope Upside Down"},
   {suffix  = "technic_cnc_slope_lying",
    nodebox = cnc_slope_lying(),
    desc    = "Slope Lying"},
   {suffix  = "technic_cnc_slope",
    nodebox = cnc_slope(),
    desc    = "Slope"},
--   {suffix  = "",
--    nodebox =},
}
-- Allow disabling certain programs for some node. Default is allowing all types for all nodes
technic_cnc_api.cnc_programs_disable = {
   -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
   -- ...
   ["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown", "technic_cnc_edge",
             "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown",
             "technic_cnc_stick", "technic_cnc_cylinder_horizontal"}
}
-- Generic function for registering all the different node types
function technic_cnc_api.register_cnc_program(recipeitem, suffix, nodebox, groups, images, description)
   minetest.register_node(":" .. recipeitem .. "_" .. suffix, {
              description   = description,
              drawtype      = "nodebox",
              tiles         = images,
              paramtype     = "light",
              paramtype2    = "facedir",
              walkable      = true,
              selection_box = {
            type  = "fixed",
            fixed = nodebox
              },
              node_box      = {
            type  = "fixed",
            fixed = nodebox
              },
              groups        = groups,
           })
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = slopebox,
        },
        groups = groups,
        })
-- function to iterate over all the programs the CNC machine knows
function technic_cnc_api.register_all(recipeitem, groups, images, description)
   for _, data in ipairs(technic_cnc_api.cnc_programs) do
      -- Disable node creation for disabled node types for some material
      local do_register = true
      if technic_cnc_api.cnc_programs_disable[recipeitem] ~= nil then
    for __, disable in ipairs(technic_cnc_api.cnc_programs_disable[recipeitem]) do
       if disable == data.suffix then
          do_register = false
       end
    end
      end
      -- Create the node if it passes the test
      if do_register then
    technic_cnc_api.register_cnc_program(recipeitem, data.suffix, data.nodebox, groups, images, description.." "..data.desc)
      end
   end
end
-- SLOPE Lying
----------------
function technic_cnc_api.register_slope_lying(recipeitem, groups, images, description)
local slopeboxlying = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        slopeboxlying[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_lying", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = slopeboxlying,
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_slope_lying 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_slope", ""},
                        {"", "", ""},
                },
        })
end
-- SLOPE UPSIDE DOWN
--------------------
function technic_cnc_api.register_slope_upsdown(recipeitem, groups, images, description)
if subname == "dirt" then
return
end
local slopeupdwnbox = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        slopeupdwnbox[i+1]={-0.5, (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = slopeupdwnbox,
        },
        groups = groups,
        })
end
-- SLOPE EDGE
-------------
function technic_cnc_api.register_slope_edge(recipeitem, groups, images, description)
local slopeboxedge = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        slopeboxedge[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_edge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = slopeboxedge,
        },
        groups = groups,
        })
end
-- SLOPE INNER EDGE
-------------------
function technic_cnc_api.register_slope_inner_edge(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_inner_edge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {
                        -- PART 1
                        {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5},
                        {-0.45, -0.5, -0.5, 0.5, -0.4, 0.5},
                        {-0.4, -0.5, -0.5, 0.5, -0.35, 0.5},
                        {-0.35, -0.5, -0.5, 0.5, -0.3, 0.5},
                        {-0.3, -0.5, -0.5, 0.5, -0.25, 0.5},
                        {-0.25, -0.5, -0.5, 0.5, -0.2, 0.5},
                        {-0.2, -0.5, -0.5, 0.5, -0.15, 0.5},
                        {-0.15, -0.5, -0.5, 0.5, -0.1, 0.5},
                        {-0.1, -0.5, -0.5, 0.5, -0.05, 0.5},
                        {-0.05, -0.5, -0.5, 0.5, 0, 0.5},
                        {0, -0.5, -0.5, 0.5, 0.05, 0.5},
                        {0.05, -0.5, -0.5, 0.5, 0.1, 0.5},
                        {0.1, -0.5, -0.5, 0.5, 0.15, 0.5},
                        {0.15, -0.5, -0.5, 0.5, 0.2, 0.5},
                        {0.2, -0.5, -0.5, 0.5, 0.25, 0.5},
                        {0.25, -0.5, -0.5, 0.5, 0.3, 0.5},
                        {0.3, -0.5, -0.5, 0.5, 0.35, 0.5},
                        {0.35, -0.5, -0.5, 0.5, 0.4, 0.5},
                        {0.4, -0.5, -0.5, 0.5, 0.45, 0.5},
                        {0.45, -0.5, -0.5, 0.5, 0.5, 0.5},
                        -- PART 2
                        {-0.5, -0.5, -0.45, 0.5, -0.45, 0.5},
                        {-0.5, -0.5, -0.4, 0.5, -0.4, 0.5},
                        {-0.5, -0.5, -0.35, 0.5, -0.35, 0.5},
                        {-0.5, -0.5, -0.3, 0.5, -0.3, 0.5},
                        {-0.5, -0.5, -0.25, 0.5, -0.25, 0.5},
                        {-0.5, -0.5, -0.2, 0.5, -0.2, 0.5},
                        {-0.5, -0.5, -0.15, 0.5, -0.15, 0.5},
                        {-0.5, -0.5, -0.1, 0.5, -0.1, 0.5},
                        {-0.5, -0.5, -0.05, 0.5, -0.05, 0.5},
                        {-0.5, -0.5, 0, 0.5, 0, 0.5},
                        {-0.5, -0.5, 0.05, 0.5, 0.05, 0.5},
                        {-0.5, -0.5, 0.1, 0.5, 0.1, 0.5},
                        {-0.5, -0.5, 0.15, 0.5, 0.15, 0.5},
                        {-0.5, -0.5, 0.2, 0.5, 0.2, 0.5},
                        {-0.5, -0.5, .25, 0.5, 0.25, 0.5},
                        {-0.5, -0.5, 0.3, 0.5, 0.3, 0.5},
                        {-0.5, -0.5, 0.35, 0.5, 0.35, 0.5},
                        {-0.5, -0.5, 0.4, 0.5, 0.4, 0.5},
                        {-0.5, -0.5, 0.45, 0.5, 0.45, 0.5},
                        {-0.5, -0.5, 0.5, 0.5, 0.5, 0.5},
                        },
        },
        groups = groups,
        })
end
-- SLOPE EDGE UPSIDE DOWN
-------------------------
function technic_cnc_api.register_slope_upsdown_edge(recipeitem, groups, images, description)
if recipeitem == "default:dirt" then
   return
end
local slopeupdwnboxedge = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        slopeupdwnboxedge[i+1]={(-1*(i/detail))+0.5-(1/detail), (i/detail)-0.5, (-1*(i/detail))+0.5-(1/detail), 0.5, (i/detail)-0.5+(1/detail), 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown_edge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = slopeupdwnboxedge,
        },
        groups = groups,
        })
end
-- SLOPE INNER EDGE UPSIDE DOWN
-------------------------------
function technic_cnc_api.register_slope_upsdown_inner_edge(recipeitem, groups, images, description)
if recipename == "default:dirt" then
return
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_slope_upsdown_inner_edge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {0.45, -0.5, -0.5, 0.5, -0.45, 0.5},
                        {0.4, -0.45, -0.5, 0.5, -0.4, 0.5},
                        {0.35, -0.4, -0.5, 0.5, -0.35, 0.5},
                        {0.3, -0.35, -0.5, 0.5, -0.3, 0.5},
                        {0.25, -0.3, -0.5, 0.5, -0.25, 0.5},
                        {0.2, -0.25, -0.5, 0.5, -0.2, 0.5},
                        {0.15, -0.2, -0.5, 0.5, -0.15, 0.5},
                        {0.1, -0.15, -0.5, 0.5, -0.1, 0.5},
                        {0.05, -0.1, -0.5, 0.5, -0.05, 0.5},
                        {0, -0.05, -0.5, 0.5, 0, 0.5},
                        {-0.05, 0, -0.5, 0.5, 0.05, 0.5},
                        {-0.1, 0.05, -0.5, 0.5, 0.1, 0.5},
                        {-0.15, 0.1, -0.5, 0.5, 0.15, 0.5},
                        {-0.2, 0.15, -0.5, 0.5, 0.2, 0.5},
                        {-0.25, 0.2, -0.5, 0.5, 0.25, 0.5},
                        {-0.3, 0.25, -0.5, 0.5, 0.3, 0.5},
                        {-0.35, 0.3, -0.5, 0.5, 0.35, 0.5},
                        {-0.4, 0.35, -0.5, 0.5, 0.4, 0.5},
                        {-0.45, 0.4, -0.5, 0.5, 0.45, 0.5},
                        {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5},
                        {-0.5, -0.5, 0.45, 0.5, -0.45, 0.5},
                        {-0.5, -0.45, 0.4, 0.5, -0.4, 0.5},
                        {-0.5, -0.4, 0.35, 0.5, -0.35, 0.5},
                        {-0.5, -0.35, 0.3, 0.5, -0.3, 0.5},
                        {-0.5, -0.3, 0.25, 0.5, -0.25, 0.5},
                        {-0.5, -0.25, 0.2, 0.5, -0.2, 0.5},
                        {-0.5, -0.2, 0.15, 0.5, -0.15, 0.5},
                        {-0.5, -0.15, 0.1, 0.5, -0.1, 0.5},
                        {-0.5, -0.1, 0.05, 0.5, -0.05, 0.5},
                        {-0.5, -0.05, 0, 0.5, 0, 0.5},
                        {-0.5, 0, -0.05, 0.5, 0.05, 0.5},
                        {-0.5, 0.05, -0.1, 0.5, 0.1, 0.5},
                        {-0.5, 0.1, -0.15, 0.5, 0.15, 0.5},
                        {-0.5, 0.15, -0.2, 0.5, 0.2, 0.5},
                        {-0.5, 0.2, -0.25, 0.5, 0.25, 0.5},
                        {-0.5, 0.25, -0.3, 0.5, 0.3, 0.5},
                        {-0.5, 0.3, -0.35, 0.5, 0.35, 0.5},
                        {-0.5, 0.35, -0.4, 0.5, 0.4, 0.5},
                        {-0.5, 0.4, -0.45, 0.5, 0.45, 0.5},
                        {-0.5, 0.45, -0.5, 0.5, 0.5, 0.5},
                        },
        },
        groups = groups,
        })
end
-- PYRAMID
----------
function technic_cnc_api.register_pyramid(recipeitem, groups, images, description)
local pyrabox = {}
local detail = technic_cnc_api.detail_level/2
for i = 0, detail-1 do
        pyrabox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail/2)-0.5+(1/detail), 0.5-(i/detail/2)}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_pyramid", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = pyrabox,
        },
        groups = groups,
        })
end
-- SPIKE
--------
function technic_cnc_api.register_spike(recipeitem, groups, images, description)
if recipename == "default:dirt" then
       return
end
local spikebox = {}
local detail = technic_cnc_api.detail_level
for i = 0, detail-1 do
        spikebox[i+1]={(i/detail/2)-0.5, (i/detail/2)-0.5, (i/detail/2)-0.5, 0.5-(i/detail/2), (i/detail)-0.5+(1/detail), 0.5-(i/detail/2)}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_spike", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = spikebox,
        },
        groups = groups,
        })
end
-- Block one curved edge
------------------------
function technic_cnc_api.register_onecurvededge(recipeitem, groups, images, description)
local quartercyclebox = {}
local detail = technic_cnc_api.detail_level*2
local sehne
for i = (detail/2)-1, detail-1 do
        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
        quartercyclebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_onecurvededge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = quartercyclebox,
        },
        groups = groups,
        })
end
-- Block two curved edges
-------------------------
function technic_cnc_api.register_twocurvededge(recipeitem, groups, images, description)
local quartercyclebox2 = {}
local detail = technic_cnc_api.detail_level*2
local sehne
for i = (detail/2)-1, detail-1 do
        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
        quartercyclebox2[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_twocurvededge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = quartercyclebox2,
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_twocurvededge 3",
                recipe = {
                        {"", "", ""},
                        {recipeitem .. "_technic_cnc_onecurvededge", "", ""},
                        {recipeitem .. "_technic_cnc_onecurvededge", recipeitem .. "_technic_cnc_onecurvededge", ""},
                },
        })
end
-- Cylinder
-----------
function technic_cnc_api.register_cylinder(recipeitem, groups, images, description)
if recipename == "default:dirt" then
return
end
local cylbox = {}
local detail = technic_cnc_api.detail_level
local sehne
for i = 1, detail-1 do
        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
        cylbox[i]={(i/detail)-0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = cylbox,
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_cylinder 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_cylinder_horizontal", ""},
                        {"", "", ""},
                },
        })
end
-- Cylinder Horizontal
----------------------
function technic_cnc_api.register_cylinder_horizontal(recipeitem, groups, images, description)
if recipename == "default:dirt" then
       return
end
local cylbox_horizontal = {}
local detail = technic_cnc_api.detail_level
local sehne
for i = 1, detail-1 do
        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
        cylbox_horizontal[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder_horizontal", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = cylbox_horizontal,
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_cylinder_horizontal 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_cylinder", ""},
                        {"", "", ""},
                },
        })
end
-- Sphere
---------
function technic_cnc_api.register_sphere(recipeitem, groups, images, description)
if recipename == "default:dirt" then
       return
end
local spherebox = {}
local detail = technic_cnc_api.detail_level
local sehne
for i = 1, detail-1 do
        sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
        spherebox[i]={-sehne, (i/detail)-0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
end
minetest.register_node(":" .. recipeitem .. "_technic_cnc_cylinder_sphere", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = spherebox,
        },
        groups = groups,
        })
end
-- Element straight
-------------------
function technic_cnc_api.register_element_straight(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_straight", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
                        },
        },
        groups = groups,
        })
end
-- Element Edge
---------------
function technic_cnc_api.register_element_edge(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_edge", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        },
        },
        groups = groups,
        })
end
-- Element T
------------
function technic_cnc_api.register_element_t(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_t", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
                        },
        },
        groups = groups,
        })
end
-- Element Cross
----------------
function technic_cnc_api.register_element_cross(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_cross", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
                        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
                        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
                        },
        },
        groups = groups,
        })
end
-- Element End
--------------
function technic_cnc_api.register_element_end(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_end", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
        },
        groups = groups,
        })
end
-- Element straight DOUBLE
--------------------------
function technic_cnc_api.register_element_straight_double(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_straight_double", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
                        },
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_element_straight_double 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_element_straight", ""},
                        {"", recipeitem .. "_technic_cnc_element_straight", ""},
                },
        })
end
-- Element Edge DOUBLE
----------------------
function technic_cnc_api.register_element_edge_double(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_edge_double", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        },
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_element_edge_double 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_element_edge", ""},
                        {"", recipeitem .. "_technic_cnc_element_edge", ""},
                },
        })
end
-- Element T DOUBLE
-------------------
function technic_cnc_api.register_element_t_double(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_t_double", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
                        },
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_element_t_double 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_element_t", ""},
                        {"", recipeitem .. "_technic_cnc_element_t", ""},
                },
        })
end
-- Element Cross Double
-----------------------
function technic_cnc_api.register_element_cross_double(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_cross_double", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {
                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        },
        },
        node_box = {
                type = "fixed",
                fixed = {
                        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
                        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
                        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
                        },
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_element_cross_double 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_element_cross", ""},
                        {"", recipeitem .. "_technic_cnc_element_cross", ""},
                        },
        })
end
-- Element End Double
---------------------
function technic_cnc_api.register_element_end_double(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_element_end_double", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
        },
        node_box = {
                type = "fixed",
                fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_element_end_double 1",
                recipe = {
                        {"", "", ""},
                        {"", recipeitem .. "_technic_cnc_element_end", ""},
                        {"", recipeitem .. "_technic_cnc_element_end", ""},
                        },
        })
end
-- STICK
--------
function technic_cnc_api.register_stick(recipeitem, groups, images, description)
minetest.register_node(":" .. recipeitem .. "_technic_cnc_stick", {
        description = description,
        drawtype = "nodebox",
        tiles = images,
        paramtype = "light",
        paramtype2 = "facedir",
        walkable = true,
        selection_box = {
                type = "fixed",
                fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
        },
        node_box = {
                type = "fixed",
                fixed = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
        },
        groups = groups,
        })
        minetest.register_craft({
                output = recipeitem .. "_technic_cnc_stick 8",
                recipe = {
                        {'default:stick', "", ""},
                        {"", "", ""},
                        {recipeitem, "", ""},
                },
        })
end
-- REGISTER NEW TECHNIC_CNC_API's PART 2: technic_cnc_api.register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
@@ -939,8 +341,8 @@
         technic_cnc_api.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
         technic_cnc_api.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
         technic_cnc_api.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
         technic_cnc_api.register_slope_upsdown_edge(recipeitem, groups, images, desc_slope_upsdwn_edge)
         technic_cnc_api.register_slope_upsdown_inner_edge(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
         technic_cnc_api.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
         technic_cnc_api.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
         technic_cnc_api.register_pyramid(recipeitem, groups, images, desc_pyramid)
         technic_cnc_api.register_spike(recipeitem, groups, images, desc_spike)
         technic_cnc_api.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)