|
|
@ -28,7 +28,7 @@ class LightBaker: |
|
|
|
self._lightgroups = {} |
|
|
|
self._lightgroups = {} |
|
|
|
self._uvtexs = {} |
|
|
|
self._uvtexs = {} |
|
|
|
|
|
|
|
|
|
|
|
def _apply_render_settings(self, toggle): |
|
|
|
def _apply_render_settings(self, toggle, vcols): |
|
|
|
render = bpy.context.scene.render |
|
|
|
render = bpy.context.scene.render |
|
|
|
toggle.track(render, "use_textures", False) |
|
|
|
toggle.track(render, "use_textures", False) |
|
|
|
toggle.track(render, "use_shadows", True) |
|
|
|
toggle.track(render, "use_shadows", True) |
|
|
@ -36,6 +36,7 @@ class LightBaker: |
|
|
|
toggle.track(render, "use_raytrace", True) |
|
|
|
toggle.track(render, "use_raytrace", True) |
|
|
|
toggle.track(render, "bake_type", "FULL") |
|
|
|
toggle.track(render, "bake_type", "FULL") |
|
|
|
toggle.track(render, "use_bake_clear", True) |
|
|
|
toggle.track(render, "use_bake_clear", True) |
|
|
|
|
|
|
|
toggle.track(render, "use_bake_to_vertex_color", vcols) |
|
|
|
|
|
|
|
|
|
|
|
def _associate_image_with_uvtex(self, uvtex, im): |
|
|
|
def _associate_image_with_uvtex(self, uvtex, im): |
|
|
|
# Associate the image with all the new UVs |
|
|
|
# Associate the image with all the new UVs |
|
|
@ -44,17 +45,19 @@ class LightBaker: |
|
|
|
for i in uvtex.data: |
|
|
|
for i in uvtex.data: |
|
|
|
i.image = im |
|
|
|
i.image = im |
|
|
|
|
|
|
|
|
|
|
|
def _bake_lightmaps(self, objs, layers, toggle): |
|
|
|
def _bake_lightmaps(self, objs, layers): |
|
|
|
|
|
|
|
with GoodNeighbor() as toggle: |
|
|
|
scene = bpy.context.scene |
|
|
|
scene = bpy.context.scene |
|
|
|
scene.layers = layers |
|
|
|
scene.layers = layers |
|
|
|
toggle.track(scene.render, "use_bake_to_vertex_color", False) |
|
|
|
self._apply_render_settings(toggle, False) |
|
|
|
self._select_only(objs) |
|
|
|
self._select_only(objs, toggle) |
|
|
|
bpy.ops.object.bake_image() |
|
|
|
bpy.ops.object.bake_image() |
|
|
|
|
|
|
|
|
|
|
|
def _bake_vcols(self, objs, toggle): |
|
|
|
def _bake_vcols(self, objs): |
|
|
|
|
|
|
|
with GoodNeighbor() as toggle: |
|
|
|
bpy.context.scene.layers = (True,) * _NUM_RENDER_LAYERS |
|
|
|
bpy.context.scene.layers = (True,) * _NUM_RENDER_LAYERS |
|
|
|
toggle.track(bpy.context.scene.render, "use_bake_to_vertex_color", True) |
|
|
|
self._apply_render_settings(toggle, True) |
|
|
|
self._select_only(objs) |
|
|
|
self._select_only(objs, toggle) |
|
|
|
bpy.ops.object.bake_image() |
|
|
|
bpy.ops.object.bake_image() |
|
|
|
|
|
|
|
|
|
|
|
def bake_static_lighting(self, objs): |
|
|
|
def bake_static_lighting(self, objs): |
|
|
@ -96,17 +99,16 @@ class LightBaker: |
|
|
|
print(" ...") |
|
|
|
print(" ...") |
|
|
|
|
|
|
|
|
|
|
|
# Step 2: BAKE! |
|
|
|
# Step 2: BAKE! |
|
|
|
self._apply_render_settings(toggle) |
|
|
|
|
|
|
|
for key, value in bake.items(): |
|
|
|
for key, value in bake.items(): |
|
|
|
if not value: |
|
|
|
if not value: |
|
|
|
continue |
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if key[0] == "lightmap": |
|
|
|
if key[0] == "lightmap": |
|
|
|
print(" {} Lightmap(s) [H:{:X}]".format(len(value), hash(key))) |
|
|
|
print(" {} Lightmap(s) [H:{:X}]".format(len(value), hash(key))) |
|
|
|
self._bake_lightmaps(value, key[1:], toggle) |
|
|
|
self._bake_lightmaps(value, key[1:]) |
|
|
|
elif key[0] == "vcol": |
|
|
|
elif key[0] == "vcol": |
|
|
|
print(" {} Crap Light(s)".format(len(value))) |
|
|
|
print(" {} Crap Light(s)".format(len(value))) |
|
|
|
self._bake_vcols(value, toggle) |
|
|
|
self._bake_vcols(value) |
|
|
|
else: |
|
|
|
else: |
|
|
|
raise RuntimeError(key[0]) |
|
|
|
raise RuntimeError(key[0]) |
|
|
|
|
|
|
|
|
|
|
@ -228,11 +230,8 @@ class LightBaker: |
|
|
|
if uvtex is not None: |
|
|
|
if uvtex is not None: |
|
|
|
uv_textures.remove(uvtex) |
|
|
|
uv_textures.remove(uvtex) |
|
|
|
|
|
|
|
|
|
|
|
# Make sure the object can be baked to. NOTE this also makes sure we can enter edit mode |
|
|
|
# Make sure we can enter Edit Mode(TM) |
|
|
|
# TROLLING LOL LOL LOL |
|
|
|
|
|
|
|
toggle.track(bo, "hide", False) |
|
|
|
toggle.track(bo, "hide", False) |
|
|
|
toggle.track(bo, "hide_render", False) |
|
|
|
|
|
|
|
toggle.track(bo, "hide_select", False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Because the way Blender tracks active UV layers is massively stupid... |
|
|
|
# Because the way Blender tracks active UV layers is massively stupid... |
|
|
|
self._uvtexs[mesh.name] = uv_textures.active.name |
|
|
|
self._uvtexs[mesh.name] = uv_textures.active.name |
|
|
@ -285,12 +284,6 @@ class LightBaker: |
|
|
|
if not self._generate_lightgroup(mesh): |
|
|
|
if not self._generate_lightgroup(mesh): |
|
|
|
return False |
|
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
# Make sure the object can be baked to. NOTE this also makes sure we can enter edit mode |
|
|
|
|
|
|
|
# TROLLING LOL LOL LOL |
|
|
|
|
|
|
|
toggle.track(bo, "hide", False) |
|
|
|
|
|
|
|
toggle.track(bo, "hide_render", False) |
|
|
|
|
|
|
|
toggle.track(bo, "hide_select", False) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# I have heard tale of some moar "No valid image to bake to" boogs if there is a really |
|
|
|
# I have heard tale of some moar "No valid image to bake to" boogs if there is a really |
|
|
|
# old copy of the autocolor layer on the mesh. Nuke it. |
|
|
|
# old copy of the autocolor layer on the mesh. Nuke it. |
|
|
|
autocolor = vcols.get("autocolor") |
|
|
|
autocolor = vcols.get("autocolor") |
|
|
@ -316,13 +309,17 @@ class LightBaker: |
|
|
|
i.active = uvtex_name == i.name |
|
|
|
i.active = uvtex_name == i.name |
|
|
|
mesh.uv_textures.active = mesh.uv_textures[uvtex_name] |
|
|
|
mesh.uv_textures.active = mesh.uv_textures[uvtex_name] |
|
|
|
|
|
|
|
|
|
|
|
def _select_only(self, objs): |
|
|
|
def _select_only(self, objs, toggle): |
|
|
|
if isinstance(objs, bpy.types.Object): |
|
|
|
if isinstance(objs, bpy.types.Object): |
|
|
|
|
|
|
|
toggle.track(objs, "hide_render", False) |
|
|
|
for i in bpy.data.objects: |
|
|
|
for i in bpy.data.objects: |
|
|
|
i.select = i == objs |
|
|
|
i.select = i == objs |
|
|
|
else: |
|
|
|
else: |
|
|
|
for i in bpy.data.objects: |
|
|
|
for i in bpy.data.objects: |
|
|
|
i.select = i in objs |
|
|
|
value = i in objs |
|
|
|
|
|
|
|
if value: |
|
|
|
|
|
|
|
toggle.track(i, "hide_render", False) |
|
|
|
|
|
|
|
i.select = value |
|
|
|
|
|
|
|
|
|
|
|
@persistent |
|
|
|
@persistent |
|
|
|
def _toss_garbage(scene): |
|
|
|
def _toss_garbage(scene): |
|
|
|