243 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import bpy, math | ||
|  | 
 | ||
|  | #from . import cache | ||
|  | from .. utility import * | ||
|  | 
 | ||
|  | def init(self, prev_container): | ||
|  | 
 | ||
|  |     #store_existing(prev_container) | ||
|  | 
 | ||
|  |     #set_settings() | ||
|  | 
 | ||
|  |     configure_world() | ||
|  | 
 | ||
|  |     configure_lights() | ||
|  | 
 | ||
|  |     configure_meshes(self) | ||
|  | 
 | ||
|  | def configure_world(): | ||
|  |     pass | ||
|  | 
 | ||
|  | def configure_lights(): | ||
|  |     pass | ||
|  | 
 | ||
|  | def configure_meshes(self): | ||
|  | 
 | ||
|  |     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) | ||
|  | 
 | ||
|  |     iterNum = 1 | ||
|  |     currentIterNum = 0 | ||
|  | 
 | ||
|  |     scene = bpy.context.scene | ||
|  | 
 | ||
|  |     for obj in scene.objects: | ||
|  |         if obj.type == "MESH": | ||
|  |             if obj.TLM_ObjectProperties.tlm_mesh_lightmap_use: | ||
|  |                 obj.hide_select = False #Remember to toggle this back | ||
|  | 
 | ||
|  |                 currentIterNum = currentIterNum + 1 | ||
|  | 
 | ||
|  |                 obj.octane.baking_group_id = 1 + currentIterNum #0 doesn't exist, 1 is neutral and 2 is first baked object | ||
|  | 
 | ||
|  |                 print("Obj: " + obj.name + " set to baking group: " + str(obj.octane.baking_group_id)) | ||
|  | 
 | ||
|  |                 for slot in obj.material_slots: | ||
|  |                     if "." + slot.name + '_Original' in bpy.data.materials: | ||
|  |                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                             print("The material: " + slot.name + " shifted to " + "." + slot.name + '_Original') | ||
|  |                         slot.material = bpy.data.materials["." + slot.name + '_Original'] | ||
|  | 
 | ||
|  |                  | ||
|  |                 objWasHidden = False | ||
|  | 
 | ||
|  |                 #For some reason, a Blender bug might prevent invisible objects from being smart projected | ||
|  |                 #We will turn the object temporarily visible | ||
|  |                 obj.hide_viewport = False | ||
|  |                 obj.hide_set(False) | ||
|  | 
 | ||
|  |                 #Configure selection | ||
|  |                 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 | ||
|  | 
 | ||
|  |                 uv_layers = obj.data.uv_layers | ||
|  |                 if not obj.TLM_ObjectProperties.tlm_use_default_channel: | ||
|  |                     uv_channel = obj.TLM_ObjectProperties.tlm_uv_channel | ||
|  |                 else: | ||
|  |                     uv_channel = "UVMap_Lightmap" | ||
|  | 
 | ||
|  |                     if not uv_channel in uv_layers: | ||
|  |                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                             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": | ||
|  |                             bpy.ops.uv.lightmap_pack('EXEC_SCREEN', PREF_CONTEXT='ALL_FACES', PREF_MARGIN_DIV=obj.TLM_ObjectProperties.tlm_mesh_unwrap_margin) | ||
|  |                          | ||
|  |                         #If smart project | ||
|  |                         elif obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "SmartProject": | ||
|  | 
 | ||
|  |                             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                                 print("Smart Project B") | ||
|  |                             bpy.ops.object.select_all(action='DESELECT') | ||
|  |                             obj.select_set(True) | ||
|  |                             bpy.ops.object.mode_set(mode='EDIT') | ||
|  |                             bpy.ops.mesh.select_all(action='SELECT') | ||
|  |                             #API changes in 2.91 causes errors: | ||
|  |                             if (2, 91, 0) > bpy.app.version: | ||
|  |                                 bpy.ops.uv.smart_project(angle_limit=45.0, island_margin=obj.TLM_ObjectProperties.tlm_mesh_unwrap_margin, user_area_weight=1.0, use_aspect=True, stretch_to_bounds=False) | ||
|  |                             else: | ||
|  |                                 angle = math.radians(45.0) | ||
|  |                                 bpy.ops.uv.smart_project(angle_limit=angle, island_margin=obj.TLM_ObjectProperties.tlm_mesh_unwrap_margin, area_weight=1.0, correct_aspect=True, scale_to_bounds=False) | ||
|  |                             bpy.ops.mesh.select_all(action='DESELECT') | ||
|  |                             bpy.ops.object.mode_set(mode='OBJECT') | ||
|  |                          | ||
|  |                         elif obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "Xatlas": | ||
|  |                              | ||
|  |                             Unwrap_Lightmap_Group_Xatlas_2_headless_call(obj) | ||
|  | 
 | ||
|  |                         elif obj.TLM_ObjectProperties.tlm_mesh_lightmap_unwrap_mode == "AtlasGroupA": | ||
|  | 
 | ||
|  |                             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                                 print("ATLAS GROUP: " + obj.TLM_ObjectProperties.tlm_atlas_pointer) | ||
|  |                              | ||
|  |                         else: #if copy existing | ||
|  | 
 | ||
|  |                             if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                                 print("Copied Existing UV Map for object: " + obj.name) | ||
|  | 
 | ||
