Advertisement
Guest User

Sproxel Minetest exporter

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