fix loading and bm import/export error
This commit is contained in:
parent
e264c85a04
commit
c40f956771
@ -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])
|
||||||
|
Loading…
Reference in New Issue
Block a user