Files
test2/scripts/startup/bl_ui/properties_render.py
Omar Emara 56b0b709ea Compositor: Support GPU OIDN denoising
This patch supports GPU OIDN denoising in the compositor. A new
compositor performance option was added to allow choosing between CPU,
GPU, and Auto device selection. Auto will use whatever the compositor is
using for execution.

The code is two folds, first, denoising code was adapted to use buffers
as opposed to passing in pointers to filters directly, this is needed to
support GPU devices. Second, device creation is now a bit more involved,
it tries to choose the device is being used by the compositor for
execution.

Matching GPU devices is done by choosing the OIDN device that matches
the UUID or LUID of the active GPU platform. We need both UUID and LUID
because not all platforms support both. UUID is supported on all
platforms except MacOS Metal, while LUID is only supported on Window and
MacOS metal.

If there is no active GPU device or matching is unsuccessful, we let
OIDN choose the best device, which is typically the fastest.

To support this case, UUID and LUID identifiers were added to the
GPUPlatformGlobal and are initialized by the GPU backend if supported.
OpenGL now requires GL_EXT_memory_object and GL_EXT_memory_object_win32
to support this use case, but it should function without it.

Pull Request: https://projects.blender.org/blender/blender/pulls/136660
2025-04-04 11:17:08 +02:00

1147 lines
34 KiB
Python

