Guest User

Untitled

a guest
Aug 28th, 2013
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.55 KB | None | 0 0
  1. # author : Jorge Aldo Gomes de Freitas Junior ([email protected])
  2. # released under the same license as sproxel, whatever it is...
  3.  
  4. import sproxel
  5. import os
  6.  
  7. plugin_info=dict(
  8.     name='Minetest NodeBox Export Plugin'
  9.     )
  10.  
  11. def register():
  12.     sproxel.register_exporter(TilesExporter)
  13.  
  14. def unregister():
  15.     sproxel.unregister_exporter(TilesExporter)
  16.    
  17. def writeppm(fn, xmax, ymax, buffer):
  18.     f = open(fn, 'wb')
  19.     f.write("P3\n")
  20.     f.write("# " + fn + "\n")
  21.     f.write(str(xmax))
  22.     f.write(" ")
  23.     f.write(str(ymax))
  24.     f.write("\n")
  25.     f.write("255\n")
  26.     for x in xrange(0, xmax):
  27.         for y in xrange(0, ymax):
  28.             f.write(str(int(buffer[x][y][0] * 255)))
  29.             f.write(" ")
  30.             f.write(str(int(buffer[x][y][1] * 255)))
  31.             f.write(" ")
  32.             f.write(str(int(buffer[x][y][2] * 255)))
  33.             f.write(" ")
  34.         f.write("\n")
  35.     f.close
  36.     return
  37.  
  38. class TilesExporter(object):
  39.     @staticmethod
  40.     def name():
  41.         return 'Minetest nodebox file'
  42.  
  43.     @staticmethod
  44.     def filter():
  45.         return '*.*'
  46.  
  47.     @staticmethod
  48.     def doExport(fn, prj, cur_sprite):
  49.    
  50.         fn = os.path.basename(fn)
  51.  
  52.         if not os.path.exists(fn): os.makedirs(fn)
  53.         if not os.path.exists(fn + "/textures"): os.makedirs(fn + "/textures")
  54.        
  55.         # node texture names
  56.         luaname = fn + "/init.lua"
  57.         topname = fn + "/textures/" + fn + "_texturetop.ppm"
  58.         bottomname = fn + "/textures/" + fn + "_texturebottom.ppm"
  59.         frontname = fn + "/textures/" + fn + "_texturefront.ppm"
  60.         backname = fn + "/textures/" + fn + "_textureback.ppm"
  61.         leftname = fn + "/textures/" + fn + "_textureleft.ppm"
  62.         rightname = fn + "/textures/" + fn + "_textureright.ppm"
  63.  
  64.         # sprite constants
  65.         # get object size
  66.         bounds = cur_sprite.bounds
  67.         minx = bounds[0][0]
  68.         miny = bounds[0][1]
  69.         minz = bounds[0][2]
  70.         maxx = bounds[1][0]
  71.         maxy = bounds[1][1]
  72.         maxz = bounds[1][2]
  73.         sizex = maxx - minx + 1
  74.         sizey = maxy - miny + 1
  75.         sizez = maxz - minz + 1
  76.        
  77.         # nodebox constants
  78.         minnodeboxx = -0.5
  79.         minnodeboxy = -0.5
  80.         minnodeboxz = -0.5
  81.         maxnodeboxx = 0.5
  82.         maxnodeboxy = 0.5
  83.         maxnodeboxz = 0.5
  84.         sizenodeboxx = maxnodeboxx - minnodeboxx
  85.         sizenodeboxy = maxnodeboxy - minnodeboxy
  86.         sizenodeboxz = maxnodeboxz - minnodeboxz
  87.         stepnodeboxx = sizenodeboxx / sizex
  88.         stepnodeboxy = sizenodeboxy / sizey
  89.         stepnodeboxz = sizenodeboxz / sizez
  90.  
  91.         # prealloc textures
  92.        
  93.         mttoptexture = [[[0, 0, 0] for i in range(0, sizex)] for j in range(0, sizez)]
  94.         mtbottomtexture = [[[0, 0, 0] for i in range(0, sizex)] for j in range(0, sizez)]
  95.         mtfronttexture = [[[0, 0, 0] for i in range(0, sizex)] for j in range(0, sizey)]
  96.         mtbacktexture = [[[0, 0, 0] for i in range(0, sizex)] for j in range(0, sizey)]
  97.         mtlefttexture = [[[0, 0, 0] for i in range(0, sizey)] for j in range(0, sizez)]
  98.         mtrighttexture = [[[0, 0, 0] for i in range(0, sizey)] for j in range(0, sizez)]
  99.        
  100.         # generate lefttexture
  101.         for x in xrange(minx, maxx + 1):
  102.             for z in xrange(minz, maxz + 1):
  103.                 for y in xrange(miny, maxy + 1):
  104.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  105.                     if not r + g + b == 0:
  106.                         mtlefttexture[x][z] = [r, g, b]
  107.  
  108.         # generate righttexture
  109.         for x in xrange(minx, maxx + 1):
  110.             for z in xrange(minz, maxz + 1):
  111.                 for y in xrange(maxy, miny - 1, -1):
  112.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  113.                     print x, ',', z, '=', maxx - x + 1, ',', z
  114.                     if not r + g + b == 0:
  115.                         mtrighttexture[x][maxz - z] = [r, g, b]
  116.  
  117.         # generate fronttexture
  118.         for x in xrange(minx, maxx + 1):
  119.             for y in xrange(miny, maxy + 1):
  120.                 for z in xrange(minz, maxz + 1):
  121.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  122.                     if not r + g + b == 0:
  123.                         mtfronttexture[x][y] = [r, g, b]
  124.  
  125.         # generate backtexture
  126.         for x in xrange(minx, maxx + 1):
  127.             for y in xrange(miny, maxy + 1):
  128.                 for z in xrange(maxz, minz - 1, -1):
  129.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  130.                     if not r + g + b == 0:
  131.                         mtbacktexture[maxx - x][y] = [r, g, b]
  132.  
  133.         # generate toptexture
  134.         for y in xrange(miny, maxy + 1):
  135.             for z in xrange(minz, maxz + 1):
  136.                 for x in xrange(minx, maxx + 1):
  137.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  138.                     if not r + g + b == 0:
  139.                         mttoptexture[maxz - z][y] = [r, g, b]
  140.  
  141.         # generate bottomtexture
  142.         for y in xrange(miny, maxy + 1):
  143.             for z in xrange(minz, maxz + 1):
  144.                 for x in xrange(maxx, minx - 1, -1):
  145.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  146.                     if not r + g + b == 0:
  147.                         mtbottomtexture[z][y] = [r, g, b]
  148.  
  149.         # write header
  150.         f = open(luaname, 'wb')
  151.         f.write("minetest.register_node('" + fn + ":yournode', {\n")
  152.         f.write("  description = 'yournode',\n")
  153.         f.write("  paramtype = 'light',\n",)
  154.         f.write("  paramtype2 = 'facedir',\n",)
  155.         f.write("  is_ground_content = true,\n")
  156.         f.write("  drawtype = 'nodebox',\n")
  157.         f.write("  tiles = {\n")
  158.         f.write("    '" + fn + "_texturetop.png',\n")
  159.         f.write("    '" + fn + "_texturebottom.png',\n")
  160.         f.write("    '" + fn + "_textureleft.png',\n")
  161.         f.write("    '" + fn + "_textureright.png',\n")
  162.         f.write("    '" + fn + "_texturefront.png',\n")
  163.         f.write("    '" + fn + "_textureback.png',\n")
  164.         f.write("  },\n")
  165.         f.write("  selection_box = {\n")
  166.         f.write("    type = 'fixed',\n")
  167.         f.write("    fixed = { -1/3, -1/3, -1/3, 1/3, 1/3, 1/3 }\n")
  168.         f.write("  },\n")
  169.         f.write("  node_box = {\n")
  170.         f.write("    type = 'fixed',\n")
  171.         f.write("    fixed = {\n")
  172.        
  173.         # write nodebox data
  174.         for x in xrange(minx, maxx + 1):
  175.             for z in xrange(minz, maxz + 1):
  176.                 for y in xrange(miny, maxy + 1):
  177.                     r, g, b, a = cur_sprite.getColor(x, y, z)
  178.                     if not r + g + b == 0:
  179.                         f.write("        {")
  180.                         f.write(str((x * stepnodeboxx) + minnodeboxx))
  181.                         f.write(", ")
  182.                         f.write(str((y * stepnodeboxy) + minnodeboxy))
  183.                         f.write(", ")
  184.                         f.write(str((z * stepnodeboxz) + minnodeboxz))
  185.                         f.write(", ")
  186.                         f.write(str(((x + 1) * stepnodeboxx) + minnodeboxx))
  187.                         f.write(", ")
  188.                         f.write(str(((y + 1) * stepnodeboxy) + minnodeboxy))
  189.                         f.write(", ")
  190.                         f.write(str(((z + 1) * stepnodeboxz) + minnodeboxz))
  191.                         f.write("},\n")
  192.  
  193.         # write footer
  194.         f.write("      },\n")
  195.         f.write("    },\n")
  196.         f.write("})\n")
  197.         f.close()
  198.        
  199.         # create textures
  200.  
  201.         # write toptexture
  202.         writeppm(topname, sizex, sizez, mttoptexture)
  203.  
  204.         # write bottomtexture
  205.         writeppm(bottomname, sizex, sizez, mtbottomtexture)
  206.  
  207.         # write fronttexture
  208.         writeppm(frontname, sizex, sizey, mtfronttexture)
  209.  
  210.         # write backtexture
  211.         writeppm(backname, sizex, sizey, mtbacktexture)
  212.  
  213.         # write lefttexture
  214.         writeppm(leftname, sizey, sizez, mtlefttexture)
  215.  
  216.         # write righttexture
  217.         writeppm(rightname, sizey, sizez, mtrighttexture)
  218.  
  219.         return True
Advertisement
Add Comment
Please, Sign In to add comment