io_coat3D: Big update: Better REFERENCE MESH and VOXEL MESH support.

This commit is contained in:
Kalle-Samuli Riihikoski 2019-09-21 13:07:15 +03:00
parent d3811cba7b
commit 0d585a73ef
2 changed files with 424 additions and 344 deletions

View File

@ -208,7 +208,6 @@ def make_texture_list(texturefolder):
'''
def updatemesh(objekti, proxy, texturelist):
# Vertex colors
if(len(proxy.data.vertex_colors) > 0):
bring_vertex_map = True
@ -241,8 +240,9 @@ def updatemesh(objekti, proxy, texturelist):
# UV -Sets
udim_textures = False
if(texturelist[0][0].startswith('100')):
udim_textures =True
if(texturelist != []):
if(texturelist[0][0].startswith('100')):
udim_textures =True
proxy.select_set(True)
objekti.select_set(True)
@ -265,9 +265,11 @@ def updatemesh(objekti, proxy, texturelist):
index = index + 1
# Mesh Copy
for ind, v in enumerate(objekti.data.vertices):
v.co = proxy.data.vertices[ind].co
if(proxy.name.startswith('RetopoGroup')):
objekti.data = proxy.data
else:
for ind, v in enumerate(objekti.data.vertices):
v.co = proxy.data.vertices[ind].co
class SCENE_OT_folder(bpy.types.Operator):
bl_idname = "update_exchange_folder.pilgway_3d_coat"
@ -277,9 +279,9 @@ class SCENE_OT_folder(bpy.types.Operator):
def invoke(self, context, event):
coat3D = bpy.context.scene.coat3D
if(os.path.isdir(coat3D.exchangedir)):
coat3D.exchange_found = True
bpy.coat3D['status'] = 1
else:
coat3D.exchange_found = False
@ -577,39 +579,13 @@ class SCENE_OT_export(bpy.types.Operator):
matindex = 0
for objekti in bpy.context.selected_objects:
objekti.name = '__' + objekti.name
if(objekti.material_slots.keys() == []):
newmat = bpy.data.materials.new('Material')
newmat.use_nodes = True
objekti.data.materials.append(newmat)
matindex += 1
new_name = objekti.data.name
name_boxs = new_name.split('.')
if(len(name_boxs)>1):
objekti.name = name_boxs[0] + name_boxs[1]
nimiNum = int(name_boxs[1])
looking = False
lyytyi = False
while(looking == False):
for all_ob in bpy.data.meshes:
numero = ("%.3d"%(nimiNum))
nimi2 = name_boxs[0] + numero
if(all_ob.name == nimi2):
lyytyi = True
break
else:
lyytyi = False
if(lyytyi == True):
nimiNum += 1
else:
looking = True
objekti.data.name = nimi2
objekti.name = nimi2
else:
objekti.name = name_boxs[0]
objekti.data.name = name_boxs[0]
objekti.coat3D.applink_name = objekti.data.name
objekti.coat3D.applink_name = objekti.name
mod_mat_list = {}
@ -624,6 +600,7 @@ class SCENE_OT_export(bpy.types.Operator):
for objekti in bpy.context.selected_objects:
mod_mat_list[objekti.name] = []
objekti.coat3D.applink_scale = objekti.scale
objekti.coat3D.retopo = False
''' Checks what materials are linked into UV '''
@ -750,7 +727,7 @@ class SCENE_OT_export(bpy.types.Operator):
file.close()
for idx, objekti in enumerate(bpy.context.selected_objects):
objekti.name = objekti.name[2:]
if(len(bpy.context.selected_objects) == 1):
objekti.coat3D.applink_onlyone = True
objekti.coat3D.type = coat3D.type
@ -856,7 +833,10 @@ class SCENE_OT_import(bpy.types.Operator):
Blender_export += ('%sexport.txt'%(os.sep))
new_applink_address = 'False'
new_object = False
new_ref_object = False
exportfile3 = coat3D.exchangedir
exportfile3 += ('%sexport.txt' % (os.sep))
if(os.path.isfile(Blender_export)):
obj_pathh = open(Blender_export)
new_object = True
@ -870,263 +850,31 @@ class SCENE_OT_import(bpy.types.Operator):
if(scene_objects.coat3D.applink_address == new_applink_address):
new_object = False
elif(os.path.isfile(exportfile3)):
obj_pathh = open(exportfile3)
for line in obj_pathh:
new_applink_address = line
break
obj_pathh.close()
for scene_objects in bpy.context.collection.all_objects:
if(scene_objects.type == 'MESH'):
if(scene_objects.coat3D.applink_address == new_applink_address and scene_objects.coat3D.type == 'ref'):
scene_objects.coat3D.type == ''
new_ref_object = True
nimi = scene_objects.name
exportfile = coat3D.exchangedir
exportfile += ('%sBlender' % (os.sep))
exportfile += ('%sexport.txt' % (os.sep))
if (os.path.isfile(exportfile)):
os.remove(exportfile)
if(new_object == False):
'''
#Blender -> 3DC -> Blender workflow
#First check if objects needs to be imported, if imported it will then delete extra mat and objs.
'''
old_materials = bpy.data.materials.keys()
old_objects = bpy.data.objects.keys()
cache_base = bpy.data.objects.keys()
object_list = []
import_list = []
import_type = []
for objekti in bpy.data.objects:
if objekti.type == 'MESH':
obj_coat = objekti.coat3D
if(obj_coat.applink_mesh == True):
object_list.append(objekti.name)
if(os.path.isfile(obj_coat.applink_address)):
if (obj_coat.objecttime != str(os.path.getmtime(obj_coat.applink_address))):
obj_coat.dime = objekti.dimensions
obj_coat.import_mesh = True
obj_coat.objecttime = str(os.path.getmtime(obj_coat.applink_address))
if(obj_coat.applink_address not in import_list):
import_list.append(obj_coat.applink_address)
import_type.append(coat3D.type)
if(import_list or coat3D.importmesh):
for idx, list in enumerate(import_list):
bpy.ops.import_scene.fbx(filepath=list, global_scale = 0.01,axis_forward='X',use_custom_normals=False)
cache_objects = bpy.data.objects.keys()
cache_objects = [i for i in cache_objects if i not in cache_base]
for cache_object in cache_objects:
bpy.data.objects[cache_object].coat3D.type = import_type[idx]
bpy.data.objects[cache_object].coat3D.applink_address = list
cache_base.append(cache_object)
bpy.ops.object.select_all(action='DESELECT')
new_materials = bpy.data.materials.keys()
new_objects = bpy.data.objects.keys()
diff_mat = [i for i in new_materials if i not in old_materials]
diff_objects = [i for i in new_objects if i not in old_objects]
for mark_mesh in diff_objects:
bpy.data.objects[mark_mesh].data.coat3D.name = '3DC'
for c_index in diff_mat:
bpy.data.materials.remove(bpy.data.materials[c_index])
'''The main Applink Object Loop'''
for oname in object_list:
objekti = bpy.data.objects[oname]
if(objekti.coat3D.applink_mesh == True):
path3b_n = coat3D.exchangedir
path3b_n += ('%slast_saved_3b_file.txt' % (os.sep))
if(objekti.coat3D.import_mesh and coat3D.importmesh == True):
objekti.coat3D.import_mesh = False
objekti.select_set(True)
use_smooth = objekti.data.polygons[0].use_smooth
found_obj = False
'''Changes objects mesh into proxy mesh'''
print('ONAME:',oname)
if(objekti.coat3D.type):
for proxy_objects in diff_objects:
if (proxy_objects.startswith(objekti.coat3D.applink_name + '.')):
obj_proxy = bpy.data.objects[proxy_objects]
obj_proxy.coat3D.delete_proxy_mesh = True
found_obj = True
mat_list = []
if (objekti.material_slots):
for obj_mat in objekti.material_slots:
mat_list.append(obj_mat.material)
if(found_obj == True):
exportfile = coat3D.exchangedir
path3b_n = coat3D.exchangedir
path3b_n += ('%slast_saved_3b_file.txt' % (os.sep))
exportfile += ('%sBlender' % (os.sep))
exportfile += ('%sexport.txt'%(os.sep))
if(os.path.isfile(exportfile)):
export_file = open(exportfile)
for line in export_file:
if line.rfind('.3b'):
coat['active_coat'] = line
export_file.close()
os.remove(exportfile)
if(os.path.isfile(path3b_n)):
mesh_time = os.path.getmtime(objekti.coat3D.applink_address)
b_time = os.path.getmtime(path3b_n)
if (abs(mesh_time - b_time) < 240):
export_file = open(path3b_n)
for line in export_file:
objekti.coat3D.applink_3b_path = line
head, tail = os.path.split(line)
just_3b_name = tail
objekti.coat3D.applink_3b_just_name = just_3b_name
export_file.close()
coat3D.remove_path = True
bpy.ops.object.select_all(action='DESELECT')
obj_proxy.select_set(True)
bpy.ops.object.select_all(action='TOGGLE')
if objekti.coat3D.applink_firsttime == True and objekti.coat3D.type == 'vox':
objekti.select_set(True)
objekti.rotation_euler[0] = 1.5708
objekti.rotation_euler[2] = 1.5708
bpy.ops.object.transforms_to_deltas(mode='ROT')
bpy.ops.object.transforms_to_deltas(mode='SCALE')
objekti.coat3D.applink_firsttime = False
objekti.select_set(False)
elif objekti.coat3D.applink_firsttime == True:
objekti.scale = (objekti.scale[0]/objekti.coat3D.applink_scale[0],objekti.scale[1]/objekti.coat3D.applink_scale[1],objekti.scale[2]/objekti.coat3D.applink_scale[2])
#bpy.ops.object.transforms_to_deltas(mode='SCALE')
if(objekti.coat3D.applink_onlyone == False):
objekti.rotation_euler = (0,0,0)
objekti.coat3D.applink_firsttime = False
if(coat3D.importlevel):
obj_proxy.select = True
obj_proxy.modifiers.new(name='temp',type='MULTIRES')
objekti.select = True
bpy.ops.object.multires_reshape(modifier=multires_name)
bpy.ops.object.select_all(action='TOGGLE')
else:
bpy.context.view_layer.objects.active = obj_proxy
keep_materials_count = len(obj_proxy.material_slots) - len(objekti.material_slots)
#delete_materials_from_end(keep_materials_count, obj_proxy)
for index, material in enumerate(objekti.material_slots):
obj_proxy.material_slots[index-1].material = material.material
updatemesh(objekti,obj_proxy, texturelist)
bpy.context.view_layer.objects.active = objekti
#tärkee että saadaan oikein käännettyä objekt
objekti.select_set(True)
if (use_smooth):
for data_mesh in objekti.data.polygons:
data_mesh.use_smooth = True
else:
for data_mesh in objekti.data.polygons:
data_mesh.use_smooth = False
bpy.ops.object.select_all(action='DESELECT')
if(coat3D.importmesh and not(os.path.isfile(objekti.coat3D.applink_address))):
coat3D.importmesh = False
objekti.select_set(True)
if(coat3D.importtextures):
is_new = False
tex.matlab(objekti,mat_list,texturelist,is_new)
objekti.select_set(False)
else:
mat_list = []
if (objekti.material_slots):
for obj_mat in objekti.material_slots:
mat_list.append(obj_mat.material)
if (coat3D.importtextures):
is_new = False
tex.matlab(objekti,mat_list,texturelist, is_new)
objekti.select_set(False)
if(coat3D.remove_path == True):
os.remove(path3b_n)
coat3D.remove_path = False
bpy.ops.object.select_all(action='DESELECT')
if(import_list):
for del_obj in diff_objects:
if(bpy.context.collection.all_objects[del_obj].coat3D.type == 'vox' and bpy.context.collection.all_objects[del_obj].coat3D.delete_proxy_mesh == False):
bpy.context.collection.all_objects[del_obj].select_set(True)
objekti = bpy.context.collection.all_objects[del_obj]
objekti.rotation_euler[2] = 1.5708
bpy.ops.object.transforms_to_deltas(mode='ROT')
objekti.scale = (0.02, 0.02, 0.02)
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
objekti.data.coat3D.name = '3DC'
objekti.coat3D.objecttime = str(os.path.getmtime(objekti.coat3D.applink_address))
objekti.coat3D.applink_name = objekti.name
objekti.coat3D.applink_mesh = True
objekti.coat3D.import_mesh = False
bpy.ops.object.transforms_to_deltas(mode='SCALE')
objekti.coat3D.applink_firsttime = False
bpy.context.collection.all_objects[del_obj].select_set(False)
else:
bpy.context.collection.all_objects[del_obj].select_set(True)
bpy.data.objects.remove(bpy.data.objects[del_obj])
if (coat3D.bring_retopo or coat3D.bring_retopo_path):
if(os.path.isfile(coat3D.bring_retopo_path)):
bpy.ops.import_scene.fbx(filepath=coat3D.bring_retopo_path, global_scale=1, axis_forward='X', use_custom_normals=False)
os.remove(coat3D.bring_retopo_path)
kokeilu = coat3D.exchangedir[:-9]
Blender_folder2 = ("%s%sExchange" % (kokeilu, os.sep))
Blender_folder2 += ('%sexport.txt' % (os.sep))
if (os.path.isfile(Blender_folder2)):
os.remove(Blender_folder2)
else:
'''
3DC -> Blender workflow
'''
bpy.ops.object.select_all(action='DESELECT')
for old_obj in bpy.context.collection.objects:
old_obj.coat3D.applink_old = True
coat3D = bpy.context.scene.coat3D
Blender_folder = ("%s%sBlender"%(coat3D.exchangedir,os.sep))
Blender_export = Blender_folder
path3b_now = coat3D.exchangedir + os.sep
path3b_now += ('last_saved_3b_file.txt')
Blender_export += ('%sexport.txt'%(os.sep))
mat_list = []
osoite_3b = ''
if (os.path.isfile(path3b_now)):
path3b_fil = open(path3b_now)
for lin in path3b_fil:
osoite_3b = lin
path3b_fil.close()
head, tail = os.path.split(osoite_3b)
just_3b_name = tail
os.remove(path3b_now)
if(new_ref_object):
create_collection = True
for collection in bpy.data.collections:
@ -1148,81 +896,407 @@ class SCENE_OT_import(bpy.types.Operator):
bpy.context.view_layer.active_layer_collection = bpy.context.view_layer.layer_collection.children['Applink_Objects']
old_materials = bpy.data.materials.keys()
old_objects = bpy.data.objects.keys()
object_list = []
bpy.ops.import_scene.fbx(filepath=new_applink_address, global_scale = 1, axis_forward='-Z', axis_up='Y')
new_materials = bpy.data.materials.keys()
bpy.ops.import_scene.fbx(filepath=new_applink_address, global_scale = 0.01,axis_forward='X', axis_up='Y',use_custom_normals=False)
new_objects = bpy.data.objects.keys()
diff_mat = [i for i in new_materials if i not in old_materials]
diff_objects = [i for i in new_objects if i not in old_objects]
texturelist = []
for diff_object in diff_objects:
refmesh = bpy.data.objects[nimi]
copymesh = bpy.data.objects[nimi].copy()
copymesh.data = bpy.data.objects[diff_object].data
copymesh.coat3D.applink_name = bpy.data.objects[diff_object].data.name
copymesh.coat3D.applink_address = refmesh.coat3D.applink_address
ne_name = bpy.data.objects[diff_object].data.name
copymesh.coat3D.type = 'ppp'
copymesh.coat3D.retopo = True
bpy.data.collections['Applink_Objects'].objects.link(copymesh)
bpy.data.objects.remove(bpy.data.objects[diff_object])
bpy.ops.object.select_all(action='DESELECT')
copymesh.select_set(True)
copymesh.delta_rotation_euler[0] = 1.5708
copymesh.name = ne_name
normal_node = copymesh.material_slots[0].material.node_tree.nodes['Normal Map']
copymesh.material_slots[0].material.node_tree.nodes.remove(normal_node)
copymesh.material_slots[0].material.node_tree.nodes['Principled BSDF'].inputs['Metallic'].default_value = 0
copymesh.material_slots[0].material.node_tree.nodes['Principled BSDF'].inputs['Specular'].default_value = 0.5
refmesh.coat3D.applink_name = ''
refmesh.coat3D.applink_address = ''
refmesh.coat3D.type = ''
else:
if(new_object == False):
'''
#Blender -> 3DC -> Blender workflow
#First check if objects needs to be imported, if imported it will then delete extra mat and objs.
'''
old_materials = bpy.data.materials.keys()
old_objects = bpy.data.objects.keys()
cache_base = bpy.data.objects.keys()
object_list = []
import_list = []
import_type = []
for objekti in bpy.data.objects:
if objekti.type == 'MESH':
obj_coat = objekti.coat3D
if(obj_coat.applink_mesh == True):
object_list.append(objekti.name)
if(os.path.isfile(obj_coat.applink_address)):
if (obj_coat.objecttime != str(os.path.getmtime(obj_coat.applink_address))):
obj_coat.dime = objekti.dimensions
obj_coat.import_mesh = True
obj_coat.objecttime = str(os.path.getmtime(obj_coat.applink_address))
if(obj_coat.applink_address not in import_list):
import_list.append(obj_coat.applink_address)
import_type.append(coat3D.type)
if(import_list or coat3D.importmesh):
for idx, list in enumerate(import_list):
bpy.ops.import_scene.fbx(filepath=list, global_scale = 0.01,axis_forward='X',use_custom_normals=False)
cache_objects = bpy.data.objects.keys()
cache_objects = [i for i in cache_objects if i not in cache_base]
for cache_object in cache_objects:
bpy.data.objects[cache_object].coat3D.type = import_type[idx]
bpy.data.objects[cache_object].coat3D.applink_address = list
cache_base.append(cache_object)
bpy.ops.object.select_all(action='DESELECT')
new_materials = bpy.data.materials.keys()
new_objects = bpy.data.objects.keys()
for mark_mesh in diff_mat:
bpy.data.materials[mark_mesh].coat3D.name = '3DC'
bpy.data.materials[mark_mesh].use_fake_user = True
laskuri = 0
index = 0
for c_index in diff_objects:
bpy.data.objects[c_index].data.coat3D.name = '3DC'
laskuri += 1
diff_mat = [i for i in new_materials if i not in old_materials]
diff_objects = [i for i in new_objects if i not in old_objects]
bpy.ops.object.transforms_to_deltas(mode='SCALE')
bpy.ops.object.select_all(action='DESELECT')
for new_obj in bpy.context.collection.objects:
for mark_mesh in diff_objects:
bpy.data.objects[mark_mesh].data.coat3D.name = '3DC'
for c_index in diff_mat:
bpy.data.materials.remove(bpy.data.materials[c_index])
if(new_obj.coat3D.applink_old == False):
new_obj.select_set(True)
new_obj.coat3D.applink_firsttime = False
new_obj.select_set(False)
new_obj.coat3D.type = 'ppp'
new_obj.coat3D.applink_address = new_applink_address
new_obj.coat3D.applink_mesh = True
new_obj.coat3D.objecttime = str(os.path.getmtime(new_obj.coat3D.applink_address))
'''The main Applink Object Loop'''
new_obj.coat3D.applink_name = new_obj.name
index = index + 1
for oname in object_list:
print('ONAME: ', oname)
objekti = bpy.data.objects[oname]
if(objekti.coat3D.applink_mesh == True):
path3b_n = coat3D.exchangedir
path3b_n += ('%slast_saved_3b_file.txt' % (os.sep))
if(objekti.coat3D.import_mesh and coat3D.importmesh == True):
objekti.coat3D.import_mesh = False
objekti.select_set(True)
bpy.context.view_layer.objects.active = new_obj
use_smooth = objekti.data.polygons[0].use_smooth
found_obj = False
new_obj.coat3D.applink_export = True
'''Changes objects mesh into proxy mesh'''
if(objekti.coat3D.type != 'ref'):
for proxy_objects in diff_objects:
if(objekti.coat3D.retopo == False):
if (proxy_objects == objekti.coat3D.applink_name):
obj_proxy = bpy.data.objects[proxy_objects]
obj_proxy.coat3D.delete_proxy_mesh = True
found_obj = True
else:
if (proxy_objects == objekti.coat3D.applink_name + '.001'):
obj_proxy = bpy.data.objects[proxy_objects]
obj_proxy.coat3D.delete_proxy_mesh = True
found_obj = True
if (os.path.isfile(osoite_3b)):
mesh_time = os.path.getmtime(new_obj.coat3D.applink_address)
b_time = os.path.getmtime(osoite_3b)
if (abs(mesh_time-b_time) < 240):
new_obj.coat3D.applink_3b_path = osoite_3b
new_obj.coat3D.applink_3b_just_name = just_3b_name
mat_list.append(new_obj.material_slots[0].material)
is_new = True
tex.matlab(new_obj, mat_list, texturelist, is_new)
mat_list.pop()
mat_list = []
if (objekti.material_slots):
for obj_mat in objekti.material_slots:
mat_list.append(obj_mat.material)
for new_obj in bpy.context.collection.objects:
if(new_obj.coat3D.applink_old == False):
new_obj.coat3D.applink_old = True
if(found_obj == True):
exportfile = coat3D.exchangedir
path3b_n = coat3D.exchangedir
path3b_n += ('%slast_saved_3b_file.txt' % (os.sep))
exportfile += ('%sBlender' % (os.sep))
exportfile += ('%sexport.txt'%(os.sep))
if(os.path.isfile(exportfile)):
export_file = open(exportfile)
for line in export_file:
if line.rfind('.3b'):
coat['active_coat'] = line
export_file.close()
os.remove(exportfile)
if(os.path.isfile(path3b_n)):
kokeilu = coat3D.exchangedir[:-10]
Blender_folder2 = ("%s%sExchange%sBlender" % (kokeilu, os.sep, os.sep))
Blender_folder2 += ('%sexport.txt' % (os.sep))
mesh_time = os.path.getmtime(objekti.coat3D.applink_address)
b_time = os.path.getmtime(path3b_n)
if (abs(mesh_time - b_time) < 240):
export_file = open(path3b_n)
for line in export_file:
objekti.coat3D.applink_3b_path = line
head, tail = os.path.split(line)
just_3b_name = tail
objekti.coat3D.applink_3b_just_name = just_3b_name
export_file.close()
coat3D.remove_path = True
if (os.path.isfile(Blender_export)):
os.remove(Blender_export)
if (os.path.isfile(Blender_folder2)):
os.remove(Blender_folder2)
for material in bpy.data.materials:
if material.use_nodes == True:
for node in material.node_tree.nodes:
if (node.name).startswith('3DC'):
node.location = node.location
bpy.ops.object.select_all(action='DESELECT')
obj_proxy.select_set(True)
bpy.ops.object.select_all(action='TOGGLE')
if objekti.coat3D.applink_firsttime == True and objekti.coat3D.type == 'vox':
objekti.select_set(True)
objekti.rotation_euler[0] = 1.5708
objekti.rotation_euler[2] = 1.5708
bpy.ops.object.transforms_to_deltas(mode='ROT')
bpy.ops.object.transforms_to_deltas(mode='SCALE')
objekti.coat3D.applink_firsttime = False
objekti.select_set(False)
elif objekti.coat3D.applink_firsttime == True:
objekti.scale = (objekti.scale[0]/objekti.coat3D.applink_scale[0],objekti.scale[1]/objekti.coat3D.applink_scale[1],objekti.scale[2]/objekti.coat3D.applink_scale[2])
#bpy.ops.object.transforms_to_deltas(mode='SCALE')
if(objekti.coat3D.applink_onlyone == False):
objekti.rotation_euler = (0,0,0)
objekti.coat3D.applink_firsttime = False
if(coat3D.importlevel):
obj_proxy.select = True
obj_proxy.modifiers.new(name='temp',type='MULTIRES')
objekti.select = True
bpy.ops.object.multires_reshape(modifier=multires_name)
bpy.ops.object.select_all(action='TOGGLE')
else:
bpy.context.view_layer.objects.active = obj_proxy
keep_materials_count = len(obj_proxy.material_slots) - len(objekti.material_slots)
#delete_materials_from_end(keep_materials_count, obj_proxy)
for index, material in enumerate(objekti.material_slots):
obj_proxy.material_slots[index-1].material = material.material
updatemesh(objekti,obj_proxy, texturelist)
bpy.context.view_layer.objects.active = objekti
#tärkee että saadaan oikein käännettyä objekt
objekti.select_set(True)
if (use_smooth):
for data_mesh in objekti.data.polygons:
data_mesh.use_smooth = True
else:
for data_mesh in objekti.data.polygons:
data_mesh.use_smooth = False
bpy.ops.object.select_all(action='DESELECT')
if(coat3D.importmesh and not(os.path.isfile(objekti.coat3D.applink_address))):
coat3D.importmesh = False
objekti.select_set(True)
if(coat3D.importtextures):
is_new = False
if(objekti.coat3D.retopo == False):
tex.matlab(objekti,mat_list,texturelist,is_new)
objekti.select_set(False)
else:
mat_list = []
if (objekti.material_slots):
for obj_mat in objekti.material_slots:
mat_list.append(obj_mat.material)
if (coat3D.importtextures):
is_new = False
if(objekti.coat3D.retopo == False):
tex.matlab(objekti,mat_list,texturelist, is_new)
objekti.select_set(False)
if(coat3D.remove_path == True):
os.remove(path3b_n)
coat3D.remove_path = False
bpy.ops.object.select_all(action='DESELECT')
if(import_list):
for del_obj in diff_objects:
if(bpy.context.collection.all_objects[del_obj].coat3D.type == 'vox' and bpy.context.collection.all_objects[del_obj].coat3D.delete_proxy_mesh == False):
bpy.context.collection.all_objects[del_obj].select_set(True)
objekti = bpy.context.collection.all_objects[del_obj]
#bpy.ops.object.transforms_to_deltas(mode='ROT')
objekti.scale = (2.7, 2.7, 2.7)
bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
objekti.data.coat3D.name = '3DC'
objekti.coat3D.objecttime = str(os.path.getmtime(objekti.coat3D.applink_address))
objekti.coat3D.applink_name = objekti.name
objekti.coat3D.applink_mesh = True
objekti.coat3D.import_mesh = False
bpy.ops.object.transforms_to_deltas(mode='SCALE')
objekti.coat3D.applink_firsttime = False
bpy.context.collection.all_objects[del_obj].select_set(False)
else:
bpy.context.collection.all_objects[del_obj].select_set(True)
bpy.data.objects.remove(bpy.data.objects[del_obj])
if (coat3D.bring_retopo or coat3D.bring_retopo_path):
if(os.path.isfile(coat3D.bring_retopo_path)):
bpy.ops.import_scene.fbx(filepath=coat3D.bring_retopo_path, global_scale=1, axis_forward='X', use_custom_normals=False)
os.remove(coat3D.bring_retopo_path)
kokeilu = coat3D.exchangedir[:-9]
Blender_folder2 = ("%s%sExchange" % (kokeilu, os.sep))
Blender_folder2 += ('%sexport.txt' % (os.sep))
if (os.path.isfile(Blender_folder2)):
os.remove(Blender_folder2)
else:
'''
3DC -> Blender workflow
'''
bpy.ops.object.select_all(action='DESELECT')
for old_obj in bpy.context.collection.objects:
old_obj.coat3D.applink_old = True
coat3D = bpy.context.scene.coat3D
Blender_folder = ("%s%sBlender"%(coat3D.exchangedir,os.sep))
Blender_export = Blender_folder
path3b_now = coat3D.exchangedir + os.sep
path3b_now += ('last_saved_3b_file.txt')
Blender_export += ('%sexport.txt'%(os.sep))
mat_list = []
osoite_3b = ''
if (os.path.isfile(path3b_now)):
path3b_fil = open(path3b_now)
for lin in path3b_fil:
osoite_3b = lin
path3b_fil.close()
head, tail = os.path.split(osoite_3b)
just_3b_name = tail
os.remove(path3b_now)
create_collection = True
for collection in bpy.data.collections:
if collection.name == 'Applink_Objects':
create_collection = False
if create_collection:
bpy.data.collections.new('Applink_Objects')
coll_items = bpy.context.scene.collection.children.items()
add_applink_collection = True
for coll in coll_items:
if coll[0] == 'Applink_Objects':
add_applink_collection = False
if add_applink_collection:
bpy.context.scene.collection.children.link(bpy.data.collections['Applink_Objects'])
bpy.context.view_layer.active_layer_collection = bpy.context.view_layer.layer_collection.children['Applink_Objects']
old_materials = bpy.data.materials.keys()
old_objects = bpy.data.objects.keys()
bpy.ops.import_scene.fbx(filepath=new_applink_address, global_scale = 1, axis_forward='-Z', axis_up='Y')
new_materials = bpy.data.materials.keys()
new_objects = bpy.data.objects.keys()
diff_mat = [i for i in new_materials if i not in old_materials]
diff_objects = [i for i in new_objects if i not in old_objects]
for mark_mesh in diff_mat:
bpy.data.materials[mark_mesh].coat3D.name = '3DC'
bpy.data.materials[mark_mesh].use_fake_user = True
laskuri = 0
index = 0
for c_index in diff_objects:
bpy.data.objects[c_index].data.coat3D.name = '3DC'
laskuri += 1
#bpy.ops.object.transforms_to_deltas(mode='SCALE')
bpy.ops.object.select_all(action='DESELECT')
for new_obj in bpy.context.collection.objects:
if(new_obj.coat3D.applink_old == False):
new_obj.select_set(True)
new_obj.coat3D.applink_firsttime = False
new_obj.select_set(False)
new_obj.coat3D.type = 'ppp'
new_obj.coat3D.applink_address = new_applink_address
new_obj.coat3D.applink_mesh = True
new_obj.coat3D.objecttime = str(os.path.getmtime(new_obj.coat3D.applink_address))
new_obj.coat3D.applink_name = new_obj.name
index = index + 1
bpy.context.view_layer.objects.active = new_obj
new_obj.coat3D.applink_export = True
if (os.path.isfile(osoite_3b)):
mesh_time = os.path.getmtime(new_obj.coat3D.applink_address)
b_time = os.path.getmtime(osoite_3b)
if (abs(mesh_time-b_time) < 240):
new_obj.coat3D.applink_3b_path = osoite_3b
new_obj.coat3D.applink_3b_just_name = just_3b_name
mat_list.append(new_obj.material_slots[0].material)
is_new = True
tex.matlab(new_obj, mat_list, texturelist, is_new)
mat_list.pop()
for new_obj in bpy.context.collection.objects:
if(new_obj.coat3D.applink_old == False):
new_obj.coat3D.applink_old = True
kokeilu = coat3D.exchangedir[:-10]
Blender_folder2 = ("%s%sExchange%sBlender" % (kokeilu, os.sep, os.sep))
Blender_folder2 += ('%sexport.txt' % (os.sep))
if (os.path.isfile(Blender_export)):
os.remove(Blender_export)
if (os.path.isfile(Blender_folder2)):
os.remove(Blender_folder2)
for material in bpy.data.materials:
if material.use_nodes == True:
for node in material.node_tree.nodes:
if (node.name).startswith('3DC'):
node.location = node.location
if(bpy.context.scene.render.engine == 'CYCLES'): # HACK textures are updated in cycles render
bpy.context.scene.render.engine = 'BLENDER_EEVEE'
bpy.context.scene.render.engine = 'CYCLES'
exportfile = coat3D.exchangedir
exportfile += ('%sexport.txt' % (os.sep))
if (os.path.isfile(exportfile)):
os.remove(exportfile)
return {'FINISHED'}
def run_import_periodically():
@ -1527,6 +1601,11 @@ class ObjectCoat3D(PropertyGroup):
description="FirstTime",
default=True
)
retopo: BoolProperty(
name="Retopo object",
description="Retopo object",
default=False
)
delete_proxy_mesh: BoolProperty(
name="FirstTime",
description="FirstTime",

View File

@ -565,17 +565,18 @@ def CreateTextureLine(type, act_material, main_mat, texcoat, coat3D, notegroup,
tile_int_x = int(tile[3])
tile_int_y = int(tile[2])
min_node = texture_tree.nodes.new('ShaderNodeVectorMath')
min_node.operation = "MINIMUM"
min_node.inputs[1].default_value[0] = tile_int_x - 1
min_node.inputs[1].default_value[1] = tile_int_y
max_node = texture_tree.nodes.new('ShaderNodeVectorMath')
max_node.operation = "MAXIMUM"
max_node.inputs[1].default_value[0] = tile_int_x
max_node.inputs[1].default_value[1] = tile_int_y + 1
if(index == 0):
nodes.append(tex_img_node.name)
if(count == 1):