1362 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1362 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import bpy, os, subprocess, sys, platform, aud, json, datetime, socket
 | |
| 
 | |
| from . import encoding, pack, log
 | |
| from . cycles import lightmap, prepare, nodes, cache
 | |
| from . luxcore import setup
 | |
| from . octane import configure, lightmap2
 | |
| from . denoiser import integrated, oidn, optix
 | |
| from . filtering import opencv
 | |
| from . gui import Viewport
 | |
| from .. network import client
 | |
| 
 | |
| from os import listdir
 | |
| from os.path import isfile, join
 | |
| from time import time, sleep
 | |
| from importlib import util
 | |
| 
 | |
| previous_settings = {}
 | |
| postprocess_shutdown = False
 | |
| logging = True
 | |
| 
 | |
| def prepare_build(self=0, background_mode=False, shutdown_after_build=False):
 | |
| 
 | |
|     global tlm_log
 | |
|     tlm_log = log.TLM_Logman()
 | |
|     bpy.app.driver_namespace["logman"] = tlm_log
 | |
|     tlm_log.append("Preparing build")
 | |
| 
 | |
|     if shutdown_after_build:
 | |
|         postprocess_shutdown = True
 | |
| 
 | |
|     print("Building lightmaps")
 | |
| 
 | |
|     if bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode == "combinedao": 
 | |
| 
 | |
|         scene = bpy.context.scene
 | |
| 
 | |
|         if not "tlm_plus_mode" in bpy.app.driver_namespace or bpy.app.driver_namespace["tlm_plus_mode"] == 0:
 | |
|             filepath = bpy.data.filepath
 | |
