180 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			180 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import bpy, os | ||
|  | from .. import build | ||
|  | from time import time, sleep | ||
|  | 
 | ||
|  | def bake(plus_pass=0): | ||
|  | 
 | ||
|  |     if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |         print("Initializing lightmap baking.") | ||
|  | 
 | ||
|  |     for obj in bpy.context.scene.objects: | ||
|  |         bpy.ops.object.select_all(action='DESELECT') | ||
|  |         obj.select_set(False) | ||
|  | 
 | ||
|  |     iterNum = 0 | ||
|  |     currentIterNum = 0 | ||
|  | 
 | ||
|  |     for obj in bpy.context.scene.objects: | ||
|  |         if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects: | ||
|  | 
 | ||
|  |             hidden = False | ||
|  | 
 | ||
|  |             #We check if the object is hidden | ||
|  |             if obj.hide_get(): | ||
|  |                 hidden = True | ||
|  |             if obj.hide_viewport: | ||
|  |                 hidden = True | ||
|  |             if obj.hide_render: | ||
|  |                 hidden = True | ||
|  | 
 | ||
|  |             #We check if the object's collection is hidden | ||
|  |             collections = obj.users_collection | ||
|  | 
 | ||
|  |             for collection in collections: | ||
|  | 
 | ||
|  |                 if collection.hide_viewport: | ||
|  |                     hidden = True | ||
|  |                 if collection.hide_render: | ||
|  |                     hidden = True | ||
|  |                      | ||
|  |                 try: | ||
|  |                     if collection.name in bpy.context.scene.view_layers[0].layer_collection.children: | ||
|  |                         if bpy.context.scene.view_layers[0].layer_collection.children[collection.name].hide_viewport: | ||
|  |                             hidden = True | ||
|  |                 except: | ||
|  |                     print("Error: Could not find collection: " + collection.name) | ||
|  | 
 | ||
|  |                 if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use and not hidden: | ||
|  |                     iterNum = iterNum + 1 | ||
|  | 
 | ||
|  |     if iterNum > 1: | ||
|  |         iterNum = iterNum - 1 | ||
|  | 
 | ||
|  |     for obj in bpy.context.scene.objects: | ||
|  | 
 | ||
|  |         if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |             print("Checking visibility status for object and collections: " + obj.name) | ||
|  | 
 | ||
|  |         hidden = False | ||
|  | 
 | ||
|  |         #We check if the object is hidden | ||
|  |         if obj.hide_get(): | ||
|  |             hidden = True | ||
|  |         if obj.hide_viewport: | ||
|  |             hidden = True | ||
|  |         if obj.hide_render: | ||
|  |             hidden = True | ||
|  | 
 | ||
|  |         #We check if the object's collection is hidden | ||
|  |         collections = obj.users_collection | ||
|  | 
 | ||
|  |         for collection in collections: | ||
|  | 
 | ||
|  |             if collection.hide_viewport: | ||
|  |                 hidden = True | ||
|  |             if collection.hide_render: | ||
|  |                 hidden = True | ||
|  |                  | ||
|  |             try: | ||
|  |                 if collection.name in bpy.context.scene.view_layers[0].layer_collection.children: | ||
|  |                     if bpy.context.scene.view_layers[0].layer_collection.children[collection.name].hide_viewport: | ||
|  |                         hidden = True | ||
|  |             except: | ||
|  |                 print("Error: Could not find collection: " + collection.name) | ||
|  | 
 | ||
|  |         if obj.type == 'MESH' and obj.name in bpy.context.view_layer.objects: | ||
|  |             if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use and not hidden: | ||
|  | 
 | ||
|  |                 scene = bpy.context.scene | ||
|  | 
 | ||
|  |                 bpy.ops.object.select_all(action='DESELECT') | ||
|  |                 bpy.context.view_layer.objects.active = obj | ||
|  |                 obj.select_set(True) | ||
|  |                 obs = bpy.context.view_layer.objects | ||
|  |                 active = obs.active | ||
|  |                 obj.hide_render = False | ||
|  |                 scene.render.bake.use_clear = False | ||
|  | 
 | ||
|  |                 #os.system("cls") | ||
|  | 
 | ||
