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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render')
-rw-r--r--intern/cycles/render/buffers.cpp4
-rw-r--r--intern/cycles/render/buffers.h2
-rw-r--r--intern/cycles/render/camera.cpp12
-rw-r--r--intern/cycles/render/camera.h4
-rw-r--r--intern/cycles/render/nodes.cpp93
-rw-r--r--intern/cycles/render/nodes.h5
-rw-r--r--intern/cycles/render/scene.h2
-rw-r--r--intern/cycles/render/session.cpp60
-rw-r--r--intern/cycles/render/session.h20
-rw-r--r--intern/cycles/render/svm.cpp9
-rw-r--r--intern/cycles/render/svm.h4
-rw-r--r--intern/cycles/render/tile.cpp18
-rw-r--r--intern/cycles/render/tile.h10
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;