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