|  |                 #if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                 print("Baking " + str(currentIterNum) + "/" + str(iterNum) + " (" + str(round(currentIterNum/iterNum*100, 2)) + "%) : " + obj.name) | ||
|  |                 #elapsed = build.sec_to_hours((time() - bpy.app.driver_namespace["tlm_start_time"])) | ||
|  |                 #print("Baked: " + str(currentIterNum) + " | Left: " + str(iterNum-currentIterNum)) | ||
|  |                 elapsedSeconds = time() - bpy.app.driver_namespace["tlm_start_time"] | ||
|  |                 bakedObjects = currentIterNum | ||
|  |                 bakedLeft = iterNum-currentIterNum | ||
|  |                 if bakedObjects == 0: | ||
|  |                     bakedObjects = 1 | ||
|  |                 averagePrBake = elapsedSeconds / bakedObjects | ||
|  |                 remaining = averagePrBake * bakedLeft | ||
|  |                 #print(time() - bpy.app.driver_namespace["tlm_start_time"]) | ||
|  |                 print("Elapsed time: " + str(round(elapsedSeconds, 2)) + "s | ETA remaining: " + str(round(remaining, 2)) + "s") #str(elapsed[0]) | ||
|  |                 #print("Averaged: " + str(averagePrBake)) | ||
|  |                 #print("Remaining: " + str(remaining)) | ||
|  | 
 | ||
|  |                 if scene.TLM_EngineProperties.tlm_target == "vertex": | ||
|  |                     scene.render.bake.target = "VERTEX_COLORS" | ||
|  | 
 | ||
|  |                 if scene.TLM_EngineProperties.tlm_lighting_mode == "combined": | ||
|  |                     print("Baking combined: Direct + Indirect") | ||
|  |                     bpy.ops.object.bake(type="DIFFUSE", pass_filter={"DIRECT","INDIRECT"}, margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                 elif scene.TLM_EngineProperties.tlm_lighting_mode == "indirect": | ||
|  |                     print("Baking combined: Indirect") | ||
|  |                     bpy.ops.object.bake(type="DIFFUSE", pass_filter={"INDIRECT"}, margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                 elif scene.TLM_EngineProperties.tlm_lighting_mode == "ao": | ||
|  |                     print("Baking combined: AO") | ||
|  |                     bpy.ops.object.bake(type="AO", margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                 elif scene.TLM_EngineProperties.tlm_lighting_mode == "combinedao": | ||
|  | 
 | ||
|  |                     if bpy.app.driver_namespace["tlm_plus_mode"] == 1: | ||
|  |                         bpy.ops.object.bake(type="DIFFUSE", pass_filter={"DIRECT","INDIRECT"}, margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                     elif bpy.app.driver_namespace["tlm_plus_mode"] == 2: | ||
|  |                         bpy.ops.object.bake(type="AO", margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  | 
 | ||
|  |                 elif scene.TLM_EngineProperties.tlm_lighting_mode == "indirectao": | ||
|  | 
 | ||
|  |                     print("IndirAO") | ||
|  |                      | ||
|  |                     if bpy.app.driver_namespace["tlm_plus_mode"] == 1: | ||
|  |                         print("IndirAO: 1") | ||
|  |                         bpy.ops.object.bake(type="DIFFUSE", pass_filter={"INDIRECT"}, margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                     elif bpy.app.driver_namespace["tlm_plus_mode"] == 2: | ||
|  |                         print("IndirAO: 2") | ||
|  |                         bpy.ops.object.bake(type="AO", margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                  | ||
|  |                 elif scene.TLM_EngineProperties.tlm_lighting_mode == "complete": | ||
|  |                     bpy.ops.object.bake(type="COMBINED", margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  |                 else: | ||
|  |                     bpy.ops.object.bake(type="DIFFUSE", pass_filter={"DIRECT","INDIRECT"}, margin=scene.TLM_EngineProperties.tlm_dilation_margin, use_clear=False) | ||
|  | 
 | ||
|  |                  | ||
|  |                 #Save image between | ||
|  |                 if scene.TLM_SceneProperties.tlm_save_preprocess_lightmaps: | ||
|  |                     for image in bpy.data.images: | ||
|  |                         if image.name.endswith("_baked"): | ||
|  | 
 | ||
|  |                             saveDir = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir) | ||
|  |                             bakemap_path = os.path.join(saveDir, image.name) | ||
|  |                             filepath_ext = ".hdr" | ||
|  |                             image.filepath_raw = bakemap_path + filepath_ext | ||
|  |                             image.file_format = "HDR" | ||
|  |                             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                                 print("Saving to: " + image.filepath_raw) | ||
|  |                             image.save() | ||
|  |                  | ||
|  |                 bpy.ops.object.select_all(action='DESELECT') | ||
|  |                 currentIterNum = currentIterNum + 1 | ||
|  | 
 | ||
|  |     for image in bpy.data.images: | ||
|  |         if image.name.endswith("_baked"): | ||
|  | 
 | ||
|  |             saveDir = os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.scene.TLM_EngineProperties.tlm_lightmap_savedir) | ||
|  |             bakemap_path = os.path.join(saveDir, image.name) | ||
|  |             filepath_ext = ".hdr" | ||
|  |             image.filepath_raw = bakemap_path + filepath_ext | ||
|  |             image.file_format = "HDR" | ||
|  |             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                 print("Saving to: " + image.filepath_raw) | ||
|  |             image.save() |