You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
6.4 KiB
Python
186 lines
6.4 KiB
Python
from .geo import Geo
|
|
from .geomesh import *
|
|
from .bones import *
|
|
import bpy.path
|
|
import bpy
|
|
import mathutils
|
|
|
|
from bpy_extras.io_utils import axis_conversion
|
|
|
|
def convert_mesh(geo_model, mesh, obj):
|
|
if bpy.app.version < (2, 80):
|
|
# Be sure tessface & co are available!
|
|
if not mesh.tessfaces and mesh.polygons:
|
|
mesh.calc_tessface()
|
|
else:
|
|
# Be sure tessellated loop trianlges are available!
|
|
if not mesh.loop_triangles and mesh.polygons:
|
|
mesh.calc_loop_triangles()
|
|
|
|
mesh_verts = mesh.vertices # save a lookup
|
|
|
|
if bpy.app.version < (2, 80):
|
|
has_uv = bool(mesh.tessface_uv_textures)
|
|
if has_uv:
|
|
active_uv_layer = mesh.tessface_uv_textures.active
|
|
if not active_uv_layer:
|
|
has_uv = False
|
|
else:
|
|
active_uv_layer = active_uv_layer.data
|
|
else:
|
|
has_uv = bool(mesh.uv_layers)
|
|
if has_uv:
|
|
active_uv_layer = mesh.uv_layers.active
|
|
if not active_uv_layer:
|
|
has_uv = False
|
|
else:
|
|
active_uv_layer = active_uv_layer.data
|
|
|
|
geomesh = GeoMesh()
|
|
|
|
texture_name = "white.tga"
|
|
if bpy.app.version < (2, 80):
|
|
faces = mesh.tessfaces
|
|
print("len(mesh.tessfaces): %s" % len(faces))
|
|
print("mesh.tessfaces: %s" % repr(faces))
|
|
else:
|
|
faces = mesh.loop_triangles
|
|
for i, f in enumerate(faces):
|
|
if has_uv:
|
|
uv = active_uv_layer[i]
|
|
if bpy.app.version < (2, 80):
|
|
texture_image = uv.image
|
|
if texture_image is None:
|
|
texture_name = "white.tga"
|
|
else:
|
|
texture_name = texture_image.name
|
|
if texture_name == "":
|
|
texture_name = bpy.path.display_name_from_filepath(texture_image.filepath)
|
|
if texture_name == "":
|
|
texture_name = "white.tga"
|
|
else:
|
|
mat = mesh.materials[f.material_index]
|
|
if len(mat.texture_paint_images) <= 0:
|
|
texture_name = mat.name
|
|
else:
|
|
texture_image = mat.texture_paint_images[0]
|
|
texture_name = texture_image.name
|
|
if texture_name == "":
|
|
texture_name = bpy.path.display_name_from_filepath(texture_image.filepath)
|
|
if texture_name == "":
|
|
texture_name = "white.tga"
|
|
if bpy.app.version < (2, 80):
|
|
uv = [uv.uv1, uv.uv2, uv.uv3, uv.uv4]
|
|
else:
|
|
print("uv.uv: %s" % uv.uv)
|
|
uv = [active_uv_layer[l].uv[:] for l in f.loops]
|
|
else:
|
|
uv = [(0, 0)] * 4
|
|
texture_name = "white.tga"
|
|
f_verts = f.vertices
|
|
verts = []
|
|
norms = []
|
|
groups = []
|
|
geoverts = []
|
|
for i, v_index in enumerate(f_verts):
|
|
v = mesh_verts[v_index]
|
|
verts.append(v.co)
|
|
norms.append(v.normal)
|
|
weights = []
|
|
for weight in v.groups:
|
|
group = obj.vertex_groups[weight.group]
|
|
w = [group.name, weight.weight]
|
|
weights.append(w)
|
|
print("i: %s f_verts: %s uv: %s" % (i, repr(f_verts), repr(uv)))
|
|
gv = GeoVertex(v.co, v.normal, uv[i], weights)
|
|
geoverts.append(gv)
|
|
geoverts.reverse()
|
|
geomesh.addFace(geoverts, texture_name)
|
|
|
|
print("face: vertices: %s uvs: %s norms: %s groups: %s" % (verts, uv, norms, weights))
|
|
#todo: optimize face order for bone association
|
|
geomesh.dump()
|
|
geo_model.loadFromGeoMesh(geomesh)
|
|
pass
|
|
|
|
def save(operator, context, scale = 1.0, filepath = "", global_matrix = None, use_mesh_modifiers = True):
|
|
print("export_geo.save(): %s" % (filepath, ))
|
|
|
|
geo = Geo()
|
|
geo.getTextureIndex("white.tga")
|
|
#geo.getTextureIndex("white")
|
|
|
|
body_name = bpy.path.display_name_from_filepath(filepath)
|
|
geo.setName(body_name)
|
|
|
|
#print("AXIS_ROTATION")
|
|
#axis_rotation = axis_conversion('-Y', 'Z', 'Z', 'Y')
|
|
#print("%s" % (axis_rotation, ))
|
|
#print("AXIS_ROTATION")
|
|
#axis_rotation = axis_conversion('Y', 'Z', '-Z', 'Y')
|
|
#print("%s" % (axis_rotation, ))
|
|
#print("AXIS_ROTATION")
|
|
axis_rotation = mathutils.Matrix([
|
|
[-1, 0, 0],
|
|
[0, 0, 1],
|
|
[0, -1, 0],
|
|
])
|
|
#print("%s" % (axis_rotation, ))
|
|
#print("AXIS_ROTATION")
|
|
axis_rotation.resize_4x4()
|
|
|
|
print("scale: %s" % (scale, ))
|
|
for ob in context.selected_objects:
|
|
print("Object: %s (%s)" % (ob.name, ob.type))
|
|
if ob.type != "MESH":
|
|
continue
|
|
ob.update_from_editmode()
|
|
|
|
if global_matrix is None:
|
|
from mathutils import Matrix
|
|
global_matrix = Matrix()
|
|
|
|
# get the modifiers
|
|
if bpy.app.version < (2, 80):
|
|
mesh = ob.to_mesh(bpy.context.scene, use_mesh_modifiers, "PREVIEW")
|
|
else:
|
|
mesh = ob.to_mesh(preserve_all_data_layers = True)
|
|
|
|
#translate_matrix = Matrix.Translation(-ob.location)
|
|
translate_matrix = Matrix()
|
|
#scale_matrix = Matrix.Scale(1 / 0.30480000376701355, 4)
|
|
obj_matrix = ob.matrix_world
|
|
print(obj_matrix)
|
|
obj_scale = obj_matrix.to_scale()[0] #assume scaling is uniform on all axis
|
|
print("obj_scale: %s final_scale: %s" % (obj_scale, obj_scale * scale))
|
|
print(obj_scale * scale)
|
|
scale_matrix = Matrix.Scale(obj_scale * scale, 4)
|
|
if bpy.app.version < (2, 80):
|
|
mesh.transform(global_matrix * scale_matrix * translate_matrix * axis_rotation)
|
|
else:
|
|
mesh.transform(global_matrix @ scale_matrix @ translate_matrix @ axis_rotation)
|
|
|
|
mesh.calc_normals()
|
|
|
|
geo_model = geo.addModel(ob.name)
|
|
|
|
convert_mesh(geo_model, mesh, ob)
|
|
|
|
if False: #flip bones
|
|
for i in range(len(geo.models) - 1, -1, -1):
|
|
name = geo.models[i].name.decode("utf-8")
|
|
#if reg_exp.search(name) is not None:
|
|
if True:
|
|
print("Swapping left and right in: %s" % (name, ))
|
|
model = geo.models[i]
|
|
for j in range(len(model.weight_bones)):
|
|
for k in range(len(model.weight_bones[j])):
|
|
model.weight_bones[j][k] = BONES_SWAP[model.weight_bones[j][k]]
|
|
|
|
data = geo.saveToData()
|
|
fh = open(filepath, "wb")
|
|
fh.write(data)
|
|
fh.close()
|
|
|
|
return {'FINISHED'}
|