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) |