757 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			757 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import bpy, importlib, math | ||
|  | from bpy.props import * | ||
|  | from bpy.types import Menu, Panel | ||
|  | from .. utility import icon | ||
|  | from .. properties.denoiser import oidn, optix | ||
|  | 
 | ||
|  | class TLM_PT_Panel(bpy.types.Panel): | ||
|  |     bl_label = "The Lightmapper" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  | 
 | ||
|  | class TLM_PT_Groups(bpy.types.Panel): | ||
|  |     bl_label = "Lightmap Groups" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "TLM_PT_Panel" | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_lightmap_engine == "Cycles": | ||
|  | 
 | ||
|  |             rows = 2 | ||
|  |             #if len(atlasList) > 1: | ||
|  |             #    rows = 4 | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.label(text="Lightmap Group List") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.template_list("TLM_UL_GroupList", "Lightmap Groups", scene, "TLM_GroupList", scene, "TLM_GroupListItem", rows=rows) | ||
|  |             col = row.column(align=True) | ||
|  |             col.operator("tlm_atlaslist.new_item", icon='ADD', text="") | ||
|  |             #col.operator("tlm_atlaslist.delete_item", icon='REMOVE', text="") | ||
|  |             #col.menu("TLM_MT_AtlasListSpecials", icon='DOWNARROW_HLT', text="") | ||
|  | 
 | ||
|  | class TLM_PT_Settings(bpy.types.Panel): | ||
|  |     bl_label = "Settings" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  | 
 | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         #We list LuxCoreRender as available, by default we assume Cycles exists | ||
|  |         row.prop(sceneProperties, "tlm_lightmap_engine") | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_lightmap_engine == "Cycles": | ||
|  | 
 | ||
|  |             #CYCLES SETTINGS HERE | ||
|  |             engineProperties = scene.TLM_EngineProperties | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.label(text="General Settings") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.build_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.clean_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.explore_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_apply_on_unwrap") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_headless") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_alert_on_finish") | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_alert_on_finish: | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.prop(sceneProperties, "tlm_alert_sound") | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_verbose") | ||
|  |             #row = layout.row(align=True) | ||
|  |             #row.prop(sceneProperties, "tlm_compile_statistics") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_override_bg_color") | ||
|  |             if sceneProperties.tlm_override_bg_color: | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.prop(sceneProperties, "tlm_override_color") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_reset_uv") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_apply_modifiers") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_keep_baked_files") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_repartition_on_clean") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_save_preprocess_lightmaps") | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             try: | ||
|  |                 if bpy.context.scene["TLM_Buildstat"] is not None: | ||
|  |                     row.label(text="Last build completed in: " + str(bpy.context.scene["TLM_Buildstat"][0])) | ||
|  |             except: | ||
|  |                 pass | ||
|  |              | ||
|  |             row = layout.row(align=True) | ||
|  |             row.label(text="Cycles Settings") | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_mode") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_quality") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_resolution_scale") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_bake_mode") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_target") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_lighting_mode") | ||
|  |             # if scene.TLM_EngineProperties.tlm_lighting_mode == "combinedao" or scene.TLM_EngineProperties.tlm_lighting_mode == "indirectao": | ||
|  |             #     row = layout.row(align=True) | ||
|  |             #     row.prop(engineProperties, "tlm_premultiply_ao") | ||
|  |             if scene.TLM_EngineProperties.tlm_bake_mode == "Background": | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.label(text="Warning! Background mode is currently unstable", icon_value=2) | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.prop(sceneProperties, "tlm_network_render") | ||
|  |                 if sceneProperties.tlm_network_render: | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_network_paths") | ||
|  |                     #row = layout.row(align=True) | ||
|  |                     #row.prop(sceneProperties, "tlm_network_dir") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_caching_mode") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_directional_mode") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_lightmap_savedir") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_dilation_margin") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_exposure_multiplier") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_setting_supersample") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_metallic_clamp") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_texture_interpolation") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_texture_extrapolation") | ||
|  | 
 | ||
|  |          | ||
|  |          | ||
|  |         # elif sceneProperties.tlm_lightmap_engine == "LuxCoreRender": | ||
|  | 
 | ||
