forked from LeenkxTeam/LNXSDK
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]
|
|
] |