|             dirpath = os.path.join(os.path.dirname(bpy.data.filepath), scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
|             if os.path.isdir(dirpath):
 | |
|                 for file in os.listdir(dirpath):
 | |
|                     os.remove(os.path.join(dirpath + "/" + file))
 | |
|             bpy.app.driver_namespace["tlm_plus_mode"] = 1
 | |
|             print("Plus Mode")
 | |
| 
 | |
|     if bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode == "indirectao": 
 | |
| 
 | |
|         scene = bpy.context.scene
 | |
| 
 | |
|         if not "tlm_plus_mode" in bpy.app.driver_namespace or bpy.app.driver_namespace["tlm_plus_mode"] == 0:
 | |
|             filepath = bpy.data.filepath
 | |
|             dirpath = os.path.join(os.path.dirname(bpy.data.filepath), scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
|             if os.path.isdir(dirpath):
 | |
|                 for file in os.listdir(dirpath):
 | |
|                     os.remove(os.path.join(dirpath + "/" + file))
 | |
|             bpy.app.driver_namespace["tlm_plus_mode"] = 1
 | |
|             print("Plus Mode")
 | |
| 
 | |
|     if bpy.context.scene.TLM_EngineProperties.tlm_bake_mode == "Foreground" or background_mode==True:
 | |
| 
 | |
|         global start_time
 | |
|         start_time = time()
 | |
|         bpy.app.driver_namespace["tlm_start_time"] = time()
 | |
| 
 | |
|         scene = bpy.context.scene
 | |
|         sceneProperties = scene.TLM_SceneProperties
 | |
| 
 | |
|         if not background_mode and bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode != "combinedao" and bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode != "indirectao":
 | |
|             #pass
 | |
|             setGui(1)
 | |
| 
 | |
|         if check_save():
 | |
|             print("Please save your file first")
 | |
|             self.report({'INFO'}, "Please save your file first")
 | |
|             setGui(0)
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if check_denoiser():
 | |
|             print("No denoise OIDN path assigned")
 | |
|             self.report({'INFO'}, "No denoise OIDN path assigned. Check that it points to the correct executable.")
 | |
|             setGui(0)
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if check_materials():
 | |
|             print("Error with material")
 | |
|             self.report({'INFO'}, "Error with material")
 | |
|             setGui(0)
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if opencv_check():
 | |
|             if sceneProperties.tlm_filtering_use:
 | |
|                 print("Error:Filtering - OpenCV not installed")
 | |
|                 self.report({'INFO'}, "Error:Filtering - OpenCV not installed")
 | |
|                 setGui(0)
 | |
|                 return{'FINISHED'}
 | |
| 
 | |
|         setMode()
 | |
| 
 | |
|         dirpath = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
|         if not os.path.isdir(dirpath):
 | |
|             os.mkdir(dirpath)
 | |
| 
 | |
|         #Naming check
 | |
|         naming_check()
 | |
| 
 | |
|         if sceneProperties.tlm_lightmap_engine == "Cycles":
 | |
| 
 | |
|             prepare.init(self, previous_settings)
 | |
| 
 | |
|         if sceneProperties.tlm_lightmap_engine == "LuxCoreRender":
 | |
| 
 | |
|             setup.init(self, previous_settings)
 | |
| 
 | |
|         if sceneProperties.tlm_lightmap_engine == "OctaneRender":
 | |
| 
 | |
|             configure.init(self, previous_settings)
 | |
| 
 | |
|         begin_build()
 | |
| 
 | |
|     else:
 | |
| 
 | |
|         print("Baking in background")
 | |
| 
 | |
|         filepath = bpy.data.filepath
 | |
| 
 | |
|         bpy.ops.wm.save_as_mainfile(filepath=bpy.data.filepath)
 | |
| 
 | |
|         start_time = time()
 | |
| 
 | |
|         scene = bpy.context.scene
 | |
|         sceneProperties = scene.TLM_SceneProperties
 | |
| 
 | |
|         #Timer start here bound to global
 | |
|         if check_save():
 | |
|             print("Please save your file first")
 | |
|             self.report({'INFO'}, "Please save your file first")
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if check_denoiser():
 | |
|             print("No denoise OIDN path assigned")
 | |
|             self.report({'INFO'}, "No denoise OIDN path assigned")
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if check_materials():
 | |
|             print("Error with material")
 | |
|             self.report({'INFO'}, "Error with material")
 | |
|             return{'FINISHED'}
 | |
| 
 | |
|         if opencv_check():
 | |
|             if sceneProperties.tlm_filtering_use:
 | |
|                 print("Error:Filtering - OpenCV not installed")
 | |
|                 self.report({'INFO'}, "Error:Filtering - OpenCV not installed")
 | |
|                 return{'FINISHED'}
 | |
| 
 | |
|         dirpath = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
|         if not os.path.isdir(dirpath):
 | |
|             os.mkdir(dirpath)
 | |
| 
 | |
|         #Naming check
 | |
|         naming_check()
 | |
| 
 | |
|         if scene.TLM_SceneProperties.tlm_network_render:
 | |
| 
 | |
|             print("NETWORK RENDERING")
 | |
| 
 | |
|             if scene.TLM_SceneProperties.tlm_network_paths != None:
 | |
|                 HOST = bpy.data.texts[scene.TLM_SceneProperties.tlm_network_paths.name].lines[0].body  # The server's hostname or IP address
 | |
|             else:
 | |
|                 HOST = '127.0.0.1'  # The server's hostname or IP address
 | |
| 
 | |
|             PORT = 9898        # The port used by the server
 | |
| 
 | |
|             client.connect_client(HOST, PORT, bpy.data.filepath, 0)
 | |
| 
 | |
|             finish_assemble()
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             print("Background driver process")
 | |
| 
 | |
|             bpy.app.driver_namespace["alpha"] = 0
 | |
| 
 | |
|             bpy.app.driver_namespace["tlm_process"] = False
 | |
| 
 | |
|             if os.path.exists(os.path.join(dirpath, "process.tlm")):
 | |
|                 os.remove(os.path.join(dirpath, "process.tlm"))
 | |
| 
 | |
|             bpy.app.timers.register(distribute_building)
 | |
| 
 | |
| def distribute_building():
 | |
| 
 | |
|     print("Distributing lightmap building")
 | |
| 
 | |
|     #CHECK IF THERE'S AN EXISTING SUBPROCESS 
 | |
| 
 | |
|     if not os.path.isfile(os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir, "process.tlm")):
 | |
|         
 | |
|         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|             print("No process file - Creating one...")
 | |
|             tlm_log.append("No process file - Creating one...")
 | |
|         
 | |
|         write_directory = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|         blendPath = bpy.data.filepath
 | |
| 
 | |
|         process_status = [blendPath, 
 | |
|                     {'bake': 'all', 
 | |
|                     'completed': False
 | |
|                     }]
 | |
| 
 | |
|         with open(os.path.join(write_directory, "process.tlm"), 'w') as file:
 | |
|             json.dump(process_status, file, indent=2)
 | |
| 
 | |
|         if (2, 91, 0) > bpy.app.version:
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 bpy.app.driver_namespace["tlm_process"] = subprocess.Popen([sys.executable,"-b", blendPath,"--python-expr",'import bpy; import thelightmapper; thelightmapper.addon.utility.build.prepare_build(0, True);'], shell=False, stdout=subprocess.PIPE)
 | |
|             else:
 | |
|                 bpy.app.driver_namespace["tlm_process"] = subprocess.Popen([sys.executable,"-b", blendPath,"--python-expr",'import bpy; import thelightmapper; thelightmapper.addon.utility.build.prepare_build(0, True);'], shell=False, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
 | |
|         else:
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 bpy.app.driver_namespace["tlm_process"] = subprocess.Popen([bpy.app.binary_path,"-b", blendPath,"--python-expr",'import bpy; import thelightmapper; thelightmapper.addon.utility.build.prepare_build(0, True);'], shell=False, stdout=subprocess.PIPE)
 | |
|             else:
 | |
|                 bpy.app.driver_namespace["tlm_process"] = subprocess.Popen([bpy.app.binary_path,"-b", blendPath,"--python-expr",'import bpy; import thelightmapper; thelightmapper.addon.utility.build.prepare_build(0, True);'], shell=False, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
 | |
|         tlm_log.append("Started process: " + str(bpy.app.driver_namespace["tlm_process"]) + " at " + str(datetime.datetime.now()))
 | |
|         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|             print("Started process: " + str(bpy.app.driver_namespace["tlm_process"]) + " at " + str(datetime.datetime.now()))
 | |
| 
 | |
|     else:
 | |
| 
 | |
|         write_directory = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|         process_status = json.loads(open(os.path.join(write_directory, "process.tlm")).read())
 | |
| 
 | |
|         if process_status[1]["completed"]:
 | |
| 
 | |
|             tlm_log.append("Baking finished from process. Status: Completed.")
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print("Baking finished")
 | |
| 
 | |
|             bpy.app.timers.unregister(distribute_building)
 | |
| 
 | |
|             finish_assemble()
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             #Open the json and check the status!
 | |
|             tlm_log.append("Process check: Baking in progress.")
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print("Baking in progress")
 | |
|             
 | |
|             process_status = json.loads(open(os.path.join(write_directory, "process.tlm")).read())
 | |
| 
 | |
|             tlm_log.append(process_status)
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print(process_status)
 | |
| 
 | |
|     return 1.0
 | |
| 
 | |
| 
 | |
| def finish_assemble(self=0, background_pass=0, load_atlas=0):
 | |
| 
 | |
|     print("Finishing assembly")
 | |
| 
 | |
|     tlm_log = log.TLM_Logman()
 | |
|     tlm_log.append("Preparing build")
 | |
| 
 | |
|     if load_atlas:
 | |
|         print("Assembly in Atlas load mode")
 | |
|         tlm_log.append("Assembly in Atlas load mode")
 | |
| 
 | |
|     tlm_log.append("Background baking finished")
 | |
|     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         print("Background baking finished")
 | |
| 
 | |
|     scene = bpy.context.scene
 | |
|     sceneProperties = scene.TLM_SceneProperties
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "Cycles":
 | |
| 
 | |
|         prepare.init(self, previous_settings)
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "LuxCoreRender":
 | |
|         pass
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "OctaneRender":
 | |
|         pass
 | |
| 
 | |
|     if not 'start_time' in globals():
 | |
|         global start_time
 | |
|         start_time = time()
 | |
| 
 | |
|     if background_pass:
 | |
|         manage_build(True, load_atlas)
 | |
|     else:
 | |
|         manage_build(False, load_atlas)
 | |
| 
 | |
| def begin_build():
 | |
| 
 | |
|     print("Beginning build")
 | |
| 
 | |
|     dirpath = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|     scene = bpy.context.scene
 | |
|     sceneProperties = scene.TLM_SceneProperties
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "Cycles":
 | |
| 
 | |
|         lightmap.bake()
 | |
| 
 | |
|         # try:
 | |
|         #     lightmap.bake()
 | |
|         # except Exception as e:
 | |
| 
 | |
|         #     print("An error occured during lightmap baking. See the line below for more detail:")
 | |
|         #     print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|         #     tlm_log.append("An error occured during lightmap baking. See the line below for more detail:")
 | |
|         #     tlm_log.append(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|         #     if not bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         #         print("Turn on verbose mode to get more detail.")
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "LuxCoreRender":
 | |
|         pass
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "OctaneRender":
 | |
| 
 | |
|         lightmap2.bake()
 | |
| 
 | |
|     #Denoiser
 | |
|     if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|         if sceneProperties.tlm_denoise_engine == "Integrated":
 | |
| 
 | |
|             baked_image_array = []
 | |
| 
 | |
|             dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|             for file in dirfiles:
 | |
|                 if file.endswith("_baked.hdr"):
 | |
|                     baked_image_array.append(file)
 | |
| 
 | |
|             tlm_log.append(baked_image_array)
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print(baked_image_array)
 | |
| 
 | |
|             denoiser = integrated.TLM_Integrated_Denoise()
 | |
| 
 | |
|             denoiser.load(baked_image_array)
 | |
| 
 | |
|             denoiser.setOutputDir(dirpath)
 | |
| 
 | |
|             denoiser.denoise()
 | |
| 
 | |
|         elif sceneProperties.tlm_denoise_engine == "OIDN":
 | |
| 
 | |
|             baked_image_array = []
 | |
| 
 | |
|             dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|             for file in dirfiles:
 | |
|                 if file.endswith("_baked.hdr"):
 | |
|                     baked_image_array.append(file)
 | |
| 
 | |
|             oidnProperties = scene.TLM_OIDNEngineProperties
 | |
| 
 | |
|             denoiser = oidn.TLM_OIDN_Denoise(oidnProperties, baked_image_array, dirpath)
 | |
| 
 | |
|             try:
 | |
|                 denoiser.denoise()
 | |
|             except Exception as e:
 | |
| 
 | |
|                 print("An error occured during denoising. See the line below for more detail:")
 | |
|                 print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|                 tlm_log.append("An error occured during denoising. See the line below for more detail:")
 | |
|                 tlm_log.append(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|                 if not bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     print("Turn on verbose mode to get more detail.")
 | |
| 
 | |
|             denoiser.clean()
 | |
| 
 | |
|             del denoiser
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             baked_image_array = []
 | |
| 
 | |
|             dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|             for file in dirfiles:
 | |
|                 if file.endswith("_baked.hdr"):
 | |
|                     baked_image_array.append(file)
 | |
| 
 | |
|             optixProperties = scene.TLM_OptixEngineProperties
 | |
| 
 | |
|             denoiser = optix.TLM_Optix_Denoise(optixProperties, baked_image_array, dirpath)
 | |
| 
 | |
|             denoiser.denoise()
 | |
| 
 | |
|             denoiser.clean()
 | |
| 
 | |
|             del denoiser
 | |
| 
 | |
|     #Filtering
 | |
|     if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|         if sceneProperties.tlm_denoise_use:
 | |
|             useDenoise = True
 | |
|         else:
 | |
|             useDenoise = False
 | |
| 
 | |
|         filter = opencv.TLM_CV_Filtering
 | |
| 
 | |
|         try:
 | |
|             filter.init(dirpath, useDenoise)
 | |
| 
 | |
|         except Exception as e:
 | |
| 
 | |
|             print("An error occured during filtering. See the line below for more detail:")
 | |
|             print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|             tlm_log.append("An error occured during filtering. See the line below for more detail:")
 | |
|             tlm_log.append(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|             if not bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print("Turn on verbose mode to get more detail.")
 | |
| 
 | |
|     #Encoding
 | |
|     if sceneProperties.tlm_encoding_use and scene.TLM_EngineProperties.tlm_bake_mode != "Background":
 | |
| 
 | |
|         if sceneProperties.tlm_encoding_device == "CPU":
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_a == "HDR":
 | |
| 
 | |
|                 if sceneProperties.tlm_format == "EXR":
 | |
| 
 | |
|                     tlm_log.append("EXR Format")
 | |
|                     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                         
 | |
|                         print("EXR Format")
 | |
| 
 | |
|                     ren = bpy.context.scene.render
 | |
|                     ren.image_settings.file_format = "OPEN_EXR"
 | |
|                     #ren.image_settings.exr_codec = "scene.TLM_SceneProperties.tlm_exr_codec"
 | |
| 
 | |
|                     end = "_baked"
 | |
| 
 | |
|                     baked_image_array = []
 | |
| 
 | |
|                     if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                         end = "_denoised"
 | |
| 
 | |
|                     if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                         end = "_filtered"
 | |
|                     
 | |
|                     #For each image in folder ending in denoised/filtered
 | |
|                     dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                     for file in dirfiles:
 | |
|                         if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                             img = bpy.data.images.load(os.path.join(dirpath,file))
 | |
|                             img.save_render(img.filepath_raw[:-4] + ".exr")
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_a == "RGBM":
 | |
| 
 | |
|                 tlm_log.append("ENCODING RGBM")
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     
 | |
|                     print("ENCODING RGBM")
 | |
| 
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                         
 | |
|                         tlm_log.append("Encoding:" + str(file))
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             print("Encoding:" + str(file))
 | |
|                         encoding.encodeImageRGBMCPU(img, sceneProperties.tlm_encoding_range, dirpath, 0)
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_a == "RGBD":
 | |
| 
 | |
|                 tlm_log.append("ENCODING RGBD")
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     
 | |
|                     print("ENCODING RGBD")
 | |
| 
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                         
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             tlm_log.append("Encoding:" + str(file))
 | |
|                             print("Encoding:" + str(file))
 | |
|                         encoding.encodeImageRGBDCPU(img, sceneProperties.tlm_encoding_range, dirpath, 0)
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_a == "SDR":
 | |
| 
 | |
|                 tlm_log.append("EXR Format")
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     
 | |
|                     print("EXR Format")
 | |
| 
 | |
|                 ren = bpy.context.scene.render
 | |
|                 ren.image_settings.file_format = "PNG"
 | |
|                 #ren.image_settings.exr_codec = "scene.TLM_SceneProperties.tlm_exr_codec"
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 baked_image_array = []
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
|                 
 | |
|                 #For each image in folder ending in denoised/filtered
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath,file))
 | |
|                         img.save_render(img.filepath_raw[:-4] + ".png")
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_b == "HDR":
 | |
| 
 | |
|                 if sceneProperties.tlm_format == "EXR":
 | |
| 
 | |
|                     tlm_log.append("EXR Format")
 | |
|                     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                         
 | |
|                         print("EXR Format")
 | |
| 
 | |
|                     ren = bpy.context.scene.render
 | |
|                     ren.image_settings.file_format = "OPEN_EXR"
 | |
|                     #ren.image_settings.exr_codec = "scene.TLM_SceneProperties.tlm_exr_codec"
 | |
| 
 | |
|                     end = "_baked"
 | |
| 
 | |
|                     baked_image_array = []
 | |
| 
 | |
|                     if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                         end = "_denoised"
 | |
| 
 | |
|                     if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                         end = "_filtered"
 | |
|                     
 | |
|                     #For each image in folder ending in denoised/filtered
 | |
|                     dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                     for file in dirfiles:
 | |
|                         if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                             img = bpy.data.images.load(os.path.join(dirpath,file))
 | |
|                             img.save_render(img.filepath_raw[:-4] + ".exr")
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_b == "LogLuv":
 | |
| 
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
| 
 | |
|                 #CHECK FOR ATLAS MAPS!
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                         
 | |
|                         encoding.encodeLogLuvGPU(img, dirpath, 0)
 | |
| 
 | |
|                         if sceneProperties.tlm_split_premultiplied:
 | |
| 
 | |
|                             image_name = img.name
 | |
| 
 | |
|                             if image_name[-4:] == '.exr' or image_name[-4:] == '.hdr':
 | |
|                                 image_name = image_name[:-4]
 | |
| 
 | |
|                             image_name = image_name + '_encoded.png'
 | |
| 
 | |
|                             print("SPLIT PREMULTIPLIED: " + image_name)
 | |
|                             encoding.splitLogLuvAlpha(os.path.join(dirpath, image_name), dirpath, 0)
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_b == "RGBM":
 | |
| 
 | |
|                 tlm_log.append("ENCODING RGBM")
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     
 | |
|                     print("ENCODING RGBM")
 | |
| 
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                         
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             print("Encoding:" + str(file))
 | |
|                         encoding.encodeImageRGBMGPU(img, sceneProperties.tlm_encoding_range, dirpath, 0)
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_b == "RGBD":
 | |
| 
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     print("ENCODING RGBD")
 | |
| 
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                         
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             print("Encoding:" + str(file))
 | |
|                         encoding.encodeImageRGBDGPU(img, sceneProperties.tlm_encoding_range, dirpath, 0)
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_mode_b == "PNG":
 | |
| 
 | |
|                 ren = bpy.context.scene.render
 | |
|                 ren.image_settings.file_format = "PNG"
 | |
|                 #ren.image_settings.exr_codec = "scene.TLM_SceneProperties.tlm_exr_codec"
 | |
| 
 | |
|                 end = "_baked"
 | |
| 
 | |
|                 baked_image_array = []
 | |
| 
 | |
|                 if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|                     end = "_denoised"
 | |
| 
 | |
|                 if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|                     end = "_filtered"
 | |
|                 
 | |
|                 #For each image in folder ending in denoised/filtered
 | |
|                 dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                         img = bpy.data.images.load(os.path.join(dirpath,file))
 | |
|                         img.save_render(img.filepath_raw[:-4] + ".png")
 | |
| 
 | |
|     manage_build()
 | |
| 
 | |
| def manage_build(background_pass=False, load_atlas=0):
 | |
| 
 | |
|     print("Managing build")
 | |
| 
 | |
|     if load_atlas:
 | |
|         print("Managing in load atlas mode")
 | |
| 
 | |
|     scene = bpy.context.scene
 | |
|     sceneProperties = scene.TLM_SceneProperties
 | |
| 
 | |
|     if sceneProperties.tlm_lightmap_engine == "Cycles":
 | |
| 
 | |
|         if background_pass:
 | |
|             print("In background pass")
 | |
| 
 | |
|             try:
 | |
| 
 | |
|                 nodes.apply_lightmaps()
 | |
| 
 | |
|             except Exception as e:
 | |
| 
 | |
|                 print("An error occured during lightmap application. See the line below for more detail:")
 | |
|                 print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|                 tlm_log.append("An error occured during lightmap application. See the line below for more detail:")
 | |
|                 tlm_log.append(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|                 if not bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     print("Turn on verbose mode to get more detail.")
 | |
| 
 | |
| 
 | |
|         try:
 | |
|             nodes.apply_materials(load_atlas) #From here the name is changed...
 | |
| 
 | |
|         except Exception as e:
 | |
| 
 | |
|             print("An error occured during material application. See the line below for more detail:")
 | |
|             print(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|             tlm_log.append("An error occured during material application. See the line below for more detail:")
 | |
|             tlm_log.append(f"{type(e).__name__} at line {e.__traceback__.tb_lineno} of {__file__}: {e}")
 | |
| 
 | |
|             if not bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print("Turn on verbose mode to get more detail.")
 | |
| 
 | |
|         end = "_baked"
 | |
| 
 | |
|         if sceneProperties.tlm_denoise_use:
 | |
| 
 | |
|             end = "_denoised"
 | |
| 
 | |
|         if sceneProperties.tlm_filtering_use:
 | |
| 
 | |
|             end = "_filtered"
 | |
| 
 | |
|         formatEnc = ".hdr"
 | |
|         
 | |
|         if sceneProperties.tlm_encoding_use and scene.TLM_EngineProperties.tlm_bake_mode != "Background":
 | |
| 
 | |
|             if sceneProperties.tlm_encoding_device == "CPU":
 | |
| 
 | |
|                 print("CPU Encoding")
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_a == "HDR":
 | |
| 
 | |
|                     if sceneProperties.tlm_format == "EXR":
 | |
| 
 | |
|                         formatEnc = ".exr"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_a == "RGBM":
 | |
| 
 | |
|                     formatEnc = "_encoded.png"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_a == "RGBD":
 | |
| 
 | |
|                     formatEnc = "_encoded.png"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_a == "SDR":
 | |
| 
 | |
|                     formatEnc = ".png"
 | |
| 
 | |
|             else:
 | |
| 
 | |
|                 print("GPU Encoding")
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_b == "HDR":
 | |
| 
 | |
|                     if sceneProperties.tlm_format == "EXR":
 | |
| 
 | |
|                         formatEnc = ".exr"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_b == "LogLuv":
 | |
| 
 | |
|                     formatEnc = "_encoded.png"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_b == "RGBM":
 | |
| 
 | |
|                     formatEnc = "_encoded.png"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_b == "RGBD":
 | |
| 
 | |
|                     formatEnc = "_encoded.png"
 | |
| 
 | |
|                 if sceneProperties.tlm_encoding_mode_b == "SDR":
 | |
| 
 | |
|                     formatEnc = ".png"
 | |
| 
 | |
|         if not background_pass:
 | |
|             nodes.exchangeLightmapsToPostfix("_baked", end, formatEnc)
 | |
| 
 | |
|         if scene.TLM_EngineProperties.tlm_setting_supersample == "2x":
 | |
|             supersampling_scale = 2
 | |
|         elif scene.TLM_EngineProperties.tlm_setting_supersample == "4x":
 | |
|             supersampling_scale = 4
 | |
|         else:
 | |
|             supersampling_scale = 1
 | |
| 
 | |
|         pack.postpack()
 | |
|         #We need to also make sure out postpacked atlases gets split w. premultiplied
 | |
|         #CHECK FOR ATLAS MAPS!
 | |
| 
 | |
|         if bpy.context.scene.TLM_SceneProperties.tlm_split_premultiplied:
 | |
| 
 | |
|             dirpath = os.path.join(os.path.dirname(bpy.data.filepath), scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
|             dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|             for atlas in bpy.context.scene.TLM_PostAtlasList:
 | |
| 
 | |
|                 for file in dirfiles:
 | |
|                     if file.startswith(atlas.name):
 | |
| 
 | |
|                         print("TODO: SPLIT LOGLUV FOR: " + str(file))
 | |
|                         encoding.splitLogLuvAlpha(os.path.join(dirpath, file), dirpath, 0)
 | |
| 
 | |
|             #Need to update file list for some reason?
 | |
|             dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
| 
 | |
|             for atlas in bpy.context.scene.TLM_PostAtlasList:
 | |
| 
 | |
|                 #FIND SOME WAY TO FIND THE RIGTH FILE! TOO TIRED NOW!
 | |
|                 for obj in bpy.context.scene.objects:
 | |
|                     if obj.TLM_ObjectProperties.tlm_postpack_object:
 | |
|                         if obj.TLM_ObjectProperties.tlm_postatlas_pointer == atlas.name:
 | |
|                             for slot in obj.material_slots:
 | |
|                             
 | |
|                                 mat = slot.material
 | |
| 
 | |
|                                 node_tree = mat.node_tree
 | |
| 
 | |
|                                 foundBakedNode = False
 | |
| 
 | |
|                                 #for file in dirfiles:
 | |
|                                 #    if file.startswith(atlas.name):
 | |
|                                 #        if file.endswith("XYZ"):
 | |
| 
 | |
|                                 #Find nodes
 | |
|                                 for node in node_tree.nodes:
 | |
| 
 | |
|                                     if node.name == "TLM_Lightmap":
 | |
| 
 | |
|                                         print("Found the main lightmap node: LOGLUV")
 | |
| 
 | |
|                                         for file in dirfiles:
 | |
|                                             if file.startswith(atlas.name) and file.endswith("XYZ.png"):
 | |
|                                                 print("Found an atlas file: " + str(file))
 | |
|                                                 node.image.filepath_raw = os.path.join(dirpath, file)
 | |
|                                                 print("CHANGED LIGHTMAP MAIN INTO XYZ: " + str(file))
 | |
| 
 | |
|                                     if node.name == "TLM_Lightmap_Extra":
 | |
| 
 | |
|                                         print("Found the main lightmap node: LOGLUV")
 | |
| 
 | |
|                                         for file in dirfiles:
 | |
|                                             if file.startswith(atlas.name) and file.endswith("W.png"):
 | |
|                                                 print("Found an atlas file: " + str(file))
 | |
|                                                 node.image.filepath_raw = os.path.join(dirpath, file)
 | |
|                                                 print("CHANGED LIGHTMAP MAIN INTO W: " + str(file))
 | |
| 
 | |
|                                         #print("Found the extra lightmap node: LOGLUV")
 | |
|                                         # if node.image.filepath_raw.startswith(atlas.name):
 | |
|                                         #     if node.image.filepath_raw.endswith("W.png"):
 | |
|                                         #         print("ALREADY W: " + str(node.image.filepath_raw))
 | |
|                                         
 | |
|                                         # else:
 | |
| 
 | |
|                                         #     for file in dirfiles:
 | |
|                                         #         if file.startswith(atlas.name):
 | |
|                                         #             if file.endswith("W.png"):
 | |
| 
 | |
|                                         #                 node.image.filepath_raw = os.path.join(dirpath, file)
 | |
|                                         #                 print("CHANGED LIGHTMAP MAIN INTO W: " + str(file))
 | |
| 
 | |
|             #for file in dirfiles:
 | |
|             #    if file.endswith(end + ".hdr"):
 | |
| 
 | |
|             #for atlas in bpy.context.scene.TLM_PostAtlasList:
 | |
| 
 | |
| 
 | |
| 
 | |
|                 #print("TODO: SPLIT LOGLUV FOR: " + str(atlas.name) + "..file?")
 | |
| 
 | |
|                     #CHECK FOR ATLAS MAPS!
 | |
|                 #dirfiles = [f for f in listdir(dirpath) if isfile(join(dirpath, f))]
 | |
|                     # for file in dirfiles:
 | |
|                     #     if file.endswith(end + ".hdr"):
 | |
| 
 | |
|                     #         img = bpy.data.images.load(os.path.join(dirpath, file), check_existing=False)
 | |
|                             
 | |
|                     #         encoding.encodeLogLuvGPU(img, dirpath, 0)
 | |
| 
 | |
|                     #         if sceneProperties.tlm_split_premultiplied:
 | |
| 
 | |
|                     #             image_name = img.name
 | |
| 
 | |
|                     #             if image_name[-4:] == '.exr' or image_name[-4:] == '.hdr':
 | |
|                     #                 image_name = image_name[:-4]
 | |
| 
 | |
|                     #             image_name = image_name + '_encoded.png'
 | |
| 
 | |
|                     #             print("SPLIT PREMULTIPLIED: " + image_name)
 | |
|                     #             encoding.splitLogLuvAlpha(os.path.join(dirpath, image_name), dirpath, 0)
 | |
| 
 | |
|         for image in bpy.data.images:
 | |
|             if image.users < 1:
 | |
|                 bpy.data.images.remove(image)
 | |
| 
 | |
|         if scene.TLM_SceneProperties.tlm_headless:
 | |
| 
 | |
|             filepath = bpy.data.filepath
 | |
|             dirpath = os.path.join(os.path.dirname(bpy.data.filepath), scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|             for obj in bpy.context.scene.objects:
 | |
|                 if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|                     if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                         cache.backup_material_restore(obj)
 | |
| 
 | |
|             for obj in bpy.context.scene.objects:
 | |
|                 if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|                     if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                         cache.backup_material_rename(obj)
 | |
| 
 | |
|             for mat in bpy.data.materials:
 | |
|                 if mat.users < 1:
 | |
|                     bpy.data.materials.remove(mat)
 | |
| 
 | |
|             for mat in bpy.data.materials:
 | |
|                 if mat.name.startswith("."):
 | |
|                     if "_Original" in mat.name:
 | |
|                         bpy.data.materials.remove(mat)
 | |
| 
 | |
|             for obj in bpy.context.scene.objects:
 | |
|                 if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|                     if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
| 
 | |
|                         if obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "AtlasGroupA":
 | |
|                             atlasName = obj.TLM_ObjectProperties.tlm_atlas_pointer
 | |
|                             img_name = atlasName + '_baked'
 | |
|                             Lightmapimage = bpy.data.images[img_name]
 | |
|                             obj["Lightmap"] = Lightmapimage.filepath_raw
 | |
|                         elif obj.TLM_ObjectProperties.tlm_postpack_object:
 | |
|                             atlasName = obj.TLM_ObjectProperties.tlm_postatlas_pointer
 | |
|                             img_name = atlasName + '_baked' + ".hdr"
 | |
|                             Lightmapimage = bpy.data.images[img_name]
 | |
|                             obj["Lightmap"] = Lightmapimage.filepath_raw
 | |
|                         else:
 | |
|                             img_name = obj.name + '_baked'
 | |
|                             Lightmapimage = bpy.data.images[img_name]
 | |
|                             obj["Lightmap"] = Lightmapimage.filepath_raw
 | |
| 
 | |
|             for image in bpy.data.images:
 | |
|                 if image.name.endswith("_baked"):
 | |
|                     bpy.data.images.remove(image, do_unlink=True)
 | |
| 
 | |
|         if "tlm_plus_mode" in bpy.app.driver_namespace: #First DIR pass
 | |
| 
 | |
|             if bpy.app.driver_namespace["tlm_plus_mode"] == 1: #First DIR pass
 | |
| 
 | |
|                 filepath = bpy.data.filepath
 | |
|                 dirpath = os.path.join(os.path.dirname(bpy.data.filepath), scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|                 for obj in bpy.context.scene.objects:
 | |
|                     if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|                         if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                             cache.backup_material_restore(obj)
 | |
| 
 | |
|                 for obj in bpy.context.scene.objects:
 | |
|                     if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|                         if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                             cache.backup_material_rename(obj)
 | |
| 
 | |
|                 for mat in bpy.data.materials:
 | |
|                     if mat.users < 1:
 | |
|                         bpy.data.materials.remove(mat)
 | |
| 
 | |
|                 for mat in bpy.data.materials:
 | |
|                     if mat.name.startswith("."):
 | |
|                         if "_Original" in mat.name:
 | |
|                             bpy.data.materials.remove(mat)
 | |
| 
 | |
|                 for image in bpy.data.images:
 | |
|                     if image.name.endswith("_baked"):
 | |
|                         bpy.data.images.remove(image, do_unlink=True)
 | |
| 
 | |
|                 dirpath = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|                 files = os.listdir(dirpath)
 | |
| 
 | |
|                 for index, file in enumerate(files):
 | |
| 
 | |
|                     filename = extension = os.path.splitext(file)[0]
 | |
|                     extension = os.path.splitext(file)[1]
 | |
| 
 | |
|                     os.rename(os.path.join(dirpath, file), os.path.join(dirpath, filename + "_dir" + extension))
 | |
|                 
 | |
|                 print("First DIR pass complete")
 | |
| 
 | |
|                 bpy.app.driver_namespace["tlm_plus_mode"] = 2
 | |
| 
 | |
|                 prepare_build(self=0, background_mode=False, shutdown_after_build=False)
 | |
| 
 | |
|                 if not background_pass and bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode != "combinedao":
 | |
|                     #pass
 | |
|                     setGui(0)
 | |
| 
 | |
|             elif bpy.app.driver_namespace["tlm_plus_mode"] == 2:
 | |
| 
 | |
|                 filepath = bpy.data.filepath
 | |
| 
 | |
|                 dirpath = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|                 files = os.listdir(dirpath)
 | |
| 
 | |
|                 for index, file in enumerate(files):
 | |
| 
 | |
|                     filename = os.path.splitext(file)[0]
 | |
|                     extension = os.path.splitext(file)[1]
 | |
| 
 | |
|                     if not filename.endswith("_dir"):
 | |
|                         os.rename(os.path.join(dirpath, file), os.path.join(dirpath, filename + "_ao" + extension))
 | |
|                 
 | |
|                 print("Second AO pass complete")
 | |
| 
 | |
|                 total_time = sec_to_hours((time() - start_time))
 | |
|                 tlm_log.append(total_time)
 | |
|                 if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                     
 | |
|                     print(total_time)
 | |
| 
 | |
|                 bpy.context.scene["TLM_Buildstat"] = total_time
 | |
| 
 | |
|                 reset_settings(previous_settings["settings"])
 | |
| 
 | |
|                 bpy.app.driver_namespace["tlm_plus_mode"] = 0
 | |
| 
 | |
|                 if not background_pass:
 | |
| 
 | |
|                     #TODO CHANGE!
 | |
| 
 | |
|                     nodes.exchangeLightmapsToPostfix(end, end + "_dir", formatEnc)
 | |
| 
 | |
|                     nodes.applyAOPass()
 | |
| 
 | |
|         else:
 | |
| 
 | |
|             total_time = sec_to_hours((time() - start_time))
 | |
|             tlm_log.append(total_time)
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print(total_time)
 | |
| 
 | |
|             bpy.context.scene["TLM_Buildstat"] = total_time
 | |
| 
 | |
|             reset_settings(previous_settings["settings"])
 | |
| 
 | |
|             tlm_log.append("Lightmap building finished")
 | |
|             tlm_log.append("--------------------------")
 | |
|             print("Lightmap building finished")
 | |
| 
 | |
|             if sceneProperties.tlm_lightmap_engine == "LuxCoreRender":
 | |
| 
 | |
|                 pass
 | |
| 
 | |
|             if sceneProperties.tlm_lightmap_engine == "OctaneRender":
 | |
| 
 | |
|                 pass
 | |
| 
 | |
|             if bpy.context.scene.TLM_EngineProperties.tlm_bake_mode == "Background":
 | |
|                 pass
 | |
| 
 | |
|             if not background_pass and scene.TLM_EngineProperties.tlm_bake_mode != "Background" and bpy.context.scene.TLM_EngineProperties.tlm_lighting_mode != "combinedao":
 | |
|                 #pass
 | |
|                 setGui(0)
 | |
| 
 | |
|         if scene.TLM_SceneProperties.tlm_alert_on_finish:
 | |
| 
 | |
|             alertSelect = scene.TLM_SceneProperties.tlm_alert_sound
 | |
| 
 | |
|             if alertSelect == "dash":
 | |
|                 soundfile = "dash.ogg"
 | |
|             elif alertSelect == "pingping":
 | |
|                 soundfile = "pingping.ogg"  
 | |
|             elif alertSelect == "gentle":
 | |
|                 soundfile = "gentle.ogg"
 | |
|             else:
 | |
|                 soundfile = "noot.ogg"
 | |
| 
 | |
|             scriptDir = os.path.dirname(os.path.realpath(__file__))
 | |
|             sound_path = os.path.abspath(os.path.join(scriptDir, '..', 'assets/'+soundfile))
 | |
| 
 | |
|             device = aud.Device()
 | |
|             sound = aud.Sound.file(sound_path)
 | |
|             device.play(sound)
 | |
| 
 | |
|         if logging:
 | |
|             print("Log file output:")
 | |
|             tlm_log.dumpLog()
 | |
| 
 | |
|         if bpy.app.background:
 | |
| 
 | |
|             if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                 print("Writing background process report")
 | |
|             
 | |
|             write_directory = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir)
 | |
| 
 | |
|             if os.path.exists(os.path.join(write_directory, "process.tlm")):
 | |
| 
 | |
|                 process_status = json.loads(open(os.path.join(write_directory, "process.tlm")).read())
 | |
| 
 | |
|                 process_status[1]["completed"] = True
 | |
| 
 | |
|                 with open(os.path.join(write_directory, "process.tlm"), 'w') as file:
 | |
|                     json.dump(process_status, file, indent=2)
 | |
| 
 | |
|             if postprocess_shutdown:
 | |
|                 sys.exit()
 | |
| 
 | |
| #TODO - SET BELOW TO UTILITY
 | |
| 
 | |
| def reset_settings(prev_settings):
 | |
|     scene = bpy.context.scene
 | |
|     cycles = scene.cycles
 | |
| 
 | |
|     cycles.samples = int(prev_settings[0])
 | |
|     cycles.max_bounces = int(prev_settings[1])
 | |
|     cycles.diffuse_bounces = int(prev_settings[2])
 | |
|     cycles.glossy_bounces = int(prev_settings[3])
 | |
|     cycles.transparent_max_bounces = int(prev_settings[4])
 | |
|     cycles.transmission_bounces = int(prev_settings[5])
 | |
|     cycles.volume_bounces = int(prev_settings[6])
 | |
|     cycles.caustics_reflective = prev_settings[7]
 | |
|     cycles.caustics_refractive = prev_settings[8]
 | |
|     cycles.device = prev_settings[9]
 | |
|     scene.render.engine = prev_settings[10]
 | |
|     bpy.context.view_layer.objects.active = prev_settings[11]
 | |
|     scene.render.resolution_x = prev_settings[13][0]
 | |
|     scene.render.resolution_y = prev_settings[13][1]
 | |
|     
 | |
|     #for obj in prev_settings[12]:
 | |
|     #    obj.select_set(True)
 | |
| 
 | |
| def naming_check():
 | |
| 
 | |
|     for obj in bpy.context.scene.objects:
 | |
|         if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
| 
 | |
|             if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
| 
 | |
|                 if obj.name != "":
 | |
| 
 | |
|                     if "_" in obj.name:
 | |
|                         obj.name = obj.name.replace("_",".")
 | |
|                     if " " in obj.name:
 | |
|                         obj.name = obj.name.replace(" ",".")
 | |
|                     if "[" in obj.name:
 | |
|                         obj.name = obj.name.replace("[",".")
 | |
|                     if "]" in obj.name:
 | |
|                         obj.name = obj.name.replace("]",".")
 | |
|                     if "ø" in obj.name:
 | |
|                         obj.name = obj.name.replace("ø","oe")
 | |
|                     if "æ" in obj.name:
 | |
|                         obj.name = obj.name.replace("æ","ae")
 | |
|                     if "å" in obj.name:
 | |
|                         obj.name = obj.name.replace("å","aa")
 | |
|                     if "/" in obj.name:
 | |
|                         obj.name = obj.name.replace("/",".")
 | |
| 
 | |
|                     for slot in obj.material_slots:
 | |
|                         if "_" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("_",".")
 | |
|                         if " " in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace(" ",".")
 | |
|                         if "[" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("[",".")
 | |
|                         if "[" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("]",".")
 | |
|                         if "ø" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("ø","oe")
 | |
|                         if "æ" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("æ","ae")
 | |
|                         if "å" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("å","aa")
 | |
|                         if "/" in slot.material.name:
 | |
|                             slot.material.name = slot.material.name.replace("/",".")
 | |
| 
 | |
| def opencv_check():
 | |
| 
 | |
|     cv2 = util.find_spec("cv2")
 | |
| 
 | |
|     if cv2 is not None:
 | |
|         return 0
 | |
|     else:
 | |
|         return 1
 | |
| 
 | |
| def check_save():
 | |
|     if not bpy.data.is_saved:
 | |
| 
 | |
|         return 1
 | |
| 
 | |
|     else:
 | |
| 
 | |
|         return 0
 | |
| 
 | |
| def check_denoiser():
 | |
| 
 | |
|     if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|         print("Checking denoiser path")
 | |
| 
 | |
|     scene = bpy.context.scene
 | |
| 
 | |
|     if scene.TLM_SceneProperties.tlm_denoise_use:
 | |
| 
 | |
|         if scene.TLM_SceneProperties.tlm_denoise_engine == "OIDN":
 | |
| 
 | |
|             oidnPath = scene.TLM_OIDNEngineProperties.tlm_oidn_path
 | |
| 
 | |
|             if scene.TLM_OIDNEngineProperties.tlm_oidn_path == "":
 | |
|                 return 1
 | |
| 
 | |
|             if platform.system() == "Windows":
 | |
|                 if not scene.TLM_OIDNEngineProperties.tlm_oidn_path.endswith(".exe"):
 | |
|                     return 1
 | |
|                 else:
 | |
|                     if os.path.isfile(bpy.path.abspath(scene.TLM_OIDNEngineProperties.tlm_oidn_path)):
 | |
|                         return 0
 | |
|                     else:
 | |
|                         return 1
 | |
|             else:
 | |
|                 return 0
 | |
| 
 | |
| def check_materials():
 | |
|     for obj in bpy.context.scene.objects:
 | |
|         if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects:
 | |
|             if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                 for slot in obj.material_slots:
 | |
|                     mat = slot.material
 | |
| 
 | |
|                     if mat is None:
 | |
|                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose:
 | |
|                             print("MatNone")
 | |
|                         mat = bpy.data.materials.new(name="Material")
 | |
|                         mat.use_nodes = True
 | |
|                         slot.material = mat
 | |
| 
 | |
|                     nodes = mat.node_tree.nodes
 | |
| 
 | |
|                     #TODO FINISH MATERIAL CHECK -> Nodes check
 | |
|                     #Afterwards, redo build/utility
 | |
| 
 | |
| def sec_to_hours(seconds):
 | |
|     a=str(seconds//3600)
 | |
|     b=str((seconds%3600)//60)
 | |
|     c=str(round((seconds%3600)%60,1))
 | |
|     d=["{} hours {} mins {} seconds".format(a, b, c)]
 | |
|     return d
 | |
| 
 | |
| def setMode():
 | |
| 
 | |
|     obj = bpy.context.scene.objects[0]
 | |
|     bpy.context.view_layer.objects.active = obj
 | |
|     obj.select_set(True)
 | |
| 
 | |
|     hidden = False
 | |
| 
 | |
|     if obj.hide_get():
 | |
|         hidden = True
 | |
|     if obj.hide_viewport:
 | |
|         hidden = True
 | |
|     if obj.hide_render:
 | |
|         hidden = True
 | |
| 
 | |
|     if not hidden:
 | |
|         bpy.ops.object.mode_set(mode='OBJECT')
 | |
| 
 | |
|     #TODO Make some checks that returns to previous selection
 | |
| 
 | |
| def setGui(mode):
 | |
| 
 | |
|     if mode == 0:
 | |
| 
 | |
|         context = bpy.context
 | |
|         driver = bpy.app.driver_namespace
 | |
| 
 | |
|         if "TLM_UI" in driver:
 | |
|             driver["TLM_UI"].remove_handle()
 | |
| 
 | |
|     if mode == 1:
 | |
| 
 | |
|         #bpy.context.area.tag_redraw()
 | |
|         context = bpy.context
 | |
|         driver = bpy.app.driver_namespace
 | |
|         driver["TLM_UI"] = Viewport.ViewportDraw(context, "Building Lightmaps")
 | |
| 
 | |
|         bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
 | |
| 
 | |
| def checkAtlasSize():
 | |
| 
 | |
|     overflow = False
 | |
| 
 | |
|     scene = bpy.context.scene
 | |
| 
 | |
|     if scene.TLM_EngineProperties.tlm_setting_supersample == "2x":
 | |
|         supersampling_scale = 2
 | |
|     elif scene.TLM_EngineProperties.tlm_setting_supersample == "4x":
 | |
|         supersampling_scale = 4
 | |
|     else:
 | |
|         supersampling_scale = 1
 | |
| 
 | |
|     for atlas in bpy.context.scene.TLM_PostAtlasList:
 | |
| 
 | |
|         atlas_resolution = int(int(atlas.tlm_atlas_lightmap_resolution) / int(scene.TLM_EngineProperties.tlm_resolution_scale) * int(supersampling_scale))
 | |
| 
 | |
|         utilized = 0
 | |
|         atlasUsedArea = 0
 | |
| 
 | |
|         for obj in bpy.context.scene.objects:
 | |
|             if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use:
 | |
|                 if obj.TLM_ObjectProperties.tlm_postpack_object:
 | |
|                     if obj.TLM_ObjectProperties.tlm_postatlas_pointer == atlas.name:
 | |
|                         
 | |
|                         atlasUsedArea += int(obj.TLM_ObjectProperties.tlm_mesh_lightmap_resolution) ** 2
 | |
| 
 | |
|         utilized = atlasUsedArea / (int(atlas_resolution) ** 2)
 | |
|         if (utilized * 100) > 100:
 | |
|             overflow = True
 | |
|             print("Overflow for: " + str(atlas.name))
 | |
| 
 | |
|     if overflow == True:
 | |
|         return True
 | |
|     else:
 | |
|         return False
 | |
| 
 |