Files
test/scripts/startup/bl_ui/properties_render.py
Falk David f7a0003452 Grease Pencil: Motion Blur support
This adds motion blur support for Grease Pencil.

We follow the same principle form EEVEE and use the existing
`antialiasing_accumulate` (SSAA) function to accumulate the
frames in range of the motion blur over time.

There is a new `motion_blur_steps` setting in the Grease
Pencil render settings to control the accuracy of the motion
blur. This will increase the render time.

Limitations:
* When Grease Pencil is composited into the scene, we only do
  it for one the current frame and don't take the motion blur into
  account. This will lead to hard edges currently.
* There is no viewport motion blur. This would need an entirely
  new technique that can be computed in real-time.

Pull Request: https://projects.blender.org/blender/blender/pulls/139840
2025-06-09 15:44:53 +02:00

1151 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")
col = layout.column()
col.active = scene.render.use_motion_blur
col.prop(props, "motion_blur_steps")
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 = "Object 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)