* Add alpha pass output, to use set Transparent option in Film panel.
* Add Holdout closure (OSL terminology), this is like the Sky option in the
  internal renderer, objects with this closure show the background / zero
  alpha.
* Add option to use Gaussian instead of Box pixel filter in the UI.
* Remove camera response curves for now, they don't really belong here in
  the pipeline, should be moved to compositor.

* Output full float values for rendering now, previously was only byte precision.
* Add a patch from Thomas to get a preview passes option, but still disabled
  because it isn't quite working right yet.
* CUDA: don't compile shader graph evaluation inline.
* Convert tabs to spaces in python files.
This commit is contained in:
2011-08-28 13:55:59 +00:00
parent d48e4fc92b
commit bae896691a
63 changed files with 1018 additions and 840 deletions

View File

@@ -21,6 +21,7 @@
#include "camera.h"
#include "device.h"
#include "integrator.h"
#include "film.h"
#include "light.h"
#include "scene.h"
#include "session.h"
@@ -94,7 +95,7 @@ void BlenderSession::create_session()
session->progress.set_cancel_callback(function_bind(&BlenderSession::test_cancel, this));
/* start rendering */
session->reset(width, height);
session->reset(width, height, session_params.passes);
session->start();
}
@@ -118,31 +119,17 @@ void BlenderSession::render()
void BlenderSession::write_render_result()
{
/* get result */
DisplayBuffer *display = session->display;
Device *device = session->device;
RenderBuffers *buffers = session->buffers;
float exposure = scene->film->exposure;
double total_time, pass_time;
int pass;
session->progress.get_pass(pass, total_time, pass_time);
if(!display->rgba.device_pointer)
float4 *pixels = buffers->copy_from_device(exposure, pass);
if(!pixels)
return;
/* todo: get float buffer */
device->pixels_copy_from(display->rgba, 0, width, height);
uchar4 *rgba = (uchar4*)display->rgba.data_pointer;
vector<float4> buffer(width*height);
float fac = 1.0f/255.0f;
bool color_management = b_scene.render().use_color_management();
/* normalize */
for(int i = width*height - 1; i >= 0; i--) {
uchar4 f = rgba[i];
float3 rgb = make_float3(f.x, f.y, f.z)*fac;
if(color_management)
rgb = color_srgb_to_scene_linear(rgb);
buffer[i] = make_float4(rgb.x, rgb.y, rgb.z, 1.0f);
}
struct RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, 0, 0, width, height);
PointerRNA rrptr;
RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
@@ -150,9 +137,11 @@ void BlenderSession::write_render_result()
BL::RenderResult::layers_iterator layer;
rr.layers.begin(layer);
rna_RenderLayer_rect_set(&layer->ptr, (float*)&buffer[0]);
rna_RenderLayer_rect_set(&layer->ptr, (float*)pixels);
RE_engine_end_result((RenderEngine*)b_engine.ptr.data, rrp);
delete [] pixels;
}
void BlenderSession::synchronize()
@@ -168,6 +157,9 @@ void BlenderSession::synchronize()
return;
}
/* increase passes, but never decrease */
session->set_passes(session_params.passes);
/* copy recalc flags, outside of mutex so we can decide to do the real
synchronization at a later time to not block on running updates */
sync->sync_recalc();
@@ -188,7 +180,7 @@ void BlenderSession::synchronize()
/* reset if needed */
if(scene->need_reset())
session->reset(width, height);
session->reset(width, height, session_params.passes);
/* unlock */
session->scene->mutex.unlock();
@@ -225,8 +217,10 @@ bool BlenderSession::draw(int w, int h)
}
/* reset if requested */
if(reset)
session->reset(width, height);
if(reset) {
SessionParams session_params = BlenderSync::get_session_params(b_scene, background);
session->reset(width, height, session_params.passes);
}
}
/* update status and progress for 3d view draw */