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/CMakeLists.txt4
-rw-r--r--intern/cycles/app/cycles_test.cpp2
-rw-r--r--intern/cycles/blender/addon/__init__.py1
-rw-r--r--intern/cycles/blender/addon/presets.py30
-rw-r--r--intern/cycles/blender/addon/properties.py5
-rw-r--r--intern/cycles/blender/addon/ui.py62
-rw-r--r--intern/cycles/blender/blender_mesh.cpp45
-rw-r--r--intern/cycles/blender/blender_object.cpp18
-rw-r--r--intern/cycles/blender/blender_session.cpp5
-rw-r--r--intern/cycles/blender/blender_shader.cpp4
-rw-r--r--intern/cycles/blender/blender_sync.cpp66
-rw-r--r--intern/cycles/blender/blender_sync.h1
-rw-r--r--intern/cycles/bvh/bvh.h2
-rw-r--r--intern/cycles/device/device.h2
-rw-r--r--intern/cycles/device/device_cpu.cpp4
-rw-r--r--intern/cycles/device/device_cuda.cpp1
-rw-r--r--intern/cycles/device/device_multi.cpp2
-rw-r--r--intern/cycles/kernel/kernel_camera.h12
-rw-r--r--intern/cycles/kernel/kernel_displace.h2
-rw-r--r--intern/cycles/kernel/kernel_emission.h20
-rw-r--r--intern/cycles/kernel/kernel_light.h2
-rw-r--r--intern/cycles/kernel/kernel_path.h31
-rw-r--r--intern/cycles/kernel/kernel_random.h10
-rw-r--r--intern/cycles/kernel/kernel_shader.h20
-rw-r--r--intern/cycles/kernel/kernel_textures.h55
-rw-r--r--intern/cycles/kernel/kernel_types.h20
-rw-r--r--intern/cycles/kernel/osl/osl_services.cpp11
-rw-r--r--intern/cycles/kernel/osl/osl_services.h1
-rw-r--r--intern/cycles/kernel/shaders/node_blackbody.osl4
-rw-r--r--intern/cycles/kernel/shaders/node_light_path.osl7
-rw-r--r--intern/cycles/kernel/shaders/node_vector_transform.osl28
-rw-r--r--intern/cycles/kernel/svm/svm_blackbody.h23
-rw-r--r--intern/cycles/kernel/svm/svm_image.h54
-rw-r--r--intern/cycles/kernel/svm/svm_light_path.h1
-rw-r--r--intern/cycles/kernel/svm/svm_types.h22
-rw-r--r--intern/cycles/kernel/svm/svm_vector_transform.h39
-rw-r--r--intern/cycles/render/blackbody.cpp8
-rw-r--r--intern/cycles/render/buffers.cpp2
-rw-r--r--intern/cycles/render/film.cpp3
-rw-r--r--intern/cycles/render/graph.cpp3
-rw-r--r--intern/cycles/render/image.cpp13
-rw-r--r--intern/cycles/render/image.h8
-rw-r--r--intern/cycles/render/light.cpp4
-rw-r--r--intern/cycles/render/mesh.cpp12
-rw-r--r--intern/cycles/render/mesh.h1
-rw-r--r--intern/cycles/render/nodes.cpp36
-rw-r--r--intern/cycles/render/nodes.h3
-rw-r--r--intern/cycles/render/scene.cpp4
-rw-r--r--intern/cycles/render/scene.h4
-rw-r--r--intern/cycles/render/session.cpp2
-rw-r--r--intern/cycles/render/shader.cpp2
-rw-r--r--intern/cycles/render/svm.cpp9
-rw-r--r--intern/cycles/render/tables.cpp2
-rw-r--r--intern/cycles/util/util_math.h36
-rw-r--r--intern/cycles/util/util_task.cpp6
-rw-r--r--intern/cycles/util/util_task.h4
-rw-r--r--intern/cycles/util/util_view.cpp2
57 files changed, 418 insertions, 362 deletions
diff --git a/intern/cycles/CMakeLists.txt b/intern/cycles/CMakeLists.txt
index cc132a2c3b2..82029e3a7af 100644
--- a/intern/cycles/CMakeLists.txt
+++ b/intern/cycles/CMakeLists.txt
@@ -25,6 +25,10 @@ elseif(CMAKE_COMPILER_IS_GNUCC)
set(CYCLES_SSE2_KERNEL_FLAGS "-ffast-math -msse -msse2 -mfpmath=sse")
set(CYCLES_SSE3_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
+elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ set(CYCLES_SSE2_KERNEL_FLAGS "-ffast-math -msse -msse2")
+ set(CYCLES_SSE3_KERNEL_FLAGS "-ffast-math -msse -msse2 -msse3 -mssse3")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffast-math")
endif()
# for OSL
diff --git a/intern/cycles/app/cycles_test.cpp b/intern/cycles/app/cycles_test.cpp
index 625e8cc1706..6d7c5912cb5 100644
--- a/intern/cycles/app/cycles_test.cpp
+++ b/intern/cycles/app/cycles_test.cpp
@@ -181,7 +181,7 @@ static void resize(int width, int height)
options.session->reset(session_buffer_params(), options.session_params.samples);
}
-void keyboard(unsigned char key)
+static void keyboard(unsigned char key)
{
if(key == 'r')
options.session->reset(session_buffer_params(), options.session_params.samples);
diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py
index b451b8ef3bf..cefdf504206 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -41,6 +41,7 @@ class CyclesRender(bpy.types.RenderEngine):
bl_use_shading_nodes = True
bl_use_preview = True
bl_use_exclude_layers = True
+ bl_use_save_buffers = True
def __init__(self):
self.session = None
diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py
index e2836b2cc21..d1f8e7c3a6d 100644
--- a/intern/cycles/blender/addon/presets.py
+++ b/intern/cycles/blender/addon/presets.py
@@ -46,6 +46,36 @@ class AddPresetIntegrator(AddPresetBase, Operator):
preset_subdir = "cycles/integrator"
+class AddPresetSampling(AddPresetBase, Operator):
+ '''Add a Sampling Preset'''
+ bl_idname = "render.cycles_sampling_preset_add"
+ bl_label = "Add Sampling Preset"
+ preset_menu = "CYCLES_MT_sampling_presets"
+
+ preset_defines = [
+ "cycles = bpy.context.scene.cycles"
+ ]
+
+ preset_values = [
+ "cycles.samples",
+ "cycles.preview_samples",
+ "cycles.aa_samples",
+ "cycles.preview_aa_samples",
+ "cycles.diffuse_samples",
+ "cycles.glossy_samples",
+ "cycles.transmission_samples",
+ "cycles.ao_samples",
+ "cycles.mesh_light_samples",
+ "cycles.subsurface_samples",
+ "cycles.no_caustics",
+ "cycles.blur_glossy",
+ "cycles.squared_samples",
+ "cycles.progressive"
+ ]
+
+ preset_subdir = "cycles/sampling"
+
+
def register():
pass
diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index ca49ffccd2a..eba94604a88 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -150,6 +150,11 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
description="Use progressive sampling of lighting",
default=True,
)
+ cls.squared_samples = BoolProperty(
+ name="Squared Samples",
+ description="Square sampling values for easier artist control",
+ default=False,
+ )
cls.samples = IntProperty(
name="Samples",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index b80ab6b1c5e..1a17675cb71 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -23,6 +23,14 @@ import bpy
from bpy.types import Panel, Menu, Operator
+class CYCLES_MT_sampling_presets(Menu):
+ bl_label = "Sampling Presets"
+ preset_subdir = "cycles/sampling"
+ preset_operator = "script.execute_preset"
+ COMPAT_ENGINES = {'CYCLES'}
+ draw = Menu.draw_preset
+
+
class CYCLES_MT_integrator_presets(Menu):
bl_label = "Integrator Presets"
preset_subdir = "cycles/integrator"
@@ -52,20 +60,30 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
scene = context.scene
cscene = scene.cycles
device_type = context.user_preferences.system.compute_device_type
+
+ row = layout.row(align=True)
+ row.menu("CYCLES_MT_sampling_presets", text=bpy.types.CYCLES_MT_sampling_presets.bl_label)
+ row.operator("render.cycles_sampling_preset_add", text="", icon="ZOOMIN")
+ row.operator("render.cycles_sampling_preset_add", text="", icon="ZOOMOUT").remove_active = True
+ row = layout.row()
+ sub = row.row()
+ sub.active = (device_type == 'NONE' or cscene.device == 'CPU')
+ sub.prop(cscene, "progressive")
+ row.prop(cscene, "squared_samples")
+
split = layout.split()
-
+
col = split.column()
- col.prop(cscene, "progressive")
-
sub = col.column(align=True)
+ sub.label("Settings:")
sub.prop(cscene, "seed")
sub.prop(cscene, "sample_clamp")
- if cscene.progressive:
+ if cscene.progressive or (device_type != 'NONE' and cscene.device == 'GPU'):
col = split.column()
- col.label(text="Samples:")
sub = col.column(align=True)
+ sub.label(text="Samples:")
sub.prop(cscene, "samples", text="Render")
sub.prop(cscene, "preview_samples", text="Preview")
else:
@@ -74,8 +92,8 @@ class CyclesRender_PT_sampling(CyclesButtonsPanel, Panel):
sub.prop(cscene, "preview_aa_samples", text="Preview")
col = split.column()
- col.label(text="Samples:")
sub = col.column(align=True)
+ sub.label(text="Samples:")
sub.prop(cscene, "diffuse_samples", text="Diffuse")
sub.prop(cscene, "glossy_samples", text="Glossy")
sub.prop(cscene, "transmission_samples", text="Transmission")
@@ -211,21 +229,23 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
subsub.enabled = not rd.use_border
subsub.prop(rd, "use_save_buffers")
- col = split.column()
+ col = split.column(align=True)
- sub = col.column(align=True)
- sub.label(text="Acceleration structure:")
- sub.prop(cscene, "debug_bvh_type", text="")
- sub.prop(cscene, "debug_use_spatial_splits")
- sub.prop(cscene, "use_cache")
+ col.label(text="Viewport:")
+ col.prop(cscene, "debug_bvh_type", text="")
+ col.separator()
+ col.prop(cscene, "preview_start_resolution")
- sub = col.column(align=True)
- sub.label(text="Viewport:")
- sub.prop(cscene, "preview_start_resolution")
+ col.separator()
- sub = col.column(align=True)
- sub.label(text="Final Render:")
- sub.prop(rd, "use_persistent_data", text="Persistent Images")
+ col.label(text="Final Render:")
+ col.prop(cscene, "use_cache")
+ col.prop(rd, "use_persistent_data", text="Persistent Images")
+
+ col.separator()
+
+ col.label(text="Acceleration structure:")
+ col.prop(cscene, "debug_use_spatial_splits")
class CyclesRender_PT_opengl(CyclesButtonsPanel, Panel):
@@ -628,6 +648,7 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
lamp = context.lamp
clamp = lamp.cycles
cscene = context.scene.cycles
+ device_type = context.user_preferences.system.compute_device_type
layout.prop(lamp, "type", expand=True)
@@ -646,7 +667,7 @@ class CyclesLamp_PT_lamp(CyclesButtonsPanel, Panel):
sub.prop(lamp, "size", text="Size X")
sub.prop(lamp, "size_y", text="Size Y")
- if not cscene.progressive:
+ if not cscene.progressive and (device_type == 'NONE' or cscene.device == 'CPU'):
col.prop(clamp, "samples")
col = split.column()
@@ -835,6 +856,7 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
world = context.world
cworld = world.cycles
cscene = context.scene.cycles
+ device_type = context.user_preferences.system.compute_device_type
col = layout.column()
@@ -842,7 +864,7 @@ class CyclesWorld_PT_settings(CyclesButtonsPanel, Panel):
sub = col.row(align=True)
sub.active = cworld.sample_as_light
sub.prop(cworld, "sample_map_resolution")
- if not cscene.progressive:
+ if not cscene.progressive and (device_type == 'NONE' or cscene.device == 'CPU'):
sub.prop(cworld, "samples")
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index d628fa04f92..55282a1ec00 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -212,13 +212,27 @@ static void mikk_compute_tangents(BL::Mesh b_mesh, BL::MeshTextureFaceLayer b_la
static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<uint>& used_shaders)
{
- /* create vertices */
+ /* count vertices and faces */
+ int numverts = b_mesh.vertices.length();
+ int numfaces = b_mesh.tessfaces.length();
+ int numtris = 0;
+
BL::Mesh::vertices_iterator v;
+ BL::Mesh::tessfaces_iterator f;
- for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
- mesh->verts.push_back(get_float3(v->co()));
+ for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
+ int4 vi = get_int4(f->vertices_raw());
+ numtris += (vi[3] == 0)? 1: 2;
+ }
+
+ /* reserve memory */
+ mesh->reserve(numverts, numtris, 0, 0);
+
+ /* create vertex coordinates and normals */
+ int i = 0;
+ for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v, ++i)
+ mesh->verts[i] = get_float3(v->co());
- /* create vertex normals */
Attribute *attr_N = mesh->attributes.add(ATTR_STD_VERTEX_NORMAL);
float3 *N = attr_N->data_float3();
@@ -226,10 +240,10 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
*N = get_float3(v->normal());
/* create faces */
- BL::Mesh::tessfaces_iterator f;
- vector<int> nverts;
+ vector<int> nverts(numfaces);
+ int fi = 0, ti = 0;
- for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
+ for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f, ++fi) {
int4 vi = get_int4(f->vertices_raw());
int n = (vi[3] == 0)? 3: 4;
int mi = clamp(f->material_index(), 0, used_shaders.size()-1);
@@ -239,18 +253,18 @@ static void create_mesh(Scene *scene, Mesh *mesh, BL::Mesh b_mesh, const vector<
if(n == 4) {
if(len_squared(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) == 0.0f ||
len_squared(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])) == 0.0f) {
- mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth);
- mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth);
+ mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth);
}
else {
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
- mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
+ mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth);
}
}
else
- mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth);
+ mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
- nverts.push_back(n);
+ nverts[fi] = n;
}
/* create vertex color attributes */
@@ -448,7 +462,6 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
mesh_synced.insert(mesh);
/* create derived mesh */
- bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED);
PointerRNA cmesh = RNA_pointer_get(&b_ob_data.ptr, "cycles");
vector<Mesh::Triangle> oldtriangle = mesh->triangles;
@@ -462,6 +475,10 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
mesh->name = ustring(b_ob_data.name().c_str());
if(render_layer.use_surfaces || render_layer.use_hair) {
+ if(preview)
+ b_ob.update_from_editmode();
+
+ bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED);
BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed);
if(b_mesh) {
diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 4a72341cd8c..b2235c36af0 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -154,10 +154,16 @@ void BlenderSync::sync_light(BL::Object b_parent, int persistent_id[OBJECT_PERSI
light->shader = used_shaders[0];
/* shadow */
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
PointerRNA clamp = RNA_pointer_get(&b_lamp.ptr, "cycles");
light->cast_shadow = get_boolean(clamp, "cast_shadow");
light->use_mis = get_boolean(clamp, "use_multiple_importance_sampling");
- light->samples = get_int(clamp, "samples");
+
+ int samples = get_int(clamp, "samples");
+ if(get_boolean(cscene, "squared_samples"))
+ light->samples = samples * samples;
+ else
+ light->samples = samples;
/* visibility */
uint visibility = object_ray_visibility(b_ob);
@@ -174,6 +180,7 @@ void BlenderSync::sync_background_light()
BL::World b_world = b_scene.world();
if(b_world) {
+ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles");
bool sample_as_light = get_boolean(cworld, "sample_as_light");
@@ -188,8 +195,13 @@ void BlenderSync::sync_background_light()
{
light->type = LIGHT_BACKGROUND;
light->map_resolution = get_int(cworld, "sample_map_resolution");
- light->samples = get_int(cworld, "samples");
light->shader = scene->default_background;
+
+ int samples = get_int(cworld, "samples");
+ if(get_boolean(cscene, "squared_samples"))
+ light->samples = samples * samples;
+ else
+ light->samples = samples;
light->tag_update(scene);
light_map.set_recalc(b_world);
@@ -304,7 +316,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
}
if (b_dupli_ob) {
- object->dupli_generated = get_float3(b_dupli_ob.orco());
+ 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());
}
else {
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 86bdbc0749f..3a46897fcac 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -279,6 +279,11 @@ void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_upda
BL::RenderResult::layers_iterator b_single_rlay;
b_rr.layers.begin(b_single_rlay);
+
+ /* layer will be missing if it was disabled in the UI */
+ if(b_single_rlay == b_rr.layers.end())
+ return;
+
BL::RenderLayer b_rlay = *b_single_rlay;
if (do_update_only) {
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index d0b83d9e553..469ba15d291 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -260,8 +260,8 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
BL::ShaderNodeVectorTransform b_vector_transform_node(b_node);
VectorTransformNode *vtransform = new VectorTransformNode();
vtransform->type = VectorTransformNode::type_enum[b_vector_transform_node.type()];
- vtransform->convert_from = VectorTransformNode::convert_from_enum[b_vector_transform_node.convert_from()];
- vtransform->convert_to = VectorTransformNode::convert_to_enum[b_vector_transform_node.convert_to()];
+ vtransform->convert_from = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_from()];
+ vtransform->convert_to = VectorTransformNode::convert_space_enum[b_vector_transform_node.convert_to()];
node = vtransform;
}
else if (b_node.is_a(&RNA_ShaderNodeNormal)) {
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index be5f0692dbd..11e2be5e0fb 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -191,14 +191,33 @@ void BlenderSync::sync_integrator()
}
#endif
- integrator->diffuse_samples = get_int(cscene, "diffuse_samples");
- integrator->glossy_samples = get_int(cscene, "glossy_samples");
- integrator->transmission_samples = get_int(cscene, "transmission_samples");
- integrator->ao_samples = get_int(cscene, "ao_samples");
- integrator->mesh_light_samples = get_int(cscene, "mesh_light_samples");
- integrator->subsurface_samples = get_int(cscene, "subsurface_samples");
integrator->progressive = get_boolean(cscene, "progressive");
+ int diffuse_samples = get_int(cscene, "diffuse_samples");
+ int glossy_samples = get_int(cscene, "glossy_samples");
+ int transmission_samples = get_int(cscene, "transmission_samples");
+ int ao_samples = get_int(cscene, "ao_samples");
+ int mesh_light_samples = get_int(cscene, "mesh_light_samples");
+ int subsurface_samples = get_int(cscene, "subsurface_samples");
+
+ if(get_boolean(cscene, "squared_samples")) {
+ integrator->diffuse_samples = diffuse_samples * diffuse_samples;
+ integrator->glossy_samples = glossy_samples * glossy_samples;
+ integrator->transmission_samples = transmission_samples * transmission_samples;
+ integrator->ao_samples = ao_samples * ao_samples;
+ integrator->mesh_light_samples = mesh_light_samples * mesh_light_samples;
+ integrator->subsurface_samples = subsurface_samples * subsurface_samples;
+ }
+ else {
+ integrator->diffuse_samples = diffuse_samples;
+ integrator->glossy_samples = glossy_samples;
+ integrator->transmission_samples = transmission_samples;
+ integrator->ao_samples = ao_samples;
+ integrator->mesh_light_samples = mesh_light_samples;
+ integrator->subsurface_samples = subsurface_samples;
+ }
+
+
if(experimental)
integrator->sampling_pattern = (SamplingPattern)RNA_enum_get(&cscene, "sampling_pattern");
@@ -300,8 +319,13 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
render_layer.use_localview = false;
render_layer.bound_samples = (use_layer_samples == 1);
- if(use_layer_samples != 2)
- render_layer.samples = b_rlay->samples();
+ if(use_layer_samples != 2) {
+ int samples = b_rlay->samples();
+ if(get_boolean(cscene, "squared_samples"))
+ render_layer.samples = samples * samples;
+ else
+ render_layer.samples = samples;
+ }
}
first_layer = false;
@@ -385,24 +409,36 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine b_engine, BL::Use
params.background = background;
/* samples */
- if(get_boolean(cscene, "progressive") == 0) {
+ int samples = get_int(cscene, "samples");
+ int aa_samples = get_int(cscene, "aa_samples");
+ int preview_samples = get_int(cscene, "preview_samples");
+ int preview_aa_samples = get_int(cscene, "preview_aa_samples");
+
+ if(get_boolean(cscene, "squared_samples")) {
+ samples = samples * samples;
+ aa_samples = aa_samples * aa_samples;
+ preview_samples = preview_samples * preview_samples;
+ preview_aa_samples = preview_aa_samples * preview_aa_samples;
+ }
+
+ if(get_boolean(cscene, "progressive") == 0 && params.device.type == DEVICE_CPU) {
if(background) {
- params.samples = get_int(cscene, "aa_samples");
+ params.samples = aa_samples;
}
else {
- params.samples = get_int(cscene, "preview_aa_samples");
+ params.samples = preview_aa_samples;
if(params.samples == 0)
- params.samples = INT_MAX;
+ params.samples = USHRT_MAX;
}
}
else {
if(background) {
- params.samples = get_int(cscene, "samples");
+ params.samples = samples;
}
else {
- params.samples = get_int(cscene, "preview_samples");
+ params.samples = preview_samples;
if(params.samples == 0)
- params.samples = INT_MAX;
+ params.samples = USHRT_MAX;
}
}
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index ed1f2b9d70f..da86bafa936 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -127,6 +127,7 @@ private:
use_surfaces(true),
use_hair(true),
use_viewport_visibility(false),
+ use_localview(false),
samples(0), bound_samples(false)
{}
diff --git a/intern/cycles/bvh/bvh.h b/intern/cycles/bvh/bvh.h
index 00c146143b8..f2c96638b84 100644
--- a/intern/cycles/bvh/bvh.h
+++ b/intern/cycles/bvh/bvh.h
@@ -46,7 +46,7 @@ class Progress;
struct PackedBVH {
/* BVH nodes storage, one node is 4x int4, and contains two bounding boxes,
- * and child, triangle or object indexes dependening on the node type */
+ * and child, triangle or object indexes depending on the node type */
array<int4> nodes;
/* object index to BVH node index mapping for instances */
array<int> object_node;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index e6d3922d3be..7b31b9ba157 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -53,7 +53,6 @@ public:
string description;
string id;
int num;
- int extended_images;
bool display_device;
bool advanced_shading;
bool pack_images;
@@ -64,7 +63,6 @@ public:
type = DEVICE_CPU;
id = "CPU";
num = 0;
- extended_images = false;
display_device = false;
advanced_shading = true;
pack_images = false;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index e0e06683883..7bc84878dab 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -307,8 +307,7 @@ public:
void task_add(DeviceTask& task)
{
- /* split task into smaller ones, more than number of threads for uneven
- * workloads where some parts of the image render slower than others */
+ /* split task into smaller ones */
list<DeviceTask> tasks;
task.split(tasks, TaskScheduler::num_threads());
@@ -340,7 +339,6 @@ void device_cpu_info(vector<DeviceInfo>& devices)
info.description = system_cpu_brand_string();
info.id = "CPU";
info.num = 0;
- info.extended_images = true;
info.advanced_shading = true;
info.pack_images = false;
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 65dd001f70f..4441ff1c69f 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1021,7 +1021,6 @@ void device_cuda_info(vector<DeviceInfo>& devices)
int major, minor;
cuDeviceComputeCapability(&major, &minor, num);
info.advanced_shading = (major >= 2);
- info.extended_images = (major >= 3);
info.pack_images = false;
/* if device has a kernel timeout, assume it is used for display */
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index 02db5b84831..807bfe578f3 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -330,7 +330,6 @@ static bool device_multi_add(vector<DeviceInfo>& devices, DeviceType type, bool
info.advanced_shading = with_advanced_shading;
info.pack_images = false;
- info.extended_images = true;
foreach(DeviceInfo& subinfo, devices) {
if(subinfo.type == type) {
@@ -354,7 +353,6 @@ static bool device_multi_add(vector<DeviceInfo>& devices, DeviceType type, bool
if(subinfo.display_device)
info.display_device = true;
info.pack_images = info.pack_images || subinfo.pack_images;
- info.extended_images = info.extended_images && subinfo.extended_images;
num_added++;
}
}
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
index 4b9ef8893f7..c3cffc15ebe 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -166,6 +166,12 @@ __device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float ra
ray->D = panorama_to_direction(kg, Pcamera.x, Pcamera.y);
+ /* indicates ray should not receive any light, outside of the lens */
+ if(is_zero(ray->D)) {
+ ray->t = 0.0f;
+ return;
+ }
+
/* modify ray for depth of field */
float aperturesize = kernel_data.cam.aperturesize;
@@ -186,12 +192,6 @@ __device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float ra
ray->D = normalize(Pfocus - ray->P);
}
- /* indicates ray should not receive any light, outside of the lens */
- if(is_zero(ray->D)) {
- ray->t = 0.0f;
- return;
- }
-
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h
index ae2e35e8d93..b4ece1610be 100644
--- a/intern/cycles/kernel/kernel_displace.h
+++ b/intern/cycles/kernel/kernel_displace.h
@@ -57,7 +57,7 @@ __device void kernel_shader_evaluate(KernelGlobals *kg, __global uint4 *input, _
#endif
/* setup shader data */
- shader_setup_from_background(kg, &sd, &ray);
+ shader_setup_from_background(kg, &sd, &ray, 0);
/* evaluate */
int flag = 0; /* we can't know which type of BSDF this is for */
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 77dc59d2691..a6bd3ed2850 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -21,7 +21,7 @@ CCL_NAMESPACE_BEGIN
/* Direction Emission */
__device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
- LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time)
+ LightSample *ls, float u, float v, float3 I, differential3 dI, float t, float time, int bounce)
{
/* setup shading at emitter */
ShaderData sd;
@@ -41,7 +41,7 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
#ifdef __CAMERA_MOTION__
ray.time = time;
#endif
- shader_setup_from_background(kg, &sd, &ray);
+ shader_setup_from_background(kg, &sd, &ray, bounce+1);
eval = shader_eval_background(kg, &sd, 0, SHADER_CONTEXT_EMISSION);
}
else
@@ -49,10 +49,10 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
{
#ifdef __HAIR__
if(ls->type == LIGHT_STRAND)
- shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ls->prim);
+ shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ls->prim);
else
#endif
- shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, ~0);
+ shader_setup_from_sample(kg, &sd, ls->P, ls->Ng, I, ls->shader, ls->object, ls->prim, u, v, t, time, bounce+1, ~0);
ls->Ng = sd.Ng;
@@ -74,7 +74,7 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando,
__device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int lindex,
float randt, float rando, float randu, float randv, Ray *ray, BsdfEval *eval,
- bool *is_lamp)
+ bool *is_lamp, int bounce)
{
LightSample ls;
@@ -97,7 +97,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li
differential3 dD = differential3_zero();
/* evaluate closure */
- float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time);
+ float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time, bounce);
if(is_zero(light_eval))
return false;
@@ -185,7 +185,7 @@ __device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, ShaderDa
/* Indirect Lamp Emission */
-__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission)
+__device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, float randt, float3 *emission, int bounce)
{
LightSample ls;
int lamp = lamp_light_eval_sample(kg, randt);
@@ -209,7 +209,7 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
/* todo: missing texture coordinates */
float u = 0.0f;
float v = 0.0f;
- float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time);
+ float3 L = direct_emissive_eval(kg, 0.0f, &ls, u, v, -ray->D, ray->dD, ls.t, ray->time, bounce);
if(!(path_flag & PATH_RAY_MIS_SKIP)) {
/* multiple importance sampling, get regular light pdf,
@@ -224,7 +224,7 @@ __device_noinline bool indirect_lamp_emission(KernelGlobals *kg, Ray *ray, int p
/* Indirect Background */
-__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf)
+__device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int path_flag, float bsdf_pdf, int bounce)
{
#ifdef __BACKGROUND__
int shader = kernel_data.background.shader;
@@ -240,7 +240,7 @@ __device_noinline float3 indirect_background(KernelGlobals *kg, Ray *ray, int pa
/* evaluate background closure */
ShaderData sd;
- shader_setup_from_background(kg, &sd, ray);
+ shader_setup_from_background(kg, &sd, ray, bounce+1);
float3 L = shader_eval_background(kg, &sd, path_flag, SHADER_CONTEXT_EMISSION);
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h
index 4983122fb34..5091eac41db 100644
--- a/intern/cycles/kernel/kernel_light.h
+++ b/intern/cycles/kernel/kernel_light.h
@@ -271,7 +271,7 @@ __device void lamp_light_sample(KernelGlobals *kg, int lamp,
ls->pdf = invarea;
if(type == LIGHT_SPOT) {
- /* spot light attentuation */
+ /* spot light attenuation */
float4 data2 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 2);
ls->eval_fac *= spot_light_attenuation(data1, data2, ls);
}
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 6e1843df50d..40ecb1be91b 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -215,7 +215,7 @@ __device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ra
return true;
ShaderData sd;
- shader_setup_from_ray(kg, &sd, &isect, ray);
+ shader_setup_from_ray(kg, &sd, &isect, ray, state->bounce+1);
shader_eval_surface(kg, &sd, 0.0f, PATH_RAY_SHADOW, SHADER_CONTEXT_SHADOW);
throughput *= shader_bsdf_transparency(kg, &sd);
@@ -300,7 +300,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
float light_t = path_rng_1D(kg, rng, sample, num_samples, rng_offset + PRNG_LIGHT);
float3 emission;
- if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission))
+ if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission, state.bounce))
path_radiance_accum_emission(&L, throughput, emission, state.bounce);
}
#endif
@@ -318,7 +318,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
#ifdef __BACKGROUND__
/* sample background shader */
- float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+ float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
path_radiance_accum_background(&L, throughput, L_background, state.bounce);
#endif
@@ -327,7 +327,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
/* setup shading */
ShaderData sd;
- shader_setup_from_ray(kg, &sd, &isect, &ray);
+ shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
float rbsdf = path_rng_1D(kg, rng, sample, num_samples, rng_offset + PRNG_BSDF);
shader_eval_surface(kg, &sd, rbsdf, state.flag, SHADER_CONTEXT_MAIN);
@@ -464,7 +464,7 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample,
light_ray.time = sd.time;
#endif
- if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+ if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
/* trace shadow ray */
float3 shadow;
@@ -575,7 +575,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray
float light_t = path_rng_1D(kg, rng, sample, num_total_samples, rng_offset + PRNG_LIGHT);
float3 emission;
- if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission))
+ if(indirect_lamp_emission(kg, &light_ray, state.flag, ray_pdf, light_t, &emission, state.bounce))
path_radiance_accum_emission(L, throughput, emission, state.bounce);
}
#endif
@@ -583,7 +583,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray
if(!hit) {
#ifdef __BACKGROUND__
/* sample background shader */
- float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+ float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
path_radiance_accum_background(L, throughput, L_background, state.bounce);
#endif
@@ -592,7 +592,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray
/* setup shading */
ShaderData sd;
- shader_setup_from_ray(kg, &sd, &isect, &ray);
+ shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
float rbsdf = path_rng_1D(kg, rng, sample, num_total_samples, rng_offset + PRNG_BSDF);
shader_eval_surface(kg, &sd, rbsdf, state.flag, SHADER_CONTEXT_INDIRECT);
shader_merge_closures(kg, &sd);
@@ -706,7 +706,7 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray
#endif
/* sample random light */
- if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+ if(direct_emission(kg, &sd, -1, light_t, light_o, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
/* trace shadow ray */
float3 shadow;
@@ -838,7 +838,7 @@ __device_noinline void kernel_path_non_progressive_lighting(KernelGlobals *kg, R
float light_u, light_v;
path_rng_2D(kg, &lamp_rng, sample*num_samples + j, aa_samples*num_samples, rng_offset + PRNG_LIGHT_U, &light_u, &light_v);
- if(direct_emission(kg, sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+ if(direct_emission(kg, sd, i, 0.0f, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
/* trace shadow ray */
float3 shadow;
@@ -867,7 +867,7 @@ __device_noinline void kernel_path_non_progressive_lighting(KernelGlobals *kg, R
if(kernel_data.integrator.num_all_lights)
light_t = 0.5f*light_t;
- if(direct_emission(kg, sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp)) {
+ if(direct_emission(kg, sd, -1, light_t, 0.0f, light_u, light_v, &light_ray, &L_light, &is_lamp, state.bounce)) {
/* trace shadow ray */
float3 shadow;
@@ -925,10 +925,7 @@ __device_noinline void kernel_path_non_progressive_lighting(KernelGlobals *kg, R
path_radiance_bsdf_bounce(L, &tp, &bsdf_eval, bsdf_pdf, state.bounce, label);
/* set labels */
- float min_ray_pdf = FLT_MAX;
-
- if(!(label & LABEL_TRANSPARENT))
- min_ray_pdf = fminf(bsdf_pdf, min_ray_pdf);
+ float min_ray_pdf = fminf(bsdf_pdf, FLT_MAX);
/* modify path state */
PathState ps = state;
@@ -1016,7 +1013,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam
#ifdef __BACKGROUND__
/* sample background shader */
- float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf);
+ float3 L_background = indirect_background(kg, &ray, state.flag, ray_pdf, state.bounce);
path_radiance_accum_background(&L, throughput, L_background, state.bounce);
#endif
@@ -1025,7 +1022,7 @@ __device float4 kernel_path_non_progressive(KernelGlobals *kg, RNG *rng, int sam
/* setup shading */
ShaderData sd;
- shader_setup_from_ray(kg, &sd, &isect, &ray);
+ shader_setup_from_ray(kg, &sd, &isect, &ray, state.bounce);
shader_eval_surface(kg, &sd, 0.0f, state.flag, SHADER_CONTEXT_MAIN);
shader_merge_closures(kg, &sd);
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
index 6292adff6a5..c86ac34a057 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -141,11 +141,13 @@ __device_inline void path_rng_2D(KernelGlobals *kg, RNG *rng, int sample, int nu
int p = *rng + dimension;
cmj_sample_2D(sample, num_samples, p, fx, fy);
}
+ else
#endif
-
- /* sobol */
- *fx = path_rng_1D(kg, rng, sample, num_samples, dimension);
- *fy = path_rng_1D(kg, rng, sample, num_samples, dimension + 1);
+ {
+ /* sobol */
+ *fx = path_rng_1D(kg, rng, sample, num_samples, dimension);
+ *fy = path_rng_1D(kg, rng, sample, num_samples, dimension + 1);
+ }
}
__device_inline void path_rng_init(KernelGlobals *kg, __global uint *rng_state, int sample, int num_samples, RNG *rng, int x, int y, float *fx, float *fy)
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index ca4d878daa0..b902230a9b9 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -64,7 +64,7 @@ __device_noinline
__device
#endif
void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
- const Intersection *isect, const Ray *ray)
+ const Intersection *isect, const Ray *ray, int bounce)
{
#ifdef __INSTANCING__
sd->object = (isect->object == ~0)? kernel_tex_fetch(__prim_object, isect->prim): isect->object;
@@ -80,6 +80,7 @@ void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
sd->prim = kernel_tex_fetch(__prim_index, isect->prim);
sd->ray_length = isect->t;
+ sd->ray_depth = bounce;
#ifdef __HAIR__
if(kernel_tex_fetch(__prim_segment, isect->prim) != ~0) {
@@ -277,7 +278,7 @@ __device
#endif
void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
const float3 P, const float3 Ng, const float3 I,
- int shader, int object, int prim, float u, float v, float t, float time, int segment)
+ int shader, int object, int prim, float u, float v, float t, float time, int bounce, int segment)
{
/* vectors */
sd->P = P;
@@ -300,6 +301,7 @@ void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
sd->v = v;
#endif
sd->ray_length = t;
+ sd->ray_depth = bounce;
/* detect instancing, for non-instanced the object index is -object-1 */
#ifdef __INSTANCING__
@@ -408,12 +410,12 @@ __device void shader_setup_from_displace(KernelGlobals *kg, ShaderData *sd,
/* watch out: no instance transform currently */
- shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID, ~0);
+ shader_setup_from_sample(kg, sd, P, Ng, I, shader, object, prim, u, v, 0.0f, TIME_INVALID, 0, ~0);
}
/* ShaderData setup from ray into background */
-__device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray)
+__device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData *sd, const Ray *ray, int bounce)
{
/* vectors */
sd->P = ray->D;
@@ -426,6 +428,7 @@ __device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData
sd->time = ray->time;
#endif
sd->ray_length = 0.0f;
+ sd->ray_depth = bounce;
#ifdef __INSTANCING__
sd->object = ~0;
@@ -931,15 +934,8 @@ __device void shader_merge_closures(KernelGlobals *kg, ShaderData *sd)
sci->sample_weight += scj->sample_weight;
int size = sd->num_closure - (j+1);
- if(size > 0) {
-#ifdef __KERNEL_GPU__
- for(int k = 0; k < size; k++) {
- scj[k] = scj[k+1];
- }
-#else
+ if(size > 0)
memmove(scj, scj+1, size*sizeof(ShaderClosure));
-#endif
- }
sd->num_closure--;
j--;
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index f09bb95046b..55c6e15ad04 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -176,61 +176,6 @@ KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_097)
KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_098)
KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
-/* Kepler and above */
-#if defined(__KERNEL_CUDA__) && __CUDA_ARCH__ >= 300
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_100)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_101)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_102)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_103)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_104)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_105)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_106)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_107)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_108)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_109)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_110)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_111)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_112)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_113)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_114)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_115)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_116)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_117)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_118)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_119)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_120)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_121)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_122)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_123)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_124)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_125)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_126)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_127)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_128)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_129)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_130)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_131)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_132)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_133)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_134)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_135)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_136)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_137)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_138)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_139)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_140)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_141)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_142)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_143)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_144)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_145)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_146)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_147)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_148)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_149)
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_150)
-#endif
-
/* packed image (opencl) */
KERNEL_TEX(uchar4, texture_uchar4, __tex_image_packed)
KERNEL_TEX(uint4, texture_uint4, __tex_image_packed_info)
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 348e8b8a5f1..1010fdea627 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -44,11 +44,11 @@ CCL_NAMESPACE_BEGIN
#define BSSRDF_MIN_RADIUS 1e-8f
#define BSSRDF_MAX_ATTEMPTS 8
-#define BB_DRAPPER 800.0
-#define BB_MAX_TABLE_RANGE 12000.0
-#define BB_TABLE_XPOWER 1.5
-#define BB_TABLE_YPOWER 5.0
-#define BB_TABLE_SPACING 2.0
+#define BB_DRAPPER 800.0
+#define BB_MAX_TABLE_RANGE 12000.0
+#define BB_TABLE_XPOWER 1.5
+#define BB_TABLE_YPOWER 5.0
+#define BB_TABLE_SPACING 2.0
#define TEX_NUM_FLOAT_IMAGES 5
@@ -68,7 +68,6 @@ CCL_NAMESPACE_BEGIN
#define __KERNEL_SHADING__
#if __CUDA_ARCH__ >= 200
#define __KERNEL_ADV_SHADING__
-#define __NON_PROGRESSIVE__
#endif
#endif
@@ -443,7 +442,7 @@ typedef enum AttributeStandard {
/* Closure data */
-#define MAX_CLOSURE 16
+#define MAX_CLOSURE 64
typedef struct ShaderClosure {
ClosureType type;
@@ -547,6 +546,9 @@ typedef struct ShaderData {
/* length of the ray being shaded */
float ray_length;
+
+ /* ray bounce depth */
+ int ray_depth;
#ifdef __RAY_DIFFERENTIALS__
/* differential of P. these are orthogonal to Ng, not N */
@@ -814,7 +816,7 @@ typedef struct KernelBSSRDF {
int pad1, pad2;
} KernelBSSRDF;
-typedef struct KernelBLACKBODY {
+typedef struct KernelBlackbody {
int table_offset;
int pad1, pad2, pad3;
} KernelBLACKBODY;
@@ -829,7 +831,7 @@ typedef struct KernelData {
KernelBVH bvh;
KernelCurves curve_kernel_data;
KernelBSSRDF bssrdf;
- KernelBLACKBODY blackbody;
+ KernelBlackbody blackbody;
} KernelData;
CCL_NAMESPACE_END
diff --git a/intern/cycles/kernel/osl/osl_services.cpp b/intern/cycles/kernel/osl/osl_services.cpp
index e1e43b117e7..f3b79da8894 100644
--- a/intern/cycles/kernel/osl/osl_services.cpp
+++ b/intern/cycles/kernel/osl/osl_services.cpp
@@ -84,6 +84,7 @@ ustring OSLRenderServices::u_curve_thickness("geom:curve_thickness");
ustring OSLRenderServices::u_curve_tangent_normal("geom:curve_tangent_normal");
#endif
ustring OSLRenderServices::u_path_ray_length("path:ray_length");
+ustring OSLRenderServices::u_path_ray_depth("path:ray_depth");
ustring OSLRenderServices::u_trace("trace");
ustring OSLRenderServices::u_hit("hit");
ustring OSLRenderServices::u_hitdist("hitdist");
@@ -660,6 +661,11 @@ bool OSLRenderServices::get_background_attribute(KernelGlobals *kg, ShaderData *
float f = sd->ray_length;
return set_attribute_float(f, type, derivatives, val);
}
+ else if (name == u_path_ray_depth) {
+ /* Ray Depth */
+ int f = sd->ray_depth;
+ return set_attribute_int(f, type, derivatives, val);
+ }
else if (name == u_ndc) {
/* NDC coordinates with special exception for otho */
OSLThreadData *tdata = kg->osl_tdata;
@@ -919,7 +925,10 @@ bool OSLRenderServices::getmessage(OSL::ShaderGlobals *sg, ustring source, ustri
if(!tracedata->setup) {
/* lazy shader data setup */
- shader_setup_from_ray(kg, sd, &tracedata->isect, &tracedata->ray);
+ ShaderData *original_sd = (ShaderData *)(sg->renderstate);
+ int bounce = original_sd->ray_depth + 1;
+
+ shader_setup_from_ray(kg, sd, &tracedata->isect, &tracedata->ray, bounce);
tracedata->setup = true;
}
diff --git a/intern/cycles/kernel/osl/osl_services.h b/intern/cycles/kernel/osl/osl_services.h
index ca18c85a167..5ec4673ef37 100644
--- a/intern/cycles/kernel/osl/osl_services.h
+++ b/intern/cycles/kernel/osl/osl_services.h
@@ -135,6 +135,7 @@ public:
static ustring u_curve_thickness;
static ustring u_curve_tangent_normal;
static ustring u_path_ray_length;
+ static ustring u_path_ray_depth;
static ustring u_trace;
static ustring u_hit;
static ustring u_hitdist;
diff --git a/intern/cycles/kernel/shaders/node_blackbody.osl b/intern/cycles/kernel/shaders/node_blackbody.osl
index 4a68eb973be..3eb0ec4b5e3 100644
--- a/intern/cycles/kernel/shaders/node_blackbody.osl
+++ b/intern/cycles/kernel/shaders/node_blackbody.osl
@@ -26,6 +26,8 @@ shader node_blackbody(
/* Scale by luminance */
float l = luminance(rgb);
- Color = rgb /= l;
+ if (l != 0.0)
+ rgb /= l;
+ Color = rgb;
}
diff --git a/intern/cycles/kernel/shaders/node_light_path.osl b/intern/cycles/kernel/shaders/node_light_path.osl
index 9e3f6c7b4a9..ed3c6969970 100644
--- a/intern/cycles/kernel/shaders/node_light_path.osl
+++ b/intern/cycles/kernel/shaders/node_light_path.osl
@@ -26,7 +26,8 @@ shader node_light_path(
output float IsSingularRay = 0.0,
output float IsReflectionRay = 0.0,
output float IsTransmissionRay = 0.0,
- output float RayLength = 0.0)
+ output float RayLength = 0.0,
+ output float RayDepth = 0.0)
{
IsCameraRay = raytype("camera");
IsShadowRay = raytype("shadow");
@@ -37,5 +38,9 @@ shader node_light_path(
IsTransmissionRay = raytype("refraction");
getattribute("path:ray_length", RayLength);
+
+ int ray_depth;
+ getattribute("path:ray_depth", ray_depth);
+ RayDepth = (float)ray_depth;
}
diff --git a/intern/cycles/kernel/shaders/node_vector_transform.osl b/intern/cycles/kernel/shaders/node_vector_transform.osl
index ae0cb1c7a49..2a501b25cea 100644
--- a/intern/cycles/kernel/shaders/node_vector_transform.osl
+++ b/intern/cycles/kernel/shaders/node_vector_transform.osl
@@ -20,31 +20,19 @@
shader node_vector_transform(
string type = "Vector",
- string convert_from = "World",
- string convert_to = "Object",
+ string convert_from = "world",
+ string convert_to = "object",
vector VectorIn = vector(0.0, 0.0, 0.0),
output vector VectorOut = vector(0.0, 0.0, 0.0))
{
- /* OSL uses lower case variable names here */
- string from = "world";
- string to = "object";
-
- if (convert_from == "Object")
- from = "object";
- else if (convert_from == "Camera")
- from = "camera";
-
- if (convert_to == "World")
- to = "world";
- else if (convert_to == "Camera")
- to = "camera";
-
- if (type == "Vector") {
- VectorOut = transform(from, to, VectorIn);
+ if (type == "Vector" || type == "Normal") {
+ VectorOut = transform(convert_from, convert_to, VectorIn);
+ if (type == "Normal")
+ VectorOut = normalize(VectorOut);
}
else if (type == "Point") {
- point Point = point(VectorIn[0], VectorIn[1], VectorIn[2]);
- VectorOut = transform(from, to, Point);
+ point Point = (point)VectorIn;
+ VectorOut = transform(convert_from, convert_to, Point);
}
}
diff --git a/intern/cycles/kernel/svm/svm_blackbody.h b/intern/cycles/kernel/svm/svm_blackbody.h
index 46b2f910f74..3c6e11ca683 100644
--- a/intern/cycles/kernel/svm/svm_blackbody.h
+++ b/intern/cycles/kernel/svm/svm_blackbody.h
@@ -47,35 +47,36 @@ __device void svm_node_blackbody(KernelGlobals *kg, ShaderData *sd, float *stack
color_rgb = make_float3(1.0e-6f,0.0f,0.0f);
}
else if (temperature <= BB_MAX_TABLE_RANGE) {
- /* This is the overall size of the table (317*3+3) */
- const int lookuptablesize = 954;
- const float lookuptablesizef = 954.0f;
+ /* This is the overall size of the table */
+ const int lookuptablesize = 956;
+ const float lookuptablenormalize = 1.0f/956.0f;
/* reconstruct a proper index for the table lookup, compared to OSL we don't look up two colors
just one (the OSL-lerp is also automatically done for us by "lookup_table_read") */
- float t = powf ((temperature - BB_DRAPPER) / BB_TABLE_SPACING, 1.0f/BB_TABLE_XPOWER);
+ float t = powf((temperature - BB_DRAPPER) * (1.0f / BB_TABLE_SPACING), 1.0f/BB_TABLE_XPOWER);
int blackbody_table_offset = kernel_data.blackbody.table_offset;
/* Retrieve colors from the lookup table */
- float lutval = t/lookuptablesizef;
+ float lutval = t*lookuptablenormalize;
float R = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
- lutval = (t + 317.0f*1.0f)/lookuptablesizef;
+ lutval = (t + 319.0f*1.0f)*lookuptablenormalize;
float G = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
- lutval = (t + 317.0f*2.0f)/lookuptablesizef;
+ lutval = (t + 319.0f*2.0f)*lookuptablenormalize;
float B = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
R = powf(R, BB_TABLE_YPOWER);
G = powf(G, BB_TABLE_YPOWER);
B = powf(B, BB_TABLE_YPOWER);
- /* Luminance */
- float l = linear_rgb_to_gray(make_float3(R, G, B));
-
color_rgb = make_float3(R, G, B);
- color_rgb /= l;
}
+ /* Luminance */
+ float l = linear_rgb_to_gray(color_rgb);
+ if (l != 0.0f)
+ color_rgb /= l;
+
if (stack_valid(col_offset))
stack_store_float3(stack, col_offset, color_rgb);
}
diff --git a/intern/cycles/kernel/svm/svm_image.h b/intern/cycles/kernel/svm/svm_image.h
index 037bfa2d9b9..57adaa863f1 100644
--- a/intern/cycles/kernel/svm/svm_image.h
+++ b/intern/cycles/kernel/svm/svm_image.h
@@ -229,60 +229,6 @@ __device float4 svm_image_texture(KernelGlobals *kg, int id, float x, float y, u
case 97: r = kernel_tex_image_interp(__tex_image_097, x, y); break;
case 98: r = kernel_tex_image_interp(__tex_image_098, x, y); break;
case 99: r = kernel_tex_image_interp(__tex_image_099, x, y); break;
-#if defined(__KERNEL_CUDA__) && __CUDA_ARCH__ >= 300
- case 100: r = kernel_tex_image_interp(__tex_image_100, x, y); break;
- case 101: r = kernel_tex_image_interp(__tex_image_101, x, y); break;
- case 102: r = kernel_tex_image_interp(__tex_image_102, x, y); break;
- case 103: r = kernel_tex_image_interp(__tex_image_103, x, y); break;
- case 104: r = kernel_tex_image_interp(__tex_image_104, x, y); break;
- case 105: r = kernel_tex_image_interp(__tex_image_105, x, y); break;
- case 106: r = kernel_tex_image_interp(__tex_image_106, x, y); break;
- case 107: r = kernel_tex_image_interp(__tex_image_107, x, y); break;
- case 108: r = kernel_tex_image_interp(__tex_image_108, x, y); break;
- case 109: r = kernel_tex_image_interp(__tex_image_109, x, y); break;
- case 110: r = kernel_tex_image_interp(__tex_image_110, x, y); break;
- case 111: r = kernel_tex_image_interp(__tex_image_111, x, y); break;
- case 112: r = kernel_tex_image_interp(__tex_image_112, x, y); break;
- case 113: r = kernel_tex_image_interp(__tex_image_113, x, y); break;
- case 114: r = kernel_tex_image_interp(__tex_image_114, x, y); break;
- case 115: r = kernel_tex_image_interp(__tex_image_115, x, y); break;
- case 116: r = kernel_tex_image_interp(__tex_image_116, x, y); break;
- case 117: r = kernel_tex_image_interp(__tex_image_117, x, y); break;
- case 118: r = kernel_tex_image_interp(__tex_image_118, x, y); break;
- case 119: r = kernel_tex_image_interp(__tex_image_119, x, y); break;
- case 120: r = kernel_tex_image_interp(__tex_image_120, x, y); break;
- case 121: r = kernel_tex_image_interp(__tex_image_121, x, y); break;
- case 122: r = kernel_tex_image_interp(__tex_image_122, x, y); break;
- case 123: r = kernel_tex_image_interp(__tex_image_123, x, y); break;
- case 124: r = kernel_tex_image_interp(__tex_image_124, x, y); break;
- case 125: r = kernel_tex_image_interp(__tex_image_125, x, y); break;
- case 126: r = kernel_tex_image_interp(__tex_image_126, x, y); break;
- case 127: r = kernel_tex_image_interp(__tex_image_127, x, y); break;
- case 128: r = kernel_tex_image_interp(__tex_image_128, x, y); break;
- case 129: r = kernel_tex_image_interp(__tex_image_129, x, y); break;
- case 130: r = kernel_tex_image_interp(__tex_image_130, x, y); break;
- case 131: r = kernel_tex_image_interp(__tex_image_131, x, y); break;
- case 132: r = kernel_tex_image_interp(__tex_image_132, x, y); break;
- case 133: r = kernel_tex_image_interp(__tex_image_133, x, y); break;
- case 134: r = kernel_tex_image_interp(__tex_image_134, x, y); break;
- case 135: r = kernel_tex_image_interp(__tex_image_135, x, y); break;
- case 136: r = kernel_tex_image_interp(__tex_image_136, x, y); break;
- case 137: r = kernel_tex_image_interp(__tex_image_137, x, y); break;
- case 138: r = kernel_tex_image_interp(__tex_image_138, x, y); break;
- case 139: r = kernel_tex_image_interp(__tex_image_139, x, y); break;
- case 140: r = kernel_tex_image_interp(__tex_image_140, x, y); break;
- case 141: r = kernel_tex_image_interp(__tex_image_141, x, y); break;
- case 142: r = kernel_tex_image_interp(__tex_image_142, x, y); break;
- case 143: r = kernel_tex_image_interp(__tex_image_143, x, y); break;
- case 144: r = kernel_tex_image_interp(__tex_image_144, x, y); break;
- case 145: r = kernel_tex_image_interp(__tex_image_145, x, y); break;
- case 146: r = kernel_tex_image_interp(__tex_image_146, x, y); break;
- case 147: r = kernel_tex_image_interp(__tex_image_147, x, y); break;
- case 148: r = kernel_tex_image_interp(__tex_image_148, x, y); break;
- case 149: r = kernel_tex_image_interp(__tex_image_149, x, y); break;
- case 150: r = kernel_tex_image_interp(__tex_image_150, x, y); break;
-#endif
-
default:
kernel_assert(0);
return make_float4(0.0f, 0.0f, 0.0f, 0.0f);
diff --git a/intern/cycles/kernel/svm/svm_light_path.h b/intern/cycles/kernel/svm/svm_light_path.h
index b29dc9cbd45..0f16ef83894 100644
--- a/intern/cycles/kernel/svm/svm_light_path.h
+++ b/intern/cycles/kernel/svm/svm_light_path.h
@@ -34,6 +34,7 @@ __device void svm_node_light_path(ShaderData *sd, float *stack, uint type, uint
case NODE_LP_transmission: info = (path_flag & PATH_RAY_TRANSMIT)? 1.0f: 0.0f; break;
case NODE_LP_backfacing: info = (sd->flag & SD_BACKFACING)? 1.0f: 0.0f; break;
case NODE_LP_ray_length: info = sd->ray_length; break;
+ case NODE_LP_ray_depth: info = (float)sd->ray_depth; break;
}
stack_store_float(stack, out_offset, info);
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 6c47fbc14be..dbfb8d48fbf 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -157,7 +157,8 @@ typedef enum NodeLightPath {
NODE_LP_reflection,
NODE_LP_transmission,
NODE_LP_backfacing,
- NODE_LP_ray_length
+ NODE_LP_ray_length,
+ NODE_LP_ray_depth
} NodeLightPath;
typedef enum NodeLightFalloff {
@@ -231,20 +232,15 @@ typedef enum NodeVectorMath {
typedef enum NodeVectorTransformType {
NODE_VECTOR_TRANSFORM_TYPE_VECTOR,
- NODE_VECTOR_TRANSFORM_TYPE_POINT
+ NODE_VECTOR_TRANSFORM_TYPE_POINT,
+ NODE_VECTOR_TRANSFORM_TYPE_NORMAL
} NodeVectorTransformType;
-typedef enum NodeVectorTransformConvertFrom {
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD,
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT,
- NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA
-} NodeVectorTransformConvertFrom;
-
-typedef enum NodeVectorTransformConvertTo {
- NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD,
- NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT,
- NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA
-} NodeVectorTransformConvertTo;
+typedef enum NodeVectorTransformConvertSpace {
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD,
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT,
+ NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA
+} NodeVectorTransformConvertSpace;
typedef enum NodeConvert {
NODE_CONVERT_FV,
diff --git a/intern/cycles/kernel/svm/svm_vector_transform.h b/intern/cycles/kernel/svm/svm_vector_transform.h
index 8b5369ab626..17dd72d4f30 100644
--- a/intern/cycles/kernel/svm/svm_vector_transform.h
+++ b/intern/cycles/kernel/svm/svm_vector_transform.h
@@ -31,23 +31,24 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
float3 in = stack_load_float3(stack, vector_in);
NodeVectorTransformType type = (NodeVectorTransformType)itype;
- NodeVectorTransformConvertFrom from = (NodeVectorTransformConvertFrom)ifrom;
- NodeVectorTransformConvertTo to = (NodeVectorTransformConvertTo)ito;
+ NodeVectorTransformConvertSpace from = (NodeVectorTransformConvertSpace)ifrom;
+ NodeVectorTransformConvertSpace to = (NodeVectorTransformConvertSpace)ito;
Transform tfm;
int is_object = (sd->object != ~0);
+ int is_direction = (type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR || type == NODE_VECTOR_TRANSFORM_TYPE_NORMAL);
/* From world */
- if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD) {
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+ if(from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
tfm = kernel_data.cam.worldtocamera;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
- else if (to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ else if (to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
+ if(is_direction)
object_inverse_dir_transform(kg, sd, &in);
else
object_inverse_position_transform(kg, sd, &in);
@@ -55,16 +56,16 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
}
/* From camera */
- else if (from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA) {
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT) {
+ else if (from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT) {
tfm = kernel_data.cam.cameratoworld;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT && is_object) {
+ if(is_direction)
object_inverse_dir_transform(kg, sd, &in);
else
object_inverse_position_transform(kg, sd, &in);
@@ -72,22 +73,26 @@ __device void svm_node_vector_transform(KernelGlobals *kg, ShaderData *sd, float
}
/* From object */
- else if(from == NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT) {
- if((to == NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) && is_object) {
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ else if(from == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT) {
+ if((to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD || to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) && is_object) {
+ if(is_direction)
object_dir_transform(kg, sd, &in);
else
object_position_transform(kg, sd, &in);
}
- if(to == NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA) {
+ if(to == NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA) {
tfm = kernel_data.cam.worldtocamera;
- if(type == NODE_VECTOR_TRANSFORM_TYPE_VECTOR)
+ if(is_direction)
in = transform_direction(&tfm, in);
else
in = transform_point(&tfm, in);
}
}
+ /* Normalize Normal */
+ if(type == NODE_VECTOR_TRANSFORM_TYPE_NORMAL)
+ in = normalize(in);
+
/* Output */
if(stack_valid(vector_out)) {
stack_store_float3(stack, vector_out, in);
diff --git a/intern/cycles/render/blackbody.cpp b/intern/cycles/render/blackbody.cpp
index 75b515aa3cb..467368935d7 100644
--- a/intern/cycles/render/blackbody.cpp
+++ b/intern/cycles/render/blackbody.cpp
@@ -93,8 +93,8 @@ vector<float> blackbody_table()
// h is Planck's const, k is Boltzmann's
const float dlambda = 5.0f * 1e-9; // in meters
- /* Blackbody table from 800 to 12k Kelvin (317 entries) */
- vector<float> blackbody_table(317*3+3);
+ /* Blackbody table from 800 to 12k Kelvin (319 entries (317+2 offset) * 3) */
+ vector<float> blackbody_table(956);
float X, Y, Z;
@@ -131,8 +131,8 @@ vector<float> blackbody_table()
/* Store in table in RRRGGGBBB format */
blackbody_table[i] = col.x;
- blackbody_table[i+317*1] = col.y;
- blackbody_table[i+317*2] = col.z;
+ blackbody_table[i+319*1] = col.y;
+ blackbody_table[i+319*2] = col.z;
}
return blackbody_table;
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 572cfae45cd..b509134512b 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -223,7 +223,7 @@ bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int
float3 f = make_float3(in[0], in[1], in[2]);
float3 f_divide = make_float3(in_divide[0], in_divide[1], in_divide[2]);
- f = safe_divide_color(f*exposure, f_divide);
+ f = safe_divide_even_color(f*exposure, f_divide);
pixels[0] = f.x;
pixels[1] = f.y;
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 43aef755ba3..2a16b7b6c21 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -359,12 +359,15 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
case PASS_BACKGROUND:
kfilm->pass_background = kfilm->pass_stride;
kfilm->use_light_pass = 1;
+ break;
case PASS_AO:
kfilm->pass_ao = kfilm->pass_stride;
kfilm->use_light_pass = 1;
+ break;
case PASS_SHADOW:
kfilm->pass_shadow = kfilm->pass_stride;
kfilm->use_light_pass = 1;
+ break;
case PASS_NONE:
break;
}
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index 515bbe92335..2e8bc77b9c9 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -347,8 +347,9 @@ void ShaderGraph::remove_unneeded_nodes()
if(tonode->special_type == SHADER_SPECIAL_TYPE_AUTOCONVERT) {
bool all_links_removed = true;
+ vector<ShaderInput*> links = tonode->outputs[0]->links;
- foreach(ShaderInput *autoin, tonode->outputs[0]->links) {
+ foreach(ShaderInput *autoin, links) {
if(autoin->default_value == ShaderInput::NONE)
all_links_removed = false;
else
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index 65521103df1..8e844bc788e 100644
--- a/intern/cycles/render/image.cpp
+++ b/intern/cycles/render/image.cpp
@@ -61,16 +61,11 @@ void ImageManager::set_osl_texture_system(void *texture_system)
osl_texture_system = texture_system;
}
-void ImageManager::set_extended_image_limits(const DeviceInfo& info)
+void ImageManager::set_extended_image_limits(void)
{
- if(info.type == DEVICE_CPU) {
- tex_num_images = TEX_EXTENDED_NUM_IMAGES_CPU;
- tex_num_float_images = TEX_EXTENDED_NUM_FLOAT_IMAGES;
- tex_image_byte_start = TEX_EXTENDED_IMAGE_BYTE_START;
- }
- else if ((info.type == DEVICE_CUDA || info.type == DEVICE_MULTI) && info.extended_images) {
- tex_num_images = TEX_EXTENDED_NUM_IMAGES_GPU;
- }
+ tex_num_images = TEX_EXTENDED_NUM_IMAGES;
+ tex_num_float_images = TEX_EXTENDED_NUM_FLOAT_IMAGES;
+ tex_image_byte_start = TEX_EXTENDED_IMAGE_BYTE_START;
}
bool ImageManager::set_animation_frame_update(int frame)
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 276420abea1..b20ff23fbbb 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -19,7 +19,6 @@
#ifndef __IMAGE_H__
#define __IMAGE_H__
-#include "device.h"
#include "device_memory.h"
#include "util_string.h"
@@ -30,15 +29,12 @@
CCL_NAMESPACE_BEGIN
-/* Normal Image amount */
#define TEX_NUM_IMAGES 95
#define TEX_IMAGE_BYTE_START TEX_NUM_FLOAT_IMAGES
-/* Extended Image amount*/
#define TEX_EXTENDED_NUM_FLOAT_IMAGES 5
+#define TEX_EXTENDED_NUM_IMAGES 512
#define TEX_EXTENDED_IMAGE_BYTE_START TEX_EXTENDED_NUM_FLOAT_IMAGES
-#define TEX_EXTENDED_NUM_IMAGES_CPU 512
-#define TEX_EXTENDED_NUM_IMAGES_GPU 145
/* color to use when textures are not found */
#define TEX_IMAGE_MISSING_R 1
@@ -64,7 +60,7 @@ public:
void set_osl_texture_system(void *texture_system);
void set_pack_images(bool pack_images_);
- void set_extended_image_limits(const DeviceInfo& info);
+ void set_extended_image_limits(void);
bool set_animation_frame_update(int frame);
bool need_update;
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 276647e6b2f..8b831c25d28 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -53,7 +53,7 @@ static void shade_background_pixels(Device *device, DeviceScene *dscene, int res
}
/* compute on device */
- float4 *d_output_data = d_output.resize(width*height);
+ d_output.resize(width*height);
memset((void*)d_output.data_pointer, 0, d_output.memory_size());
device->const_copy_to("__data", &dscene->data, sizeof(dscene->data));
@@ -82,7 +82,7 @@ static void shade_background_pixels(Device *device, DeviceScene *dscene, int res
device->mem_free(d_input);
device->mem_free(d_output);
- d_output_data = reinterpret_cast<float4*>(d_output.data_pointer);
+ float4 *d_output_data = reinterpret_cast<float4*>(d_output.data_pointer);
pixels.resize(width*height);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 4a2a64bb0f3..77d4a5fe7d2 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -98,6 +98,18 @@ void Mesh::clear()
transform_normal = transform_identity();
}
+void Mesh::set_triangle(int i, int v0, int v1, int v2, int shader_, bool smooth_)
+{
+ Triangle tri;
+ tri.v[0] = v0;
+ tri.v[1] = v1;
+ tri.v[2] = v2;
+
+ triangles[i] = tri;
+ shader[i] = shader_;
+ smooth[i] = smooth_;
+}
+
void Mesh::add_triangle(int v0, int v1, int v2, int shader_, bool smooth_)
{
Triangle tri;
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index b74c41f6453..a7703f7cabc 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -110,6 +110,7 @@ public:
void reserve(int numverts, int numfaces, int numcurves, int numcurvekeys);
void clear();
+ void set_triangle(int i, int v0, int v1, int v2, int shader, bool smooth);
void add_triangle(int v0, int v1, int v2, int shader, bool smooth);
void add_curve_key(float3 loc, float radius);
void add_curve(int first_key, int num_keys, int shader);
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 319d8210377..b5107315d4c 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -2064,6 +2064,7 @@ LightPathNode::LightPathNode()
add_output("Is Reflection Ray", SHADER_SOCKET_FLOAT);
add_output("Is Transmission Ray", SHADER_SOCKET_FLOAT);
add_output("Ray Length", SHADER_SOCKET_FLOAT);
+ add_output("Ray Depth", SHADER_SOCKET_FLOAT);
}
void LightPathNode::compile(SVMCompiler& compiler)
@@ -2118,6 +2119,12 @@ void LightPathNode::compile(SVMCompiler& compiler)
compiler.stack_assign(out);
compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_length, out->stack_offset);
}
+
+ out = output("Ray Depth");
+ if(!out->links.empty()) {
+ compiler.stack_assign(out);
+ compiler.add_node(NODE_LIGHT_PATH, NODE_LP_ray_depth, out->stack_offset);
+ }
}
@@ -3231,8 +3238,8 @@ VectorTransformNode::VectorTransformNode()
: ShaderNode("vector_transform")
{
type = ustring("Vector");
- convert_from = ustring("World");
- convert_to = ustring("Object");
+ convert_from = ustring("world");
+ convert_to = ustring("object");
add_input("Vector", SHADER_SOCKET_VECTOR);
add_output("Vector", SHADER_SOCKET_VECTOR);
@@ -3244,35 +3251,24 @@ static ShaderEnum vector_transform_type_init()
enm.insert("Vector", NODE_VECTOR_TRANSFORM_TYPE_VECTOR);
enm.insert("Point", NODE_VECTOR_TRANSFORM_TYPE_POINT);
+ enm.insert("Normal", NODE_VECTOR_TRANSFORM_TYPE_NORMAL);
return enm;
}
-static ShaderEnum vector_transform_convert_from_init()
-{
- ShaderEnum enm;
-
- enm.insert("World", NODE_VECTOR_TRANSFORM_CONVERT_FROM_WORLD);
- enm.insert("Object", NODE_VECTOR_TRANSFORM_CONVERT_FROM_OBJECT);
- enm.insert("Camera", NODE_VECTOR_TRANSFORM_CONVERT_FROM_CAMERA);
-
- return enm;
-}
-
-static ShaderEnum vector_transform_convert_to_init()
+static ShaderEnum vector_transform_convert_space_init()
{
ShaderEnum enm;
- enm.insert("World", NODE_VECTOR_TRANSFORM_CONVERT_TO_WORLD);
- enm.insert("Object", NODE_VECTOR_TRANSFORM_CONVERT_TO_OBJECT);
- enm.insert("Camera", NODE_VECTOR_TRANSFORM_CONVERT_TO_CAMERA);
+ enm.insert("world", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_WORLD);
+ enm.insert("object", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_OBJECT);
+ enm.insert("camera", NODE_VECTOR_TRANSFORM_CONVERT_SPACE_CAMERA);
return enm;
}
ShaderEnum VectorTransformNode::type_enum = vector_transform_type_init();
-ShaderEnum VectorTransformNode::convert_from_enum = vector_transform_convert_from_init();
-ShaderEnum VectorTransformNode::convert_to_enum = vector_transform_convert_to_init();
+ShaderEnum VectorTransformNode::convert_space_enum = vector_transform_convert_space_init();
void VectorTransformNode::compile(SVMCompiler& compiler)
{
@@ -3283,7 +3279,7 @@ void VectorTransformNode::compile(SVMCompiler& compiler)
compiler.stack_assign(vector_out);
compiler.add_node(NODE_VECTOR_TRANSFORM,
- compiler.encode_uchar4(type_enum[type], convert_from_enum[convert_from], convert_to_enum[convert_to]),
+ compiler.encode_uchar4(type_enum[type], convert_space_enum[convert_from], convert_space_enum[convert_to]),
compiler.encode_uchar4(vector_in->stack_offset, vector_out->stack_offset));
}
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index ed4d24c774a..46b426ea20b 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -513,8 +513,7 @@ public:
ustring convert_to;
static ShaderEnum type_enum;
- static ShaderEnum convert_from_enum;
- static ShaderEnum convert_to_enum;
+ static ShaderEnum convert_space_enum;
};
class BumpNode : public ShaderNode {
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index feffa2a7971..a6dca62ffd0 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -63,8 +63,8 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
else
shader_manager = ShaderManager::create(this, SceneParams::SVM);
- /* Extended Image limits for CPU and Kepler GPUs */
- image_manager->set_extended_image_limits(device_info_);
+ if (device_info_.type == DEVICE_CPU)
+ image_manager->set_extended_image_limits();
}
Scene::~Scene()
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 8f5bc4ead95..0790d4159c5 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -105,8 +105,8 @@ public:
/* integrator */
device_vector<uint> sobol_directions;
- /* CPU images */
- device_vector<uchar4> tex_image[TEX_EXTENDED_NUM_IMAGES_CPU];
+ /* images */
+ device_vector<uchar4> tex_image[TEX_EXTENDED_NUM_IMAGES];
device_vector<float4> tex_float_image[TEX_EXTENDED_NUM_FLOAT_IMAGES];
/* opencl images */
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index d13e86429d6..93d57c65363 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -786,7 +786,7 @@ void Session::update_status_time(bool show_pause, bool show_done)
substatus += string_printf(", Sample %d/%d", sample, num_samples);
}
}
- else if(tile_manager.num_samples == INT_MAX)
+ else if(tile_manager.num_samples == USHRT_MAX)
substatus = string_printf("Path Tracing Sample %d", sample+1);
else
substatus = string_printf("Path Tracing Sample %d/%d", sample+1, tile_manager.num_samples);
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 72a0645c779..5b326e0a017 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -265,7 +265,7 @@ void ShaderManager::device_update_common(Device *device, DeviceScene *dscene, Sc
}
/* blackbody lookup table */
- KernelBLACKBODY *kblackbody = &dscene->data.blackbody;
+ KernelBlackbody *kblackbody = &dscene->data.blackbody;
if(has_converter_blackbody && blackbody_table_offset == TABLE_OFFSET_INVALID) {
vector<float> table = blackbody_table();
diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp
index 30105af2910..9e887aeadf2 100644
--- a/intern/cycles/render/svm.cpp
+++ b/intern/cycles/render/svm.cpp
@@ -389,11 +389,6 @@ void SVMCompiler::generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNo
nodes_done = true;
foreach(ShaderNode *node, nodes) {
-
- /* Detect if we have a blackbody converter, to prepare lookup table */
- if(node->has_converter_blackbody())
- current_shader->has_converter_blackbody = true;
-
if(done.find(node) == done.end()) {
bool inputs_done = true;
@@ -403,6 +398,10 @@ void SVMCompiler::generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNo
inputs_done = false;
if(inputs_done) {
+ /* Detect if we have a blackbody converter, to prepare lookup table */
+ if(node->has_converter_blackbody())
+ current_shader->has_converter_blackbody = true;
+
node->compile(*this);
stack_clear_users(node, done);
stack_clear_temporary(node);
diff --git a/intern/cycles/render/tables.cpp b/intern/cycles/render/tables.cpp
index c7c86f68960..032fef7516e 100644
--- a/intern/cycles/render/tables.cpp
+++ b/intern/cycles/render/tables.cpp
@@ -99,7 +99,7 @@ void LookupTables::remove_table(size_t offset)
for(table = lookup_tables.begin(); table != lookup_tables.end(); table++) {
if(table->offset == offset) {
lookup_tables.erase(table);
- break;
+ return;
}
}
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index 14ebf311a4b..cde547cd77c 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -1100,6 +1100,42 @@ __device_inline float3 safe_divide_color(float3 a, float3 b)
return make_float3(x, y, z);
}
+__device_inline float3 safe_divide_even_color(float3 a, float3 b)
+{
+ float x, y, z;
+
+ x = (b.x != 0.0f)? a.x/b.x: 0.0f;
+ y = (b.y != 0.0f)? a.y/b.y: 0.0f;
+ z = (b.z != 0.0f)? a.z/b.z: 0.0f;
+
+ /* try to get grey even if b is zero */
+ if(b.x == 0.0f) {
+ if(b.y == 0.0f) {
+ x = z;
+ y = z;
+ }
+ else if(b.z == 0.0f) {
+ x = y;
+ z = y;
+ }
+ else
+ x = 0.5f*(y + z);
+ }
+ else if(b.y == 0.0f) {
+ if(b.z == 0.0f) {
+ y = x;
+ z = x;
+ }
+ else
+ y = 0.5f*(x + z);
+ }
+ else if(b.z == 0.0f) {
+ z = 0.5f*(x + y);
+ }
+
+ return make_float3(x, y, z);
+}
+
/* Rotation of point around axis and angle */
__device_inline float3 rotate_around_axis(float3 p, float3 axis, float angle)
diff --git a/intern/cycles/util/util_task.cpp b/intern/cycles/util/util_task.cpp
index abcb05561bd..89d990cc5d9 100644
--- a/intern/cycles/util/util_task.cpp
+++ b/intern/cycles/util/util_task.cpp
@@ -186,13 +186,9 @@ void TaskScheduler::init(int num_threads)
do_exit = false;
if(num_threads == 0) {
- /* automatic number of threads will be main thread + num cores */
+ /* automatic number of threads */
num_threads = system_cpu_thread_count();
}
- else {
- /* main thread will also work, for fixed threads we count it too */
- num_threads -= 1;
- }
/* launch threads that will be waiting for work */
threads.resize(num_threads);
diff --git a/intern/cycles/util/util_task.h b/intern/cycles/util/util_task.h
index 5bca3f255af..6e002ddd5b1 100644
--- a/intern/cycles/util/util_task.h
+++ b/intern/cycles/util/util_task.h
@@ -94,8 +94,8 @@ public:
static void init(int num_threads = 0);
static void exit();
- /* number of threads that can work on tasks, main thread counts too */
- static int num_threads() { return threads.size() + 1; }
+ /* number of threads that can work on task */
+ static int num_threads() { return threads.size(); }
/* test if any session is using the scheduler */
static bool active() { return users != 0; }
diff --git a/intern/cycles/util/util_view.cpp b/intern/cycles/util/util_view.cpp
index 328c0c97391..d9934fa1356 100644
--- a/intern/cycles/util/util_view.cpp
+++ b/intern/cycles/util/util_view.cpp
@@ -136,7 +136,7 @@ static void view_keyboard(unsigned char key, int x, int y)
}
}
-void view_idle()
+static void view_idle(void)
{
if(V.redraw) {
V.redraw = false;