|  |                     else: | ||
|  |                         if bpy.context.scene.TLM_SceneProperties.tlm_verbose: | ||
|  |                             print("Existing UV map found for obj: " + obj.name) | ||
|  |                         for i in range(0, len(uv_layers)): | ||
|  |                             if uv_layers[i].name == uv_channel: | ||
|  |                                 uv_layers.active_index = i | ||
|  |                                 break | ||
|  | 
 | ||
|  |     set_camera() | ||
|  | 
 | ||
|  | def set_camera(): | ||
|  | 
 | ||
|  |     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(): | ||
|  | 
 | ||
|  |     scene = bpy.context.scene | ||
|  |     cycles = scene.cycles | ||
|  |     scene.render.engine = "CYCLES" | ||
|  |     sceneProperties = scene.TLM_SceneProperties | ||
|  |     engineProperties = scene.TLM_EngineProperties | ||
|  |     cycles.device = scene.TLM_EngineProperties.tlm_mode | ||
|  | 
 | ||
|  |     if cycles.device == "GPU": | ||
|  |         scene.render.tile_x = 256 | ||
|  |         scene.render.tile_y = 256 | ||
|  |     else: | ||
|  |         scene.render.tile_x = 32 | ||
|  |         scene.render.tile_y = 32 | ||
|  |      | ||
|  |     if engineProperties.tlm_quality == "0": | ||
|  |         cycles.samples = 32 | ||
|  |         cycles.max_bounces = 1 | ||
|  |         cycles.diffuse_bounces = 1 | ||
|  |         cycles.glossy_bounces = 1 | ||
|  |         cycles.transparent_max_bounces = 1 | ||
|  |         cycles.transmission_bounces = 1 | ||
|  |         cycles.volume_bounces = 1 | ||
|  |         cycles.caustics_reflective = False | ||
|  |         cycles.caustics_refractive = False | ||
|  |     elif engineProperties.tlm_quality == "1": | ||
|  |         cycles.samples = 64 | ||
|  |         cycles.max_bounces = 2 | ||
|  |         cycles.diffuse_bounces = 2 | ||
|  |         cycles.glossy_bounces = 2 | ||
|  |         cycles.transparent_max_bounces = 2 | ||
|  |         cycles.transmission_bounces = 2 | ||
|  |         cycles.volume_bounces = 2 | ||
|  |         cycles.caustics_reflective = False | ||
|  |         cycles.caustics_refractive = False | ||
|  |     elif engineProperties.tlm_quality == "2": | ||
|  |         cycles.samples = 512 | ||
|  |         cycles.max_bounces = 2 | ||
|  |         cycles.diffuse_bounces = 2 | ||
|  |         cycles.glossy_bounces = 2 | ||
|  |         cycles.transparent_max_bounces = 2 | ||
|  |         cycles.transmission_bounces = 2 | ||
|  |         cycles.volume_bounces = 2 | ||
|  |         cycles.caustics_reflective = False | ||
|  |         cycles.caustics_refractive = False | ||
|  |     elif engineProperties.tlm_quality == "3": | ||
|  |         cycles.samples = 1024 | ||
|  |         cycles.max_bounces = 256 | ||
|  |         cycles.diffuse_bounces = 256 | ||
|  |         cycles.glossy_bounces = 256 | ||
|  |         cycles.transparent_max_bounces = 256 | ||
|  |         cycles.transmission_bounces = 256 | ||
|  |         cycles.volume_bounces = 256 | ||
|  |         cycles.caustics_reflective = False | ||
|  |         cycles.caustics_refractive = False | ||
|  |     elif engineProperties.tlm_quality == "4": | ||
|  |         cycles.samples = 2048 | ||
|  |         cycles.max_bounces = 512 | ||
|  |         cycles.diffuse_bounces = 512 | ||
|  |         cycles.glossy_bounces = 512 | ||
|  |         cycles.transparent_max_bounces = 512 | ||
|  |         cycles.transmission_bounces = 512 | ||
|  |         cycles.volume_bounces = 512 | ||
|  |         cycles.caustics_reflective = True | ||
|  |         cycles.caustics_refractive = True | ||
|  |     else: #Custom | ||
|  |         pass | ||
|  | 
 | ||
|  | def store_existing(prev_container): | ||
|  | 
 | ||
|  |     scene = bpy.context.scene | ||
|  |     cycles = scene.cycles | ||
|  | 
 | ||
|  |     selected = [] | ||
|  | 
 | ||
|  |     for obj in bpy.context.scene.objects: | ||
|  |         if obj.select_get(): | ||
|  |             selected.append(obj.name) | ||
|  | 
 | ||
|  |     prev_container["settings"] = [ | ||
|  |         cycles.samples, | ||
|  |         cycles.max_bounces, | ||
|  |         cycles.diffuse_bounces, | ||
|  |         cycles.glossy_bounces, | ||
|  |         cycles.transparent_max_bounces, | ||
|  |         cycles.transmission_bounces, | ||
|  |         cycles.volume_bounces, | ||
|  |         cycles.caustics_reflective, | ||
|  |         cycles.caustics_refractive, | ||
|  |         cycles.device, | ||
|  |         scene.render.engine, | ||
|  |         bpy.context.view_layer.objects.active, | ||
|  |         selected, | ||
|  |         [scene.render.resolution_x, scene.render.resolution_y] | ||
|  |     ] |