Skip to content

Instantly share code, notes, and snippets.

@z0w0
Created March 18, 2011 07:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save z0w0/875742 to your computer and use it in GitHub Desktop.
Save z0w0/875742 to your computer and use it in GitHub Desktop.
A python program for converting 3d wavefront models (.obj) to Blockland brick files (.blb). @blockland.us
"""
OBJ2BLB by Zack0Wack0
zack0wack0.com
"""
import sys,decimal
vertices = []
normals = []
uvs = []
topquads = []
bottomquads = []
northquads = []
westquads = []
southquads = []
eastquads = []
omniquads = []
facecount = 0
def join(list,delim):
string = None
for obj in list:
if string == None:
string = obj
else:
string = string + delim + obj
return string
def read(file):
input = open(file,"r")
for line in input.readlines():
line = line.strip()
if not line:
continue
if line[0] == "#":
continue
tokens = line.split()
if not tokens:
continue
if tokens[0] == "v":
vert = [tokens[1:][0],tokens[1:][2],str(decimal.Decimal(tokens[1:][1]) * 3)]
vertices.append(vert)
continue
if tokens[0] == "vn":
normals.append(tokens[1:])
continue
if tokens[0] == "vt":
uvs.append(tokens[1:])
continue
if tokens[0] == "f":
face = tokens[1:]
facefix = []
count = -1
for token in face:
count = count + 1
facefix.append(face[count].split("/"))
face = facefix
if len(face) == 3:
face.append(face[0])
if len(face) >= 3:
if normals[int(face[0][2])-1][2] == "1":
topquads.append(face)
elif normals[int(face[0][2])-1][2] == "-1":
bottomquads.append(face)
elif normals[int(face[0][2])-1][1] == "1":
northquads.append(face)
elif normals[int(face[0][2])-1][0] == "1":
eastquads.append(face)
elif normals[int(face[0][2])-1][1] == "-1":
southquads.append(face)
elif normals[int(face[0][2])-1][0] == "-1":
westquads.append(face)
else:
omniquads.append(face)
else:
omniquads.append(face)
continue
input.close()
def write(file):
output = open(file + ".blb","w")
output.write("? ? ? (INSERT OVERALL SIZE)\nSPECIAL\n\n? (INSERT BRICK GRID)\n\n? (INSERT COLLISION DATA)\n\nCOVERAGE: //TBNESW\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n? : ? (HIDE ADJACENT? : COVERAGE TO HIDE?)\n")
output.write("----------------top quads:\n" + str(len(topquads)) + "\n\n")
for face in topquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------bottom quads:\n" + str(len(bottomquads)) + "\n\n")
for face in bottomquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------north quads:\n" + str(len(northquads)) + "\n\n")
for face in northquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------west quads:\n" + str(len(westquads)) + "\n\n")
for face in westquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------south quads:\n" + str(len(southquads)) + "\n\n")
for face in southquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------east quads:\n" + str(len(eastquads)) + "\n\n")
for face in eastquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
output.write("----------------omni quads:\n" + str(len(omniquads)) + "\n\n")
for face in omniquads:
output.write("TEX:? (INSERT TEXTURE DATA)\nPOSITION:\n")
if len(face[0]) >= 1:
if vertices[int(face[0][0])-1] != None:
output.write(join(vertices[int(face[0][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[1][0])-1] != None:
output.write(join(vertices[int(face[1][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[2][0])-1] != None:
output.write(join(vertices[int(face[2][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if vertices[int(face[3][0])-1] != None:
output.write(join(vertices[int(face[3][0])-1]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("UV COORDS:\n")
if len(face[0]) >= 2:
if uvs[int(face[0][1])-1] != None:
output.write(join(uvs[int(face[0][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[1][1])-1] != None:
output.write(join(uvs[int(face[1][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[2][1])-1] != None:
output.write(join(uvs[int(face[2][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
if uvs[int(face[3][1])-1] != None:
output.write(join(uvs[int(face[3][1])-1][0:2]," ") + "\n")
else:
output.write("? ? ?\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n")
output.write("NORMALS:\n")
if len(face[0]) >= 3:
if normals[int(face[0][2])-1] != None:
output.write(join(normals[int(face[0][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[1][2])-1] != None:
output.write(join(normals[int(face[1][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[2][2])-1] != None:
output.write(join(normals[int(face[2][2])-1]," ") + "\n")
else:
output.write("? ? ?\n")
if normals[int(face[3][2])-1] != None:
output.write(join(normals[int(face[3][2])-1]," ") + "\n\n")
else:
output.write("? ? ?\n\n")
else:
output.write("? ? ?\n? ? ?\n? ? ?\n? ? ?\n\n")
read(sys.argv[1])
write(sys.argv[1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment