-
Notifications
You must be signed in to change notification settings - Fork 11
/
blender_export.py
72 lines (57 loc) · 1.82 KB
/
blender_export.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import bpy
import bmesh
import argparse
import sys
argv = sys.argv
if "--" not in argv:
argv = []
else:
argv = argv[argv.index("--") + 1:]
try:
parser = argparse.ArgumentParser(description='Exports Blender model as a byte array for wireframe rendering',prog = "blender -b -P "+__file__+" --")
parser.add_argument('-o','--out', help='Output file', required=True, dest='out')
args = parser.parse_args(argv)
except Exception as e:
sys.exit(repr(e))
obdata = bpy.context.object.data
# charset
charset="_0123456789abcdefghijklmnopqrstuvwxyz"
def pack_float(x):
h = "{:02x}".format(int(round(32*x+128,0)))
if len(h)!=2:
raise Exception('Unable to convert: {} into a byte: {}'.format(x,h))
return h
# model data
s = ""
# object name
name = bpy.context.object.name.lower()
s = s + "{:02x}".format(len(name))
for c in name:
s = s + "{:02x}".format(charset.index(c)+1)
# scale (custom model property)
s = s + "{:02x}".format(bpy.context.object.get("scale", 1))
bm = bmesh.new()
bm.from_mesh(obdata)
s = s + "{:02x}".format(len(obdata.vertices))
for v in obdata.vertices:
s = s + "{}{}{}".format(pack_float(v.co.x), pack_float(v.co.z), pack_float(v.co.y))
# faces:
s = s + "{:02x}".format(len(bm.faces))
for f in bm.faces:
# face point index
# edge count
s = s + "{:02x}{:02x}".format(f.verts[0].index+1,len(f.edges))
# edge id's
for e in f.edges:
s = s + "{:02x}".format(e.index+1)
#normals
s = s + "{:02x}".format(len(obdata.polygons))
for f in obdata.polygons:
s = s + "{}{}{}".format(pack_float(f.normal.x), pack_float(f.normal.z), pack_float(f.normal.y))
# all edges
s = s + "{:02x}".format(len(bm.edges))
for e in bm.edges:
s = s + "{:02x}{:02x}{:02x}".format(e.verts[0].index+1, e.verts[1].index+1,1 if e.is_wire else 0)
#
with open(args.out, 'w') as f:
f.write(s)