use with syntax to save file and fix no uv bug

This commit is contained in:
yyc12345 2020-08-30 21:22:25 +08:00
parent 40756b0178
commit 41d3c5f3b7

View File

@ -64,7 +64,11 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
zipObj.extractall(tempFolder)
# index.bm
findex = open(os.path.join(tempFolder, "index.bm"), "rb")
objectList = []
meshList = []
materialList = []
textureList = []
with open(os.path.join(tempFolder, "index.bm"), "rb") as findex:
# judge version first
gotten_version = read_uint32(findex)
if (gotten_version != bm_current_version):
@ -72,10 +76,7 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
findex.close()
tempFolderObj.cleanup()
return
objectList = []
meshList = []
materialList = []
textureList = []
while len(peek_stream(findex)) != 0:
index_name = read_string(findex)
index_type = read_uint8(findex)
@ -91,10 +92,10 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
textureList.append(blockCache)
else:
pass
findex.close()
# texture.bm
ftexture = open(os.path.join(tempFolder, "texture.bm"), "rb")
with open(os.path.join(tempFolder, "texture.bm"), "rb") as ftexture:
for item in textureList:
ftexture.seek(item.offset, os.SEEK_SET)
texture_filename = read_string(ftexture)
@ -113,10 +114,8 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
item.blenderData = txur
txur.name = item.name
ftexture.close()
# material.bm
fmaterial = open(os.path.join(tempFolder, "material.bm"), "rb")
with open(os.path.join(tempFolder, "material.bm"), "rb") as fmaterial:
for item in materialList:
fmaterial.seek(item.offset, os.SEEK_SET)
@ -158,10 +157,9 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
item.blenderData = m
fmaterial.close()
# mesh.bm
fmesh = open(os.path.join(tempFolder, "mesh.bm"), "rb")
with open(os.path.join(tempFolder, "mesh.bm"), "rb") as fmesh:
vList=[]
vtList=[]
vnList=[]
@ -249,10 +247,9 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
# add into item using
item.blenderData = mesh
fmesh.close()
# object
fobject = open(os.path.join(tempFolder, "object.bm"), "rb")
with open(os.path.join(tempFolder, "object.bm"), "rb") as fobject:
# we need get needed collection first
view_layer = context.view_layer
@ -292,7 +289,6 @@ def import_bm(context,filepath,externalTexture,blenderTempFolder):
obj.matrix_world = object_worldMatrix
obj.hide_set(object_isHidden)
fobject.close()
view_layer.update()
tempFolderObj.cleanup()
@ -320,14 +316,14 @@ def export_bm(context,filepath,export_mode, export_target):
forcedCollection = None
# ============================================ export
finfo = open(os.path.join(tempFolder, "index.bm"), "wb")
with open(os.path.join(tempFolder, "index.bm"), "wb") as finfo:
write_uint32(finfo, bm_current_version)
# ====================== export object
fobject = open(os.path.join(tempFolder, "object.bm"), "wb")
meshSet = set()
meshList = []
meshCount = 0
with open(os.path.join(tempFolder, "object.bm"), "wb") as fobject:
for obj in objectList:
# only export mesh object
if obj.type != 'MESH':
@ -375,12 +371,10 @@ def export_bm(context,filepath,export_mode, export_target):
write_worldMatrix(fobject, obj.matrix_world)
write_uint32(fobject, meshId)
fobject.close()
# ====================== export mesh
fmesh = open(os.path.join(tempFolder, "mesh.bm"), "wb")
materialSet = set()
materialList = []
with open(os.path.join(tempFolder, "mesh.bm"), "wb") as fmesh:
for mesh in meshList:
mesh.calc_normals_split()
@ -399,8 +393,9 @@ def export_bm(context,filepath,export_mode, export_target):
# uv
face_index_pairs = [(face, index) for index, face in enumerate(mesh.polygons)]
uv_layer = mesh.uv_layers.active.data[:]
write_uint32(fmesh, len(face_index_pairs) * 3)
if mesh.uv_layers.active is not None:
uv_layer = mesh.uv_layers.active.data[:]
for f, f_index in face_index_pairs:
# it should be triangle face, otherwise throw a error
if (f.loop_total != 3):
@ -410,6 +405,10 @@ def export_bm(context,filepath,export_mode, export_target):
uv = uv_layer[loop_index].uv
# reverse v
write_2vector(fmesh, uv[0], -uv[1])
else:
# no uv data. write garbage
for i in range(len(face_index_pairs) * 3):
write_2vector(fmesh, 0.0, 0.0)
# normals
write_uint32(fmesh, len(face_index_pairs) * 3)
@ -463,13 +462,11 @@ def export_bm(context,filepath,export_mode, export_target):
mesh.free_normals_split()
fmesh.close()
# ====================== export material
fmaterial = open(os.path.join(tempFolder, "material.bm"), "wb")
textureSet = set()
textureList = []
textureCount = 0
with open(os.path.join(tempFolder, "material.bm"), "wb") as fmaterial:
for material in materialList:
# write finfo first
write_string(finfo, material.name)
@ -540,13 +537,11 @@ def export_bm(context,filepath,export_mode, export_target):
write_bool(fmaterial, material_useTexture)
write_uint32(fmaterial, material_texture)
fmaterial.close()
# ====================== export texture
ftexture = open(os.path.join(tempFolder, "texture.bm"), "wb")
source_dir = os.path.dirname(bpy.data.filepath)
existed_texture = set()
with open(os.path.join(tempFolder, "texture.bm"), "wb") as ftexture:
for texture in textureList:
# write finfo first
write_string(finfo, texture.name)
@ -567,10 +562,6 @@ def export_bm(context,filepath,export_mode, export_target):
shutil.copy(texture_filepath, os.path.join(tempTextureFolder, filename))
existed_texture.add(filename)
ftexture.close()
# close info fs
finfo.close()
# ============================================ save zip and clean up folder
if os.path.isfile(filepath):