diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-09-17 14:55:18 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-09-17 14:55:18 +0400 |
commit | 89eeae955b1c3904c0c511e93d63f3f1677773fb (patch) | |
tree | 49bbad1820d846f8d63737857b4e4f3108da6537 /intern/cycles/render/tile.cpp | |
parent | bd4de709fd74d4d134795b7c9b35e37d9ed2e2bb (diff) |
Cycles: change preview "resolution divider" that gave the number of lower
resolutions to render, to a "start resolution" which gives the resolution
to start at.
This avoids unnecessary rendering of small resolutions in small viewports,
and avoids long waiting on big viewports.
Diffstat (limited to 'intern/cycles/render/tile.cpp')
-rw-r--r-- | intern/cycles/render/tile.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp index b4156fd9471..874f1a6b3aa 100644 --- a/intern/cycles/render/tile.cpp +++ b/intern/cycles/render/tile.cpp @@ -23,11 +23,11 @@ CCL_NAMESPACE_BEGIN -TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int resolution_, int num_devices_) +TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int start_resolution_, int num_devices_) { progressive = progressive_; tile_size = tile_size_; - resolution = resolution_; + start_resolution = start_resolution_; num_devices = num_devices_; BufferParams buffer_params; @@ -42,6 +42,18 @@ void TileManager::reset(BufferParams& params_, int num_samples_) { params = params_; + int divider = 1; + int w = params.width, h = params.height; + + if(start_resolution != INT_MAX) { + while(w*h > start_resolution*start_resolution) { + w = max(1, w/2); + h = max(1, h/2); + + divider *= 2; + } + } + num_samples = num_samples_; state.buffer = BufferParams(); @@ -49,7 +61,7 @@ void TileManager::reset(BufferParams& params_, int num_samples_) state.num_tiles = 0; state.num_rendered_tiles = 0; state.num_samples = 0; - state.resolution = resolution; + state.resolution_divider = divider; state.tiles.clear(); } @@ -60,7 +72,7 @@ void TileManager::set_samples(int num_samples_) void TileManager::set_tiles() { - int resolution = state.resolution; + int resolution = state.resolution_divider; int image_w = max(1, params.width/resolution); int image_h = max(1, params.height/resolution); @@ -104,7 +116,7 @@ list<Tile>::iterator TileManager::next_center_tile(int device) { list<Tile>::iterator iter, best = state.tiles.end(); - int resolution = state.resolution; + int resolution = state.resolution_divider; int image_w = max(1, params.width/resolution); int image_h = max(1, params.height/resolution); @@ -167,7 +179,7 @@ bool TileManager::next_tile(Tile& tile, int device) bool TileManager::done() { - return (state.sample+state.num_samples >= num_samples && state.resolution == 1); + return (state.sample+state.num_samples >= num_samples && state.resolution_divider == 1); } bool TileManager::next() @@ -175,9 +187,9 @@ bool TileManager::next() if(done()) return false; - if(progressive && state.resolution > 1) { + if(progressive && state.resolution_divider > 1) { state.sample = 0; - state.resolution /= 2; + state.resolution_divider /= 2; state.num_samples = 1; set_tiles(); } @@ -189,7 +201,7 @@ bool TileManager::next() else state.num_samples = num_samples; - state.resolution = 1; + state.resolution_divider = 1; set_tiles(); } |