# SPDX-FileCopyrightText: 2009-2023 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
from bpy.types import Panel
from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel
from bl_ui.space_view3d import (
VIEW3D_PT_shading_lighting,
VIEW3D_PT_shading_color,
VIEW3D_PT_shading_options,
VIEW3D_PT_shading_cavity,
)
from bl_ui.utils import PresetPanel
class RenderButtonsPanel:
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
# COMPAT_ENGINES must be defined in each subclass, external engines can add themselves here
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
class RENDER_PT_context(Panel):
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "render"
bl_options = {'HIDE_HEADER'}
bl_label = ""
@classmethod
def poll(cls, context):
return context.scene
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
if rd.has_multiple_engines:
layout.prop(rd, "engine", text="Render Engine")
class RENDER_PT_color_management(RenderButtonsPanel, Panel):
bl_label = "Color Management"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 100
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
view = scene.view_settings
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(scene.display_settings, "display_device")
col.separator()
col.prop(view, "view_transform")
col.prop(view, "look")
col = flow.column()
col.prop(view, "exposure")
col.prop(view, "gamma")
col.separator()
col.prop(scene.sequencer_colorspace_settings, "name", text="Sequencer")
class RENDER_PT_color_management_display_settings(RenderButtonsPanel, Panel):
bl_label = "Display"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
view = scene.view_settings
# Only enable display sub-section if HDR support is available.
import gpu
layout.enabled = gpu.capabilities.hdr_support_get()
# Only display HDR toggle for non-Filmic display transforms.
col = layout.column(align=True)
sub = col.row()
sub.active = (not view.view_transform.startswith("Filmic") and not view.view_transform.startswith("AgX") and not
view.view_transform.startswith("False Color") and not
view.view_transform.startswith("Khronos PBR Neutral"))
sub.prop(view, "use_hdr_view")
class RENDER_PT_color_management_curves(RenderButtonsPanel, Panel):
bl_label = "Curves"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
scene = context.scene
view = scene.view_settings
self.layout.prop(view, "use_curve_mapping", text="")
def draw(self, context):
layout = self.layout
scene = context.scene
view = scene.view_settings
layout.use_property_split = False
layout.use_property_decorate = False # No animation.
layout.active = view.use_curve_mapping
layout.template_curve_mapping(view, "curve_mapping", type='COLOR', levels=True)
class RENDER_PT_color_management_white_balance_presets(PresetPanel, Panel):
bl_label = "White Balance Presets"
preset_subdir = "color_management/white_balance"
preset_operator = "script.execute_preset"
preset_add_operator = "render.color_management_white_balance_preset_add"
class RENDER_PT_color_management_white_balance(RenderButtonsPanel, Panel):
bl_label = "White Balance"
bl_parent_id = "RENDER_PT_color_management"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
scene = context.scene
view = scene.view_settings
self.layout.prop(view, "use_white_balance", text="")
def draw_header_preset(self, context):
layout = self.layout
RENDER_PT_color_management_white_balance_presets.draw_panel_header(layout)
eye = layout.operator("ui.eyedropper_color", text="", icon='EYEDROPPER')
eye.prop_data_path = "scene.view_settings.white_balance_whitepoint"
def draw(self, context):
layout = self.layout
scene = context.scene
view = scene.view_settings
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.active = view.use_white_balance
col = layout.column()
col.prop(view, "white_balance_temperature")
col.prop(view, "white_balance_tint")
class RENDER_PT_eevee_next_motion_blur(RenderButtonsPanel, Panel):
bl_label = "Motion Blur"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.render
self.layout.prop(props, "use_motion_blur", text="")
def draw(self, context):
layout = self.layout
layout.use_property_split = True
scene = context.scene
props = scene.render
eevee_props = scene.eevee
layout.active = props.use_motion_blur
col = layout.column()
col.prop(props, "motion_blur_position", text="Position")
col.prop(props, "motion_blur_shutter")
col.separator()
col.prop(eevee_props, "motion_blur_depth_scale")
col.prop(eevee_props, "motion_blur_max")
col.prop(eevee_props, "motion_blur_steps", text="Steps")
class RENDER_PT_eevee_next_motion_blur_curve(RenderButtonsPanel, Panel):
bl_label = "Shutter Curve"
bl_parent_id = "RENDER_PT_eevee_next_motion_blur"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
layout.active = rd.use_motion_blur
col = layout.column()
col.template_curve_mapping(rd, "motion_blur_shutter_curve")
col = layout.column(align=True)
row = col.row(align=True)
row.operator("render.shutter_curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
row.operator("render.shutter_curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
row.operator("render.shutter_curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
row.operator("render.shutter_curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
row.operator("render.shutter_curve_preset", icon='LINCURVE', text="").shape = 'LINE'
row.operator("render.shutter_curve_preset", icon='NOCURVE', text="").shape = 'MAX'
class RENDER_PT_eevee_next_depth_of_field(RenderButtonsPanel, Panel):
bl_label = "Depth of Field"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "bokeh_max_size")
col.prop(props, "bokeh_threshold")
col.prop(props, "bokeh_neighbor_max")
col = layout.column(align=False, heading="Jitter Camera")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_bokeh_jittered", text="")
sub = sub.row(align=True)
sub.active = props.use_bokeh_jittered
sub.prop(props, "bokeh_overblur")
class RENDER_PT_eevee_next_volumes(RenderButtonsPanel, Panel):
bl_label = "Volumes"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "volumetric_tile_size", text="Resolution")
col.prop(props, "volumetric_samples", text="Steps")
col.prop(props, "volumetric_sample_distribution", text="Distribution")
col = layout.column()
col.prop(props, "volumetric_ray_depth", text="Max Depth")
class RENDER_PT_eevee_next_volumes_range(RenderButtonsPanel, Panel):
bl_label = "Custom Range"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_next_volumes"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.eevee
self.layout.prop(props, "use_volume_custom_range", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_volume_custom_range
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column(align=True)
col.prop(props, "volumetric_start")
col.prop(props, "volumetric_end")
class RENDER_PT_eevee_next_raytracing_presets(PresetPanel, Panel):
bl_label = "Raytracing Presets"
preset_subdir = "eevee/raytracing"
preset_operator = "script.execute_preset"
preset_add_operator = "render.eevee_raytracing_preset_add"
class RENDER_PT_eevee_next_raytracing(RenderButtonsPanel, Panel):
bl_label = "Raytracing"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
props = context.scene.eevee
self.layout.prop(props, "use_raytracing", text="")
def draw_header_preset(self, _context):
RENDER_PT_eevee_next_raytracing_presets.draw_panel_header(self.layout)
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_raytracing
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
col.prop(props, "ray_tracing_method", text="Method")
options = context.scene.eevee.ray_tracing_options
col.prop(options, "resolution_scale")
class RENDER_PT_eevee_next_screen_trace(RenderButtonsPanel, Panel):
bl_label = "Screen Tracing"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_next_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
use_screen_trace = (context.scene.eevee.ray_tracing_method == 'SCREEN')
return (context.engine in cls.COMPAT_ENGINES) and use_screen_trace
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_raytracing
layout.use_property_split = True
layout.use_property_decorate = False
props = context.scene.eevee.ray_tracing_options
col = layout.column()
col.prop(props, "screen_trace_quality", text="Precision")
col.prop(props, "screen_trace_thickness", text="Thickness")
class RENDER_PT_eevee_next_gi_approximation(RenderButtonsPanel, Panel):
bl_label = "Fast GI Approximation"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_next_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
self.layout.active = context.scene.eevee.use_raytracing
props = context.scene.eevee
self.layout.prop(props, "use_fast_gi", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
options = scene.eevee.ray_tracing_options
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
col.active = props.use_raytracing and props.use_fast_gi
col.prop(options, "trace_max_roughness", text="Threshold")
is_valid = props.use_raytracing and props.use_fast_gi and props.ray_tracing_options.trace_max_roughness < 1
col = layout.column()
col.active = is_valid
col.prop(props, "fast_gi_method")
col.prop(props, "fast_gi_resolution", text="Resolution")
sub = col.column(align=True)
sub.prop(props, "fast_gi_ray_count", text="Rays")
sub.prop(props, "fast_gi_step_count", text="Steps")
sub.prop(props, "fast_gi_quality", text="Precision")
sub = col.column(align=True)
sub.prop(props, "fast_gi_distance")
sub.prop(props, "fast_gi_thickness_near", text="Thickness Near")
sub.prop(props, "fast_gi_thickness_far", text="Far")
col.prop(props, "fast_gi_bias", text="Bias")
class RENDER_PT_eevee_next_denoise(RenderButtonsPanel, Panel):
bl_label = "Denoising"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_next_raytracing"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
self.layout.active = context.scene.eevee.use_raytracing
props = context.scene.eevee.ray_tracing_options
self.layout.prop(props, "use_denoise", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_raytracing
layout.use_property_split = True
layout.use_property_decorate = False
props = context.scene.eevee.ray_tracing_options
col = layout.column()
col.active = props.use_denoise
col.prop(props, "denoise_spatial")
col = layout.column()
col.active = props.use_denoise and props.denoise_spatial
col.prop(props, "denoise_temporal")
col = layout.column()
col.active = props.use_denoise and props.denoise_spatial and props.denoise_temporal
col.prop(props, "denoise_bilateral")
class RENDER_PT_eevee_next_clamping(RenderButtonsPanel, Panel):
bl_label = "Clamping"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
pass
class RENDER_PT_eevee_next_clamping_surface(RenderButtonsPanel, Panel):
bl_label = "Surface"
bl_parent_id = "RENDER_PT_eevee_next_clamping"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "clamp_surface_direct", text="Direct Light")
col.prop(props, "clamp_surface_indirect", text="Indirect Light")
class RENDER_PT_eevee_next_clamping_volume(RenderButtonsPanel, Panel):
bl_label = "Volume"
bl_parent_id = "RENDER_PT_eevee_next_clamping"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "clamp_volume_direct", text="Direct Light")
col.prop(props, "clamp_volume_indirect", text="Indirect Light")
class RENDER_PT_eevee_next_sampling_shadows(RenderButtonsPanel, Panel):
bl_label = "Shadows"
bl_parent_id = "RENDER_PT_eevee_next_sampling"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw_header(self, context):
scene = context.scene
props = scene.eevee
self.layout.prop(props, "use_shadows", text="")
def draw(self, context):
scene = context.scene
props = scene.eevee
layout = self.layout
layout.active = props.use_shadows
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column(heading="Tracing", align=True)
col.prop(props, "shadow_ray_count", text="Rays")
col.prop(props, "shadow_step_count", text="Steps")
col = layout.column(align=False, heading="Volume Shadows")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_volumetric_shadows", text="")
sub = sub.row(align=True)
sub.active = props.use_volumetric_shadows
sub.prop(props, "volumetric_shadow_samples", text="Steps")
col = layout.column()
col.prop(props, "shadow_resolution_scale", text="Resolution")
class RENDER_PT_eevee_next_sampling(RenderButtonsPanel, Panel):
bl_label = "Sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
pass
class RENDER_PT_eevee_next_sampling_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_eevee_next_sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "taa_samples", text="Samples")
col.prop(props, "use_taa_reprojection", text="Temporal Reprojection")
col.prop(props, "use_shadow_jitter_viewport", text="Jittered Shadows")
# Add SSS sample count here.
class RENDER_PT_eevee_next_sampling_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_parent_id = "RENDER_PT_eevee_next_sampling"
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column(align=True)
col.prop(props, "taa_render_samples", text="Samples")
# Add SSS sample count here.
class RENDER_PT_eevee_next_sampling_advanced(RenderButtonsPanel, Panel):
bl_label = "Advanced"
bl_parent_id = "RENDER_PT_eevee_next_sampling"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
col = layout.column()
col.prop(props, "light_threshold")
class RENDER_PT_eevee_next_film(RenderButtonsPanel, Panel):
bl_label = "Film"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
scene = context.scene
rd = scene.render
props = scene.eevee
col = layout.column()
col.prop(rd, "filter_size")
col.prop(rd, "film_transparent", text="Transparent")
col = layout.column(align=False, heading="Overscan")
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(props, "use_overscan", text="")
sub = sub.row(align=True)
sub.active = props.use_overscan
sub.prop(props, "overscan_size", text="")
def draw_curves_settings(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.prop(rd, "hair_type", text="Shape", expand=True)
layout.prop(rd, "hair_subdiv")
class RENDER_PT_eevee_hair(RenderButtonsPanel, Panel):
bl_label = "Curves"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
draw_curves_settings(self, context)
class RENDER_PT_eevee_performance(RenderButtonsPanel, Panel):
bl_label = "Performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
layout.prop(rd, "use_high_quality_normals")
class CompositorPerformanceButtonsPanel:
bl_label = "Compositor"
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
row = col.row()
row.prop(rd, "compositor_device", text="Device", expand=True)
if rd.compositor_device == 'GPU':
col.prop(rd, "compositor_precision", text="Precision")
class CompositorDenoisePerformanceButtonsPanel:
bl_label = "Denoise Nodes"
def draw(self, context):
layout = self.layout
scene = context.scene
rd = scene.render
layout.use_property_split = True
layout.use_property_decorate = False
col = layout.column()
row = col.row()
row.prop(rd, "compositor_denoise_device", text="Denoising Device", expand=True)
col.prop(rd, "compositor_denoise_preview_quality", text="Preview Quality")
col.prop(rd, "compositor_denoise_final_quality", text="Final Quality")
class RENDER_PT_eevee_performance_compositor(RenderButtonsPanel, CompositorPerformanceButtonsPanel, Panel):
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_performance"
COMPAT_ENGINES = {
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
class RENDER_PT_eevee_performance_compositor_denoise_settings(
RenderButtonsPanel, CompositorDenoisePerformanceButtonsPanel, Panel,
):
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_eevee_performance_compositor"
COMPAT_ENGINES = {
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
class RENDER_PT_eevee_performance_memory(RenderButtonsPanel, Panel):
bl_label = "Memory"
bl_parent_id = "RENDER_PT_eevee_performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
props = scene.eevee
layout.prop(props, "shadow_pool_size", text="Shadow Pool")
layout.prop(props, "gi_irradiance_pool_size", text="Light Probes Volume Pool")
class RENDER_PT_eevee_performance_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_eevee_performance"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_EEVEE_NEXT'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False
scene = context.scene
rd = scene.render
col = layout.column()
col.prop(rd, "preview_pixel_size", text="Pixel Size")
# TODO(falk): To rename for 5.0
class RENDER_PT_gpencil(RenderButtonsPanel, Panel):
bl_label = "Grease Pencil"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 10
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
pass
class RENDER_PT_grease_pencil_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_gpencil"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.grease_pencil_settings
col = layout.column()
col.prop(props, "antialias_threshold", text="SMAA Threshold")
class RENDER_PT_grease_pencil_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_options = {'DEFAULT_CLOSED'}
bl_parent_id = "RENDER_PT_gpencil"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.grease_pencil_settings
col = layout.column()
col.prop(props, "antialias_threshold_render", text="SMAA Threshold")
col.prop(props, "aa_samples", text="SSAA Samples")
class RENDER_PT_opengl_sampling(RenderButtonsPanel, Panel):
bl_label = "Sampling"
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
scene = context.scene
props = scene.display
col = layout.column()
col.prop(props, "render_aa", text="Render")
col.prop(props, "viewport_aa", text="Viewport")
class RENDER_PT_opengl_film(RenderButtonsPanel, Panel):
bl_label = "Film"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = False # No animation.
rd = context.scene.render
layout.prop(rd, "film_transparent", text="Transparent")
class RENDER_PT_opengl_lighting(RenderButtonsPanel, Panel):
bl_label = "Lighting"
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_lighting.draw(self, context)
class RENDER_PT_opengl_color(RenderButtonsPanel, Panel):
bl_label = "Color"
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_color._draw_color_type(self, context)
class RENDER_PT_opengl_options(RenderButtonsPanel, Panel):
bl_label = "Options"
COMPAT_ENGINES = {'BLENDER_WORKBENCH'}
@classmethod
def poll(cls, context):
return (context.engine in cls.COMPAT_ENGINES)
def draw(self, context):
VIEW3D_PT_shading_options.draw(self, context)
# Cavity properties.
VIEW3D_PT_shading_cavity.draw_header(self, context)
VIEW3D_PT_shading_cavity.draw(self, context)
class RENDER_PT_simplify(RenderButtonsPanel, Panel):
bl_label = "Simplify"
bl_options = {'DEFAULT_CLOSED'}
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw_header(self, context):
rd = context.scene.render
self.layout.prop(rd, "use_simplify", text="")
def draw(self, context):
pass
class RENDER_PT_simplify_viewport(RenderButtonsPanel, Panel):
bl_label = "Viewport"
bl_parent_id = "RENDER_PT_simplify"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
rd = context.scene.render
layout.active = rd.use_simplify
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(rd, "simplify_subdivision", text="Max Subdivision")
col = flow.column()
col.prop(rd, "simplify_child_particles", text="Max Child Particles")
col = flow.column()
col.prop(rd, "simplify_volumes", text="Volume Resolution")
col = flow.column()
col.prop(rd, "use_simplify_normals", text="Normals")
class RENDER_PT_simplify_render(RenderButtonsPanel, Panel):
bl_label = "Render"
bl_parent_id = "RENDER_PT_simplify"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
def draw(self, context):
layout = self.layout
layout.use_property_split = True
rd = context.scene.render
layout.active = rd.use_simplify
flow = layout.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=True)
col = flow.column()
col.prop(rd, "simplify_subdivision_render", text="Max Subdivision")
col = flow.column()
col.prop(rd, "simplify_child_particles_render", text="Max Child Particles")
class RENDER_PT_simplify_greasepencil(RenderButtonsPanel, Panel, GreasePencilSimplifyPanel):
bl_label = "Grease Pencil"
bl_parent_id = "RENDER_PT_simplify"
COMPAT_ENGINES = {
'BLENDER_RENDER',
'BLENDER_EEVEE_NEXT',
'BLENDER_WORKBENCH',
}
bl_options = {'DEFAULT_CLOSED'}
class RENDER_PT_hydra_debug(RenderButtonsPanel, Panel):
bl_label = "Hydra Debug"
bl_options = {'DEFAULT_CLOSED'}
bl_order = 200
COMPAT_ENGINES = {'HYDRA_STORM'}
@classmethod
def poll(cls, context):
prefs = context.preferences
return (context.engine in cls.COMPAT_ENGINES) and prefs.view.show_developer_ui
def draw(self, context):
layout = self.layout
layout.use_property_split = True
hydra = context.scene.hydra
layout.prop(hydra, "export_method")
classes = (
RENDER_PT_context,
RENDER_PT_eevee_next_sampling,
RENDER_PT_eevee_next_sampling_viewport,
RENDER_PT_eevee_next_sampling_render,
RENDER_PT_eevee_next_sampling_shadows,
RENDER_PT_eevee_next_sampling_advanced,
RENDER_PT_eevee_next_clamping,
RENDER_PT_eevee_next_clamping_surface,
RENDER_PT_eevee_next_clamping_volume,
RENDER_PT_eevee_next_raytracing_presets,
RENDER_PT_eevee_next_raytracing,
RENDER_PT_eevee_next_screen_trace,
RENDER_PT_eevee_next_denoise,
RENDER_PT_eevee_next_gi_approximation,
RENDER_PT_eevee_next_volumes,
RENDER_PT_eevee_next_volumes_range,
RENDER_PT_eevee_hair,
RENDER_PT_simplify,
RENDER_PT_simplify_viewport,
RENDER_PT_simplify_render,
RENDER_PT_simplify_greasepencil,
RENDER_PT_eevee_next_depth_of_field,
RENDER_PT_eevee_next_motion_blur,
RENDER_PT_eevee_next_motion_blur_curve,
RENDER_PT_eevee_next_film,
RENDER_PT_eevee_performance,
RENDER_PT_eevee_performance_memory,
RENDER_PT_eevee_performance_viewport,
RENDER_PT_eevee_performance_compositor,
RENDER_PT_eevee_performance_compositor_denoise_settings,
RENDER_PT_gpencil,
RENDER_PT_grease_pencil_viewport,
RENDER_PT_grease_pencil_render,
RENDER_PT_opengl_sampling,
RENDER_PT_opengl_lighting,
RENDER_PT_opengl_color,
RENDER_PT_opengl_options,
RENDER_PT_opengl_film,
RENDER_PT_hydra_debug,
RENDER_PT_color_management,
RENDER_PT_color_management_display_settings,
RENDER_PT_color_management_curves,
RENDER_PT_color_management_white_balance_presets,
RENDER_PT_color_management_white_balance,
)
if __name__ == "__main__": # only for live edit.
from bpy.utils import register_class
for cls in classes:
register_class(cls)