fix loading and bm import/export error
This commit is contained in:
		| @ -19,8 +19,8 @@ class BALLANCE_OT_export_bm(bpy.types.Operator, bpy_extras.io_utils.ExportHelper | |||||||
|         ) |         ) | ||||||
|  |  | ||||||
|     def execute(self, context): |     def execute(self, context): | ||||||
|         if (self.export_mode == 'COLLECTION' and context.scene.BallanceBlenderPluginProperty.collection_picker is None) or  |         if ((self.export_mode == 'COLLECTION' and context.scene.BallanceBlenderPluginProperty.collection_picker is None) or  | ||||||
|             (self.export_mode == 'OBJECT' and context.scene.BallanceBlenderPluginProperty.object_picker is None): |             (self.export_mode == 'OBJECT' and context.scene.BallanceBlenderPluginProperty.object_picker is None)): | ||||||
|             UTILS_functions.show_message_box(("No specific target", ), "Lost parameter", 'ERROR') |             UTILS_functions.show_message_box(("No specific target", ), "Lost parameter", 'ERROR') | ||||||
|         else: |         else: | ||||||
|             prefs = bpy.context.preferences.addons[__package__].preferences |             prefs = bpy.context.preferences.addons[__package__].preferences | ||||||
| @ -47,7 +47,7 @@ class BALLANCE_OT_export_bm(bpy.types.Operator, bpy_extras.io_utils.ExportHelper | |||||||
| def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTarget): | def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTarget): | ||||||
|     # ============================================ alloc a temp folder |     # ============================================ alloc a temp folder | ||||||
|     utils_tempFolderObj = tempfile.TemporaryDirectory() |     utils_tempFolderObj = tempfile.TemporaryDirectory() | ||||||
|     utils_tempFolder = tempFolderObj.name |     utils_tempFolder = utils_tempFolderObj.name | ||||||
|     utils_tempTextureFolder = os.path.join(utils_tempFolder, "Texture") |     utils_tempTextureFolder = os.path.join(utils_tempFolder, "Texture") | ||||||
|     os.makedirs(utils_tempTextureFolder) |     os.makedirs(utils_tempTextureFolder) | ||||||
|      |      | ||||||
| @ -69,7 +69,7 @@ def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTar | |||||||
|     |     | ||||||
|     # ============================================ export |     # ============================================ export | ||||||
|     with open(os.path.join(utils_tempFolder, "index.bm"), "wb") as finfo: |     with open(os.path.join(utils_tempFolder, "index.bm"), "wb") as finfo: | ||||||
|         UTILS_file_io.write_uint32(finfo, bm_current_version) |         UTILS_file_io.write_uint32(finfo, UTILS_constants.bmfile_currentVersion) | ||||||
|          |          | ||||||
|         # ====================== export object |         # ====================== export object | ||||||
|         meshSet = set() |         meshSet = set() | ||||||
| @ -92,7 +92,7 @@ def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTar | |||||||
|                     object_isComponent = False |                     object_isComponent = False | ||||||
|                 else: |                 else: | ||||||
|                     # check isComponent normally |                     # check isComponent normally | ||||||
|                     object_isComponent = is_component(obj.name) |                     object_isComponent = UTILS_functions.is_component(obj.name) | ||||||
|  |  | ||||||
|                 # triangle first and then group |                 # triangle first and then group | ||||||
|                 if not object_isComponent: |                 if not object_isComponent: | ||||||
| @ -105,7 +105,7 @@ def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTar | |||||||
|                     else: |                     else: | ||||||
|                         object_meshIndex = meshList.index(object_blenderMesh) |                         object_meshIndex = meshList.index(object_blenderMesh) | ||||||
|                 else: |                 else: | ||||||
|                     object_meshIndex = get_component_id(obj.name) |                     object_meshIndex = UTILS_functions.get_component_id(obj.name) | ||||||
|  |  | ||||||
|                 # get visibility |                 # get visibility | ||||||
|                 object_isHidden = not obj.visible_get() |                 object_isHidden = not obj.visible_get() | ||||||
| @ -124,7 +124,7 @@ def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTar | |||||||
|                 # write fobject |                 # write fobject | ||||||
|                 UTILS_file_io.write_bool(fobject, object_isComponent) |                 UTILS_file_io.write_bool(fobject, object_isComponent) | ||||||
|                 UTILS_file_io.write_bool(fobject, object_isHidden) |                 UTILS_file_io.write_bool(fobject, object_isHidden) | ||||||
|                 UTILS_file_io.write_worldMatrix(fobject, obj.matrix_world) |                 UTILS_file_io.write_world_matrix(fobject, obj.matrix_world) | ||||||
|                 UTILS_file_io.write_uint32(fobject, len(object_groupList)) |                 UTILS_file_io.write_uint32(fobject, len(object_groupList)) | ||||||
|                 for item in object_groupList: |                 for item in object_groupList: | ||||||
|                     UTILS_file_io.write_string(fobject, item) |                     UTILS_file_io.write_string(fobject, item) | ||||||
| @ -337,7 +337,7 @@ def export_bm(context, bmx_filepath, prefs_fncg, opts_exportMode, opts_exportTar | |||||||
| # blender related functions | # blender related functions | ||||||
|  |  | ||||||
| def _is_external_texture(name): | def _is_external_texture(name): | ||||||
|     if name in config.external_texture_list: |     if name in UTILS_constants.bmfile_externalTextureSet: | ||||||
|         return True |         return True | ||||||
|     else: |     else: | ||||||
|         return False |         return False | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import bpy,bmesh,bpy_extras,mathutils | import bpy,bmesh,bpy_extras,mathutils | ||||||
| import pathlib,zipfile,time,os,tempfile,math | import pathlib,zipfile,time,os,tempfile,math | ||||||
| import struct,shutil | import struct, shutil | ||||||
| from bpy_extras import io_utils,node_shader_utils | from bpy_extras import io_utils,node_shader_utils | ||||||
| from bpy_extras.io_utils import unpack_list | from bpy_extras.io_utils import unpack_list | ||||||
| from bpy_extras.image_utils import load_image | from bpy_extras.image_utils import load_image | ||||||
| @ -88,7 +88,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|             return |             return | ||||||
|  |  | ||||||
|         # collect block header data |         # collect block header data | ||||||
|         while len(peek_stream(findex)) != 0: |         while len(UTILS_file_io.peek_stream(findex)) != 0: | ||||||
|             # read |             # read | ||||||
|             index_name = UTILS_file_io.read_string(findex) |             index_name = UTILS_file_io.read_string(findex) | ||||||
|             index_type = UTILS_file_io.read_uint8(findex) |             index_type = UTILS_file_io.read_uint8(findex) | ||||||
| @ -120,7 +120,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|             if texture_isExternal: |             if texture_isExternal: | ||||||
|                 (texture_target, skip_init) = UTILS_functions.create_instance_with_option( |                 (texture_target, skip_init) = UTILS_functions.create_instance_with_option( | ||||||
|                     UTILS_constants.BmfileInfoType.TEXTURE, item.name, opts_texture, |                     UTILS_constants.BmfileInfoType.TEXTURE, item.name, opts_texture, | ||||||
|                     extra_texture_path= texture_filename, extra_texture_path= prefs_externalTexture) |                     extra_texture_filename= texture_filename, extra_texture_path= prefs_externalTexture) | ||||||
|             else: |             else: | ||||||
|                 # not external. copy temp file into blender temp. then use it. |                 # not external. copy temp file into blender temp. then use it. | ||||||
|                 # try copy. if fail, don't need to do more |                 # try copy. if fail, don't need to do more | ||||||
| @ -132,7 +132,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|  |  | ||||||
|                 (texture_target, skip_init) = UTILS_functions.create_instance_with_option( |                 (texture_target, skip_init) = UTILS_functions.create_instance_with_option( | ||||||
|                     UTILS_constants.BmfileInfoType.TEXTURE, item.name, opts_texture, |                     UTILS_constants.BmfileInfoType.TEXTURE, item.name, opts_texture, | ||||||
|                     extra_texture_path= texture_filename, extra_texture_path= prefs_tempTextureFolder) |                     extra_texture_filename= texture_filename, extra_texture_path= prefs_tempTextureFolder) | ||||||
|              |              | ||||||
|             # setup name and blender data for header |             # setup name and blender data for header | ||||||
|             item.blender_data = texture_target |             item.blender_data = texture_target | ||||||
| @ -154,7 +154,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|             material_texture = UTILS_file_io.read_uint32(fmaterial) |             material_texture = UTILS_file_io.read_uint32(fmaterial) | ||||||
|  |  | ||||||
|             # alloc basic material |             # alloc basic material | ||||||
|             (material_target, skip_init) = create_instance_with_option( |             (material_target, skip_init) = UTILS_functions.create_instance_with_option( | ||||||
|                 UTILS_constants.BmfileInfoType.MATERIAL, item.name, opts_material) |                 UTILS_constants.BmfileInfoType.MATERIAL, item.name, opts_material) | ||||||
|             item.blender_data = material_target |             item.blender_data = material_target | ||||||
|             if skip_init: |             if skip_init: | ||||||
| @ -178,7 +178,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|             fmesh.seek(item.offset, os.SEEK_SET) |             fmesh.seek(item.offset, os.SEEK_SET) | ||||||
|  |  | ||||||
|             # create real mesh |             # create real mesh | ||||||
|             (mesh_target, skip_init) = create_instance_with_option( |             (mesh_target, skip_init) = UTILS_functions.create_instance_with_option( | ||||||
|                 UTILS_constants.BmfileInfoType.MESH, item.name, opts_mesh) |                 UTILS_constants.BmfileInfoType.MESH, item.name, opts_mesh) | ||||||
|             item.blender_data = mesh_target |             item.blender_data = mesh_target | ||||||
|             if skip_init: |             if skip_init: | ||||||
| @ -215,7 +215,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|                 if mesh_useMaterial: |                 if mesh_useMaterial: | ||||||
|                     mesh_neededMaterial = materialList[mesh_materialIndex].blender_data |                     mesh_neededMaterial = materialList[mesh_materialIndex].blender_data | ||||||
|                     if mesh_neededMaterial in mesh_materialSolt: |                     if mesh_neededMaterial in mesh_materialSolt: | ||||||
|                         mesh_blenderMtlIndex = materialSolt.index(mesh_neededMaterial) |                         mesh_blenderMtlIndex = mesh_materialSolt.index(mesh_neededMaterial) | ||||||
|                     else: |                     else: | ||||||
|                         mesh_blenderMtlIndex = len(mesh_materialSolt) |                         mesh_blenderMtlIndex = len(mesh_materialSolt) | ||||||
|                         mesh_materialSolt.append(mesh_neededMaterial) |                         mesh_materialSolt.append(mesh_neededMaterial) | ||||||
| @ -235,22 +235,22 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|                 mesh_target.materials.append(mat) |                 mesh_target.materials.append(mat) | ||||||
|  |  | ||||||
|             # then, we need add correspond count for vertices |             # then, we need add correspond count for vertices | ||||||
|             mesh_target.vertices.add(len(vList)) |             mesh_target.vertices.add(len(mesh_vList)) | ||||||
|             mesh_target.loops.add(len(faceList)*3)  # triangle face confirm |             mesh_target.loops.add(len(mesh_faceList)*3)  # triangle face confirm | ||||||
|             mesh_target.polygons.add(len(faceList)) |             mesh_target.polygons.add(len(mesh_faceList)) | ||||||
|             mesh_target.uv_layers.new(do_init=False) |             mesh_target.uv_layers.new(do_init=False) | ||||||
|             mesh_target.create_normals_split() |             mesh_target.create_normals_split() | ||||||
|  |  | ||||||
|             # add vertices data |             # add vertices data | ||||||
|             mesh_target.vertices.foreach_set("co", unpack_list(vList)) |             mesh_target.vertices.foreach_set("co", unpack_list(mesh_vList)) | ||||||
|             mesh_target.loops.foreach_set("vertex_index", unpack_list(_flat_vertices_index(mesh_faceList))) |             mesh_target.loops.foreach_set("vertex_index", unpack_list(_flat_vertices_index(mesh_faceList))) | ||||||
|             mesh_target.loops.foreach_set("normal", unpack_list(_flat_vertices_normal(mesh_faceList, mesh_vnList))) |             mesh_target.loops.foreach_set("normal", unpack_list(_flat_vertices_normal(mesh_faceList, mesh_vnList))) | ||||||
|             mesh_target.uv_layers[0].data.foreach_set("uv", unpack_list(_flat_vertices_uv(mesh_faceList, mesh_vtList))) |             mesh_target.uv_layers[0].data.foreach_set("uv", unpack_list(_flat_vertices_uv(mesh_faceList, mesh_vtList))) | ||||||
|             for i in range(len(faceList)): |             for i in range(len(mesh_faceList)): | ||||||
|                 mesh_target.polygons[i].loop_start = i * 3 |                 mesh_target.polygons[i].loop_start = i * 3 | ||||||
|                 mesh_target.polygons[i].loop_total = 3 |                 mesh_target.polygons[i].loop_total = 3 | ||||||
|                 if faceList[i][9] != -1: |                 if mesh_faceList[i][9] != -1: | ||||||
|                     mesh_target.polygons[i].material_index = faceList[i][9] |                     mesh_target.polygons[i].material_index = mesh_faceList[i][9] | ||||||
|  |  | ||||||
|                 mesh_target.polygons[i].use_smooth = True |                 mesh_target.polygons[i].use_smooth = True | ||||||
|              |              | ||||||
| @ -285,7 +285,7 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|             object_isComponent = UTILS_file_io.read_bool(fobject) |             object_isComponent = UTILS_file_io.read_bool(fobject) | ||||||
|             #object_isForcedNoComponent = UTILS_file_io.read_bool(fobject) |             #object_isForcedNoComponent = UTILS_file_io.read_bool(fobject) | ||||||
|             object_isHidden = UTILS_file_io.read_bool(fobject) |             object_isHidden = UTILS_file_io.read_bool(fobject) | ||||||
|             object_worldMatrix = UTILS_file_io.read_worldMaterix(fobject) |             object_worldMatrix = UTILS_file_io.read_world_materix(fobject) | ||||||
|             object_groupListCount = UTILS_file_io.read_uint32(fobject) |             object_groupListCount = UTILS_file_io.read_uint32(fobject) | ||||||
|             object_groupList.clear() |             object_groupList.clear() | ||||||
|             for i in range(object_groupListCount): |             for i in range(object_groupListCount): | ||||||
| @ -299,15 +299,15 @@ def import_bm(context, bmx_filepath, prefs_fncg, prefs_externalTexture, prefs_te | |||||||
|                 object_neededMesh = meshList[object_meshIndex].blender_data |                 object_neededMesh = meshList[object_meshIndex].blender_data | ||||||
|  |  | ||||||
|             # create real object |             # create real object | ||||||
|             (object_target, skip_init) = create_instance_with_option( |             (object_target, skip_init) = UTILS_functions.create_instance_with_option( | ||||||
|                 UTILS_constants.BmfileInfoType.OBJECT, item.name, opts_object,  |                 UTILS_constants.BmfileInfoType.OBJECT, item.name, opts_object,  | ||||||
|                 extraMesh=object_neededMesh) |                 extra_mesh=object_neededMesh) | ||||||
|             if skip_init: |             if skip_init: | ||||||
|                 continue |                 continue | ||||||
|  |  | ||||||
|             # link to correct collection |             # link to correct collection | ||||||
|             if (object_fncgCollection is not None) and (not object_isComponent) and UTILS_functions.is_component(item.name): |             if (object_fncgCollection is not None) and (not object_isComponent) and UTILS_functions.is_component(item.name): | ||||||
|                 # a object should be grouped into fncg should fufill following requirements |                 # a object should be grouped into fncg should check following requirements | ||||||
|                 # fncg is not null |                 # fncg is not null | ||||||
|                 # this object is a normal object |                 # this object is a normal object | ||||||
|                 # but its name match component format |                 # but its name match component format | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ class BALLANCE_OT_add_components(bpy.types.Operator): | |||||||
|     elements_type: bpy.props.EnumProperty( |     elements_type: bpy.props.EnumProperty( | ||||||
|         name="Type", |         name="Type", | ||||||
|         description="This element type", |         description="This element type", | ||||||
|         items=tuple(map(lambda x: (x, x, ""), UTILS_constants.componentList)), |         items=tuple(map(lambda x: (x, x, ""), UTILS_constants.bmfile_componentList)), | ||||||
|     ) |     ) | ||||||
|  |  | ||||||
|     attentionElements = ["PC_TwoFlames", "PR_Resetpoint"] |     attentionElements = ["PC_TwoFlames", "PR_Resetpoint"] | ||||||
| @ -37,7 +37,7 @@ class BALLANCE_OT_add_components(bpy.types.Operator): | |||||||
|  |  | ||||||
|         # create object |         # create object | ||||||
|         loadedMesh = UTILS_functions.load_component( |         loadedMesh = UTILS_functions.load_component( | ||||||
|             UTILS_constants.componentList.index(self.elements_type)) |             UTILS_constants.bmfile_componentList.index(self.elements_type)) | ||||||
|         obj = bpy.data.objects.new(finalObjectName, loadedMesh) |         obj = bpy.data.objects.new(finalObjectName, loadedMesh) | ||||||
|         UTILS_functions.add_into_scene_and_move_to_cursor(obj) |         UTILS_functions.add_into_scene_and_move_to_cursor(obj) | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import bpy,bmesh,bpy_extras,mathutils | import bpy, bmesh, bpy_extras, mathutils | ||||||
| import struct,shutil | import struct, shutil, os | ||||||
|  |  | ||||||
| # writer | # writer | ||||||
|  |  | ||||||
| @ -26,7 +26,7 @@ def write_bool(fs,boolean): | |||||||
| def write_float(fs,fl): | def write_float(fs,fl): | ||||||
|     fs.write(struct.pack("f", fl)) |     fs.write(struct.pack("f", fl)) | ||||||
|  |  | ||||||
| def write_worldMatrix(fs, matt): | def write_world_matrix(fs, matt): | ||||||
|     mat = matt.transposed() |     mat = matt.transposed() | ||||||
|     fs.write(struct.pack("ffffffffffffffff", |     fs.write(struct.pack("ffffffffffffffff", | ||||||
|     mat[0][0],mat[0][2], mat[0][1], mat[0][3], |     mat[0][0],mat[0][2], mat[0][1], mat[0][3], | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| import bpy, bmesh, bpy_extras, mathutils | import bpy, bmesh, bpy_extras, mathutils | ||||||
| import struct, shutil | import struct, shutil, os | ||||||
| from bpy_extras.io_utils import unpack_list | from bpy_extras.io_utils import unpack_list | ||||||
|  | from bpy_extras.image_utils import load_image | ||||||
| from bpy_extras import io_utils, node_shader_utils | from bpy_extras import io_utils, node_shader_utils | ||||||
| from . import UTILS_file_io, UTILS_constants | from . import UTILS_file_io, UTILS_constants | ||||||
|  |  | ||||||
| @ -177,20 +178,21 @@ def create_instance_with_option(instance_type, instance_name, instance_opt, | |||||||
|  |  | ||||||
|             temp_is_existed = True |             temp_is_existed = True | ||||||
|         except: |         except: | ||||||
|  |             temp_instance = None | ||||||
|             temp_is_existed = False |             temp_is_existed = False | ||||||
|  |  | ||||||
|         return (temp_instance, temp_is_existed) |         return (temp_instance, temp_is_existed) | ||||||
|  |  | ||||||
|     def create_instance(): |     def create_instance(): | ||||||
|         if instType == UTILS_constants.BmfileInfoType.OBJECT: |         if instance_type == UTILS_constants.BmfileInfoType.OBJECT: | ||||||
|             instance_obj = bpy.data.objects.new(instance_name, extra_mesh) |             instance_obj = bpy.data.objects.new(instance_name, extra_mesh) | ||||||
|             instance_obj.name = instance_name |             #instance_obj.name = instance_name | ||||||
|         elif instType == UTILS_constants.BmfileInfoType.MESH: |         elif instance_type == UTILS_constants.BmfileInfoType.MESH: | ||||||
|             instance_obj = bpy.data.meshes.new(instance_name) |             instance_obj = bpy.data.meshes.new(instance_name) | ||||||
|             instance_obj.name = instance_name |             #instance_obj.name = instance_name | ||||||
|         elif instType == UTILS_constants.BmfileInfoType.MATERIAL: |         elif instance_type == UTILS_constants.BmfileInfoType.MATERIAL: | ||||||
|             instance_obj = bpy.data.materials.new(instance_name) |             instance_obj = bpy.data.materials.new(instance_name) | ||||||
|             instance_obj.name = instance_name |             #instance_obj.name = instance_name | ||||||
|         elif instance_type == UTILS_constants.BmfileInfoType.TEXTURE: |         elif instance_type == UTILS_constants.BmfileInfoType.TEXTURE: | ||||||
|             # this command will also check current available texture |             # this command will also check current available texture | ||||||
|             # because `get_instance()` only check texture name |             # because `get_instance()` only check texture name | ||||||
| @ -206,7 +208,7 @@ def create_instance_with_option(instance_type, instance_name, instance_opt, | |||||||
|         # create new instance |         # create new instance | ||||||
|         # or always create new instance if opts is not string |         # or always create new instance if opts is not string | ||||||
|         temp_instance = create_instance() |         temp_instance = create_instance() | ||||||
|         temp_skip_init = True |         temp_skip_init = False | ||||||
|     elif instance_opt == 'CURRENT': |     elif instance_opt == 'CURRENT': | ||||||
|         # try get instance |         # try get instance | ||||||
|         (temp_instance, temp_is_existed) = get_instance() |         (temp_instance, temp_is_existed) = get_instance() | ||||||
|  | |||||||
| @ -82,7 +82,7 @@ class BALLANCE_MT_AddFloorMenu(bpy.types.Menu): | |||||||
|         layout = self.layout |         layout = self.layout | ||||||
|  |  | ||||||
|         layout.label(text="Basic floor") |         layout.label(text="Basic floor") | ||||||
|         for item in UTILS_constants.floor_basicBlock_list: |         for item in UTILS_constants.floor_basicBlockList: | ||||||
|             cop = layout.operator( |             cop = layout.operator( | ||||||
|                 OBJS_add_floors.BALLANCE_OT_add_floors.bl_idname,  |                 OBJS_add_floors.BALLANCE_OT_add_floors.bl_idname,  | ||||||
|                 text=item, icon_value = UTILS_constants.icons_floorDict[item]) |                 text=item, icon_value = UTILS_constants.icons_floorDict[item]) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user