|  |         #     engineProperties = scene.TLM_Engine2Properties | ||
|  |         #     row = layout.row(align=True) | ||
|  |         #     row.prop(engineProperties, "tlm_luxcore_dir") | ||
|  |         #     row = layout.row(align=True) | ||
|  |         #     row.operator("tlm.build_lightmaps") | ||
|  |         #     #LUXCORE SETTINGS HERE | ||
|  |         #     #luxcore_available = False | ||
|  | 
 | ||
|  |         #     #Look for Luxcorerender in the renderengine classes | ||
|  |         #     # for engine in bpy.types.RenderEngine.__subclasses__(): | ||
|  |         #     #     if engine.bl_idname == "LUXCORE": | ||
|  |         #     #         luxcore_available = True | ||
|  |         #     #         break | ||
|  | 
 | ||
|  |         #     # row = layout.row(align=True) | ||
|  |         #     # if not luxcore_available: | ||
|  |         #     #     row.label(text="Please install BlendLuxCore.") | ||
|  |         #     # else: | ||
|  |         #     #     row.label(text="LuxCoreRender not yet available.") | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_lightmap_engine == "OctaneRender": | ||
|  | 
 | ||
|  |             engineProperties = scene.TLM_Engine3Properties | ||
|  | 
 | ||
|  |             #LUXCORE SETTINGS HERE | ||
|  |             octane_available = True | ||
|  | 
 | ||
|  |              | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.build_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.clean_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.explore_lightmaps") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_verbose") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(engineProperties, "tlm_lightmap_savedir") | ||
|  |             row = layout.row(align=True) | ||
|  | 
 | ||
|  | class TLM_PT_Denoise(bpy.types.Panel): | ||
|  |     bl_label = "Denoise" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw_header(self, context): | ||
|  |         scene = context.scene | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         self.layout.prop(sceneProperties, "tlm_denoise_use", text="") | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         layout.active = sceneProperties.tlm_denoise_use | ||
|  | 
 | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         #row.prop(sceneProperties, "tlm_denoiser", expand=True) | ||
|  |         #row = layout.row(align=True) | ||
|  |         row.prop(sceneProperties, "tlm_denoise_engine", expand=True) | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_denoise_engine == "Integrated": | ||
|  |             row.label(text="No options for Integrated.") | ||
|  |         elif sceneProperties.tlm_denoise_engine == "OIDN": | ||
|  |             denoiseProperties = scene.TLM_OIDNEngineProperties | ||
|  |             row.prop(denoiseProperties, "tlm_oidn_path") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_oidn_verbose") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_oidn_threads") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_oidn_maxmem") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_oidn_affinity") | ||
|  |             # row = layout.row(align=True) | ||
|  |             # row.prop(denoiseProperties, "tlm_denoise_ao") | ||
|  |         elif sceneProperties.tlm_denoise_engine == "Optix": | ||
|  |             denoiseProperties = scene.TLM_OptixEngineProperties | ||
|  |             row.prop(denoiseProperties, "tlm_optix_path") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_optix_verbose") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(denoiseProperties, "tlm_optix_maxmem") | ||
|  |             #row = layout.row(align=True) | ||
|  |             #row.prop(denoiseProperties, "tlm_denoise_ao") | ||
|  | 
 | ||
|  | class TLM_PT_Filtering(bpy.types.Panel): | ||
|  |     bl_label = "Filtering" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw_header(self, context): | ||
|  |         scene = context.scene | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         self.layout.prop(sceneProperties, "tlm_filtering_use", text="") | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         layout.active = sceneProperties.tlm_filtering_use | ||
|  |         #row = layout.row(align=True) | ||
|  |         #row.label(text="TODO MAKE CHECK") | ||
|  |         #row = layout.row(align=True) | ||
|  |         #row.prop(sceneProperties, "tlm_filtering_engine", expand=True) | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_filtering_engine == "OpenCV": | ||
|  | 
 | ||
|  |             cv2 = importlib.util.find_spec("cv2") | ||
|  | 
 | ||
|  |             if cv2 is None: | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.label(text="OpenCV is not installed. Install it through preferences.") | ||
|  |             else: | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.prop(scene.TLM_SceneProperties, "tlm_filtering_mode") | ||
|  |                 row = layout.row(align=True) | ||
|  |                 if scene.TLM_SceneProperties.tlm_filtering_mode == "Gaussian": | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_gaussian_strength") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_iterations") | ||
|  |                 elif scene.TLM_SceneProperties.tlm_filtering_mode == "Box": | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_box_strength") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_iterations") | ||
|  | 
 | ||
