ShadowNinja
2013-07-11 5d470cd753efe8f4640099165a7bfc0c6e181c35
commit | author | age
8e03d7 1 -- API for the technic CNC machine
R 2 -- Again code is adapted from the NonCubic Blocks MOD v1.4 by yves_de_beck
3 technic_cnc_api = {}
4
5 -- HERE YOU CAN CHANGE THE DETAIL-LEVEL:
6 ----------------------------------------
7 technic_cnc_api.detail_level = 16 -- 16; 1-32
8
9 -- REGISTER NONCUBIC FORMS, CREATE MODELS AND RECIPES:
10 ------------------------------------------------------
11 local cnc_sphere =
12    function()
13       local nodebox = {}
14       local detail = technic_cnc_api.detail_level
15       local sehne
16       for i = 1, detail-1 do
17      sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
18      nodebox[i]={-sehne, (i/detail)-0.5, -sehne, sehne, (i/detail)+(1/detail)-0.5, sehne}
19       end
20       return nodebox
21    end
22
23 local cnc_cylinder_horizontal =
24    function()
25       local nodebox = {}
26       local detail = technic_cnc_api.detail_level
27       local sehne
28       for i = 1, detail-1 do
29      sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
30      nodebox[i]={-0.5, (i/detail)-0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, sehne}
31       end
32       return nodebox
33    end
34
35 local cnc_cylinder =
36    function()
37       local nodebox = {}
38       local detail = technic_cnc_api.detail_level
39       local sehne
40       for i = 1, detail-1 do
41      sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
42      nodebox[i]={(i/detail)-0.5, -0.5, -sehne, (i/detail)+(1/detail)-0.5, 0.5, sehne}
43       end
44       return nodebox
45    end
46
47 local cnc_twocurvededge =
48    function()
49       local nodebox = {}
50       local detail = technic_cnc_api.detail_level*2
51       local sehne
52       for i = (detail/2)-1, detail-1 do
53      sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
54      nodebox[i]={-sehne, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
55       end
56       return nodebox
57    end
58
59 local cnc_onecurvededge =
60    function()
61       local nodebox = {}
62       local detail = technic_cnc_api.detail_level*2
63       local sehne
64       for i = (detail/2)-1, detail-1 do
65      sehne = math.sqrt(0.25 - (((i/detail)-0.5)^2))
66      nodebox[i]={-0.5, -0.5, -sehne, 0.5, (i/detail)+(1/detail)-0.5, 0.5}
67       end 
68      return nodebox
69    end
70
71 local cnc_spike =
72    function()
73       local nodebox = {}
74       local detail = technic_cnc_api.detail_level
75       for i = 0, detail-1 do
76      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)}
77 end
78       return nodebox
79    end
80
81 local cnc_pyramid =
82    function()
83       local nodebox = {}
84       local detail = technic_cnc_api.detail_level/2
85       for i = 0, detail-1 do
86      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)}
87       end
88       return nodebox
89    end
90
91 local cnc_slope_inner_edge_upsdown =
92    function()
93       local nodebox = {}
94       local detail = technic_cnc_api.detail_level
95       for i = 0, detail-1 do
96      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}
97      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}
98       end
99       return nodebox
100    end
101
102 local cnc_slope_edge_upsdown =
103    function()
104       local nodebox = {}
105       local detail = technic_cnc_api.detail_level
106       for i = 0, detail-1 do
107      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}
108       end
109       return nodebox
110    end
111
112 local cnc_slope_inner_edge =
113    function()
114       local nodebox = {}
115       local detail = technic_cnc_api.detail_level
116       for i = 0, detail-1 do
117      nodebox[i+1]={(i/detail)-0.5, -0.5, -0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
118      nodebox[i+detail+1]={-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
119       end
120       return nodebox
121    end
122
123 local cnc_slope_edge =
124    function()
125       local nodebox = {}
126       local detail = technic_cnc_api.detail_level
127       for i = 0, detail-1 do
128      nodebox[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
129       end
130       return nodebox
131    end
132
133 local cnc_slope_upsdown =
134    function()
135       local nodebox = {}
136       local detail = technic_cnc_api.detail_level
137       for i = 0, detail-1 do
138      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}
139       end
140       return nodebox
141    end
142
143 local cnc_slope_lying =
144    function()
145       local nodebox = {}
146       local detail = technic_cnc_api.detail_level
147       for i = 0, detail-1 do
148      nodebox[i+1]={(i/detail)-0.5, -0.5, (i/detail)-0.5, (i/detail)-0.5+(1/detail), 0.5 , 0.5}
149       end
150       return nodebox
151    end
152
153 local cnc_slope =
154    function()
155       local nodebox = {}
156       local detail = technic_cnc_api.detail_level
157       for i = 0, detail-1 do
158      nodebox[i+1]={-0.5, (i/detail)-0.5, (i/detail)-0.5, 0.5, (i/detail)-0.5+(1/detail), 0.5}
159       end
160       return nodebox
161    end
162
163 -- Define slope boxes for the various nodes
164 -------------------------------------------
165 technic_cnc_api.cnc_programs = {
166    {suffix  = "technic_cnc_stick",
167     nodebox = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15},
168     desc    = "Stick"},
169
170    {suffix  = "technic_cnc_element_end_double",
171     nodebox = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.5},
172     desc    = "Element End Double"},
173
174    {suffix  = "technic_cnc_element_cross_double",
175     nodebox = {
176        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3},
177        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
178        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
179     desc    = "Element Cross Double"},
180
181    {suffix  = "technic_cnc_element_t_double",
182     nodebox = {
183        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
184        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3},
185        {0.3, -0.5, -0.3, 0.5, 0.5, 0.3}},
186     desc    = "Element T Double"},
187
188    {suffix  = "technic_cnc_element_edge_double",
189     nodebox = {
190        {-0.3, -0.5, -0.5, 0.3, 0.5, 0.3},
191        {-0.5, -0.5, -0.3, -0.3, 0.5, 0.3}},
192     desc    = "Element Edge Double"},
193
194    {suffix  = "technic_cnc_element_straight_double",
195     nodebox = {-0.3, -0.5, -0.5, 0.3, 0.5, 0.5},
196     desc    = "Element Straight Double"},
197
198    {suffix  = "technic_cnc_element_end",
199     nodebox = {-0.3, -0.5, -0.3, 0.3, 0, 0.5},
200     desc    = "Element End"},
201
202    {suffix  = "technic_cnc_element_cross",
203     nodebox = {
204        {0.3, -0.5, -0.3, 0.5, 0, 0.3},
205        {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
206        {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
207     desc    = "Element Cross"},
208
209    {suffix  = "technic_cnc_element_t",
210     nodebox = {
211        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
212        {-0.5, -0.5, -0.3, -0.3, 0, 0.3},
213        {0.3, -0.5, -0.3, 0.5, 0, 0.3}},
214     desc    = "Element T"},
215
216    {suffix  = "technic_cnc_element_edge",
217     nodebox = {
218        {-0.3, -0.5, -0.5, 0.3, 0, 0.3},
219        {-0.5, -0.5, -0.3, -0.3, 0, 0.3}},
220     desc    = "Element Edge"},
221
222    {suffix  = "technic_cnc_element_straight",
223     nodebox = {-0.3, -0.5, -0.5, 0.3, 0, 0.5},
224     desc    = "Element Straight"},
225
226    {suffix  = "technic_cnc_sphere",
227     nodebox = cnc_sphere(),
228     desc    = "Sphere"},
229
230    {suffix  = "technic_cnc_cylinder_horizontal",
231     nodebox = cnc_cylinder_horizontal(),
232     desc    = "Cylinder Horizontal"},
233
234    {suffix  = "technic_cnc_cylinder",
235     nodebox = cnc_cylinder(),
236     desc    = ""},
237
238    {suffix  = "technic_cnc_twocurvededge",
239     nodebox = cnc_twocurvededge(),
240     desc    = "One Curved Edge Block"},
241
242    {suffix  = "technic_cnc_onecurvededge",
243     nodebox = cnc_onecurvededge(),
244     desc    = "Two Curved Edge Block"},
245
246    {suffix  = "technic_cnc_spike",
247     nodebox = cnc_spike(),
248     desc    = "Spike"},
249
250    {suffix  = "technic_cnc_pyramid",
251     nodebox = cnc_pyramid(),
252     desc    = "Pyramid"},
253
254    {suffix  = "technic_cnc_slope_inner_edge_upsdown",
255     nodebox = cnc_slope_inner_edge_upsdown(),
256     desc    = "Slope Upside Down Inner Edge"},
257
258    {suffix  = "technic_cnc_slope_edge_upsdown",
259     nodebox = cnc_slope_edge_upsdown(),
260     desc    = "Slope Upside Down Edge"},
261
262    {suffix  = "technic_cnc_slope_inner_edge",
263     nodebox = cnc_slope_inner_edge(),
264     desc    = "Slope Inner Edge"},
265
266    {suffix  = "technic_cnc_slope_edge",
267     nodebox = cnc_slope_edge(),
268     desc    = "Slope Edge"},
269
270    {suffix  = "technic_cnc_slope_upsdown",
271     nodebox = cnc_slope_upsdown(),
272     desc    = "Slope Upside Down"},
273
274    {suffix  = "technic_cnc_slope_lying",
275     nodebox = cnc_slope_lying(),
276     desc    = "Slope Lying"},
277
278    {suffix  = "technic_cnc_slope",
279     nodebox = cnc_slope(),
280     desc    = "Slope"},
281 --   {suffix  = "",
282 --    nodebox =},
283 }
284
285 -- Allow disabling certain programs for some node. Default is allowing all types for all nodes
286 technic_cnc_api.cnc_programs_disable = {
287    -- ["default:brick"] = {"technic_cnc_stick"}, -- Example: Disallow the stick for brick
288    -- ...
289    ["default:dirt"] = {"technic_cnc_sphere", "technic_cnc_slope_upsdown", "technic_cnc_edge",
290                "technic_cnc_inner_edge", "technic_cnc_slope_edge_upsdown", "technic_cnc_slope_inner_edge_upsdown",
291                "technic_cnc_stick", "technic_cnc_cylinder_horizontal"}
292 }
293
294 -- Generic function for registering all the different node types
295 function technic_cnc_api.register_cnc_program(recipeitem, suffix, nodebox, groups, images, description)
296    minetest.register_node(":" .. recipeitem .. "_" .. suffix, {
297                  description   = description,
298                  drawtype      = "nodebox",
299                  tiles         = images,
300                  paramtype     = "light",
301                  paramtype2    = "facedir",
302                  walkable      = true,
303                  selection_box = {
304                 type  = "fixed",
305                 fixed = nodebox
306                  },
307                  node_box      = {
308                 type  = "fixed",
309                 fixed = nodebox
310                  },
311                  groups        = groups,
312               })
313 end
314
315 -- function to iterate over all the programs the CNC machine knows
316 function technic_cnc_api.register_all(recipeitem, groups, images, description)
317    for _, data in ipairs(technic_cnc_api.cnc_programs) do
318       -- Disable node creation for disabled node types for some material
319       local do_register = true
320       if technic_cnc_api.cnc_programs_disable[recipeitem] ~= nil then
321      for __, disable in ipairs(technic_cnc_api.cnc_programs_disable[recipeitem]) do
322         if disable == data.suffix then
323            do_register = false
324         end
325      end
326       end
327       -- Create the node if it passes the test
328       if do_register then
329      technic_cnc_api.register_cnc_program(recipeitem, data.suffix, data.nodebox, groups, images, description.." "..data.desc)
330       end
331    end
332 end
333
334
335 -- REGISTER NEW TECHNIC_CNC_API's PART 2: technic_cnc_api.register_element_end(subname, recipeitem, groups, images, desc_element_xyz)
336 -----------------------------------------------------------------------------------------------------------------------
337 function technic_cnc_api.register_slope_edge_etc(recipeitem, groups, images, desc_slope, desc_slope_lying, desc_slope_upsdown, desc_slope_edge, desc_slope_inner_edge, desc_slope_upsdwn_edge, desc_slope_upsdwn_inner_edge, desc_pyramid, desc_spike, desc_onecurvededge, desc_twocurvededge, desc_cylinder, desc_cylinder_horizontal, desc_sphere, desc_element_straight, desc_element_edge, desc_element_t, desc_element_cross, desc_element_end)
338
339          technic_cnc_api.register_slope(recipeitem, groups, images, desc_slope)
340          technic_cnc_api.register_slope_lying(recipeitem, groups, images, desc_slope_lying)
341          technic_cnc_api.register_slope_upsdown(recipeitem, groups, images, desc_slope_upsdown)
342          technic_cnc_api.register_slope_edge(recipeitem, groups, images, desc_slope_edge)
343          technic_cnc_api.register_slope_inner_edge(recipeitem, groups, images, desc_slope_inner_edge)
344          technic_cnc_api.register_slope_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_edge)
345          technic_cnc_api.register_slope_inner_edge_upsdown(recipeitem, groups, images, desc_slope_upsdwn_inner_edge)
346          technic_cnc_api.register_pyramid(recipeitem, groups, images, desc_pyramid)
347          technic_cnc_api.register_spike(recipeitem, groups, images, desc_spike)
348          technic_cnc_api.register_onecurvededge(recipeitem, groups, images, desc_onecurvededge)
349          technic_cnc_api.register_twocurvededge(recipeitem, groups, images, desc_twocurvededge)
350          technic_cnc_api.register_cylinder(recipeitem, groups, images, desc_cylinder)
351          technic_cnc_api.register_cylinder_horizontal(recipeitem, groups, images, desc_cylinder_horizontal)
352          technic_cnc_api.register_sphere(recipeitem, groups, images, desc_sphere)
353          technic_cnc_api.register_element_straight(recipeitem, groups, images, desc_element_straight)
354          technic_cnc_api.register_element_edge(recipeitem, groups, images, desc_element_edge)
355          technic_cnc_api.register_element_t(recipeitem, groups, images, desc_element_t)
356          technic_cnc_api.register_element_cross(recipeitem, groups, images, desc_element_cross)
357          technic_cnc_api.register_element_end(recipeitem, groups, images, desc_element_end)
358 end
359
360 -- REGISTER STICKS: noncubic.register_xyz(recipeitem, groups, images, desc_element_xyz)
361 ------------------------------------------------------------------------------------------------------------
362 function technic_cnc_api.register_stick_etc(recipeitem, groups, images, desc_stick)
363          technic_cnc_api.register_stick(recipeitem, groups, images, desc_stick)
364 end
365
366 function technic_cnc_api.register_elements(recipeitem, groups, images, desc_element_straight_double, desc_element_edge_double, desc_element_t_double, desc_element_cross_double, desc_element_end_double)
367          technic_cnc_api.register_element_straight_double(recipeitem, groups, images, desc_element_straight_double)
368          technic_cnc_api.register_element_edge_double(recipeitem, groups, images, desc_element_edge_double)
369          technic_cnc_api.register_element_t_double(recipeitem, groups, images, desc_element_t_double)
370          technic_cnc_api.register_element_cross_double(recipeitem, groups, images, desc_element_cross_double)
371          technic_cnc_api.register_element_end_double(recipeitem, groups, images, desc_element_end_double)
372 end