Skip to content

Commit

Permalink
Merge pull request #106 from MozillaReality/save-settings-in-bake
Browse files Browse the repository at this point in the history
Disable compostior and don't clobber settings during reflection probe baking
  • Loading branch information
keianhzo authored Sep 6, 2022
2 parents b9bf191 + e9fccc9 commit 0c59337
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 37 deletions.
62 changes: 25 additions & 37 deletions addons/io_hubs_addon/components/definitions/reflection_probe.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from ..hubs_component import HubsComponent
from ..types import Category, PanelType, NodeType
from ... import io
from ...utils import rgetattr, rsetattr
import math


Expand Down Expand Up @@ -152,22 +153,14 @@ def draw(self, context):
'Temp EnvMap Camera', self.camera_data)
bpy.context.scene.collection.objects.link(self.camera_object)

self.prev_render_camera = bpy.context.scene.camera
self.prev_render_engine = bpy.context.scene.render.engine
self.prev_cycles_device = bpy.context.scene.cycles.device
self.prev_render_rex_x = bpy.context.scene.render.resolution_x
self.prev_render_res_y = bpy.context.scene.render.resolution_y
self.prev_render_res_percent = bpy.context.scene.render.resolution_percentage
self.prev_render_file_format = bpy.context.scene.render.image_settings.file_format
self.prev_render_file_path = bpy.context.scene.render.filepath

modes = {
'ACTIVE': lambda: [context.active_object],
'SELECTED': lambda: [ob for ob in get_probes() if ob in context.selected_objects],
'ALL': lambda: get_probes(),
}
self.probes = modes[self.bake_mode]()

self.saved_props = {}
self.cancelled = False
self.done = False
self.rendering = False
Expand Down Expand Up @@ -196,7 +189,6 @@ def modal(self, context, event):
if self.cancelled:
self.report(
{'WARNING'}, 'Reflection probe baking cancelled')
self.restore_render_props()
return {"CANCELLED"}

for probe in self.probes:
Expand All @@ -218,7 +210,6 @@ def modal(self, context, event):
props.render_resolution = props.resolution

self.report({'INFO'}, 'Reflection probe baking finished')
self.restore_render_props()
return {"FINISHED"}

elif not self.rendering:
Expand All @@ -241,14 +232,8 @@ def modal(self, context, event):
return {"PASS_THROUGH"}

def restore_render_props(self):
bpy.context.scene.camera = self.prev_render_camera
bpy.context.scene.render.engine = self.prev_render_engine
bpy.context.scene.cycles.device = self.prev_cycles_device
bpy.context.scene.render.resolution_x = self.prev_render_rex_x
bpy.context.scene.render.resolution_y = self.prev_render_res_y
bpy.context.scene.render.resolution_percentage = self.prev_render_res_percent
bpy.context.scene.render.image_settings.file_format = self.prev_render_file_format
bpy.context.scene.render.filepath = self.prev_render_file_path
for prop in self.saved_props:
rsetattr(bpy.context, prop, self.saved_props[prop])

def render_probe(self, context):
probe = self.probes[self.probe_index]
Expand All @@ -268,28 +253,31 @@ def render_probe(self, context):
self.camera_object.rotation_euler.x += math.pi/2
self.camera_object.rotation_euler.z += -math.pi/2

bpy.context.scene.camera = self.camera_object
bpy.context.scene.render.engine = "CYCLES"
resolution = context.scene.hubs_scene_reflection_probe_properties.resolution
(x, y) = [int(i) for i in resolution.split('x')]
bpy.context.scene.cycles.device = "GPU" if is_gpu_available(
context) else "CPU"
bpy.context.scene.render.resolution_x = x
bpy.context.scene.render.resolution_y = y
bpy.context.scene.render.resolution_percentage = 100
bpy.context.scene.render.image_settings.file_format = "HDR"
bpy.context.scene.render.filepath = "%s/%s.hdr" % (
get_addon_pref(context).tmp_path, probe.name)

# TODO don't clobber renderer properties
# TODO handle skipping compositor

tmp_pref = bpy.context.preferences.view.render_display_type
bpy.context.preferences.view.render_display_type = "NONE"
output_path = "%s/%s.hdr" % (get_addon_pref(context).tmp_path, probe.name)

overrides = [
("preferences.view.render_display_type", "NONE"),
("scene.camera", self.camera_object),
("scene.render.engine", "CYCLES"),
("scene.cycles.device", "GPU" if is_gpu_available(context) else "CPU"),
("scene.render.resolution_x", x),
("scene.render.resolution_y", y),
("scene.render.resolution_percentage", 100),
("scene.render.image_settings.file_format", "HDR"),
("scene.render.filepath", output_path),
("scene.render.use_compositing", False),
("scene.use_nodes", False)
]

for (prop, value) in overrides:
if prop not in self.saved_props:
self.saved_props[prop] = rgetattr(bpy.context, prop)
rsetattr(bpy.context, prop, value)

self.report({'INFO'}, 'Baking probe %s' % probe.name)
bpy.ops.render.render("INVOKE_DEFAULT", write_still=True)
bpy.context.preferences.view.render_display_type = tmp_pref


class ReflectionProbe(HubsComponent):
_definition = {
Expand Down
11 changes: 11 additions & 0 deletions addons/io_hubs_addon/utils.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
def get_addon_package():
return __package__

import functools

def rsetattr(obj, attr, val):
pre, _, post = attr.rpartition('.')
return setattr(rgetattr(obj, pre) if pre else obj, post, val)

def rgetattr(obj, attr, *args):
def _getattr(obj, attr):
return getattr(obj, attr, *args)
return functools.reduce(_getattr, [obj] + attr.split('.'))

0 comments on commit 0c59337

Please sign in to comment.