diff options
Diffstat (limited to 'intern/cycles')
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; |