daily pastebin goal
1%
SHARE
TWEET

Sproxel Minetest exporter

a guest Aug 27th, 2013 50 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top