|  |                 elif scene.TLM_SceneProperties.tlm_filtering_mode == "Bilateral": | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_bilateral_diameter") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_bilateral_color_deviation") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_bilateral_coordinate_deviation") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_iterations") | ||
|  |                 else: | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_median_kernel", expand=True) | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(scene.TLM_SceneProperties, "tlm_filtering_iterations") | ||
|  |         else: | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(scene.TLM_SceneProperties, "tlm_numpy_filtering_mode") | ||
|  | 
 | ||
|  | 
 | ||
|  | class TLM_PT_Encoding(bpy.types.Panel): | ||
|  |     bl_label = "Encoding" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw_header(self, context): | ||
|  |         scene = context.scene | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         self.layout.prop(sceneProperties, "tlm_encoding_use", text="") | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         layout.active = sceneProperties.tlm_encoding_use | ||
|  | 
 | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         if scene.TLM_EngineProperties.tlm_bake_mode == "Background": | ||
|  |             row.label(text="Encoding options disabled in background mode") | ||
|  |             row = layout.row(align=True) | ||
|  | 
 | ||
|  |         else: | ||
|  | 
 | ||
|  |             row.prop(sceneProperties, "tlm_encoding_device", expand=True) | ||
|  |             row = layout.row(align=True) | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_encoding_device == "CPU": | ||
|  |                 row.prop(sceneProperties, "tlm_encoding_mode_a", expand=True) | ||
|  |             else: | ||
|  |                 row.prop(sceneProperties, "tlm_encoding_mode_b", expand=True) | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_encoding_device == "CPU": | ||
|  |                 if sceneProperties.tlm_encoding_mode_a == "RGBM": | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_encoding_range") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_decoder_setup") | ||
|  |                 if sceneProperties.tlm_encoding_mode_a == "RGBD": | ||
|  |                     pass | ||
|  |                 if sceneProperties.tlm_encoding_mode_a == "HDR": | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_format") | ||
|  |             else: | ||
|  | 
 | ||
|  |                 if sceneProperties.tlm_encoding_mode_b == "RGBM": | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_encoding_range") | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_decoder_setup") | ||
|  | 
 | ||
|  |                 if sceneProperties.tlm_encoding_mode_b == "LogLuv" and sceneProperties.tlm_encoding_device == "GPU": | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_decoder_setup") | ||
|  |                     if sceneProperties.tlm_decoder_setup: | ||
|  |                         row = layout.row(align=True) | ||
|  |                         row.prop(sceneProperties, "tlm_split_premultiplied") | ||
|  |                 if sceneProperties.tlm_encoding_mode_b == "HDR": | ||
|  |                     row = layout.row(align=True) | ||
|  |                     row.prop(sceneProperties, "tlm_format") | ||
|  | 
 | ||
|  | class TLM_PT_Utility(bpy.types.Panel): | ||
|  |     bl_label = "Utilities" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  | 
 | ||
|  |         row = layout.row(align=True) | ||
|  |         row.label(text="Enable Lightmaps for set") | ||
|  |         row = layout.row(align=True) | ||
|  |         row.prop(sceneProperties, "tlm_utility_context") | ||
|  |         row = layout.row(align=True) | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_utility_context == "SetBatching": | ||
|  | 
 | ||
|  |             row.operator("tlm.enable_set") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_utility_set") | ||
|  |             row = layout.row(align=True) | ||
|  |             #row.label(text="ABCD") | ||
|  |             row.prop(sceneProperties, "tlm_mesh_lightmap_unwrap_mode") | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_mesh_lightmap_unwrap_mode == "AtlasGroupA": | ||
|  | 
 | ||
|  |                 if scene.TLM_AtlasListItem >= 0 and len(scene.TLM_AtlasList) > 0: | ||
|  |                     row = layout.row() | ||
|  |                     item = scene.TLM_AtlasList[scene.TLM_AtlasListItem] | ||
|  |                     row.prop_search(sceneProperties, "tlm_atlas_pointer", scene, "TLM_AtlasList", text='Atlas Group') | ||
|  |                 else: | ||
|  |                     row = layout.label(text="Add Atlas Groups from the scene lightmapping settings.") | ||
|  | 
 | ||
