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]
							 | 
						||
| 
								 | 
							
								    ]
							 |