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