|  |             else: | ||
|  | 
 | ||
|  |                 row = layout.row() | ||
|  |                 row.prop(sceneProperties, "tlm_postpack_object") | ||
|  |                 row = layout.row() | ||
|  |              | ||
|  |                 if sceneProperties.tlm_postpack_object and sceneProperties.tlm_mesh_lightmap_unwrap_mode != "AtlasGroupA": | ||
|  | 
 | ||
|  |                     if scene.TLM_PostAtlasListItem >= 0 and len(scene.TLM_PostAtlasList) > 0: | ||
|  |                         row = layout.row() | ||
|  |                         item = scene.TLM_PostAtlasList[scene.TLM_PostAtlasListItem] | ||
|  |                         row.prop_search(sceneProperties, "tlm_postatlas_pointer", scene, "TLM_PostAtlasList", text='Atlas Group') | ||
|  |                         row = layout.row() | ||
|  | 
 | ||
|  |                     else: | ||
|  |                         row = layout.label(text="Add Atlas Groups from the scene lightmapping settings.") | ||
|  |                         row = layout.row() | ||
|  | 
 | ||
|  |                 row.prop(sceneProperties, "tlm_mesh_unwrap_margin") | ||
|  |                 row = layout.row() | ||
|  |                 row.prop(sceneProperties, "tlm_resolution_weight") | ||
|  | 
 | ||
|  |                 if sceneProperties.tlm_resolution_weight == "Single": | ||
|  |                     row = layout.row() | ||
|  |                     row.prop(sceneProperties, "tlm_mesh_lightmap_resolution") | ||
|  |                 else: | ||
|  |                     row = layout.row() | ||
|  |                     row.prop(sceneProperties, "tlm_resolution_min") | ||
|  |                     row = layout.row() | ||
|  |                     row.prop(sceneProperties, "tlm_resolution_max") | ||
|  | 
 | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.disable_selection") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.select_lightmapped_objects") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.remove_uv_selection") | ||
|  |          | ||
|  |         elif sceneProperties.tlm_utility_context == "EnvironmentProbes": | ||
|  | 
 | ||
|  |             row.label(text="Environment Probes") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.build_environmentprobe") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.clean_environmentprobe") | ||
|  |             row = layout.row() | ||
|  |             row.prop(sceneProperties, "tlm_environment_probe_engine") | ||
|  |             row = layout.row() | ||
|  |             row.prop(sceneProperties, "tlm_cmft_path") | ||
|  |             row = layout.row() | ||
|  |             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() | ||
|  |                 row.prop(sceneProperties, "tlm_write_sh") | ||
|  |                 row = layout.row() | ||
|  |                 row.prop(sceneProperties, "tlm_write_radiance") | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_utility_context == "LoadLightmaps": | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row.label(text="Load lightmaps") | ||
|  |             row = layout.row() | ||
|  |             row.prop(sceneProperties, "tlm_load_folder") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.load_lightmaps") | ||
|  |             row = layout.row() | ||
|  |             row.prop(sceneProperties, "tlm_load_atlas") | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_utility_context == "MaterialAdjustment": | ||
|  |          | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_utility_set") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.disable_specularity") | ||
|  |             row.operator("tlm.disable_metallic") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.prop(sceneProperties, "tlm_remove_met_spec_link") | ||
|  |             row = layout.row(align=True) | ||
|  |             row.operator("tlm.remove_empty_images") | ||
|  |             row = layout.row(align=True) | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_utility_context == "NetworkRender": | ||
|  | 
 | ||
|  |             row.label(text="Network Rendering") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.start_server") | ||
|  |             layout.label(text="Atlas Groups") | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_utility_context == "TexelDensity": | ||
|  | 
 | ||
|  |             row.label(text="Texel Density Utilies") | ||
|  |             row = layout.row() | ||
|  | 
 | ||
|  |         elif sceneProperties.tlm_utility_context == "GLTFUtil": | ||
|  | 
 | ||
|  |             row.label(text="GLTF material utilities") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.add_gltf_node") | ||
|  |             row = layout.row() | ||
|  |             row.operator("tlm.shift_multiply_links") | ||
|  | 
 | ||
