Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/app/io_export_cycles_xml.py3
-rw-r--r--intern/cycles/blender/addon/__init__.py18
-rw-r--r--intern/cycles/blender/addon/engine.py13
-rw-r--r--intern/cycles/blender/addon/properties.py18
-rw-r--r--intern/cycles/blender/addon/ui.py244
-rw-r--r--intern/cycles/blender/addon/version_update.py3
-rw-r--r--intern/cycles/blender/blender_curves.cpp8
-rw-r--r--intern/cycles/blender/blender_mesh.cpp17
-rw-r--r--intern/cycles/blender/blender_object.cpp207
-rw-r--r--intern/cycles/blender/blender_python.cpp16
-rw-r--r--intern/cycles/blender/blender_session.cpp23
-rw-r--r--intern/cycles/blender/blender_session.h4
-rw-r--r--intern/cycles/blender/blender_shader.cpp100
-rw-r--r--intern/cycles/blender/blender_sync.cpp144
-rw-r--r--intern/cycles/blender/blender_sync.h47
-rw-r--r--intern/cycles/blender/blender_texture.cpp3
-rw-r--r--intern/cycles/blender/blender_texture.h2
-rw-r--r--intern/cycles/blender/blender_util.h7
-rw-r--r--intern/cycles/device/device.cpp327
-rw-r--r--intern/cycles/device/device.h22
-rw-r--r--intern/cycles/device/device_cuda.cpp60
-rw-r--r--intern/cycles/device/device_multi.cpp9
-rw-r--r--intern/cycles/render/buffers.cpp6
-rw-r--r--intern/cycles/util/util_opengl.h8
-rw-r--r--intern/cycles/util/util_view.cpp2
25 files changed, 692 insertions, 619 deletions
diff --git a/intern/cycles/app/io_export_cycles_xml.py b/intern/cycles/app/io_export_cycles_xml.py
index 7d6d85f88af..d02487aefa4 100644
--- a/intern/cycles/app/io_export_cycles_xml.py
+++ b/intern/cycles/app/io_export_cycles_xml.py
@@ -66,8 +66,7 @@ class RenderButtonsPanel():
@classmethod
def poll(self, context):
- rd = context.scene.render
- return rd.engine == 'CYCLES'
+ return context.engine == 'CYCLES'
class PHYSICS_PT_fluid_export(RenderButtonsPanel, bpy.types.Panel):
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index a2d6262fb20..1cb7835d14d 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -19,7 +19,7 @@
bl_info = {
"name": "Cycles Render Engine",
"author": "",
- "blender": (2, 76, 0),
+ "blender": (2, 80, 0),
"location": "Info header, render engine menu",
"description": "Cycles Render Engine integration",
"warning": "",
@@ -66,21 +66,21 @@ class CyclesRender(bpy.types.RenderEngine):
engine.free(self)
# final render
- def update(self, data, scene):
+ def update(self, data, depsgraph, scene):
if not self.session:
if self.is_preview:
cscene = bpy.context.scene.cycles
use_osl = cscene.shading_system and cscene.device == 'CPU'
- engine.create(self, data, scene,
+ engine.create(self, data, depsgraph, scene,
None, None, None, use_osl)
else:
- engine.create(self, data, scene)
+ engine.create(self, data, depsgraph, scene)
else:
engine.reset(self, data, scene)
- def render(self, scene):
- engine.render(self)
+ def render_to_image(self, depsgraph):
+ engine.render(self, depsgraph)
def bake(self, scene, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result):
engine.bake(self, obj, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result)
@@ -88,12 +88,12 @@ class CyclesRender(bpy.types.RenderEngine):
# viewport render
def view_update(self, context):
if not self.session:
- engine.create(self, context.blend_data, context.scene,
+ engine.create(self, context.blend_data, context.depsgraph, context.scene,
context.region, context.space_data, context.region_data)
engine.update(self, context.blend_data, context.scene)
- def view_draw(self, context):
- engine.draw(self, context.region, context.space_data, context.region_data)
+ def render_to_view(self, context):
+ engine.draw(self, context.depsgraph, context.region, context.space_data, context.region_data)
def update_script_node(self, node):
if engine.with_osl():
diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py
index 1f97eff9bd0..cbc21b79da8 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -123,12 +123,13 @@ def exit():
_cycles.exit()
-def create(engine, data, scene, region=None, v3d=None, rv3d=None, preview_osl=False):
+def create(engine, data, depsgraph, scene, region=None, v3d=None, rv3d=None, preview_osl=False):
import bpy
import _cycles
data = data.as_pointer()
userpref = bpy.context.user_preferences.as_pointer()
+ depsgraph = depsgraph.as_pointer()
scene = scene.as_pointer()
if region:
region = region.as_pointer()
@@ -142,7 +143,8 @@ def create(engine, data, scene, region=None, v3d=None, rv3d=None, preview_osl=Fa
else:
_cycles.debug_flags_reset()
- engine.session = _cycles.create(engine.as_pointer(), userpref, data, scene, region, v3d, rv3d, preview_osl)
+ engine.session = _cycles.create(
+ engine.as_pointer(), userpref, data, depsgraph, scene, region, v3d, rv3d, preview_osl)
def free(engine):
@@ -153,7 +155,7 @@ def free(engine):
del engine.session
-def render(engine):
+def render(engine, depsgraph):
import _cycles
if hasattr(engine, "session"):
_cycles.render(engine.session)
@@ -178,13 +180,14 @@ def update(engine, data, scene):
_cycles.sync(engine.session)
-def draw(engine, region, v3d, rv3d):
+def draw(engine, depsgraph, region, v3d, rv3d):
import _cycles
+ depsgraph = depsgraph.as_pointer()
v3d = v3d.as_pointer()
rv3d = rv3d.as_pointer()
# draw render image
- _cycles.draw(engine.session, v3d, rv3d)
+ _cycles.draw(engine.session, depsgraph, v3d, rv3d)
def available_devices():
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index 62aea8790af..fb7530f8663 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -200,12 +200,6 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
description="Pause all viewport preview renders",
default=False,
)
- cls.preview_active_layer = BoolProperty(
- name="Preview Active Layer",
- description="Preview active render layer in viewport",
- default=False,
- )
-
cls.aa_samples = IntProperty(
name="AA Samples",
description="Number of antialiasing samples to render for each pixel",
@@ -1200,15 +1194,15 @@ class CyclesCurveRenderSettings(bpy.types.PropertyGroup):
def update_render_passes(self, context):
scene = context.scene
rd = scene.render
- rl = rd.layers.active
- rl.update_render_passes()
+ view_layer = scene.view_layers.active
+ view_layer.update_render_passes()
class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
@classmethod
def register(cls):
- bpy.types.SceneRenderLayer.cycles = PointerProperty(
- name="Cycles SceneRenderLayer Settings",
- description="Cycles SceneRenderLayer Settings",
+ bpy.types.ViewLayer.cycles = PointerProperty(
+ name="Cycles ViewLayer Settings",
+ description="Cycles ViewLayer Settings",
type=cls,
)
cls.pass_debug_bvh_traversed_nodes = BoolProperty(
@@ -1332,7 +1326,7 @@ class CyclesRenderLayerSettings(bpy.types.PropertyGroup):
@classmethod
def unregister(cls):
- del bpy.types.SceneRenderLayer.cycles
+ del bpy.types.ViewLayer.cycles
class CyclesCurveSettings(bpy.types.PropertyGroup):
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 07fd491dc04..13bb0094982 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -17,6 +17,7 @@
# <pep8 compliant>
import bpy
+from bpy_extras.node_utils import find_node_input, find_output_node
from bpy.types import (
Panel,
@@ -49,8 +50,7 @@ class CyclesButtonsPanel:
@classmethod
def poll(cls, context):
- rd = context.scene.render
- return rd.engine in cls.COMPAT_ENGINES
+ return context.scene.view_render.engine in cls.COMPAT_ENGINES
def get_device_type(context):
@@ -204,13 +204,6 @@ class CYCLES_RENDER_PT_sampling(CyclesButtonsPanel, Panel):
col.prop(cscene, "sample_all_lights_indirect")
layout.row().prop(cscene, "sampling_pattern", text="Pattern")
-
- for rl in scene.render.layers:
- if rl.samples > 0:
- layout.separator()
- layout.row().prop(cscene, "use_layer_samples")
- break
-
draw_samples_info(layout, context)
@@ -415,8 +408,8 @@ class CYCLES_RENDER_PT_performance(CyclesButtonsPanel, Panel):
subsub = sub.column()
subsub.active = not rd.use_save_buffers
- for rl in rd.layers:
- if rl.cycles.use_denoising:
+ for view_layer in scene.view_layers:
+ if view_layer.cycles.use_denoising:
subsub.active = False
subsub.prop(cscene, "use_progressive_refine")
@@ -445,43 +438,24 @@ class CYCLES_RENDER_PT_performance(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_layer_options(CyclesButtonsPanel, Panel):
bl_label = "Layer"
- bl_context = "render_layer"
+ bl_context = "view_layer"
def draw(self, context):
layout = self.layout
scene = context.scene
- rd = scene.render
- rl = rd.layers.active
-
- split = layout.split()
-
- col = split.column()
- col.prop(scene, "layers", text="Scene")
- col.prop(rl, "layers_exclude", text="Exclude")
-
- col = split.column()
- col.prop(rl, "layers", text="Layer")
- col.prop(rl, "layers_zmask", text="Mask Layer")
-
- split = layout.split()
+ view_layer = scene.view_layers.active
- col = split.column()
- col.label(text="Material:")
- col.prop(rl, "material_override", text="")
- col.separator()
- col.prop(rl, "samples")
-
- col = split.column()
- col.prop(rl, "use_sky", "Use Environment")
- col.prop(rl, "use_ao", "Use AO")
- col.prop(rl, "use_solid", "Use Surfaces")
- col.prop(rl, "use_strand", "Use Hair")
+ col = layout.column()
+ col.prop(view_layer, "use_sky", "Use Environment")
+ col.prop(view_layer, "use_ao", "Use AO")
+ col.prop(view_layer, "use_solid", "Use Surfaces")
+ col.prop(view_layer, "use_strand", "Use Hair")
class CYCLES_RENDER_PT_layer_passes(CyclesButtonsPanel, Panel):
bl_label = "Passes"
- bl_context = "render_layer"
+ bl_context = "view_layer"
bl_options = {'DEFAULT_CLOSED'}
def draw(self, context):
@@ -491,76 +465,76 @@ class CYCLES_RENDER_PT_layer_passes(CyclesButtonsPanel, Panel):
scene = context.scene
rd = scene.render
- rl = rd.layers.active
- crl = rl.cycles
+ view_layer = scene.view_layers.active
+ cycles_view_layer = view_layer.cycles
split = layout.split()
col = split.column()
- col.prop(rl, "use_pass_combined")
- col.prop(rl, "use_pass_z")
- col.prop(rl, "use_pass_mist")
- col.prop(rl, "use_pass_normal")
+ col.prop(view_layer, "use_pass_combined")
+ col.prop(view_layer, "use_pass_z")
+ col.prop(view_layer, "use_pass_mist")
+ col.prop(view_layer, "use_pass_normal")
row = col.row()
- row.prop(rl, "use_pass_vector")
+ row.prop(view_layer, "use_pass_vector")
row.active = not rd.use_motion_blur
- col.prop(rl, "use_pass_uv")
- col.prop(rl, "use_pass_object_index")
- col.prop(rl, "use_pass_material_index")
+ col.prop(view_layer, "use_pass_uv")
+ col.prop(view_layer, "use_pass_object_index")
+ col.prop(view_layer, "use_pass_material_index")
col.separator()
- col.prop(rl, "use_pass_shadow")
- col.prop(rl, "use_pass_ambient_occlusion")
+ col.prop(view_layer, "use_pass_shadow")
+ col.prop(view_layer, "use_pass_ambient_occlusion")
col.separator()
- col.prop(rl, "pass_alpha_threshold")
+ col.prop(view_layer, "pass_alpha_threshold")
col = split.column()
col.label(text="Diffuse:")
row = col.row(align=True)
- row.prop(rl, "use_pass_diffuse_direct", text="Direct", toggle=True)
- row.prop(rl, "use_pass_diffuse_indirect", text="Indirect", toggle=True)
- row.prop(rl, "use_pass_diffuse_color", text="Color", toggle=True)
+ row.prop(view_layer, "use_pass_diffuse_direct", text="Direct", toggle=True)
+ row.prop(view_layer, "use_pass_diffuse_indirect", text="Indirect", toggle=True)
+ row.prop(view_layer, "use_pass_diffuse_color", text="Color", toggle=True)
col.label(text="Glossy:")
row = col.row(align=True)
- row.prop(rl, "use_pass_glossy_direct", text="Direct", toggle=True)
- row.prop(rl, "use_pass_glossy_indirect", text="Indirect", toggle=True)
- row.prop(rl, "use_pass_glossy_color", text="Color", toggle=True)
+ row.prop(view_layer, "use_pass_glossy_direct", text="Direct", toggle=True)
+ row.prop(view_layer, "use_pass_glossy_indirect", text="Indirect", toggle=True)
+ row.prop(view_layer, "use_pass_glossy_color", text="Color", toggle=True)
col.label(text="Transmission:")
row = col.row(align=True)
- row.prop(rl, "use_pass_transmission_direct", text="Direct", toggle=True)
- row.prop(rl, "use_pass_transmission_indirect", text="Indirect", toggle=True)
- row.prop(rl, "use_pass_transmission_color", text="Color", toggle=True)
+ row.prop(view_layer, "use_pass_transmission_direct", text="Direct", toggle=True)
+ row.prop(view_layer, "use_pass_transmission_indirect", text="Indirect", toggle=True)
+ row.prop(view_layer, "use_pass_transmission_color", text="Color", toggle=True)
col.label(text="Subsurface:")
row = col.row(align=True)
- row.prop(rl, "use_pass_subsurface_direct", text="Direct", toggle=True)
- row.prop(rl, "use_pass_subsurface_indirect", text="Indirect", toggle=True)
- row.prop(rl, "use_pass_subsurface_color", text="Color", toggle=True)
+ row.prop(view_layer, "use_pass_subsurface_direct", text="Direct", toggle=True)
+ row.prop(view_layer, "use_pass_subsurface_indirect", text="Indirect", toggle=True)
+ row.prop(view_layer, "use_pass_subsurface_color", text="Color", toggle=True)
col.label(text="Volume:")
row = col.row(align=True)
- row.prop(crl, "use_pass_volume_direct", text="Direct", toggle=True)
- row.prop(crl, "use_pass_volume_indirect", text="Indirect", toggle=True)
+ row.prop(cycles_view_layer, "use_pass_volume_direct", text="Direct", toggle=True)
+ row.prop(cycles_view_layer, "use_pass_volume_indirect", text="Indirect", toggle=True)
col.separator()
- col.prop(rl, "use_pass_emit", text="Emission")
- col.prop(rl, "use_pass_environment")
+ col.prop(view_layer, "use_pass_emit", text="Emission")
+ col.prop(view_layer, "use_pass_environment")
if context.scene.cycles.feature_set == 'EXPERIMENTAL':
col.separator()
sub = col.column()
- sub.active = crl.use_denoising
- sub.prop(crl, "denoising_store_passes", text="Denoising")
+ sub.active = cycles_view_layer.use_denoising
+ sub.prop(cycles_view_layer, "denoising_store_passes", text="Denoising")
col = layout.column()
- col.prop(crl, "pass_debug_render_time")
+ col.prop(cycles_view_layer, "pass_debug_render_time")
if _cycles.with_cycles_debug:
- col.prop(crl, "pass_debug_bvh_traversed_nodes")
- col.prop(crl, "pass_debug_bvh_traversed_instances")
- col.prop(crl, "pass_debug_bvh_intersections")
- col.prop(crl, "pass_debug_ray_bounces")
+ col.prop(cycles_view_layer, "pass_debug_bvh_traversed_nodes")
+ col.prop(cycles_view_layer, "pass_debug_bvh_traversed_instances")
+ col.prop(cycles_view_layer, "pass_debug_bvh_intersections")
+ col.prop(cycles_view_layer, "pass_debug_ray_bounces")
class CYCLES_RENDER_PT_views(CyclesButtonsPanel, Panel):
bl_label = "Views"
- bl_context = "render_layer"
+ bl_context = "view_layer"
bl_options = {'DEFAULT_CLOSED'}
def draw_header(self, context):
@@ -582,7 +556,7 @@ class CYCLES_RENDER_PT_views(CyclesButtonsPanel, Panel):
if basic_stereo:
row = layout.row()
- row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2)
+ row.template_list("VIEWLAYER_UL_renderviews", "name", rd, "stereo_views", rd.views, "active_index", rows=2)
row = layout.row()
row.label(text="File Suffix:")
@@ -590,7 +564,7 @@ class CYCLES_RENDER_PT_views(CyclesButtonsPanel, Panel):
else:
row = layout.row()
- row.template_list("RENDERLAYER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2)
+ row.template_list("VIEWLAYER_UL_renderviews", "name", rd, "views", rd.views, "active_index", rows=2)
col = row.column(align=True)
col.operator("scene.render_view_add", icon='ZOOMIN', text="")
@@ -603,66 +577,65 @@ class CYCLES_RENDER_PT_views(CyclesButtonsPanel, Panel):
class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel):
bl_label = "Denoising"
- bl_context = "render_layer"
+ bl_context = "view_layer"
bl_options = {'DEFAULT_CLOSED'}
def draw_header(self, context):
- rd = context.scene.render
- rl = rd.layers.active
- crl = rl.cycles
- cscene = context.scene.cycles
+ scene = context.scene
+ view_layer = scene.view_layers.active
+ cycles_view_layer = view_layer.cycles
+ cscene = scene.cycles
layout = self.layout
- layout.prop(crl, "use_denoising", text="")
+ layout.prop(cycles_view_layer, "use_denoising", text="")
def draw(self, context):
layout = self.layout
scene = context.scene
cscene = scene.cycles
- rd = scene.render
- rl = rd.layers.active
- crl = rl.cycles
+ view_layer = scene.view_layers.active
+ cycles_view_layer = view_layer.cycles
- layout.active = crl.use_denoising
+ layout.active = cycles_view_layer.use_denoising
split = layout.split()
col = split.column()
sub = col.column(align=True)
- sub.prop(crl, "denoising_radius", text="Radius")
- sub.prop(crl, "denoising_strength", slider=True, text="Strength")
+ sub.prop(cycles_view_layer, "denoising_radius", text="Radius")
+ sub.prop(cycles_view_layer, "denoising_strength", slider=True, text="Strength")
col = split.column()
sub = col.column(align=True)
- sub.prop(crl, "denoising_feature_strength", slider=True, text="Feature Strength")
- sub.prop(crl, "denoising_relative_pca")
+ sub.prop(cycles_view_layer, "denoising_feature_strength", slider=True, text="Feature Strength")
+ sub.prop(cycles_view_layer, "denoising_relative_pca")
layout.separator()
row = layout.row()
row.label(text="Diffuse:")
sub = row.row(align=True)
- sub.prop(crl, "denoising_diffuse_direct", text="Direct", toggle=True)
- sub.prop(crl, "denoising_diffuse_indirect", text="Indirect", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_diffuse_direct", text="Direct", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_diffuse_indirect", text="Indirect", toggle=True)
row = layout.row()
row.label(text="Glossy:")
sub = row.row(align=True)
- sub.prop(crl, "denoising_glossy_direct", text="Direct", toggle=True)
- sub.prop(crl, "denoising_glossy_indirect", text="Indirect", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_glossy_direct", text="Direct", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_glossy_indirect", text="Indirect", toggle=True)
row = layout.row()
row.label(text="Transmission:")
sub = row.row(align=True)
- sub.prop(crl, "denoising_transmission_direct", text="Direct", toggle=True)
- sub.prop(crl, "denoising_transmission_indirect", text="Indirect", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_transmission_direct", text="Direct", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_transmission_indirect", text="Indirect", toggle=True)
row = layout.row()
row.label(text="Subsurface:")
sub = row.row(align=True)
- sub.prop(crl, "denoising_subsurface_direct", text="Direct", toggle=True)
- sub.prop(crl, "denoising_subsurface_indirect", text="Indirect", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_subsurface_direct", text="Direct", toggle=True)
+ sub.prop(cycles_view_layer, "denoising_subsurface_indirect", text="Indirect", toggle=True)
class CYCLES_PT_post_processing(CyclesButtonsPanel, Panel):
@@ -913,43 +886,22 @@ class CYCLES_OT_use_shading_nodes(Operator):
return {'FINISHED'}
-def find_node(material, nodetype):
- if material and material.node_tree:
- ntree = material.node_tree
-
- active_output_node = None
- for node in ntree.nodes:
- if getattr(node, "type", None) == nodetype:
- if getattr(node, "is_active_output", True):
- return node
- if not active_output_node:
- active_output_node = node
- return active_output_node
-
- return None
-
-
-def find_node_input(node, name):
- for input in node.inputs:
- if input.name == name:
- return input
-
- return None
-
-
-def panel_node_draw(layout, id_data, output_type, input_name):
+def panel_node_draw(layout, id_data, output_types, input_name):
if not id_data.use_nodes:
layout.operator("cycles.use_shading_nodes", icon='NODETREE')
return False
ntree = id_data.node_tree
- node = find_node(id_data, output_type)
- if not node:
- layout.label(text="No output node")
- else:
+ node = find_output_node(ntree, output_types)
+ if node:
input = find_node_input(node, input_name)
- layout.template_node_view(ntree, node, input)
+ if input:
+ layout.template_node_view(ntree, node, input)
+ else:
+ layout.label(text="Incompatible output node")
+ else:
+ layout.label(text="No output node")
return True
@@ -1038,7 +990,7 @@ class CYCLES_LAMP_PT_nodes(CyclesButtonsPanel, Panel):
layout = self.layout
lamp = context.lamp
- if not panel_node_draw(layout, lamp, 'OUTPUT_LAMP', 'Surface'):
+ if not panel_node_draw(layout, lamp, ('OUTPUT_LAMP',), 'Surface'):
layout.prop(lamp, "color")
@@ -1093,7 +1045,7 @@ class CYCLES_WORLD_PT_surface(CyclesButtonsPanel, Panel):
world = context.world
- if not panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Surface'):
+ if not panel_node_draw(layout, world, ('OUTPUT_WORLD',), 'Surface'):
layout.prop(world, "horizon_color", text="Color")
@@ -1111,7 +1063,7 @@ class CYCLES_WORLD_PT_volume(CyclesButtonsPanel, Panel):
layout = self.layout
world = context.world
- panel_node_draw(layout, world, 'OUTPUT_WORLD', 'Volume')
+ panel_node_draw(layout, world, ('OUTPUT_WORLD',), 'Volume')
class CYCLES_WORLD_PT_ambient_occlusion(CyclesButtonsPanel, Panel):
@@ -1148,8 +1100,8 @@ class CYCLES_WORLD_PT_mist(CyclesButtonsPanel, Panel):
def poll(cls, context):
if CyclesButtonsPanel.poll(context):
if context.world:
- for rl in context.scene.render.layers:
- if rl.use_pass_mist:
+ for view_layer in context.scene.view_layers:
+ if view_layer.use_pass_mist:
return True
return False
@@ -1256,7 +1208,7 @@ class CYCLES_MATERIAL_PT_surface(CyclesButtonsPanel, Panel):
layout = self.layout
mat = context.material
- if not panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Surface'):
+ if not panel_node_draw(layout, mat, ('OUTPUT_MATERIAL', 'OUTPUT_EEVEE_MATERIAL'), 'Surface'):
layout.prop(mat, "diffuse_color")
@@ -1276,7 +1228,7 @@ class CYCLES_MATERIAL_PT_volume(CyclesButtonsPanel, Panel):
mat = context.material
# cmat = mat.cycles
- panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Volume')
+ panel_node_draw(layout, mat, ('OUTPUT_MATERIAL', 'OUTPUT_EEVEE_MATERIAL'), 'Volume')
class CYCLES_MATERIAL_PT_displacement(CyclesButtonsPanel, Panel):
@@ -1292,7 +1244,7 @@ class CYCLES_MATERIAL_PT_displacement(CyclesButtonsPanel, Panel):
layout = self.layout
mat = context.material
- panel_node_draw(layout, mat, 'OUTPUT_MATERIAL', 'Displacement')
+ panel_node_draw(layout, mat, ('OUTPUT_MATERIAL', 'OUTPUT_EEVEE_MATERIAL'), 'Displacement')
class CYCLES_MATERIAL_PT_settings(CyclesButtonsPanel, Panel):
@@ -1701,6 +1653,7 @@ class CYCLES_SCENE_PT_simplify(CyclesButtonsPanel, Panel):
row.prop(rd, "simplify_subdivision", text="Viewport")
row.prop(rd, "simplify_subdivision_render", text="Render")
+
col = layout.column(align=True)
col.label(text="Child Particles")
row = col.row(align=True)
@@ -1740,7 +1693,7 @@ def draw_device(self, context):
scene = context.scene
layout = self.layout
- if scene.render.engine == 'CYCLES':
+ if context.engine == 'CYCLES':
from . import engine
cscene = scene.cycles
@@ -1760,14 +1713,11 @@ def draw_pause(self, context):
layout = self.layout
scene = context.scene
- if scene.render.engine == "CYCLES":
+ if context.engine == "CYCLES":
view = context.space_data
- if view.viewport_shade == 'RENDERED':
- cscene = scene.cycles
- layername = scene.render.layers.active.name
- layout.prop(cscene, "preview_pause", icon="PAUSE", text="")
- layout.prop(cscene, "preview_active_layer", icon="RENDERLAYERS", text=layername)
+ cscene = scene.cycles
+ layout.prop(cscene, "preview_pause", icon="PAUSE", text="")
def get_panels():
@@ -1800,9 +1750,9 @@ def get_panels():
'MATERIAL_PT_volume_options',
'MATERIAL_PT_volume_shading',
'MATERIAL_PT_volume_transp',
- 'RENDERLAYER_PT_layer_options',
- 'RENDERLAYER_PT_layer_passes',
- 'RENDERLAYER_PT_views',
+ 'VIEWLAYER_PT_layer_options',
+ 'VIEWLAYER_PT_layer_passes',
+ 'VIEWLAYER_PT_views',
'RENDER_PT_antialiasing',
'RENDER_PT_bake',
'RENDER_PT_motion_blur',
diff --git a/intern/cycles/blender/addon/version_update.py b/intern/cycles/blender/addon/version_update.py
index 400d6dac454..12f1cec4ac9 100644
--- a/intern/cycles/blender/addon/version_update.py
+++ b/intern/cycles/blender/addon/version_update.py
@@ -363,7 +363,8 @@ def do_versions(self):
if not cscene.is_property_set("sample_clamp_indirect"):
cscene.sample_clamp_indirect = 0.0
- if bpy.data.version <= (2, 79, 1):
+ if bpy.data.version <= (2, 79, 1) or \
+ (bpy.data.version >= (2, 80, 0) and bpy.data.version <= (2, 80, 3)):
displacement_nodes_insert()
if bpy.data.version <= (2, 79, 2):
diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index 42b985305ea..1499390f1d5 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -325,14 +325,14 @@ static bool ObtainCacheParticleVcol(Mesh *mesh,
return true;
}
-static void set_resolution(BL::Object *b_ob, BL::Scene *scene, bool render)
+static void set_resolution(BL::Object *b_ob, BL::Scene *scene, BL::ViewLayer *view_layer, bool render)
{
BL::Object::modifiers_iterator b_mod;
for(b_ob->modifiers.begin(b_mod); b_mod != b_ob->modifiers.end(); ++b_mod) {
if((b_mod->type() == b_mod->type_PARTICLE_SYSTEM) && ((b_mod->show_viewport()) || (b_mod->show_render()))) {
BL::ParticleSystemModifier psmd((const PointerRNA)b_mod->ptr);
BL::ParticleSystem b_psys((const PointerRNA)psmd.particle_system().ptr);
- b_psys.set_resolution(*scene, *b_ob, (render)? 2: 1);
+ b_psys.set_resolution(*scene, *view_layer, *b_ob, (render)? 2: 1);
}
}
}
@@ -912,7 +912,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
ParticleCurveData CData;
if(!preview)
- set_resolution(&b_ob, &b_scene, true);
+ set_resolution(&b_ob, &b_scene, &b_view_layer, true);
ObtainCacheParticleData(mesh, &b_mesh, &b_ob, &CData, !preview);
@@ -1057,7 +1057,7 @@ void BlenderSync::sync_curves(Mesh *mesh,
}
if(!preview)
- set_resolution(&b_ob, &b_scene, false);
+ set_resolution(&b_ob, &b_scene, &b_view_layer, false);
mesh->compute_bounds();
}
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 6f1c49774f2..df1b1a4ca10 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -557,7 +557,7 @@ static void attr_create_subd_uv_map(Scene *scene,
int i = 0;
for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, ++i) {
- bool active_render = b_mesh.uv_textures[i].active_render();
+ bool active_render = l->active_render();
AttributeStandard uv_std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
ustring uv_name = ustring(l->name().c_str());
AttributeStandard tangent_std = (active_render)? ATTR_STD_UV_TANGENT
@@ -1066,6 +1066,7 @@ static void sync_mesh_fluid_motion(BL::Object& b_ob, Scene *scene, Mesh *mesh)
}
Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
+ BL::Object& b_ob_instance,
bool object_updated,
bool hide_tris)
{
@@ -1079,8 +1080,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
/* test if we can instance or if the object is modified */
BL::ID b_ob_data = b_ob.data();
- BL::ID key = (BKE_object_is_modified(b_ob))? b_ob: b_ob_data;
- BL::Material material_override = render_layer.material_override;
+ BL::ID key = (BKE_object_is_modified(b_ob))? b_ob_instance: b_ob_data;
+ BL::Material material_override = view_layer.material_override;
/* find shader indices */
vector<Shader*> used_shaders;
@@ -1105,10 +1106,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
/* test if we need to sync */
int requested_geometry_flags = Mesh::GEOMETRY_NONE;
- if(render_layer.use_surfaces) {
+ if(view_layer.use_surfaces) {
requested_geometry_flags |= Mesh::GEOMETRY_TRIANGLES;
}
- if(render_layer.use_hair) {
+ if(view_layer.use_hair) {
requested_geometry_flags |= Mesh::GEOMETRY_CURVES;
}
Mesh *mesh;
@@ -1183,13 +1184,14 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
BL::Mesh b_mesh = object_to_mesh(b_data,
b_ob,
b_scene,
+ b_view_layer,
true,
!preview,
need_undeformed,
mesh->subdivision_type);
if(b_mesh) {
- if(render_layer.use_surfaces && !hide_tris) {
+ if(view_layer.use_surfaces && !hide_tris) {
if(mesh->subdivision_type != Mesh::SUBDIVISION_NONE)
create_subd_mesh(scene, mesh, b_ob, b_mesh, used_shaders,
dicing_rate, max_subdivisions);
@@ -1199,7 +1201,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
}
- if(render_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
+ if(view_layer.use_hair && mesh->subdivision_type == Mesh::SUBDIVISION_NONE)
sync_curves(mesh, b_mesh, b_ob, false);
if(can_free_caches) {
@@ -1297,6 +1299,7 @@ void BlenderSync::sync_mesh_motion(BL::Object& b_ob,
b_mesh = object_to_mesh(b_data,
b_ob,
b_scene,
+ b_view_layer,
true,
!preview,
false,
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 38ef1bc5249..6564eea4767 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -112,13 +112,14 @@ static uint object_ray_visibility(BL::Object& b_ob)
void BlenderSync::sync_light(BL::Object& b_parent,
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
BL::Object& b_ob,
- BL::DupliObject& b_dupli_ob,
+ BL::Object& b_ob_instance,
+ int random_id,
Transform& tfm,
bool *use_portal)
{
/* test if we need to sync */
Light *light;
- ObjectKey key(b_parent, persistent_id, b_ob);
+ ObjectKey key(b_parent, persistent_id, b_ob_instance);
if(!light_map.sync(&light, b_ob, b_parent, key)) {
if(light->is_portal)
@@ -194,8 +195,8 @@ void BlenderSync::sync_light(BL::Object& b_parent,
light->max_bounces = get_int(clamp, "max_bounces");
- if(b_dupli_ob) {
- light->random_id = b_dupli_ob.random_id();
+ if(b_ob != b_ob_instance) {
+ light->random_id = random_id;
}
else {
light->random_id = hash_int_2d(hash_string(b_ob.name().c_str()), 0);
@@ -262,24 +263,42 @@ void BlenderSync::sync_background_light(bool use_portal)
/* Object */
-Object *BlenderSync::sync_object(BL::Object& b_parent,
- int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
- BL::DupliObject& b_dupli_ob,
- Transform& tfm,
+Object *BlenderSync::sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter,
uint layer_flag,
float motion_time,
bool hide_tris,
BlenderObjectCulling& culling,
bool *use_portal)
{
- BL::Object b_ob = (b_dupli_ob ? b_dupli_ob.object() : b_parent);
- bool motion = motion_time != 0.0f;
-
+ const bool is_instance = b_dupli_iter->is_instance();
+ BL::Object b_ob = b_dupli_iter->object();
+ BL::Object b_parent = is_instance ? b_dupli_iter->parent()
+ : b_dupli_iter->object();
+ BL::Object b_ob_instance = is_instance ? b_dupli_iter->instance_object()
+ : b_ob;
+ const bool motion = motion_time != 0.0f;
+ /*const*/ Transform tfm = get_transform(b_ob.matrix_world());
+ int *persistent_id = NULL;
+ BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id_array;
+ if(is_instance) {
+ persistent_id_array = b_dupli_iter->persistent_id();
+ persistent_id = persistent_id_array.data;
+ }
+
/* light is handled separately */
if(object_is_light(b_ob)) {
/* don't use lamps for excluded layers used as mask layer */
- if(!motion && !((layer_flag & render_layer.holdout_layer) && (layer_flag & render_layer.exclude_layer)))
- sync_light(b_parent, persistent_id, b_ob, b_dupli_ob, tfm, use_portal);
+ if(!motion && !((layer_flag & view_layer.holdout_layer) &&
+ (layer_flag & view_layer.exclude_layer)))
+ {
+ sync_light(b_parent,
+ persistent_id,
+ b_ob,
+ b_ob_instance,
+ is_instance ? b_dupli_iter->random_id() : 0,
+ tfm,
+ use_portal);
+ }
return NULL;
}
@@ -296,7 +315,7 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
/* Visibility flags for both parent and child. */
PointerRNA cobject = RNA_pointer_get(&b_ob.ptr, "cycles");
- bool use_holdout = (layer_flag & render_layer.holdout_layer) != 0 ||
+ bool use_holdout = (layer_flag & view_layer.holdout_layer) != 0 ||
get_boolean(cobject, "is_holdout");
uint visibility = object_ray_visibility(b_ob) & PATH_RAY_ALL_VISIBILITY;
@@ -305,12 +324,12 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
}
/* Make holdout objects on excluded layer invisible for non-camera rays. */
- if(use_holdout && (layer_flag & render_layer.exclude_layer)) {
+ if(use_holdout && (layer_flag & view_layer.exclude_layer)) {
visibility &= ~(PATH_RAY_ALL_VISIBILITY - PATH_RAY_CAMERA);
}
/* Hide objects not on render layer from camera rays. */
- if(!(layer_flag & render_layer.layer)) {
+ if(!(layer_flag & view_layer.layer)) {
visibility &= ~PATH_RAY_CAMERA;
}
@@ -320,7 +339,7 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
}
/* key to lookup object */
- ObjectKey key(b_parent, persistent_id, b_ob);
+ ObjectKey key(b_parent, persistent_id, b_ob_instance);
Object *object;
/* motion vector case */
@@ -360,7 +379,7 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
object_updated = true;
/* mesh sync */
- object->mesh = sync_mesh(b_ob, object_updated, hide_tris);
+ object->mesh = sync_mesh(b_ob, b_ob_instance, object_updated, hide_tris);
/* special case not tracked by object update flags */
@@ -412,10 +431,10 @@ Object *BlenderSync::sync_object(BL::Object& b_parent,
}
/* dupli texture coordinates and random_id */
- if(b_dupli_ob) {
- object->dupli_generated = 0.5f*get_float3(b_dupli_ob.orco()) - make_float3(0.5f, 0.5f, 0.5f);
- object->dupli_uv = get_float2(b_dupli_ob.uv());
- object->random_id = b_dupli_ob.random_id();
+ if(is_instance) {
+ object->dupli_generated = 0.5f*get_float3(b_dupli_iter->orco()) - make_float3(0.5f, 0.5f, 0.5f);
+ object->dupli_uv = get_float2(b_dupli_iter->uv());
+ object->random_id = b_dupli_iter->random_id();
}
else {
object->dupli_generated = make_float3(0.0f, 0.0f, 0.0f);
@@ -450,6 +469,7 @@ static bool object_render_hide(BL::Object& b_ob,
BL::Object::particle_systems_iterator b_psys;
bool hair_present = false;
+ bool has_particles = false;
bool show_emitter = false;
bool hide_emitter = false;
bool hide_as_dupli_parent = false;
@@ -459,20 +479,17 @@ static bool object_render_hide(BL::Object& b_ob,
if((b_psys->settings().render_type() == BL::ParticleSettings::render_type_PATH) &&
(b_psys->settings().type()==BL::ParticleSettings::type_HAIR))
hair_present = true;
-
- if(b_psys->settings().use_render_emitter())
- show_emitter = true;
- else
- hide_emitter = true;
+ has_particles = true;
}
- if(show_emitter)
- hide_emitter = false;
-
- /* duplicators hidden by default, except dupliframes which duplicate self */
- if(b_ob.is_duplicator())
- if(top_level || b_ob.dupli_type() != BL::Object::dupli_type_FRAMES)
+ if(has_particles) {
+ show_emitter = b_ob.show_duplicator_for_render();
+ hide_emitter = !show_emitter;
+ } else if(b_ob.is_duplicator()) {
+ if(top_level || b_ob.show_duplicator_for_render()) {
hide_as_dupli_parent = true;
+ }
+ }
/* hide original object for duplis */
BL::Object parent = b_ob.parent();
@@ -501,19 +518,11 @@ static bool object_render_hide(BL::Object& b_ob,
}
}
-static bool object_render_hide_duplis(BL::Object& b_ob)
-{
- BL::Object parent = b_ob.parent();
-
- return (parent && object_render_hide_original(b_ob.type(), parent.dupli_type()));
-}
-
/* Object Loop */
void BlenderSync::sync_objects(float motion_time)
{
/* layer data */
- uint scene_layer = render_layer.scene_layer;
bool motion = motion_time != 0.0f;
if(!motion) {
@@ -532,100 +541,38 @@ void BlenderSync::sync_objects(float motion_time)
BlenderObjectCulling culling(scene, b_scene);
/* object loop */
- BL::Scene::object_bases_iterator b_base;
- BL::Scene b_sce = b_scene;
- /* modifier result type (not exposed as enum in C++ API)
- * 1 : DAG_EVAL_PREVIEW
- * 2 : DAG_EVAL_RENDER
- */
- int dupli_settings = (render_layer.use_viewport_visibility) ? 1 : 2;
-
bool cancel = false;
bool use_portal = false;
- uint layer_override = get_layer(b_engine.layer_override());
- for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
- /* Render layer's scene_layer is affected by local view already,
- * which is not a desired behavior here.
- */
- uint scene_layers = layer_override ? layer_override : get_layer(b_scene.layers());
- for(b_sce.object_bases.begin(b_base); b_base != b_sce.object_bases.end() && !cancel; ++b_base) {
- BL::Object b_ob = b_base->object();
- bool hide = (render_layer.use_viewport_visibility)? b_ob.hide(): b_ob.hide_render();
- uint ob_layer = get_layer(b_base->layers(),
- b_base->layers_local_view(),
- object_is_light(b_ob),
- scene_layers);
- hide = hide || !(ob_layer & scene_layer);
-
- if(!hide) {
- progress.set_sync_status("Synchronizing object", b_ob.name());
-
- /* load per-object culling data */
- culling.init_object(scene, b_ob);
-
- if(b_ob.is_duplicator() && !object_render_hide_duplis(b_ob)) {
- /* dupli objects */
- b_ob.dupli_list_create(b_scene, dupli_settings);
-
- BL::Object::dupli_list_iterator b_dup;
-
- for(b_ob.dupli_list.begin(b_dup); b_dup != b_ob.dupli_list.end(); ++b_dup) {
- Transform tfm = get_transform(b_dup->matrix());
- BL::Object b_dup_ob = b_dup->object();
- bool dup_hide = (render_layer.use_viewport_visibility)? b_dup_ob.hide(): b_dup_ob.hide_render();
- bool in_dupli_group = (b_dup->type() == BL::DupliObject::type_GROUP);
- bool hide_tris;
-
- if(!(b_dup->hide() || dup_hide || object_render_hide(b_dup_ob, false, in_dupli_group, hide_tris))) {
- /* the persistent_id allows us to match dupli objects
- * between frames and updates */
- BL::Array<int, OBJECT_PERSISTENT_ID_SIZE> persistent_id = b_dup->persistent_id();
-
- /* sync object and mesh or light data */
- Object *object = sync_object(b_ob,
- persistent_id.data,
- *b_dup,
- tfm,
- ob_layer,
- motion_time,
- hide_tris,
- culling,
- &use_portal);
-
- /* sync possible particle data, note particle_id
- * starts counting at 1, first is dummy particle */
- if(!motion && object) {
- sync_dupli_particle(b_ob, *b_dup, object);
- }
-
- }
- }
-
- b_ob.dupli_list_clear();
- }
+ BL::Depsgraph::duplis_iterator b_dupli_iter;
+ for(b_depsgraph.duplis.begin(b_dupli_iter);
+ b_dupli_iter != b_depsgraph.duplis.end() && !cancel;
+ ++b_dupli_iter)
+ {
+ BL::Object b_ob = b_dupli_iter->object();
+ if(!b_ob.is_visible()) {
+ continue;
+ }
- /* test if object needs to be hidden */
- bool hide_tris;
-
- if(!object_render_hide(b_ob, true, true, hide_tris)) {
- /* object itself */
- Transform tfm = get_transform(b_ob.matrix_world());
- BL::DupliObject b_empty_dupli_ob(PointerRNA_NULL);
- sync_object(b_ob,
- NULL,
- b_empty_dupli_ob,
- tfm,
- ob_layer,
- motion_time,
- hide_tris,
- culling,
- &use_portal);
- }
- }
+ progress.set_sync_status("Synchronizing object", b_ob.name());
- cancel = progress.get_cancel();
- }
+ /* load per-object culling data */
+ culling.init_object(scene, b_ob);
+
+ /* test if object needs to be hidden */
+ bool hide_tris;
+
+ if(!object_render_hide(b_ob, true, true, hide_tris)) {
+ /* object itself */
+ sync_object(b_dupli_iter,
+ ~(0), /* until we get rid of layers */
+ motion_time,
+ hide_tris,
+ culling,
+ &use_portal);
+ }
+
+ cancel = progress.get_cancel();
}
progress.set_sync_status("");
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 792597cbad5..9ade27d57d7 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -203,10 +203,10 @@ static PyObject *exit_func(PyObject * /*self*/, PyObject * /*args*/)
static PyObject *create_func(PyObject * /*self*/, PyObject *args)
{
- PyObject *pyengine, *pyuserpref, *pydata, *pyscene, *pyregion, *pyv3d, *pyrv3d;
+ PyObject *pyengine, *pyuserpref, *pydata, *pygraph, *pyscene, *pyregion, *pyv3d, *pyrv3d;
int preview_osl;
- if(!PyArg_ParseTuple(args, "OOOOOOOi", &pyengine, &pyuserpref, &pydata, &pyscene,
+ if(!PyArg_ParseTuple(args, "OOOOOOOOi", &pyengine, &pyuserpref, &pydata, &pygraph, &pyscene,
&pyregion, &pyv3d, &pyrv3d, &preview_osl))
{
return NULL;
@@ -225,6 +225,10 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
RNA_main_pointer_create((Main*)PyLong_AsVoidPtr(pydata), &dataptr);
BL::BlendData data(dataptr);
+ PointerRNA graphptr;
+ RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pygraph), &graphptr);
+ BL::Depsgraph graph(graphptr);
+
PointerRNA sceneptr;
RNA_id_pointer_create((ID*)PyLong_AsVoidPtr(pyscene), &sceneptr);
BL::Scene scene(sceneptr);
@@ -249,7 +253,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
int width = region.width();
int height = region.height();
- session = new BlenderSession(engine, userpref, data, scene, v3d, rv3d, width, height);
+ session = new BlenderSession(engine, userpref, data, graph, scene, v3d, rv3d, width, height);
}
else {
/* override some settings for preview */
@@ -261,7 +265,7 @@ static PyObject *create_func(PyObject * /*self*/, PyObject *args)
}
/* offline session or preview render */
- session = new BlenderSession(engine, userpref, data, scene);
+ session = new BlenderSession(engine, userpref, data, graph, scene);
}
python_thread_state_save(&session->python_thread_state);
@@ -327,9 +331,9 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject *args)
static PyObject *draw_func(PyObject * /*self*/, PyObject *args)
{
- PyObject *pysession, *pyv3d, *pyrv3d;
+ PyObject *pysession, *pygraph, *pyv3d, *pyrv3d;
- if(!PyArg_ParseTuple(args, "OOO", &pysession, &pyv3d, &pyrv3d))
+ if(!PyArg_ParseTuple(args, "OOOO", &pysession, &pygraph, &pyv3d, &pyrv3d))
return NULL;
BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index d9301125641..60e49161be2 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -52,12 +52,15 @@ int BlenderSession::end_resumable_chunk = 0;
BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
BL::UserPreferences& b_userpref,
BL::BlendData& b_data,
+ BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene)
: b_engine(b_engine),
b_userpref(b_userpref),
b_data(b_data),
b_render(b_engine.render()),
+ b_depsgraph(b_depsgraph),
b_scene(b_scene),
+ b_view_layer(b_engine.view_layer()),
b_v3d(PointerRNA_NULL),
b_rv3d(PointerRNA_NULL),
python_thread_state(NULL)
@@ -76,6 +79,7 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
BL::UserPreferences& b_userpref,
BL::BlendData& b_data,
+ BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene,
BL::SpaceView3D& b_v3d,
BL::RegionView3D& b_rv3d,
@@ -84,7 +88,9 @@ BlenderSession::BlenderSession(BL::RenderEngine& b_engine,
b_userpref(b_userpref),
b_data(b_data),
b_render(b_scene.render()),
+ b_depsgraph(b_depsgraph),
b_scene(b_scene),
+ b_view_layer(b_engine.view_layer()),
b_v3d(b_v3d),
b_rv3d(b_rv3d),
width(width),
@@ -142,7 +148,7 @@ void BlenderSession::create_session()
session->scene = scene;
/* create sync */
- sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
+ sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress);
BL::Object b_camera_override(b_engine.camera_override());
if(b_v3d) {
if(session_pause == false) {
@@ -159,7 +165,7 @@ void BlenderSession::create_session()
else {
/* for final render we will do full data sync per render layer, only
* do some basic syncing here, no objects or materials for speed */
- sync->sync_render_layers(b_v3d, NULL);
+ sync->sync_view_layers(b_v3d, NULL);
sync->sync_integrator();
sync->sync_camera(b_render, b_camera_override, width, height, "");
}
@@ -211,12 +217,12 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, BL::Scene& b_scene_)
session->stats.mem_peak = session->stats.mem_used;
/* sync object should be re-created */
- sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress);
+ sync = new BlenderSync(b_engine, b_data, b_depsgraph, b_scene, scene, !background, session->progress);
/* for final render we will do full data sync per render layer, only
* do some basic syncing here, no objects or materials for speed */
BL::Object b_camera_override(b_engine.camera_override());
- sync->sync_render_layers(b_v3d, NULL);
+ sync->sync_view_layers(b_v3d, NULL);
sync->sync_integrator();
sync->sync_camera(b_render, b_camera_override, width, height, "");
@@ -377,14 +383,13 @@ void BlenderSession::render()
BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
/* render each layer */
- BL::RenderSettings r = b_scene.render();
- BL::RenderSettings::layers_iterator b_layer_iter;
+ BL::Scene::view_layers_iterator b_layer_iter;
BL::RenderResult::views_iterator b_view_iter;
/* We do some special meta attributes when we only have single layer. */
- const bool is_single_layer = (r.layers.length() == 1);
+ const bool is_single_layer = (b_scene.view_layers.length() == 1);
- for(r.layers.begin(b_layer_iter); b_layer_iter != r.layers.end(); ++b_layer_iter) {
+ for(b_scene.view_layers.begin(b_layer_iter); b_layer_iter != b_scene.view_layers.end(); ++b_layer_iter) {
b_rlay_name = b_layer_iter->name();
/* temporary render result to find needed passes and views */
@@ -1306,7 +1311,7 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name,
BL::ShaderNodeTexPointDensity b_point_density_node(b_node);
int length;
int settings = background ? 1 : 0; /* 1 - render settings, 0 - vewport settings. */
- b_point_density_node.calc_point_density(b_scene, settings, &length, &pixels);
+ b_point_density_node.calc_point_density(b_scene, b_view_layer, settings, &length, &pixels);
}
}
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index cbd2303d282..8694c9499b8 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -36,11 +36,13 @@ public:
BlenderSession(BL::RenderEngine& b_engine,
BL::UserPreferences& b_userpref,
BL::BlendData& b_data,
+ BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene);
BlenderSession(BL::RenderEngine& b_engine,
BL::UserPreferences& b_userpref,
BL::BlendData& b_data,
+ BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene,
BL::SpaceView3D& b_v3d,
BL::RegionView3D& b_rv3d,
@@ -104,7 +106,9 @@ public:
BL::UserPreferences b_userpref;
BL::BlendData b_data;
BL::RenderSettings b_render;
+ BL::Depsgraph b_depsgraph;
BL::Scene b_scene;
+ BL::ViewLayer b_view_layer;
BL::SpaceView3D b_v3d;
BL::RegionView3D b_rv3d;
string b_rlay_name;
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index ac1eba85dbb..d4c34d52011 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -231,17 +231,11 @@ static void get_tex_mapping(TextureMapping *mapping,
mapping->max = get_float3(b_mapping.max());
}
-static bool is_output_node(BL::Node& b_node)
-{
- return (b_node.is_a(&RNA_ShaderNodeOutputMaterial)
- || b_node.is_a(&RNA_ShaderNodeOutputWorld)
- || b_node.is_a(&RNA_ShaderNodeOutputLamp));
-}
-
static ShaderNode *add_node(Scene *scene,
BL::RenderEngine& b_engine,
BL::BlendData& b_data,
BL::Scene& b_scene,
+ BL::ViewLayer b_view_layer,
const bool background,
ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree,
@@ -838,7 +832,7 @@ static ShaderNode *add_node(Scene *scene,
/* TODO(sergey): Use more proper update flag. */
if(true) {
- b_point_density_node.cache_point_density(b_scene, settings);
+ b_point_density_node.cache_point_density(b_scene, b_view_layer, settings);
scene->image_manager->tag_reload_image(
point_density->filename.string(),
point_density->builtin_data,
@@ -856,7 +850,7 @@ static ShaderNode *add_node(Scene *scene,
BL::Object b_ob(b_point_density_node.object());
if(b_ob) {
float3 loc, size;
- point_density_texture_space(b_scene,
+ point_density_texture_space(b_scene, b_view_layer,
b_point_density_node,
settings,
loc,
@@ -968,10 +962,36 @@ static ShaderOutput *node_find_output_by_name(ShaderNode *node,
return node->output(name.c_str());
}
+static BL::ShaderNode find_output_node(BL::ShaderNodeTree& b_ntree)
+{
+ BL::ShaderNodeTree::nodes_iterator b_node;
+ BL::ShaderNode output_node(PointerRNA_NULL);
+
+ for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
+ BL::ShaderNodeOutputMaterial b_output_node(*b_node);
+
+ if (b_output_node.is_a(&RNA_ShaderNodeOutputMaterial) ||
+ b_output_node.is_a(&RNA_ShaderNodeOutputWorld) ||
+ b_output_node.is_a(&RNA_ShaderNodeOutputLamp)) {
+ /* regular Cycles output node */
+ if(b_output_node.is_active_output()) {
+ output_node = b_output_node;
+ break;
+ }
+ else if(!output_node.ptr.data) {
+ output_node = b_output_node;
+ }
+ }
+ }
+
+ return output_node;
+}
+
static void add_nodes(Scene *scene,
BL::RenderEngine& b_engine,
BL::BlendData& b_data,
BL::Scene& b_scene,
+ BL::ViewLayer& b_view_layer,
const bool background,
ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree,
@@ -987,23 +1007,7 @@ static void add_nodes(Scene *scene,
BL::Node::outputs_iterator b_output;
/* find the node to use for output if there are multiple */
- bool found_active_output = false;
- BL::ShaderNode output_node(PointerRNA_NULL);
-
- for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
- if(is_output_node(*b_node)) {
- BL::ShaderNodeOutputMaterial b_output_node(*b_node);
-
- if(b_output_node.is_active_output()) {
- output_node = b_output_node;
- found_active_output = true;
- break;
- }
- else if(!output_node.ptr.data && !found_active_output) {
- output_node = b_output_node;
- }
- }
- }
+ BL::ShaderNode output_node = find_output_node(b_ntree);
/* add nodes */
for(b_ntree.nodes.begin(b_node); b_node != b_ntree.nodes.end(); ++b_node) {
@@ -1062,6 +1066,7 @@ static void add_nodes(Scene *scene,
b_engine,
b_data,
b_scene,
+ b_view_layer,
background,
graph,
b_group_ntree,
@@ -1100,10 +1105,8 @@ static void add_nodes(Scene *scene,
else {
ShaderNode *node = NULL;
- if(is_output_node(*b_node)) {
- if(b_node->ptr.data == output_node.ptr.data) {
- node = graph->output();
- }
+ if(b_node->ptr.data == output_node.ptr.data) {
+ node = graph->output();
}
else {
BL::ShaderNode b_shader_node(*b_node);
@@ -1111,6 +1114,7 @@ static void add_nodes(Scene *scene,
b_engine,
b_data,
b_scene,
+ b_view_layer,
background,
graph,
b_ntree,
@@ -1174,6 +1178,7 @@ static void add_nodes(Scene *scene,
BL::RenderEngine& b_engine,
BL::BlendData& b_data,
BL::Scene& b_scene,
+ BL::ViewLayer& b_view_layer,
const bool background,
ShaderGraph *graph,
BL::ShaderNodeTree& b_ntree)
@@ -1183,6 +1188,7 @@ static void add_nodes(Scene *scene,
b_engine,
b_data,
b_scene,
+ b_view_layer,
background,
graph,
b_ntree,
@@ -1196,13 +1202,18 @@ void BlenderSync::sync_materials(bool update_all)
{
shader_map.set_default(scene->default_surface);
- /* material loop */
- BL::BlendData::materials_iterator b_mat;
-
TaskPool pool;
set<Shader*> updated_shaders;
- for(b_data.materials.begin(b_mat); b_mat != b_data.materials.end(); ++b_mat) {
+ /* material loop */
+ BL::BlendData::materials_iterator b_mat_orig;
+ for(b_data.materials.begin(b_mat_orig);
+ b_mat_orig != b_data.materials.end();
+ ++b_mat_orig)
+ {
+ /* TODO(sergey): Iterate over evaluated data rather than using mapping. */
+ BL::Material b_mat_(b_depsgraph.evaluated_id_get(*b_mat_orig));
+ BL::Material *b_mat = &b_mat_;
Shader *shader;
/* test if we need to sync */
@@ -1216,7 +1227,7 @@ void BlenderSync::sync_materials(bool update_all)
if(b_mat->use_nodes() && b_mat->node_tree()) {
BL::ShaderNodeTree b_ntree(b_mat->node_tree());
- add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
+ add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree);
}
else {
DiffuseBsdfNode *diffuse = new DiffuseBsdfNode();
@@ -1287,7 +1298,7 @@ void BlenderSync::sync_world(bool update_all)
if(b_world && b_world.use_nodes() && b_world.node_tree()) {
BL::ShaderNodeTree b_ntree(b_world.node_tree());
- add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
+ add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree);
/* volume */
PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
@@ -1355,8 +1366,8 @@ void BlenderSync::sync_world(bool update_all)
background->transparent_roughness_threshold = 0.0f;
}
- background->use_shader = render_layer.use_background_shader;
- background->use_ao = background->use_ao && render_layer.use_background_ao;
+ background->use_shader = view_layer.use_background_shader;
+ background->use_ao = background->use_ao && view_layer.use_background_ao;
if(background->modified(prevbackground))
background->tag_update(scene);
@@ -1369,9 +1380,14 @@ void BlenderSync::sync_lamps(bool update_all)
shader_map.set_default(scene->default_light);
/* lamp loop */
- BL::BlendData::lamps_iterator b_lamp;
-
- for(b_data.lamps.begin(b_lamp); b_lamp != b_data.lamps.end(); ++b_lamp) {
+ BL::BlendData::lamps_iterator b_lamp_orig;
+ for(b_data.lamps.begin(b_lamp_orig);
+ b_lamp_orig != b_data.lamps.end();
+ ++b_lamp_orig)
+ {
+ /* TODO(sergey): Iterate over evaluated data rather than using mapping. */
+ BL::Lamp b_lamp_(b_depsgraph.evaluated_id_get(*b_lamp_orig));
+ BL::Lamp *b_lamp = &b_lamp_;
Shader *shader;
/* test if we need to sync */
@@ -1384,7 +1400,7 @@ void BlenderSync::sync_lamps(bool update_all)
BL::ShaderNodeTree b_ntree(b_lamp->node_tree());
- add_nodes(scene, b_engine, b_data, b_scene, !preview, graph, b_ntree);
+ add_nodes(scene, b_engine, b_data, b_scene, b_view_layer, !preview, graph, b_ntree);
}
else {
float strength = 1.0f;
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 283aa5600fd..08d76582f03 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -44,13 +44,16 @@ CCL_NAMESPACE_BEGIN
BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
BL::BlendData& b_data,
+ BL::Depsgraph& b_depsgraph,
BL::Scene& b_scene,
Scene *scene,
bool preview,
Progress &progress)
: b_engine(b_engine),
b_data(b_data),
+ b_depsgraph(b_depsgraph),
b_scene(b_scene),
+ b_view_layer(b_engine.view_layer()),
shader_map(&scene->shaders),
object_map(&scene->objects),
mesh_map(&scene->meshes),
@@ -195,7 +198,7 @@ void BlenderSync::sync_data(BL::RenderSettings& b_render,
void **python_thread_state,
const char *layer)
{
- sync_render_layers(b_v3d, layer);
+ sync_view_layers(b_v3d, layer);
sync_integrator();
sync_film();
sync_shaders();
@@ -369,71 +372,43 @@ void BlenderSync::sync_film()
/* Render Layer */
-void BlenderSync::sync_render_layers(BL::SpaceView3D& b_v3d, const char *layer)
+void BlenderSync::sync_view_layers(BL::SpaceView3D& b_v3d, const char *layer)
{
- PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
string layername;
/* 3d view */
if(b_v3d) {
- if(RNA_boolean_get(&cscene, "preview_active_layer")) {
- BL::RenderLayers layers(b_scene.render().ptr);
- layername = layers.active().name();
- layer = layername.c_str();
- }
- else {
- render_layer.scene_layer = get_layer(b_v3d.layers(), b_v3d.layers_local_view());
- render_layer.layer = render_layer.scene_layer;
- render_layer.exclude_layer = 0;
- render_layer.holdout_layer = 0;
- render_layer.material_override = PointerRNA_NULL;
- render_layer.use_background_shader = true;
- render_layer.use_background_ao = true;
- render_layer.use_hair = true;
- render_layer.use_surfaces = true;
- render_layer.use_viewport_visibility = true;
- render_layer.samples = 0;
- render_layer.bound_samples = false;
- return;
- }
+ layername = b_scene.view_layers.active().name();
+ layer = layername.c_str();
}
/* render layer */
- BL::RenderSettings r = b_scene.render();
- BL::RenderSettings::layers_iterator b_rlay;
- int use_layer_samples = get_enum(cscene, "use_layer_samples");
+ BL::Scene::view_layers_iterator b_view_layer;
bool first_layer = true;
uint layer_override = get_layer(b_engine.layer_override());
- uint scene_layers = layer_override ? layer_override : get_layer(b_scene.layers());
-
- for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
- if((!layer && first_layer) || (layer && b_rlay->name() == layer)) {
- render_layer.name = b_rlay->name();
-
- render_layer.holdout_layer = get_layer(b_rlay->layers_zmask());
- render_layer.exclude_layer = get_layer(b_rlay->layers_exclude());
-
- render_layer.scene_layer = scene_layers & ~render_layer.exclude_layer;
- render_layer.scene_layer |= render_layer.exclude_layer & render_layer.holdout_layer;
-
- render_layer.layer = get_layer(b_rlay->layers());
- render_layer.layer |= render_layer.holdout_layer;
-
- render_layer.material_override = b_rlay->material_override();
- render_layer.use_background_shader = b_rlay->use_sky();
- render_layer.use_background_ao = b_rlay->use_ao();
- render_layer.use_surfaces = b_rlay->use_solid();
- render_layer.use_hair = b_rlay->use_strand();
- render_layer.use_viewport_visibility = false;
-
- render_layer.bound_samples = (use_layer_samples == 1);
- if(use_layer_samples != 2) {
- int samples = b_rlay->samples();
- if(get_boolean(cscene, "use_square_samples"))
- render_layer.samples = samples * samples;
- else
- render_layer.samples = samples;
- }
+ uint view_layers = layer_override ? layer_override : get_layer(b_scene.layers());
+
+ for(b_scene.view_layers.begin(b_view_layer); b_view_layer != b_scene.view_layers.end(); ++b_view_layer) {
+ if((!layer && first_layer) || (layer && b_view_layer->name() == layer)) {
+ view_layer.name = b_view_layer->name();
+
+ view_layer.holdout_layer = 0;
+ view_layer.exclude_layer = 0;
+
+ view_layer.view_layer = view_layers & ~view_layer.exclude_layer;
+ view_layer.view_layer |= view_layer.exclude_layer & view_layer.holdout_layer;
+
+ view_layer.layer = (1 << 20) - 1;
+ view_layer.layer |= view_layer.holdout_layer;
+
+ view_layer.material_override = PointerRNA_NULL;
+ view_layer.use_background_shader = b_view_layer->use_sky();
+ view_layer.use_background_ao = b_view_layer->use_ao();
+ view_layer.use_surfaces = b_view_layer->use_solid();
+ view_layer.use_hair = b_view_layer->use_strand();
+
+ view_layer.bound_samples = false;
+ view_layer.samples = 0;
}
first_layer = false;
@@ -547,7 +522,7 @@ int BlenderSync::get_denoising_pass(BL::RenderPass& b_pass)
}
array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
- BL::SceneRenderLayer& b_srlay,
+ BL::ViewLayer& b_view_layer,
const SessionParams &session_params)
{
array<Pass> passes;
@@ -570,49 +545,49 @@ array<Pass> BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
Pass::add(pass_type, passes);
}
- PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles");
+ PointerRNA crp = RNA_pointer_get(&b_view_layer.ptr, "cycles");
if(get_boolean(crp, "denoising_store_passes") &&
get_boolean(crp, "use_denoising"))
{
- b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Image", 3, "RGB", b_srlay.name().c_str());
- b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("Denoising Normal", 3, "XYZ", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Albedo", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Depth", 1, "Z", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Image", 3, "RGB", b_view_layer.name().c_str());
+ b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_view_layer.name().c_str());
}
#ifdef __KERNEL_DEBUG__
if(get_boolean(crp, "pass_debug_bvh_traversed_nodes")) {
- b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", b_srlay.name().c_str());
+ b_engine.add_pass("Debug BVH Traversed Nodes", 1, "X", b_view_layer.name().c_str());
Pass::add(PASS_BVH_TRAVERSED_NODES, passes);
}
if(get_boolean(crp, "pass_debug_bvh_traversed_instances")) {
- b_engine.add_pass("Debug BVH Traversed Instances", 1, "X", b_srlay.name().c_str());
+ b_engine.add_pass("Debug BVH Traversed Instances", 1, "X", b_view_layer.name().c_str());
Pass::add(PASS_BVH_TRAVERSED_INSTANCES, passes);
}
if(get_boolean(crp, "pass_debug_bvh_intersections")) {
- b_engine.add_pass("Debug BVH Intersections", 1, "X", b_srlay.name().c_str());
+ b_engine.add_pass("Debug BVH Intersections", 1, "X", b_view_layer.name().c_str());
Pass::add(PASS_BVH_INTERSECTIONS, passes);
}
if(get_boolean(crp, "pass_debug_ray_bounces")) {
- b_engine.add_pass("Debug Ray Bounces", 1, "X", b_srlay.name().c_str());
+ b_engine.add_pass("Debug Ray Bounces", 1, "X", b_view_layer.name().c_str());
Pass::add(PASS_RAY_BOUNCES, passes);
}
#endif
if(get_boolean(crp, "pass_debug_render_time")) {
- b_engine.add_pass("Debug Render Time", 1, "X", b_srlay.name().c_str());
+ b_engine.add_pass("Debug Render Time", 1, "X", b_view_layer.name().c_str());
Pass::add(PASS_RENDER_TIME, passes);
}
if(get_boolean(crp, "use_pass_volume_direct")) {
- b_engine.add_pass("VolumeDir", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("VolumeDir", 3, "RGB", b_view_layer.name().c_str());
Pass::add(PASS_VOLUME_DIRECT, passes);
}
if(get_boolean(crp, "use_pass_volume_indirect")) {
- b_engine.add_pass("VolumeInd", 3, "RGB", b_srlay.name().c_str());
+ b_engine.add_pass("VolumeInd", 3, "RGB", b_view_layer.name().c_str());
Pass::add(PASS_VOLUME_INDIRECT, passes);
}
@@ -841,9 +816,9 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
!b_r.use_save_buffers();
if(params.progressive_refine) {
- BL::RenderSettings::layers_iterator b_rlay;
- for(b_r.layers.begin(b_rlay); b_rlay != b_r.layers.end(); ++b_rlay) {
- PointerRNA crl = RNA_pointer_get(&b_rlay->ptr, "cycles");
+ BL::Scene::view_layers_iterator b_view_layer;
+ for(b_scene.view_layers.begin(b_view_layer); b_view_layer != b_scene.view_layers.end(); ++b_view_layer) {
+ PointerRNA crl = RNA_pointer_get(&b_view_layer->ptr, "cycles");
if(get_boolean(crl, "use_denoising")) {
params.progressive_refine = false;
}
@@ -871,17 +846,8 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
params.shadingsystem = SHADINGSYSTEM_OSL;
/* color managagement */
-#ifdef GLEW_MX
- /* When using GLEW MX we need to check whether we've got an OpenGL
- * context for current window. This is because command line rendering
- * doesn't have OpenGL context actually.
- */
- if(glewGetContext() != NULL)
-#endif
- {
- params.display_buffer_linear = GLEW_ARB_half_float_pixel &&
- b_engine.support_display_space_shader(b_scene);
- }
+ params.display_buffer_linear = GLEW_ARB_half_float_pixel &&
+ b_engine.support_display_space_shader(b_scene);
if(b_engine.is_preview()) {
/* For preview rendering we're using same timeout as
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index e7b71ae9310..c4dd17714be 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -43,6 +43,7 @@ class Mesh;
class Object;
class ParticleSystem;
class Scene;
+class ViewLayer;
class Shader;
class ShaderGraph;
class ShaderNode;
@@ -51,6 +52,7 @@ class BlenderSync {
public:
BlenderSync(BL::RenderEngine& b_engine,
BL::BlendData& b_data,
+ BL::Depsgraph& b_graph,
BL::Scene& b_scene,
Scene *scene,
bool preview,
@@ -65,9 +67,9 @@ public:
int width, int height,
void **python_thread_state,
const char *layer = 0);
- void sync_render_layers(BL::SpaceView3D& b_v3d, const char *layer);
- array<Pass> sync_render_passes(BL::RenderLayer& b_rlay,
- BL::SceneRenderLayer& b_srlay,
+ void sync_view_layers(BL::SpaceView3D& b_v3d, const char *layer);
+ array<Pass> sync_render_passes(BL::RenderLayer& b_render_layer,
+ BL::ViewLayer& b_view_layer,
const SessionParams &session_params);
void sync_integrator();
void sync_camera(BL::RenderSettings& b_render,
@@ -77,8 +79,8 @@ public:
void sync_view(BL::SpaceView3D& b_v3d,
BL::RegionView3D& b_rv3d,
int width, int height);
- inline int get_layer_samples() { return render_layer.samples; }
- inline int get_layer_bound_samples() { return render_layer.bound_samples; }
+ inline int get_layer_samples() { return view_layer.samples; }
+ inline int get_layer_bound_samples() { return view_layer.bound_samples; }
/* get parameters */
static SceneParams get_scene_params(BL::Scene& b_scene,
@@ -113,16 +115,16 @@ private:
void sync_curve_settings();
void sync_nodes(Shader *shader, BL::ShaderNodeTree& b_ntree);
- Mesh *sync_mesh(BL::Object& b_ob, bool object_updated, bool hide_tris);
+ Mesh *sync_mesh(BL::Object& b_ob,
+ BL::Object& b_ob_instance,
+ bool object_updated,
+ bool hide_tris);
void sync_curves(Mesh *mesh,
BL::Mesh& b_mesh,
BL::Object& b_ob,
bool motion,
int time_index = 0);
- Object *sync_object(BL::Object& b_parent,
- int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
- BL::DupliObject& b_dupli_ob,
- Transform& tfm,
+ Object *sync_object(BL::Depsgraph::duplis_iterator& b_dupli_iter,
uint layer_flag,
float motion_time,
bool hide_tris,
@@ -131,7 +133,8 @@ private:
void sync_light(BL::Object& b_parent,
int persistent_id[OBJECT_PERSISTENT_ID_SIZE],
BL::Object& b_ob,
- BL::DupliObject& b_dupli_ob,
+ BL::Object& b_ob_instance,
+ int random_id,
Transform& tfm,
bool *use_portal);
void sync_background_light(bool use_portal);
@@ -160,7 +163,9 @@ private:
/* variables */
BL::RenderEngine b_engine;
BL::BlendData b_data;
+ BL::Depsgraph b_depsgraph;
BL::Scene b_scene;
+ BL::ViewLayer b_view_layer;
id_map<void*, Shader> shader_map;
id_map<ObjectKey, Object> object_map;
@@ -182,31 +187,29 @@ private:
struct RenderLayerInfo {
RenderLayerInfo()
- : scene_layer(0), layer(0),
+ : view_layer(0), layer(0),
holdout_layer(0), exclude_layer(0),
material_override(PointerRNA_NULL),
use_background_shader(true),
use_background_ao(true),
use_surfaces(true),
use_hair(true),
- use_viewport_visibility(false),
samples(0), bound_samples(false)
{}
string name;
- uint scene_layer;
- uint layer;
- uint holdout_layer;
- uint exclude_layer;
- BL::Material material_override;
+ uint view_layer;
+ uint layer; /* This can be safely removed from Cycles. */
+ uint holdout_layer; /* This can be safely removed from Cycles. */
+ uint exclude_layer; /* This can be safely removed from Cycles. */
+ BL::Material material_override; /* This can be safely removed from Cycles. */
bool use_background_shader;
bool use_background_ao;
bool use_surfaces;
bool use_hair;
- bool use_viewport_visibility;
- int samples;
- bool bound_samples;
- } render_layer;
+ int samples; /* This can be safely removed from Cycles. */
+ bool bound_samples; /* This can be safely removed from Cycles. */
+ } view_layer;
Progress &progress;
};
diff --git a/intern/cycles/blender/blender_texture.cpp b/intern/cycles/blender/blender_texture.cpp
index b2e27b76189..3b06fb720de 100644
--- a/intern/cycles/blender/blender_texture.cpp
+++ b/intern/cycles/blender/blender_texture.cpp
@@ -34,7 +34,7 @@ void density_texture_space_invert(float3& loc,
} /* namespace */
-void point_density_texture_space(BL::Scene& b_scene,
+void point_density_texture_space(BL::Scene& b_scene, BL::ViewLayer& b_view_layer,
BL::ShaderNodeTexPointDensity& b_point_density_node,
int settings,
float3& loc,
@@ -48,6 +48,7 @@ void point_density_texture_space(BL::Scene& b_scene,
}
float3 min, max;
b_point_density_node.calc_point_density_minmax(b_scene,
+ b_view_layer,
settings,
&min[0],
&max[0]);
diff --git a/intern/cycles/blender/blender_texture.h b/intern/cycles/blender/blender_texture.h
index 734231a85ec..3d4b8739d49 100644
--- a/intern/cycles/blender/blender_texture.h
+++ b/intern/cycles/blender/blender_texture.h
@@ -22,7 +22,7 @@
CCL_NAMESPACE_BEGIN
-void point_density_texture_space(BL::Scene& b_scene,
+void point_density_texture_space(BL::Scene& b_scene, BL::ViewLayer& b_view_layer,
BL::ShaderNodeTexPointDensity& b_point_density_node,
const int settings,
float3& loc,
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index 363e19f7a20..a813a09f38a 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -46,6 +46,7 @@ void python_thread_state_restore(void **python_thread_state);
static inline BL::Mesh object_to_mesh(BL::BlendData& data,
BL::Object& object,
BL::Scene& scene,
+ BL::ViewLayer view_layer,
bool apply_modifiers,
bool render,
bool calc_undeformed,
@@ -64,7 +65,7 @@ static inline BL::Mesh object_to_mesh(BL::BlendData& data,
subsurf_mod.show_viewport(false);
}
- BL::Mesh me = data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1, false, calc_undeformed);
+ BL::Mesh me = data.meshes.new_from_object(scene, view_layer, object, apply_modifiers, (render)? 2: 1, false, calc_undeformed);
if(subdivision_type != Mesh::SUBDIVISION_NONE) {
BL::Modifier subsurf_mod = object.modifiers[object.modifiers.length()-1];
@@ -306,7 +307,7 @@ static inline uint get_layer(const BL::Array<int, 20>& array)
static inline uint get_layer(const BL::Array<int, 20>& array,
const BL::Array<int, 8>& local_array,
bool is_light = false,
- uint scene_layers = (1 << 20) - 1)
+ uint view_layers = (1 << 20) - 1)
{
uint layer = 0;
@@ -318,7 +319,7 @@ static inline uint get_layer(const BL::Array<int, 20>& array,
/* Consider light is visible if it was visible without layer
* override, which matches behavior of Blender Internal.
*/
- if(layer & scene_layers) {
+ if(layer & view_layers) {
for(uint i = 0; i < 8; i++)
layer |= (1 << (20+i));
}
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 1ec0bc3e1c6..56649a7e363 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -78,132 +78,275 @@ std::ostream& operator <<(std::ostream &os,
Device::~Device()
{
- if(!background && vertex_buffer != 0) {
- glDeleteBuffers(1, &vertex_buffer);
+ if(!background) {
+ if(vertex_buffer != 0) {
+ glDeleteBuffers(1, &vertex_buffer);
+ }
+ if(fallback_shader_program != 0) {
+ glDeleteProgram(fallback_shader_program);
+ }
}
}
-void Device::draw_pixels(device_memory& rgba, int y, int w, int h, int dx, int dy, int width, int height, bool transparent,
- const DeviceDrawParams &draw_params)
+/* TODO move shaders to standalone .glsl file. */
+const char *FALLBACK_VERTEX_SHADER =
+"#version 330\n"
+"uniform vec2 fullscreen;\n"
+"in vec2 texCoord;\n"
+"in vec2 pos;\n"
+"out vec2 texCoord_interp;\n"
+"\n"
+"vec2 normalize_coordinates()\n"
+"{\n"
+" return (vec2(2.0) * (pos / fullscreen)) - vec2(1.0);\n"
+"}\n"
+"\n"
+"void main()\n"
+"{\n"
+" gl_Position = vec4(normalize_coordinates(), 0.0, 1.0);\n"
+" texCoord_interp = texCoord;\n"
+"}\n\0";
+
+const char *FALLBACK_FRAGMENT_SHADER =
+"#version 330\n"
+"uniform sampler2D image_texture;\n"
+"in vec2 texCoord_interp;\n"
+"out vec4 fragColor;\n"
+"\n"
+"void main()\n"
+"{\n"
+" fragColor = texture(image_texture, texCoord_interp);\n"
+"}\n\0";
+
+static void shader_print_errors(const char *task, const char *log, const char *code)
{
- assert(rgba.type == MEM_PIXELS);
+ LOG(ERROR) << "Shader: " << task << " error:";
+ LOG(ERROR) << "===== shader string ====";
- mem_copy_from(rgba, y, w, h, rgba.memory_elements_size(1));
+ stringstream stream(code);
+ string partial;
- if(transparent) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ int line = 1;
+ while(getline(stream, partial, '\n')) {
+ if(line < 10) {
+ LOG(ERROR) << " " << line << " " << partial;
+ }
+ else {
+ LOG(ERROR) << line << " " << partial;
+ }
+ line++;
}
+ LOG(ERROR) << log;
+}
- glColor3f(1.0f, 1.0f, 1.0f);
+static int bind_fallback_shader(void)
+{
+ GLint status;
+ GLchar log[5000];
+ GLsizei length = 0;
+ GLuint program = 0;
- if(rgba.data_type == TYPE_HALF) {
- /* for multi devices, this assumes the inefficient method that we allocate
- * all pixels on the device even though we only render to a subset */
- GLhalf *host_pointer = (GLhalf*)rgba.host_pointer;
- float vbuffer[16], *basep;
- float *vp = NULL;
-
- host_pointer += 4*y*w;
-
- /* draw half float texture, GLSL shader for display transform assumed to be bound */
- GLuint texid;
- glGenTextures(1, &texid);
- glBindTexture(GL_TEXTURE_2D, texid);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, w, h, 0, GL_RGBA, GL_HALF_FLOAT, host_pointer);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-
- glEnable(GL_TEXTURE_2D);
-
- if(draw_params.bind_display_space_shader_cb) {
- draw_params.bind_display_space_shader_cb();
+ struct Shader {
+ const char *source;
+ GLenum type;
+ } shaders[2] = {
+ {FALLBACK_VERTEX_SHADER, GL_VERTEX_SHADER},
+ {FALLBACK_FRAGMENT_SHADER, GL_FRAGMENT_SHADER}
+ };
+
+ program = glCreateProgram();
+
+ for(int i = 0; i < 2; i++) {
+ GLuint shader = glCreateShader(shaders[i].type);
+
+ string source_str = shaders[i].source;
+ const char *c_str = source_str.c_str();
+
+ glShaderSource(shader, 1, &c_str, NULL);
+ glCompileShader(shader);
+
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+
+ if(!status) {
+ glGetShaderInfoLog(shader, sizeof(log), &length, log);
+ shader_print_errors("compile", log, c_str);
+ return 0;
}
- if(GLEW_VERSION_1_5) {
- if(!vertex_buffer)
- glGenBuffers(1, &vertex_buffer);
+ glAttachShader(program, shader);
+ }
+
+ /* Link output. */
+ glBindFragDataLocation(program, 0, "fragColor");
- glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
- /* invalidate old contents - avoids stalling if buffer is still waiting in queue to be rendered */
- glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), NULL, GL_STREAM_DRAW);
+ /* Link and error check. */
+ glLinkProgram(program);
+
+ glGetProgramiv(program, GL_LINK_STATUS, &status);
+ if(!status) {
+ glGetShaderInfoLog(program, sizeof(log), &length, log);
+ shader_print_errors("linking", log, FALLBACK_VERTEX_SHADER);
+ shader_print_errors("linking", log, FALLBACK_FRAGMENT_SHADER);
+ return 0;
+ }
+
+ return program;
+}
+
+bool Device::bind_fallback_display_space_shader(const float width, const float height)
+{
+ if(fallback_status == FALLBACK_SHADER_STATUS_ERROR) {
+ return false;
+ }
- vp = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+ if(fallback_status == FALLBACK_SHADER_STATUS_NONE) {
+ fallback_shader_program = bind_fallback_shader();
+ fallback_status = FALLBACK_SHADER_STATUS_ERROR;
- basep = NULL;
+ if (fallback_shader_program == 0) {
+ return false;
}
- else {
- basep = vbuffer;
- vp = vbuffer;
+
+ glUseProgram(fallback_shader_program);
+ image_texture_location = glGetUniformLocation(fallback_shader_program, "image_texture");
+ if(image_texture_location < 0) {
+ LOG(ERROR) << "Shader doesn't containt the 'image_texture' uniform.";
+ return false;
}
- if(vp) {
- /* texture coordinate - vertex pair */
- vp[0] = 0.0f;
- vp[1] = 0.0f;
- vp[2] = dx;
- vp[3] = dy;
-
- vp[4] = 1.0f;
- vp[5] = 0.0f;
- vp[6] = (float)width + dx;
- vp[7] = dy;
-
- vp[8] = 1.0f;
- vp[9] = 1.0f;
- vp[10] = (float)width + dx;
- vp[11] = (float)height + dy;
-
- vp[12] = 0.0f;
- vp[13] = 1.0f;
- vp[14] = dx;
- vp[15] = (float)height + dy;
-
- if(vertex_buffer)
- glUnmapBuffer(GL_ARRAY_BUFFER);
+ fullscreen_location = glGetUniformLocation(fallback_shader_program, "fullscreen");
+ if(fullscreen_location < 0) {
+ LOG(ERROR) << "Shader doesn't containt the 'fullscreen' uniform.";
+ return false;
}
- glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(float), basep);
- glVertexPointer(2, GL_FLOAT, 4 * sizeof(float), ((char *)basep) + 2 * sizeof(float));
+ fallback_status = FALLBACK_SHADER_STATUS_SUCCESS;
+ }
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ /* Run this every time. */
+ glUseProgram(fallback_shader_program);
+ glUniform1i(image_texture_location, 0);
+ glUniform2f(fullscreen_location, width, height);
+ return true;
+}
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+void Device::draw_pixels(
+ device_memory& rgba, int y,
+ int w, int h, int width, int height,
+ int dx, int dy, int dw, int dh,
+ bool transparent, const DeviceDrawParams &draw_params)
+{
+ const bool use_fallback_shader = (draw_params.bind_display_space_shader_cb == NULL);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
+ assert(rgba.type == MEM_PIXELS);
+ mem_copy_from(rgba, y, w, h, rgba.memory_elements_size(1));
- if(vertex_buffer) {
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- }
+ GLuint texid;
+ glGenTextures(1, &texid);
+ glBindTexture(GL_TEXTURE_2D, texid);
- if(draw_params.unbind_display_space_shader_cb) {
- draw_params.unbind_display_space_shader_cb();
- }
+ if(rgba.data_type == TYPE_HALF) {
+ GLhalf *data_pointer = (GLhalf*)rgba.host_pointer;
+ data_pointer += 4 * y * w;
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F_ARB, w, h, 0, GL_RGBA, GL_HALF_FLOAT, data_pointer);
+ }
+ else {
+ uint8_t *data_pointer = (uint8_t*)rgba.host_pointer;
+ data_pointer += 4 * y * w;
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data_pointer);
+ }
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ if(transparent) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ }
- glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
- glDeleteTextures(1, &texid);
+ GLint shader_program;
+ if(use_fallback_shader) {
+ if (!bind_fallback_display_space_shader(dw, dh)) {
+ return;
+ }
+ shader_program = fallback_shader_program;
}
else {
- /* fallback for old graphics cards that don't support GLSL, half float,
- * and non-power-of-two textures */
- glPixelZoom((float)width/(float)w, (float)height/(float)h);
- glRasterPos2f(dx, dy);
+ draw_params.bind_display_space_shader_cb();
+ glGetIntegerv(GL_CURRENT_PROGRAM, &shader_program);
+ }
+
+ if(!vertex_buffer) {
+ glGenBuffers(1, &vertex_buffer);
+ }
+
+ glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
+ /* invalidate old contents - avoids stalling if buffer is still waiting in queue to be rendered */
+ glBufferData(GL_ARRAY_BUFFER, 16 * sizeof(float), NULL, GL_STREAM_DRAW);
+
+ float *vpointer = (float *)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
- uint8_t *pixels = (uint8_t*)rgba.host_pointer;
+ if(vpointer) {
+ /* texture coordinate - vertex pair */
+ vpointer[0] = 0.0f;
+ vpointer[1] = 0.0f;
+ vpointer[2] = dx;
+ vpointer[3] = dy;
- pixels += 4*y*w;
+ vpointer[4] = 1.0f;
+ vpointer[5] = 0.0f;
+ vpointer[6] = (float)width + dx;
+ vpointer[7] = dy;
- glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ vpointer[8] = 1.0f;
+ vpointer[9] = 1.0f;
+ vpointer[10] = (float)width + dx;
+ vpointer[11] = (float)height + dy;
- glRasterPos2f(0.0f, 0.0f);
- glPixelZoom(1.0f, 1.0f);
+ vpointer[12] = 0.0f;
+ vpointer[13] = 1.0f;
+ vpointer[14] = dx;
+ vpointer[15] = (float)height + dy;
+
+ if(vertex_buffer) {
+ glUnmapBuffer(GL_ARRAY_BUFFER);
+ }
+ }
+
+ GLuint vertex_array_object;
+ GLuint position_attribute, texcoord_attribute;
+
+ glGenVertexArrays(1, &vertex_array_object);
+ glBindVertexArray(vertex_array_object);
+
+ texcoord_attribute = glGetAttribLocation(shader_program, "texCoord");
+ position_attribute = glGetAttribLocation(shader_program, "pos");
+
+ glEnableVertexAttribArray(texcoord_attribute);
+ glEnableVertexAttribArray(position_attribute);
+
+ glVertexAttribPointer(texcoord_attribute, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (const GLvoid *)0);
+ glVertexAttribPointer(position_attribute, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (const GLvoid *)(sizeof(float) * 2));
+
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ if(vertex_buffer) {
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
}
- if(transparent)
+ if(use_fallback_shader) {
+ glUseProgram(0);
+ }
+ else {
+ draw_params.unbind_display_space_shader_cb();
+ }
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDeleteTextures(1, &texid);
+
+ if(transparent) {
glDisable(GL_BLEND);
+ }
}
Device *Device::create(DeviceInfo& info, Stats &stats, bool background)
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 99e80d10424..721898458fc 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -251,13 +251,26 @@ struct DeviceDrawParams {
class Device {
friend class device_sub_ptr;
protected:
- Device(DeviceInfo& info_, Stats &stats_, bool background) : background(background), vertex_buffer(0), info(info_), stats(stats_) {}
+ enum {
+ FALLBACK_SHADER_STATUS_NONE = 0,
+ FALLBACK_SHADER_STATUS_ERROR,
+ FALLBACK_SHADER_STATUS_SUCCESS,
+ };
+
+ Device(DeviceInfo& info_, Stats &stats_, bool background) : background(background),
+ vertex_buffer(0),
+ fallback_status(FALLBACK_SHADER_STATUS_NONE), fallback_shader_program(0),
+ info(info_), stats(stats_) {}
bool background;
string error_msg;
/* used for real time display */
unsigned int vertex_buffer;
+ int fallback_status, fallback_shader_program;
+ int image_texture_location, fullscreen_location;
+
+ bool bind_fallback_display_space_shader(const float width, const float height);
virtual device_ptr mem_alloc_sub_ptr(device_memory& /*mem*/, int /*offset*/, int /*size*/)
{
@@ -308,9 +321,10 @@ public:
virtual void task_cancel() = 0;
/* opengl drawing */
- virtual void draw_pixels(device_memory& mem, int y, int w, int h,
- int dx, int dy, int width, int height, bool transparent,
- const DeviceDrawParams &draw_params);
+ virtual void draw_pixels(device_memory& mem, int y,
+ int w, int h, int width, int height,
+ int dx, int dy, int dw, int dh,
+ bool transparent, const DeviceDrawParams &draw_params);
#ifdef WITH_NETWORK
/* networking */
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index f3548640679..a7d20c67b6d 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -2011,12 +2011,16 @@ public:
}
}
- void draw_pixels(device_memory& mem, int y, int w, int h, int dx, int dy, int width, int height, bool transparent,
+ void draw_pixels(
+ device_memory& mem, int y,
+ int w, int h, int width, int height,
+ int dx, int dy, int dw, int dh, bool transparent,
const DeviceDrawParams &draw_params)
{
assert(mem.type == MEM_PIXELS);
if(!background) {
+ const bool use_fallback_shader = (draw_params.bind_display_space_shader_cb == NULL);
PixelMem pmem = pixel_mem_map[mem.device_pointer];
float *vpointer;
@@ -2033,27 +2037,34 @@ public:
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pmem.cuPBO);
glBindTexture(GL_TEXTURE_2D, pmem.cuTexId);
- if(mem.data_type == TYPE_HALF)
+ if(mem.data_type == TYPE_HALF) {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_HALF_FLOAT, (void*)offset);
- else
+ }
+ else {
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, (void*)offset);
+ }
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
- glEnable(GL_TEXTURE_2D);
-
if(transparent) {
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
}
- glColor3f(1.0f, 1.0f, 1.0f);
-
- if(draw_params.bind_display_space_shader_cb) {
+ GLint shader_program;
+ if(use_fallback_shader) {
+ if(!bind_fallback_display_space_shader(dw, dh)) {
+ return;
+ }
+ shader_program = fallback_shader_program;
+ }
+ else {
draw_params.bind_display_space_shader_cb();
+ glGetIntegerv(GL_CURRENT_PROGRAM, &shader_program);
}
- if(!vertex_buffer)
+ if(!vertex_buffer) {
glGenBuffers(1, &vertex_buffer);
+ }
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
/* invalidate old contents - avoids stalling if buffer is still waiting in queue to be rendered */
@@ -2086,33 +2097,40 @@ public:
glUnmapBuffer(GL_ARRAY_BUFFER);
}
- glTexCoordPointer(2, GL_FLOAT, 4 * sizeof(float), 0);
- glVertexPointer(2, GL_FLOAT, 4 * sizeof(float), (char *)NULL + 2 * sizeof(float));
+ GLuint vertex_array_object;
+ GLuint position_attribute, texcoord_attribute;
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glGenVertexArrays(1, &vertex_array_object);
+ glBindVertexArray(vertex_array_object);
- glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ texcoord_attribute = glGetAttribLocation(shader_program, "texCoord");
+ position_attribute = glGetAttribLocation(shader_program, "pos");
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
+ glEnableVertexAttribArray(texcoord_attribute);
+ glEnableVertexAttribArray(position_attribute);
- glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glVertexAttribPointer(texcoord_attribute, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (const GLvoid *)0);
+ glVertexAttribPointer(position_attribute, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (const GLvoid *)(sizeof(float) * 2));
+
+ glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- if(draw_params.unbind_display_space_shader_cb) {
+ if(use_fallback_shader) {
+ glUseProgram(0);
+ }
+ else {
draw_params.unbind_display_space_shader_cb();
}
- if(transparent)
+ if(transparent) {
glDisable(GL_BLEND);
+ }
glBindTexture(GL_TEXTURE_2D, 0);
- glDisable(GL_TEXTURE_2D);
return;
}
- Device::draw_pixels(mem, y, w, h, dx, dy, width, height, transparent, draw_params);
+ Device::draw_pixels(mem, y, w, h, width, height, dx, dy, dw, dh, transparent, draw_params);
}
void thread_run(DeviceTask *task)
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index 3a4c08b6eb2..91507e6be0c 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -216,8 +216,11 @@ public:
sub.device->const_copy_to(name, host, size);
}
- void draw_pixels(device_memory& rgba, int y, int w, int h, int dx, int dy, int width, int height, bool transparent,
- const DeviceDrawParams &draw_params)
+ void draw_pixels(
+ device_memory& rgba, int y,
+ int w, int h, int width, int height,
+ int dx, int dy, int dw, int dh,
+ bool transparent, const DeviceDrawParams &draw_params)
{
device_ptr key = rgba.device_pointer;
int i = 0, sub_h = h/devices.size();
@@ -231,7 +234,7 @@ public:
/* adjust math for w/width */
rgba.device_pointer = sub.ptr_map[key];
- sub.device->draw_pixels(rgba, sy, w, sh, dx, sdy, width, sheight, transparent, draw_params);
+ sub.device->draw_pixels(rgba, sy, w, sh, width, sheight, dx, sdy, dw, dh, transparent, draw_params);
i++;
}
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 84d10cc477e..e4931a6317c 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -439,7 +439,11 @@ void DisplayBuffer::draw(Device *device, const DeviceDrawParams& draw_params)
device_memory& rgba = (half_float)? (device_memory&)rgba_half:
(device_memory&)rgba_byte;
- device->draw_pixels(rgba, 0, draw_width, draw_height, params.full_x, params.full_y, params.width, params.height, transparent, draw_params);
+ device->draw_pixels(
+ rgba, 0,
+ draw_width, draw_height, params.width, params.height,
+ params.full_x, params.full_y, params.full_width, params.full_height,
+ transparent, draw_params);
}
}
diff --git a/intern/cycles/util/util_opengl.h b/intern/cycles/util/util_opengl.h
index 0b5462e0a09..7a8d5eec1f9 100644
--- a/intern/cycles/util/util_opengl.h
+++ b/intern/cycles/util/util_opengl.h
@@ -20,12 +20,6 @@
/* OpenGL header includes, used everywhere we use OpenGL, to deal with
* platform differences in one central place. */
-#ifdef WITH_GLEW_MX
-# include "glew-mx.h"
-#else
-# include <GL/glew.h>
-# define mxCreateContext() glewInit()
-# define mxMakeCurrentContext(x) (x)
-#endif
+#include <GL/glew.h>
#endif /* __UTIL_OPENGL_H__ */
diff --git a/intern/cycles/util/util_view.cpp b/intern/cycles/util/util_view.cpp
index 10d86167921..7b453d123b8 100644
--- a/intern/cycles/util/util_view.cpp
+++ b/intern/cycles/util/util_view.cpp
@@ -252,7 +252,7 @@ void view_main_loop(const char *title, int width, int height,
glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow(title);
- mxMakeCurrentContext(mxCreateContext());
+ glewInit();
view_reshape(width, height);