forked from LeenkxTeam/LNXSDK
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
|
||
|
|