|  | class TLM_PT_Selection(bpy.types.Panel): | ||
|  |     bl_label = "Selection" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         layout.use_property_split = True | ||
|  |         layout.use_property_decorate = False | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  | 
 | ||
|  |         row = layout.row(align=True) | ||
|  |         row.operator("tlm.enable_selection") | ||
|  |         row = layout.row(align=True) | ||
|  |         row.operator("tlm.disable_selection") | ||
|  |         row = layout.row(align=True) | ||
|  |         row.prop(sceneProperties, "tlm_override_object_settings") | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_override_object_settings: | ||
|  | 
 | ||
|  |             row = layout.row(align=True) | ||
|  |             row = layout.row() | ||
|  |             row.prop(sceneProperties, "tlm_mesh_lightmap_unwrap_mode") | ||
|  |             row = layout.row() | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_mesh_lightmap_unwrap_mode == "AtlasGroupA": | ||
|  | 
 | ||
|  |                 if scene.TLM_AtlasListItem >= 0 and len(scene.TLM_AtlasList) > 0: | ||
|  |                     row = layout.row() | ||
|  |                     item = scene.TLM_AtlasList[scene.TLM_AtlasListItem] | ||
|  |                     row.prop_search(sceneProperties, "tlm_atlas_pointer", scene, "TLM_AtlasList", text='Atlas Group') | ||
|  |                 else: | ||
|  |                     row = layout.label(text="Add Atlas Groups from the scene lightmapping settings.") | ||
|  | 
 | ||
|  |             else: | ||
|  |                 row = layout.row() | ||
|  |                 row.prop(sceneProperties, "tlm_postpack_object") | ||
|  |                 row = layout.row() | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_postpack_object and sceneProperties.tlm_mesh_lightmap_unwrap_mode != "AtlasGroupA": | ||
|  |                 if scene.TLM_PostAtlasListItem >= 0 and len(scene.TLM_PostAtlasList) > 0: | ||
|  |                     row = layout.row() | ||
|  |                     item = scene.TLM_PostAtlasList[scene.TLM_PostAtlasListItem] | ||
|  |                     row.prop_search(sceneProperties, "tlm_postatlas_pointer", scene, "TLM_PostAtlasList", text='Atlas Group') | ||
|  |                     row = layout.row() | ||
|  | 
 | ||
|  |                 else: | ||
|  |                     row = layout.label(text="Add Atlas Groups from the scene lightmapping settings.") | ||
|  |                     row = layout.row() | ||
|  | 
 | ||
|  |             if sceneProperties.tlm_mesh_lightmap_unwrap_mode != "AtlasGroupA": | ||
|  |                 row.prop(sceneProperties, "tlm_mesh_lightmap_resolution") | ||
|  |                 row = layout.row() | ||
|  |                 row.prop(sceneProperties, "tlm_mesh_unwrap_margin") | ||
|  | 
 | ||
|  |         row = layout.row(align=True) | ||
|  |         row.operator("tlm.remove_uv_selection") | ||
|  |         row = layout.row(align=True) | ||
|  |         row.operator("tlm.select_lightmapped_objects") | ||
|  |         # row = layout.row(align=True) | ||
|  |         # for addon in bpy.context.preferences.addons.keys(): | ||
|  |         #     if addon.startswith("Texel_Density"): | ||
|  |         #         row.operator("tlm.toggle_texel_density") | ||
|  |         #         row = layout.row(align=True) | ||
|  | 
 | ||
|  | class TLM_PT_Additional(bpy.types.Panel): | ||
|  |     bl_label = "Additional" | ||
|  |     bl_space_type = "PROPERTIES" | ||
|  |     bl_region_type = "WINDOW" | ||
|  |     bl_context = "render" | ||
|  |     bl_options = {'DEFAULT_CLOSED'} | ||
|  |     bl_parent_id = "LNX_PT_BakePanel" | ||
|  | 
 | ||
|  |     @classmethod  | ||
|  |     def poll(self, context): | ||
|  |         scene = context.scene | ||
|  |         return scene.lnx_bakemode == "Lightmap" | ||
|  | 
 | ||
|  |     def draw(self, context): | ||
|  |         layout = self.layout | ||
|  |         scene = context.scene | ||
|  |         sceneProperties = scene.TLM_SceneProperties | ||
|  |         atlasListItem = scene.TLM_AtlasListItem | ||
|  |         atlasList = scene.TLM_AtlasList | ||
|  |         postatlasListItem = scene.TLM_PostAtlasListItem | ||
|  |         postatlasList = scene.TLM_PostAtlasList | ||
|  | 
 | ||
