From 4004816208553e4d7369a96f62a86f539f9b4c08 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 24 Jan 2021 21:07:14 +0100 Subject: [PATCH] GUI, background fixes, further octane work, image tools --- addon/assets/TLM_Overlay.png | Bin 0 -> 12898 bytes addon/operators/imagetools.py | 50 ++++++++++++- addon/panels/image.py | 8 +++ addon/panels/scene.py | 84 +++++++++++++--------- addon/properties/image.py | 4 ++ addon/properties/renderer/octanerender.py | 6 +- addon/utility/build.py | 52 +++++++++++--- addon/utility/gui/Viewport.py | 66 +++++++++++++++++ addon/utility/octane/configure.py | 14 +++- addon/utility/octane/lightmap2.py | 71 ++++++++++++++++++ 10 files changed, 309 insertions(+), 46 deletions(-) create mode 100644 addon/assets/TLM_Overlay.png create mode 100644 addon/utility/gui/Viewport.py create mode 100644 addon/utility/octane/lightmap2.py diff --git a/addon/assets/TLM_Overlay.png b/addon/assets/TLM_Overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..04e40474514f004c4fd9b006093b470a2707d201 GIT binary patch literal 12898 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 wFFVLPWKsH%WbIc2FSS!o>@k>Z!yQG 1: - rows = 4 - row = layout.row() - row.template_list("TLM_UL_PostAtlasList", "PostList", scene, "TLM_PostAtlasList", scene, "TLM_PostAtlasListItem", rows=rows) - col = row.column(align=True) - col.operator("tlm_postatlaslist.new_item", icon='ADD', text="") - col.operator("tlm_postatlaslist.delete_item", icon='REMOVE', text="") - if postatlasListItem >= 0 and len(postatlasList) > 0: - item = postatlasList[postatlasListItem] - layout.prop(item, "tlm_atlas_lightmap_resolution") + cv2 = importlib.util.find_spec("cv2") - #Below list object counter - amount = 0 - utilized = 0 - atlasUsedArea = 0 - atlasSize = item.tlm_atlas_lightmap_resolution + if cv2 is None: - for obj in bpy.data.objects: - if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: - if obj.TLM_ObjectProperties.tlm_postpack_object: - if obj.TLM_ObjectProperties.tlm_postatlas_pointer == item.name: - amount = amount + 1 - - atlasUsedArea += int(obj.TLM_ObjectProperties.tlm_mesh_lightmap_resolution) ** 2 + row = layout.row(align=True) + row.label(text="OpenCV is not installed. Install it through preferences.") - row = layout.row() - row.prop(item, "tlm_atlas_repack_on_cleanup") + else: - #TODO SET A CHECK FOR THIS! ADD A CV2 CHECK TO UTILITY! - cv2 = True + rows = 2 + if len(atlasList) > 1: + rows = 4 + row = layout.row() + row.template_list("TLM_UL_PostAtlasList", "PostList", scene, "TLM_PostAtlasList", scene, "TLM_PostAtlasListItem", rows=rows) + col = row.column(align=True) + col.operator("tlm_postatlaslist.new_item", icon='ADD', text="") + col.operator("tlm_postatlaslist.delete_item", icon='REMOVE', text="") + + if postatlasListItem >= 0 and len(postatlasList) > 0: + item = postatlasList[postatlasListItem] + layout.prop(item, "tlm_atlas_lightmap_resolution") + + #Below list object counter + amount = 0 + utilized = 0 + atlasUsedArea = 0 + atlasSize = item.tlm_atlas_lightmap_resolution + + for obj in bpy.data.objects: + if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: + if obj.TLM_ObjectProperties.tlm_postpack_object: + if obj.TLM_ObjectProperties.tlm_postatlas_pointer == item.name: + amount = amount + 1 + + atlasUsedArea += int(obj.TLM_ObjectProperties.tlm_mesh_lightmap_resolution) ** 2 - if cv2: row = layout.row() - row.prop(item, "tlm_atlas_dilation") - layout.label(text="Objects: " + str(amount)) + row.prop(item, "tlm_atlas_repack_on_cleanup") + + #TODO SET A CHECK FOR THIS! ADD A CV2 CHECK TO UTILITY! + cv2 = True - utilized = atlasUsedArea / (int(atlasSize) ** 2) - layout.label(text="Utilized: " + str(utilized * 100) + "%") + if cv2: + row = layout.row() + row.prop(item, "tlm_atlas_dilation") + layout.label(text="Objects: " + str(amount)) - if (utilized * 100) > 100: - layout.label(text="Warning! Overflow not yet supported") + utilized = atlasUsedArea / (int(atlasSize) ** 2) + layout.label(text="Utilized: " + str(utilized * 100) + "%") + + if (utilized * 100) > 100: + layout.label(text="Warning! Overflow not yet supported") row = layout.row() row.label(text="Build Environment Probes") @@ -537,7 +549,9 @@ def draw(self, context): row.prop(sceneProperties, "tlm_environment_probe_resolution") row = layout.row() row.prop(sceneProperties, "tlm_create_spherical") + if sceneProperties.tlm_create_spherical: + row = layout.row() row.prop(sceneProperties, "tlm_invert_direction") row = layout.row() diff --git a/addon/properties/image.py b/addon/properties/image.py index e0af681..a81169c 100644 --- a/addon/properties/image.py +++ b/addon/properties/image.py @@ -20,3 +20,7 @@ class TLM_ImageProperties(bpy.types.PropertyGroup): description="TODO", default='Lanczos') + tlm_image_cache_switch : BoolProperty( + name="Cache for quickswitch", + description="Caches scaled images for quick switching", + default=True) \ No newline at end of file diff --git a/addon/properties/renderer/octanerender.py b/addon/properties/renderer/octanerender.py index fb94ed2..8c66cf1 100644 --- a/addon/properties/renderer/octanerender.py +++ b/addon/properties/renderer/octanerender.py @@ -3,4 +3,8 @@ class TLM_OctanerenderSceneProperties(bpy.types.PropertyGroup): - pass \ No newline at end of file + tlm_lightmap_savedir : StringProperty( + name="Lightmap Directory", + description="TODO", + default="Lightmaps", + subtype="FILE_PATH") \ No newline at end of file diff --git a/addon/utility/build.py b/addon/utility/build.py index acc2a6c..948371b 100644 --- a/addon/utility/build.py +++ b/addon/utility/build.py @@ -1,12 +1,14 @@ import bpy, os, subprocess, sys, platform, aud, json, datetime, socket -import threading + from . import encoding, pack from . cycles import lightmap, prepare, nodes, cache from . luxcore import setup -from . octane import configure +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 @@ -31,6 +33,9 @@ def prepare_build(self=0, background_mode=False, shutdown_after_build=False): scene = bpy.context.scene sceneProperties = scene.TLM_SceneProperties + if not background_mode: + setGui(1) + #Timer start here bound to global if check_save(): @@ -186,12 +191,15 @@ def distribute_building(): json.dump(process_status, file, indent=2) if (2, 91, 0) > bpy.app.version: - 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) + 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: - 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) - - - + 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) if bpy.context.scene.TLM_SceneProperties.tlm_verbose: print("Started process: " + str(bpy.app.driver_namespace["tlm_process"]) + " at " + str(datetime.datetime.now())) @@ -267,7 +275,8 @@ def begin_build(): pass if sceneProperties.tlm_lightmap_engine == "OctaneRender": - pass + + lightmap2.bake() #Denoiser if sceneProperties.tlm_denoise_use: @@ -704,6 +713,9 @@ def manage_build(background_pass=False): print("Lightmap building finished") + if not background_pass: + setGui(0) + if bpy.app.background: if bpy.context.scene.TLM_SceneProperties.tlm_verbose: @@ -852,10 +864,34 @@ def sec_to_hours(seconds): return d def setMode(): + + obj = bpy.context.scene.objects[0] + bpy.context.view_layer.objects.active = obj + obj.select_set(True) + 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 diff --git a/addon/utility/gui/Viewport.py b/addon/utility/gui/Viewport.py new file mode 100644 index 0000000..c18a911 --- /dev/null +++ b/addon/utility/gui/Viewport.py @@ -0,0 +1,66 @@ +import bpy, blf, bgl, os, gpu +from gpu_extras.batch import batch_for_shader + +class ViewportDraw: + + def __init__(self, context, text): + + bakefile = "TLM_Overlay.png" + scriptDir = os.path.dirname(os.path.realpath(__file__)) + bakefile_path = os.path.abspath(os.path.join(scriptDir, '..', '..', 'assets/' + bakefile)) + + bpy.ops.image.open(filepath=bakefile_path) + + #print("Self path: " + bakefile_path) + + image_name = "TLM_Overlay.png" + + image = bpy.data.images[image_name] + + x = 15 + y = 15 + w = 400 + h = 200 + + self.shader = gpu.shader.from_builtin('2D_IMAGE') + self.batch = batch_for_shader( + self.shader, 'TRI_FAN', + { + "pos": ((x, y), (x+w, y), (x+w, y+h), (x, y+h)), + "texCoord": ((0, 0), (1, 0), (1, 1), (0, 1)), + }, + ) + + if image.gl_load(): + raise Exception() + + self.text = text + self.image = image + #self.handle = bpy.types.SpaceView3D.draw_handler_add(self.draw_text_callback, (context,), 'WINDOW', 'POST_PIXEL') + self.handle2 = bpy.types.SpaceView3D.draw_handler_add(self.draw_image_callback, (context,), 'WINDOW', 'POST_PIXEL') + + def draw_text_callback(self, context): + + font_id = 0 + blf.position(font_id, 15, 15, 0) + blf.size(font_id, 20, 72) + blf.draw(font_id, "%s" % (self.text)) + + def draw_image_callback(self, context): + + bgl.glEnable(bgl.GL_BLEND) + bgl.glActiveTexture(bgl.GL_TEXTURE0) + bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.image.bindcode) + + self.shader.bind() + self.shader.uniform_int("image", 0) + self.batch.draw(self.shader) + bgl.glDisable(bgl.GL_BLEND) + + def update_text(self, text): + + self.text = text + + def remove_handle(self): + #bpy.types.SpaceView3D.draw_handler_remove(self.handle, 'WINDOW') + bpy.types.SpaceView3D.draw_handler_remove(self.handle2, 'WINDOW') \ No newline at end of file diff --git a/addon/utility/octane/configure.py b/addon/utility/octane/configure.py index 360a3a3..b9364c7 100644 --- a/addon/utility/octane/configure.py +++ b/addon/utility/octane/configure.py @@ -94,6 +94,7 @@ def configure_meshes(self): print("UV map created for obj: " + obj.name) uvmap = uv_layers.new(name=uv_channel) uv_layers.active_index = len(uv_layers) - 1 + print("Setting active UV to: " + uv_layers.active_index) #If lightmap if obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "Lightmap": @@ -139,9 +140,20 @@ def configure_meshes(self): uv_layers.active_index = i break + set_camera() + def set_camera(): - pass + cam_name = "TLM-BakeCam" + + if not cam_name in bpy.context.scene: + camera = bpy.data.cameras.new(cam_name) + camobj_name = "TLM-BakeCam-obj" + cam_obj = bpy.data.objects.new(camobj_name, camera) + bpy.context.collection.objects.link(cam_obj) + cam_obj.location = ((0,0,0)) + + bpy.context.scene.camera = cam_obj def set_settings(): diff --git a/addon/utility/octane/lightmap2.py b/addon/utility/octane/lightmap2.py new file mode 100644 index 0000000..1d281b4 --- /dev/null +++ b/addon/utility/octane/lightmap2.py @@ -0,0 +1,71 @@ +import bpy, os + +def bake(): + + cam_name = "TLM-BakeCam-obj" + + if cam_name in bpy.context.scene.objects: + + print("Camera found...") + + camera = bpy.context.scene.objects[cam_name] + + camera.data.octane.baking_camera = True + + for obj in bpy.data.objects: + bpy.ops.object.select_all(action='DESELECT') + obj.select_set(False) + + iterNum = 2 + currentIterNum = 1 + + for obj in bpy.data.objects: + if obj.type == "MESH": + if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: + iterNum = iterNum + 1 + + if iterNum > 1: + iterNum = iterNum - 1 + + for obj in bpy.data.objects: + if obj.type == 'MESH': + if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: + + currentIterNum = currentIterNum + 1 + + scene = bpy.context.scene + + print("Baking obj: " + obj.name) + + print("Baking ID: " + str(currentIterNum) + " out of " + str(iterNum)) + + bpy.ops.object.select_all(action='DESELECT') + + camera.data.octane.baking_group_id = currentIterNum + + savedir = os.path.dirname(bpy.data.filepath) + user_dir = scene.TLM_Engine3Properties.tlm_lightmap_savedir + directory = os.path.join(savedir, user_dir) + + image_settings = bpy.context.scene.render.image_settings + image_settings.file_format = "HDR" + image_settings.color_depth = '32' + + filename = os.path.join(directory, "LM") + "_" + obj.name + ".hdr" + bpy.context.scene.render.filepath = filename + + resolution = int(obj.TLM_ObjectProperties.tlm_mesh_lightmap_resolution) + + bpy.context.scene.render.resolution_x = resolution + bpy.context.scene.render.resolution_y = resolution + + bpy.ops.render.render(write_still=True) + + else: + + print("No baking camera found") + + + + + print("Baking in Octane!") \ No newline at end of file