124 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import bpy
 | |
| 
 | |
| #Todo - Check if already exists, in case multiple objects has the same material
 | |
| 
 | |
| def backup_material_copy(slot):
 | |
|     material = slot.material
 | |
|     dup = material.copy()
 | |
|     dup.name = "." + material.name + "_Original"
 | |
|     dup.use_fake_user = True
 | |
| 
 | |
| def backup_material_cache(slot, path):
 | |
|     bpy.ops.wm.save_as_mainfile(filepath=path, copy=True)
 | |
| 
 | |
| def backup_material_cache_restore(slot, path):
 | |
|     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         print("Restore cache")
 | |
| 
 | |
| # def backup_material_restore(obj): #??
 | |
| #     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
| #         print("Restoring material for: " + obj.name)
 | |
| 
 | |
| #Check if object has TLM_PrevMatArray
 | |
| #   if yes
 | |
| #       - check if array.len is bigger than 0:
 | |
| #           if yes:
 | |
| #               for slot in object:
 | |
| #                   originalMaterial = TLM_PrevMatArray[index]
 | |
| #
 | |
| #
 | |
| #           if no:
 | |
| #               - In which cases are these?
 | |
| 
 | |
| #   if no:
 | |
| #    - In which cases are there not?
 | |
| #    - If a lightmapped material was applied to a non-lightmap object?
 | |
| 
 | |
| 
 | |
|                 # if bpy.data.materials[originalMaterial].users > 0: #TODO - Check if all lightmapped
 | |
| 
 | |
|                 #     print("Material has multiple users")
 | |
|                 
 | |
|                 #     if originalMaterial in bpy.data.materials:
 | |
|                 #         slot.material = bpy.data.materials[originalMaterial]
 | |
|                 #         slot.material.use_fake_user = False
 | |
|                 #     elif "." + originalMaterial + "_Original" in bpy.data.materials:
 | |
|                 #         slot.material = bpy.data.materials["." + originalMaterial + "_Original"]
 | |
|                 #         slot.material.use_fake_user = False
 | |
|                 
 | |
|                 # else:
 | |
| 
 | |
|                 #     print("Material has one user")
 | |
| 
 | |
|                 #     if "." + originalMaterial + "_Original" in bpy.data.materials:
 | |
|                 #         slot.material = bpy.data.materials["." + originalMaterial + "_Original"]
 | |
|                 #         slot.material.use_fake_user = False
 | |
|                 #     elif originalMaterial in bpy.data.materials:
 | |
|                 #         slot.material = bpy.data.materials[originalMaterial]
 | |
|                 #         slot.material.use_fake_user = False
 | |
| 
 | |
| def backup_material_restore(obj): #??
 | |
|     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         print("Restoring material for: " + obj.name)
 | |
| 
 | |
|     if "TLM_PrevMatArray" in obj:
 | |
| 
 | |
|         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|             print("Material restore array found: " + str(obj["TLM_PrevMatArray"]))
 | |
|         #Running through the slots
 | |
|         prevMatArray = obj["TLM_PrevMatArray"]
 | |
|         slotsLength = len(prevMatArray)
 | |
| 
 | |
|         if len(prevMatArray) > 0:
 | |
|             for idx, slot in enumerate(obj.material_slots): #For each slot, we get the index
 | |
|                 #We only need the index, corresponds to the array index
 | |
|                 try:
 | |
|                     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                         print("Attempting to set material")
 | |
|                     originalMaterial = prevMatArray[idx]
 | |
|                 except IndexError:
 | |
|                     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                         print("Material restore failed - Resetting")
 | |
|                     originalMaterial = ""
 | |
| 
 | |
|                 if slot.material is not None:
 | |
|                     #if slot.material.users < 2:
 | |
|                     #slot.material.user_clear() #Seems to be bad; See: https://developer.blender.org/T49837
 | |
|                     #bpy.data.materials.remove(slot.material)
 | |
| 
 | |
|                     if "." + originalMaterial + "_Original" in bpy.data.materials:
 | |
|                         slot.material = bpy.data.materials["." + originalMaterial + "_Original"]
 | |
|                         slot.material.use_fake_user = False
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             print("No previous material for " + obj.name)
 | |
| 
 | |
|     else:
 | |
| 
 | |
|         print("No previous material for " + obj.name)
 | |
| 
 | |
| def backup_material_rename(obj): #??
 | |
|     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         print("Renaming material for: " + obj.name)
 | |
| 
 | |
| 
 | |
|     if "TLM_PrevMatArray" in obj:
 | |
| 
 | |
|         for slot in obj.material_slots:
 | |
| 
 | |
|             if slot.material is not None:
 | |
|                 if slot.material.name.endswith("_Original"):
 | |
|                     newname = slot.material.name[1:-9]
 | |
|                     if newname in bpy.data.materials:
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             print("Removing material: " + bpy.data.materials[newname].name)
 | |
|                         #if bpy.data.materials[newname].users < 2:
 | |
|                             #bpy.data.materials.remove(bpy.data.materials[newname]) #TODO - Maybe remove this
 | |
|                     slot.material.name = newname
 | |
| 
 | |
|         del obj["TLM_PrevMatArray"]
 | |
| 
 | |
|     else:
 | |
| 
 | |
|         print("No Previous material array for: " + obj.name) |