|  |         row = layout.row() | ||
|  |         row.prop(sceneProperties, "tlm_atlas_mode", expand=True) | ||
|  | 
 | ||
|  |         if sceneProperties.tlm_atlas_mode == "Prepack": | ||
|  | 
 | ||
|  |             rows = 2 | ||
|  |             if len(atlasList) > 1: | ||
|  |                 rows = 4 | ||
|  |             row = layout.row() | ||
|  |             row.template_list("TLM_UL_AtlasList", "Atlas List", scene, "TLM_AtlasList", scene, "TLM_AtlasListItem", rows=rows) | ||
|  |             col = row.column(align=True) | ||
|  |             col.operator("tlm_atlaslist.new_item", icon='ADD', text="") | ||
|  |             col.operator("tlm_atlaslist.delete_item", icon='REMOVE', text="") | ||
|  |             col.menu("TLM_MT_AtlasListSpecials", icon='DOWNARROW_HLT', text="") | ||
|  | 
 | ||
|  |             if atlasListItem >= 0 and len(atlasList) > 0: | ||
|  |                 item = atlasList[atlasListItem] | ||
|  |                 layout.prop(item, "tlm_atlas_lightmap_unwrap_mode") | ||
|  |                 layout.prop(item, "tlm_atlas_lightmap_resolution") | ||
|  |                 layout.prop(item, "tlm_atlas_unwrap_margin") | ||
|  | 
 | ||
|  |                 amount = 0 | ||
|  | 
 | ||
|  |                 for obj in bpy.context.scene.objects: | ||
|  |                     if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: | ||
|  |                         if obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "AtlasGroupA": | ||
|  |                             if obj.TLM_ObjectProperties.tlm_atlas_pointer == item.name: | ||
|  |                                 amount = amount + 1 | ||
|  | 
 | ||
|  |                 layout.label(text="Objects: " + str(amount)) | ||
|  |                 layout.prop(item, "tlm_atlas_merge_samemat") | ||
|  | 
 | ||
|  |                 layout.prop(item, "tlm_use_uv_packer") | ||
|  |                 layout.prop(item, "tlm_uv_packer_padding") | ||
|  |                 layout.prop(item, "tlm_uv_packer_packing_engine") | ||
|  | 
 | ||
|  |         else: | ||
|  | 
 | ||
|  |             layout.label(text="Postpacking is unstable.") | ||
|  | 
 | ||
|  |             cv2 = importlib.util.find_spec("cv2") | ||
|  | 
 | ||
|  |             if cv2 is None: | ||
|  | 
 | ||
|  |                 row = layout.row(align=True) | ||
|  |                 row.label(text="OpenCV is not installed. Install it through preferences.") | ||
|  | 
 | ||
|  |             else: | ||
|  | 
 | ||
|  |                 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="") | ||
|  |                 col.menu("TLM_MT_PostAtlasListSpecials", icon='DOWNARROW_HLT', 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.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 == item.name: | ||
|  |                                     amount = amount + 1 | ||
|  |                                      | ||
|  |                                     atlasUsedArea += int(obj.TLM_ObjectProperties.tlm_mesh_lightmap_resolution) ** 2 | ||
|  | 
 | ||
|  |                     row = layout.row() | ||
|  |                     row.prop(item, "tlm_atlas_repack_on_cleanup") | ||
|  | 
 | ||
|  |                     #TODO SET A CHECK FOR THIS! ADD A CV2 CHECK TO UTILITY! | ||
|  |                     cv2 = True | ||
|  | 
 | ||
|  |                     if cv2: | ||
|  |                         row = layout.row() | ||
|  |                         row.prop(item, "tlm_atlas_dilation") | ||
|  |                     layout.label(text="Objects: " + str(amount)) | ||
|  | 
 | ||
|  |                     utilized = atlasUsedArea / (int(atlasSize) ** 2) | ||
|  |                     layout.label(text="Utilized: " + str(utilized * 100) + "%") | ||
|  | 
 | ||
|  |                     if (utilized * 100) > 100: | ||
|  |                         layout.label(text="Warning! Overflow not yet supported") |