diff options
Diffstat (limited to 'intern/cycles/render')
-rw-r--r-- | intern/cycles/render/buffers.cpp | 4 | ||||
-rw-r--r-- | intern/cycles/render/buffers.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/camera.cpp | 12 | ||||
-rw-r--r-- | intern/cycles/render/camera.h | 4 | ||||
-rw-r--r-- | intern/cycles/render/nodes.cpp | 93 | ||||
-rw-r--r-- | intern/cycles/render/nodes.h | 5 | ||||
-rw-r--r-- | intern/cycles/render/scene.h | 2 | ||||
-rw-r--r-- | intern/cycles/render/session.cpp | 60 | ||||
-rw-r--r-- | intern/cycles/render/session.h | 20 | ||||
-rw-r--r-- | intern/cycles/render/svm.cpp | 9 | ||||
-rw-r--r-- | intern/cycles/render/svm.h | 4 | ||||
-rw-r--r-- | intern/cycles/render/tile.cpp | 18 | ||||
-rw-r--r-- | intern/cycles/render/tile.h | 10 |
13 files changed, 159 insertions, 84 deletions
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp index 62dc17960ae..acdddb475d0 100644 --- a/intern/cycles/render/buffers.cpp +++ b/intern/cycles/render/buffers.cpp @@ -85,7 +85,7 @@ void RenderBuffers::reset(Device *device, int width_, int height_) device->mem_copy_to(rng_state); } -float4 *RenderBuffers::copy_from_device(float exposure, int pass) +float4 *RenderBuffers::copy_from_device(float exposure, int sample) { if(!buffer.device_pointer) return NULL; @@ -94,7 +94,7 @@ float4 *RenderBuffers::copy_from_device(float exposure, int pass) float4 *out = new float4[width*height]; float4 *in = (float4*)buffer.data_pointer; - float scale = 1.0f/(float)pass; + float scale = 1.0f/(float)sample; for(int i = width*height - 1; i >= 0; i--) { float4 rgba = in[i]*scale; diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h index e99fedb0dff..d5eb8d7fa2f 100644 --- a/intern/cycles/render/buffers.h +++ b/intern/cycles/render/buffers.h @@ -47,7 +47,7 @@ public: ~RenderBuffers(); void reset(Device *device, int width, int height); - float4 *copy_from_device(float exposure, int pass); + float4 *copy_from_device(float exposure, int sample); protected: void device_free(); diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp index 74469c738c7..e88c0a388bc 100644 --- a/intern/cycles/render/camera.cpp +++ b/intern/cycles/render/camera.cpp @@ -28,8 +28,10 @@ Camera::Camera() shutteropen = 0.0f; shutterclose = 1.0f; - lensradius = 0.0f; + aperturesize = 0.0f; focaldistance = 10.0f; + blades = 0; + bladesrotation = 0.0f; matrix = transform_identity(); @@ -134,8 +136,10 @@ void Camera::device_update(Device *device, DeviceScene *dscene) kcam->worldtocamera = transform_inverse(cameratoworld); /* depth of field */ - kcam->lensradius = lensradius; + kcam->aperturesize = aperturesize; kcam->focaldistance = focaldistance; + kcam->blades = (blades < 3)? 0.0f: blades; + kcam->bladesrotation = bladesrotation; /* motion blur */ kcam->shutteropen = shutteropen; @@ -168,7 +172,9 @@ bool Camera::modified(const Camera& cam) { return !((shutteropen == cam.shutteropen) && (shutterclose == cam.shutterclose) && - (lensradius == cam.lensradius) && + (aperturesize == cam.aperturesize) && + (blades == cam.blades) && + (bladesrotation == cam.bladesrotation) && (focaldistance == cam.focaldistance) && (ortho == cam.ortho) && (fov == cam.fov) && diff --git a/intern/cycles/render/camera.h b/intern/cycles/render/camera.h index d385aa274f4..43537ce8c3c 100644 --- a/intern/cycles/render/camera.h +++ b/intern/cycles/render/camera.h @@ -39,8 +39,10 @@ public: float shutterclose; /* depth of field */ - float lensradius; float focaldistance; + float aperturesize; + uint blades; + float bladesrotation; /* orthographic/perspective */ bool ortho; diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index f2030256814..038a6c45b97 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -49,6 +49,7 @@ ImageTextureNode::ImageTextureNode() add_input("Vector", SHADER_SOCKET_POINT, ShaderInput::TEXTURE_COORDINATE); add_output("Color", SHADER_SOCKET_COLOR); + add_output("Alpha", SHADER_SOCKET_FLOAT); } ImageTextureNode::~ImageTextureNode() @@ -69,12 +70,16 @@ void ImageTextureNode::compile(SVMCompiler& compiler) { ShaderInput *vector_in = input("Vector"); ShaderOutput *color_out = output("Color"); + ShaderOutput *alpha_out = output("Alpha"); image_manager = compiler.image_manager; if(slot == -1) slot = image_manager->add_image(filename); - compiler.stack_assign(color_out); + if(!color_out->links.empty()) + compiler.stack_assign(color_out); + if(!alpha_out->links.empty()) + compiler.stack_assign(alpha_out); if(slot != -1) { compiler.stack_assign(vector_in); @@ -83,12 +88,17 @@ void ImageTextureNode::compile(SVMCompiler& compiler) compiler.encode_uchar4( vector_in->stack_offset, color_out->stack_offset, + alpha_out->stack_offset, color_space_enum[color_space])); } else { /* image not found */ - compiler.add_node(NODE_VALUE_V, color_out->stack_offset); - compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0)); + if(!color_out->links.empty()) { + compiler.add_node(NODE_VALUE_V, color_out->stack_offset); + compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0)); + } + if(!alpha_out->links.empty()) + compiler.add_node(NODE_VALUE_F, __float_as_int(0.0f), alpha_out->stack_offset); } } @@ -113,6 +123,7 @@ EnvironmentTextureNode::EnvironmentTextureNode() add_input("Vector", SHADER_SOCKET_VECTOR, ShaderInput::POSITION); add_output("Color", SHADER_SOCKET_COLOR); + add_output("Alpha", SHADER_SOCKET_FLOAT); } EnvironmentTextureNode::~EnvironmentTextureNode() @@ -133,12 +144,16 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler) { ShaderInput *vector_in = input("Vector"); ShaderOutput *color_out = output("Color"); + ShaderOutput *alpha_out = output("Alpha"); image_manager = compiler.image_manager; if(slot == -1) slot = image_manager->add_image(filename); - compiler.stack_assign(color_out); + if(!color_out->links.empty()) + compiler.stack_assign(color_out); + if(!alpha_out->links.empty()) + compiler.stack_assign(alpha_out); if(slot != -1) { compiler.stack_assign(vector_in); @@ -147,12 +162,17 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler) compiler.encode_uchar4( vector_in->stack_offset, color_out->stack_offset, + alpha_out->stack_offset, color_space_enum[color_space])); } else { /* image not found */ - compiler.add_node(NODE_VALUE_V, color_out->stack_offset); - compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0)); + if(!color_out->links.empty()) { + compiler.add_node(NODE_VALUE_V, color_out->stack_offset); + compiler.add_node(NODE_VALUE_V, make_float3(0, 0, 0)); + } + if(!alpha_out->links.empty()) + compiler.add_node(NODE_VALUE_F, __float_as_int(0.0f), alpha_out->stack_offset); } } @@ -1080,7 +1100,6 @@ GlossyBsdfNode::GlossyBsdfNode() distribution = ustring("Beckmann"); add_input("Roughness", SHADER_SOCKET_FLOAT, 0.2f); - add_input("Fresnel", SHADER_SOCKET_FLOAT, 1.0f); } void GlossyBsdfNode::compile(SVMCompiler& compiler) @@ -1088,9 +1107,9 @@ void GlossyBsdfNode::compile(SVMCompiler& compiler) closure = (ClosureType)distribution_enum[distribution]; if(closure == CLOSURE_BSDF_REFLECTION_ID) - BsdfNode::compile(compiler, NULL, input("Fresnel")); + BsdfNode::compile(compiler, NULL, NULL); else - BsdfNode::compile(compiler, input("Roughness"), input("Fresnel")); + BsdfNode::compile(compiler, input("Roughness"), NULL); } void GlossyBsdfNode::compile(OSLCompiler& compiler) @@ -1119,7 +1138,7 @@ GlassBsdfNode::GlassBsdfNode() distribution = ustring("Sharp"); add_input("Roughness", SHADER_SOCKET_FLOAT, 0.0f); - add_input("Fresnel", SHADER_SOCKET_FLOAT, 0.3f); + add_input("IOR", SHADER_SOCKET_FLOAT, 0.3f); } void GlassBsdfNode::compile(SVMCompiler& compiler) @@ -1127,9 +1146,9 @@ void GlassBsdfNode::compile(SVMCompiler& compiler) closure = (ClosureType)distribution_enum[distribution]; if(closure == CLOSURE_BSDF_REFRACTION_ID) - BsdfNode::compile(compiler, NULL, input("Fresnel")); + BsdfNode::compile(compiler, NULL, input("IOR")); else - BsdfNode::compile(compiler, input("Roughness"), input("Fresnel")); + BsdfNode::compile(compiler, input("Roughness"), input("IOR")); } void GlassBsdfNode::compile(OSLCompiler& compiler) @@ -1145,12 +1164,11 @@ VelvetBsdfNode::VelvetBsdfNode() closure = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID; add_input("Sigma", SHADER_SOCKET_FLOAT, 1.0f); - add_input("Fresnel", SHADER_SOCKET_FLOAT, 1.0f); } void VelvetBsdfNode::compile(SVMCompiler& compiler) { - BsdfNode::compile(compiler, input("Sigma"), input("Fresnel")); + BsdfNode::compile(compiler, input("Sigma"), NULL); } void VelvetBsdfNode::compile(OSLCompiler& compiler) @@ -1781,18 +1799,18 @@ FresnelNode::FresnelNode() : ShaderNode("Fresnel") { add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true); - add_input("Fresnel", SHADER_SOCKET_FLOAT, 0.3f); + add_input("IOR", SHADER_SOCKET_FLOAT, 1.45f); add_output("Fac", SHADER_SOCKET_FLOAT); } void FresnelNode::compile(SVMCompiler& compiler) { - ShaderInput *fresnel_in = input("Fresnel"); + ShaderInput *ior_in = input("IOR"); ShaderOutput *fac_out = output("Fac"); - compiler.stack_assign(fresnel_in); + compiler.stack_assign(ior_in); compiler.stack_assign(fac_out); - compiler.add_node(NODE_FRESNEL, fresnel_in->stack_offset, __float_as_int(fresnel_in->value.x), fac_out->stack_offset); + compiler.add_node(NODE_FRESNEL, ior_in->stack_offset, __float_as_int(ior_in->value.x), fac_out->stack_offset); } void FresnelNode::compile(OSLCompiler& compiler) @@ -1800,6 +1818,45 @@ void FresnelNode::compile(OSLCompiler& compiler) compiler.add(this, "node_fresnel"); } +/* Blend Weight */ + +BlendWeightNode::BlendWeightNode() +: ShaderNode("BlendWeight") +{ + add_input("Normal", SHADER_SOCKET_NORMAL, ShaderInput::NORMAL, true); + add_input("Blend", SHADER_SOCKET_FLOAT, 0.5f); + + add_output("Fresnel", SHADER_SOCKET_FLOAT); + add_output("Facing", SHADER_SOCKET_FLOAT); +} + +void BlendWeightNode::compile(SVMCompiler& compiler) +{ + ShaderInput *blend_in = input("Blend"); + + if(blend_in->link) + compiler.stack_assign(blend_in); + + ShaderOutput *fresnel_out = output("Fresnel"); + if(!fresnel_out->links.empty()) { + compiler.stack_assign(fresnel_out); + compiler.add_node(NODE_BLEND_WEIGHT, blend_in->stack_offset, __float_as_int(blend_in->value.x), + compiler.encode_uchar4(NODE_BLEND_WEIGHT_FRESNEL, fresnel_out->stack_offset)); + } + + ShaderOutput *facing_out = output("Facing"); + if(!facing_out->links.empty()) { + compiler.stack_assign(facing_out); + compiler.add_node(NODE_BLEND_WEIGHT, blend_in->stack_offset, __float_as_int(blend_in->value.x), + compiler.encode_uchar4(NODE_BLEND_WEIGHT_FACING, facing_out->stack_offset)); + } +} + +void BlendWeightNode::compile(OSLCompiler& compiler) +{ + compiler.add(this, "node_blend_weight"); +} + /* Output */ OutputNode::OutputNode() diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 2afe585c3ac..f11f34778e3 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -323,6 +323,11 @@ public: SHADER_NODE_CLASS(FresnelNode) }; +class BlendWeightNode : public ShaderNode { +public: + SHADER_NODE_CLASS(BlendWeightNode) +}; + class MathNode : public ShaderNode { public: SHADER_NODE_CLASS(MathNode) diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h index 5772a9d7268..93d8ebf1301 100644 --- a/intern/cycles/render/scene.h +++ b/intern/cycles/render/scene.h @@ -99,6 +99,7 @@ public: class SceneParams { public: enum { OSL, SVM } shadingsystem; + bool use_multi_closure; enum BVHType { BVH_DYNAMIC, BVH_STATIC } bvh_type; bool use_bvh_cache; bool use_bvh_spatial_split; @@ -107,6 +108,7 @@ public: SceneParams() { shadingsystem = SVM; + use_multi_closure = false; bvh_type = BVH_DYNAMIC; use_bvh_cache = false; use_bvh_spatial_split = false; diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 5eb8d51a816..50f7017bacf 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -33,7 +33,7 @@ CCL_NAMESPACE_BEGIN Session::Session(const SessionParams& params_) : params(params_), - tile_manager(params.progressive, params.passes, params.tile_size, params.min_size) + tile_manager(params.progressive, params.samples, params.tile_size, params.min_size) { device_use_gl = ((params.device_type != DEVICE_CPU) && !params.background); @@ -48,12 +48,12 @@ Session::Session(const SessionParams& params_) reset_time = 0.0; preview_time = 0.0; paused_time = 0.0; - pass = 0; + sample = 0; delayed_reset.do_reset = false; delayed_reset.w = 0; delayed_reset.h = 0; - delayed_reset.passes = 0; + delayed_reset.samples = 0; display_outdated = false; gpu_draw_ready = false; @@ -108,7 +108,7 @@ bool Session::ready_to_reset() /* GPU Session */ -void Session::reset_gpu(int w, int h, int passes) +void Session::reset_gpu(int w, int h, int samples) { /* block for buffer acces and reset immediately. we can't do this in the thread, because we need to allocate an OpenGL buffer, and @@ -119,7 +119,7 @@ void Session::reset_gpu(int w, int h, int passes) display_outdated = true; reset_time = time_dt(); - reset_(w, h, passes); + reset_(w, h, samples); gpu_need_tonemap = false; gpu_need_tonemap_cond.notify_all(); @@ -207,7 +207,7 @@ void Session::run_gpu() if(!no_tiles) { /* buffers mutex is locked entirely while rendering each - pass, and released/reacquired on each iteration to allow + sample, and released/reacquired on each iteration to allow reset and draw in between */ thread_scoped_lock buffers_lock(buffers->mutex); @@ -249,7 +249,7 @@ void Session::run_gpu() /* CPU Session */ -void Session::reset_cpu(int w, int h, int passes) +void Session::reset_cpu(int w, int h, int samples) { thread_scoped_lock reset_lock(delayed_reset.mutex); @@ -258,7 +258,7 @@ void Session::reset_cpu(int w, int h, int passes) delayed_reset.w = w; delayed_reset.h = h; - delayed_reset.passes = passes; + delayed_reset.samples = samples; delayed_reset.do_reset = true; device->task_cancel(); @@ -294,7 +294,7 @@ void Session::run_cpu() thread_scoped_lock buffers_lock(buffers->mutex); thread_scoped_lock display_lock(display->mutex); - reset_(delayed_reset.w, delayed_reset.h, delayed_reset.passes); + reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples); delayed_reset.do_reset = false; } @@ -335,7 +335,7 @@ void Session::run_cpu() if(!no_tiles) { /* buffers mutex is locked entirely while rendering each - pass, and released/reacquired on each iteration to allow + sample, and released/reacquired on each iteration to allow reset and draw in between */ thread_scoped_lock buffers_lock(buffers->mutex); @@ -368,11 +368,11 @@ void Session::run_cpu() if(delayed_reset.do_reset) { /* reset rendering if request from main thread */ delayed_reset.do_reset = false; - reset_(delayed_reset.w, delayed_reset.h, delayed_reset.passes); + reset_(delayed_reset.w, delayed_reset.h, delayed_reset.samples); } else if(need_tonemap) { /* tonemap only if we do not reset, we don't we don't - want to show the result of an incomplete pass*/ + want to show the result of an incomplete sample*/ tonemap(); } } @@ -418,7 +418,7 @@ bool Session::draw(int w, int h) return draw_cpu(w, h); } -void Session::reset_(int w, int h, int passes) +void Session::reset_(int w, int h, int samples) { if(w != buffers->width || h != buffers->height) { gpu_draw_ready = false; @@ -426,27 +426,27 @@ void Session::reset_(int w, int h, int passes) display->reset(device, w, h); } - tile_manager.reset(w, h, passes); + tile_manager.reset(w, h, samples); start_time = time_dt(); preview_time = 0.0; paused_time = 0.0; - pass = 0; + sample = 0; } -void Session::reset(int w, int h, int passes) +void Session::reset(int w, int h, int samples) { if(device_use_gl) - reset_gpu(w, h, passes); + reset_gpu(w, h, samples); else - reset_cpu(w, h, passes); + reset_cpu(w, h, samples); } -void Session::set_passes(int passes) +void Session::set_samples(int samples) { - if(passes != params.passes) { - params.passes = passes; - tile_manager.set_passes(passes); + if(samples != params.samples) { + params.samples = samples; + tile_manager.set_samples(samples); { thread_scoped_lock pause_lock(pause_mutex); @@ -504,7 +504,7 @@ void Session::update_scene() void Session::update_status_time(bool show_pause, bool show_done) { - int pass = tile_manager.state.pass; + int sample = tile_manager.state.sample; int resolution = tile_manager.state.resolution; /* update status */ @@ -512,10 +512,10 @@ void Session::update_status_time(bool show_pause, bool show_done) if(!params.progressive) substatus = "Path Tracing"; - else if(params.passes == INT_MAX) - substatus = string_printf("Path Tracing Pass %d", pass+1); + else if(params.samples == INT_MAX) + substatus = string_printf("Path Tracing Sample %d", sample+1); else - substatus = string_printf("Path Tracing Pass %d/%d", pass+1, params.passes); + substatus = string_printf("Path Tracing Sample %d/%d", sample+1, params.samples); if(show_pause) status = "Paused"; @@ -531,13 +531,13 @@ void Session::update_status_time(bool show_pause, bool show_done) preview_time = time_dt(); double total_time = time_dt() - start_time - paused_time; - double pass_time = (pass == 0)? 0.0: (time_dt() - preview_time - paused_time)/(pass); + double sample_time = (sample == 0)? 0.0: (time_dt() - preview_time - paused_time)/(sample); /* negative can happen when we pause a bit before rendering, can discard that */ if(total_time < 0.0) total_time = 0.0; if(preview_time < 0.0) preview_time = 0.0; - progress.set_pass(pass + 1, total_time, pass_time); + progress.set_sample(sample + 1, total_time, sample_time); } void Session::path_trace(Tile& tile) @@ -551,7 +551,7 @@ void Session::path_trace(Tile& tile) task.h = tile.h; task.buffer = buffers->buffer.device_pointer; task.rng_state = buffers->rng_state.device_pointer; - task.pass = tile_manager.state.pass; + task.sample = tile_manager.state.sample; task.resolution = tile_manager.state.resolution; device->task_add(task); @@ -568,7 +568,7 @@ void Session::tonemap() task.h = tile_manager.state.height; task.rgba = display->rgba.device_pointer; task.buffer = buffers->buffer.device_pointer; - task.pass = tile_manager.state.pass; + task.sample = tile_manager.state.sample; task.resolution = tile_manager.state.resolution; if(task.w > 0 && task.h > 0) { diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 4d5cf434098..82c14227d03 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -43,7 +43,7 @@ public: string output_path; bool progressive; - int passes; + int samples; int tile_size; int min_size; int threads; @@ -59,7 +59,7 @@ public: output_path = ""; progressive = false; - passes = INT_MAX; + samples = INT_MAX; tile_size = 64; min_size = 64; threads = 0; @@ -73,7 +73,7 @@ public: { return !(device_type == params.device_type && background == params.background && output_path == params.output_path - /* && passes == params.passes */ + /* && samples == params.samples */ && progressive == params.progressive && tile_size == params.tile_size && min_size == params.min_size @@ -97,7 +97,7 @@ public: DisplayBuffer *display; Progress progress; SessionParams params; - int pass; + int sample; Session(const SessionParams& params); ~Session(); @@ -107,8 +107,8 @@ public: void wait(); bool ready_to_reset(); - void reset(int w, int h, int passes); - void set_passes(int passes); + void reset(int w, int h, int samples); + void set_samples(int samples); void set_pause(bool pause); protected: @@ -116,7 +116,7 @@ protected: thread_mutex mutex; bool do_reset; int w, h; - int passes; + int samples; } delayed_reset; void run(); @@ -126,15 +126,15 @@ protected: void tonemap(); void path_trace(Tile& tile); - void reset_(int w, int h, int passes); + void reset_(int w, int h, int samples); void run_cpu(); bool draw_cpu(int w, int h); - void reset_cpu(int w, int h, int passes); + void reset_cpu(int w, int h, int samples); void run_gpu(); bool draw_gpu(int w, int h); - void reset_gpu(int w, int h, int passes); + void reset_gpu(int w, int h, int samples); TileManager tile_manager; bool device_use_gl; diff --git a/intern/cycles/render/svm.cpp b/intern/cycles/render/svm.cpp index 8f3682cc349..c9bbeecc3a4 100644 --- a/intern/cycles/render/svm.cpp +++ b/intern/cycles/render/svm.cpp @@ -69,7 +69,8 @@ void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene if(shader->has_surface_emission) scene->light_manager->need_update = true; - SVMCompiler compiler(scene->shader_manager, scene->image_manager); + SVMCompiler compiler(scene->shader_manager, scene->image_manager, + scene->params.use_multi_closure); compiler.sunsky = (sunsky_done)? NULL: &dscene->data.sunsky; compiler.background = ((int)i == scene->default_background); compiler.compile(shader, svm_nodes, i); @@ -96,7 +97,7 @@ void SVMShaderManager::device_free(Device *device, DeviceScene *dscene) /* Graph Compiler */ -SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_manager_) +SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_manager_, bool use_multi_closure_) { shader_manager = shader_manager_; image_manager = image_manager_; @@ -106,6 +107,7 @@ SVMCompiler::SVMCompiler(ShaderManager *shader_manager_, ImageManager *image_man current_shader = NULL; background = false; mix_weight_offset = SVM_STACK_INVALID; + use_multi_closure = use_multi_closure_; } int SVMCompiler::stack_size(ShaderSocketType type) @@ -573,9 +575,8 @@ void SVMCompiler::compile_type(Shader *shader, ShaderGraph *graph, ShaderType ty if(generate) { set<ShaderNode*> done; - bool multi_closure = false; /* __MULTI_CLOSURE__ */ - if(multi_closure) { + if(use_multi_closure) { generate_multi_closure(clin->link->parent, done, SVM_STACK_INVALID); } else { diff --git a/intern/cycles/render/svm.h b/intern/cycles/render/svm.h index dfd78cf3c40..4c23e931e09 100644 --- a/intern/cycles/render/svm.h +++ b/intern/cycles/render/svm.h @@ -53,7 +53,8 @@ public: class SVMCompiler { public: - SVMCompiler(ShaderManager *shader_manager, ImageManager *image_manager); + SVMCompiler(ShaderManager *shader_manager, ImageManager *image_manager, + bool use_multi_closure_); void compile(Shader *shader, vector<int4>& svm_nodes, int index); void stack_assign(ShaderOutput *output); @@ -123,6 +124,7 @@ protected: Stack active_stack; int max_stack_use; uint mix_weight_offset; + bool use_multi_closure; }; CCL_NAMESPACE_END diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp index 450090c42f8..ba437e74874 100644 --- a/intern/cycles/render/tile.cpp +++ b/intern/cycles/render/tile.cpp @@ -22,7 +22,7 @@ CCL_NAMESPACE_BEGIN -TileManager::TileManager(bool progressive_, int passes_, int tile_size_, int min_size_) +TileManager::TileManager(bool progressive_, int samples_, int tile_size_, int min_size_) { progressive = progressive_; tile_size = tile_size_; @@ -35,7 +35,7 @@ TileManager::~TileManager() { } -void TileManager::reset(int width_, int height_, int passes_) +void TileManager::reset(int width_, int height_, int samples_) { full_width = width_; full_height = height_; @@ -53,18 +53,18 @@ void TileManager::reset(int width_, int height_, int passes_) } } - passes = passes_; + samples = samples_; state.width = 0; state.height = 0; - state.pass = -1; + state.sample = -1; state.resolution = start_resolution; state.tiles.clear(); } -void TileManager::set_passes(int passes_) +void TileManager::set_samples(int samples_) { - passes = passes_; + samples = samples_; } void TileManager::set_tiles() @@ -96,7 +96,7 @@ void TileManager::set_tiles() bool TileManager::done() { - return (state.pass+1 >= passes); + return (state.sample+1 >= samples && state.resolution == 1); } bool TileManager::next() @@ -105,12 +105,12 @@ bool TileManager::next() return false; if(progressive && state.resolution > 1) { - state.pass = 0; + state.sample = 0; state.resolution /= 2; set_tiles(); } else { - state.pass++; + state.sample++; state.resolution = 1; set_tiles(); } diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h index 56c69cdce88..5cd16eb8afa 100644 --- a/intern/cycles/render/tile.h +++ b/intern/cycles/render/tile.h @@ -42,16 +42,16 @@ public: struct State { int width; int height; - int pass; + int sample; int resolution; list<Tile> tiles; } state; - TileManager(bool progressive, int passes, int tile_size, int min_size); + TileManager(bool progressive, int samples, int tile_size, int min_size); ~TileManager(); - void reset(int width, int height, int passes); - void set_passes(int passes); + void reset(int width, int height, int samples); + void set_samples(int samples); bool next(); bool done(); @@ -59,7 +59,7 @@ protected: void set_tiles(); bool progressive; - int passes; + int samples; int tile_size; int min_size; |