[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53639] trunk/blender/intern/cycles: Cycles / Tile Rendering:

Thomas Dinges blender at dingto.org
Mon Jan 7 20:55:50 CET 2013


Revision: 53639
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53639
Author:   dingto
Date:     2013-01-07 19:55:49 +0000 (Mon, 07 Jan 2013)
Log Message:
-----------
Cycles / Tile Rendering:
* Added new option to chose the tile order.
In addition to the "Center" method, 4 new methods are available now, like Top -> Bottom and Right -> Left. 

Thanks to Sergey for code review and some tweaks! 

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/addon/properties.py
    trunk/blender/intern/cycles/blender/addon/ui.py
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/render/session.cpp
    trunk/blender/intern/cycles/render/session.h
    trunk/blender/intern/cycles/render/tile.cpp
    trunk/blender/intern/cycles/render/tile.h

Modified: trunk/blender/intern/cycles/blender/addon/properties.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/properties.py	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/blender/addon/properties.py	2013-01-07 19:55:49 UTC (rev 53639)
@@ -95,6 +95,14 @@
     ('CARDINAL', "Cardinal interpolation", "Use cardinal interpolation between segments"),
     ('BSPLINE', "B-spline interpolation", "Use b-spline interpolation between segments"),
     )
+    
+enum_tile_order = (
+    ('CENTER', "Center", "Render from center to the edges"),
+    ('RIGHT_TO_LEFT', "Right to Left", "Render from right to left"),
+    ('LEFT_TO_RIGHT', "Left to Right", "Render from left to right"),
+    ('TOP_TO_BOTTOM', "Top to Bottom", "Render from top to bottom"),
+    ('BOTTOM_TO_TOP', "Bottom to Top", "Render from bottom to top"),
+    )
 
 class CyclesRenderSettings(bpy.types.PropertyGroup):
     @classmethod
@@ -352,6 +360,12 @@
                 description="Cache last built BVH to disk for faster re-render if no geometry changed",
                 default=False,
                 )
+        cls.tile_order = EnumProperty(
+                name="Tile Order",
+                description="Tile order for rendering",
+                items=enum_tile_order,
+                default='CENTER',
+                )
         cls.use_progressive_refine = BoolProperty(
                 name="Progressive Refine",
                 description="Instead of rendering each tile until it is finished, "

Modified: trunk/blender/intern/cycles/blender/addon/ui.py
===================================================================
--- trunk/blender/intern/cycles/blender/addon/ui.py	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/blender/addon/ui.py	2013-01-07 19:55:49 UTC (rev 53639)
@@ -191,7 +191,8 @@
         sub.prop(rd, "threads")
 
         sub = col.column(align=True)
-        sub.label(text="Tile Size:")
+        sub.label(text="Tiles:")
+        sub.prop(cscene, "tile_order", text="")
 
         sub.prop(rd, "tile_x", text="X")
         sub.prop(rd, "tile_y", text="Y")

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-01-07 19:55:49 UTC (rev 53639)
@@ -396,6 +396,8 @@
 
 		params.tile_size = make_int2(tile_x, tile_y);
 	}
+	
+	params.tile_order = RNA_enum_get(&cscene, "tile_order");
 
 	params.start_resolution = get_int(cscene, "preview_start_resolution");
 

Modified: trunk/blender/intern/cycles/render/session.cpp
===================================================================
--- trunk/blender/intern/cycles/render/session.cpp	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/render/session.cpp	2013-01-07 19:55:49 UTC (rev 53639)
@@ -41,7 +41,7 @@
 Session::Session(const SessionParams& params_)
 : params(params_),
   tile_manager(params.progressive, params.samples, params.tile_size, params.start_resolution,
-       params.background == false || params.progressive_refine, params.background,
+       params.background == false || params.progressive_refine, params.background, params.tile_order,
        max(params.device.multi_devices.size(), 1)),
   stats()
 {

Modified: trunk/blender/intern/cycles/render/session.h
===================================================================
--- trunk/blender/intern/cycles/render/session.h	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/render/session.h	2013-01-07 19:55:49 UTC (rev 53639)
@@ -51,6 +51,7 @@
 	bool experimental;
 	int samples;
 	int2 tile_size;
+	int tile_order;
 	int start_resolution;
 	int threads;
 

Modified: trunk/blender/intern/cycles/render/tile.cpp
===================================================================
--- trunk/blender/intern/cycles/render/tile.cpp	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/render/tile.cpp	2013-01-07 19:55:49 UTC (rev 53639)
@@ -24,10 +24,11 @@
 CCL_NAMESPACE_BEGIN
 
 TileManager::TileManager(bool progressive_, int num_samples_, int2 tile_size_, int start_resolution_,
-                         bool preserve_tile_device_, bool background_, int num_devices_)
+                         bool preserve_tile_device_, bool background_, int tile_order_, int num_devices_)
 {
 	progressive = progressive_;
 	tile_size = tile_size_;
+	tile_order = tile_order_;
 	start_resolution = start_resolution_;
 	num_devices = num_devices_;
 	preserve_tile_device = preserve_tile_device_;
@@ -165,6 +166,20 @@
 	state.buffer.full_height = max(1, params.full_height/resolution);
 }
 
+list<Tile>::iterator TileManager::next_viewport_tile(int device)
+{
+	list<Tile>::iterator iter;
+
+	int logical_device = preserve_tile_device? device: 0;
+
+	for(iter = state.tiles.begin(); iter != state.tiles.end(); iter++) {
+		if(iter->device == logical_device && iter->rendering == false)
+		return iter;
+	}
+
+	return state.tiles.end();
+}
+
 list<Tile>::iterator TileManager::next_center_tile(int device)
 {
 	list<Tile>::iterator iter, best = state.tiles.end();
@@ -210,28 +225,54 @@
 	return best;
 }
 
-list<Tile>::iterator TileManager::next_simple_tile(int device)
+list<Tile>::iterator TileManager::next_simple_tile(int device, int tile_order)
 {
-	list<Tile>::iterator iter;
+	list<Tile>::iterator iter, best = state.tiles.end();
 
+	int resolution = state.resolution_divider;
 	int logical_device = preserve_tile_device? device: 0;
 
+	int64_t cordx = max(1, params.width/resolution);
+	int64_t cordy = max(1, params.height/resolution);
+	int64_t mindist = cordx * cordy;
+
 	for(iter = state.tiles.begin(); iter != state.tiles.end(); iter++) {
-		if(iter->device == logical_device && iter->rendering == false)
-			return iter;
+		if(iter->device == logical_device && iter->rendering == false) {
+			Tile &cur_tile = *iter;
+			
+			int64_t distx = cordx;
+			int64_t disty = cordy;
+			
+			if (tile_order == TileManager::RIGHT_TO_LEFT)
+				distx = cordx - cur_tile.x;
+			else if (tile_order == TileManager::LEFT_TO_RIGHT)
+				distx = cordx + cur_tile.x;
+			else if (tile_order == TileManager::TOP_TO_BOTTOM)
+				distx = cordx - cur_tile.y;
+			else /* TileManager::BOTTOM_TO_TOP */
+				distx = cordx + cur_tile.y;
+
+			if(distx < mindist) {
+				best = iter;
+				mindist = distx;
+			}
+		}
 	}
 
-	return state.tiles.end();
+	return best;
 }
 
 bool TileManager::next_tile(Tile& tile, int device)
 {
 	list<Tile>::iterator tile_it;
-
-	if(background)
-		tile_it = next_center_tile(device);
+	if (background) {
+		if(tile_order == TileManager::CENTER)
+			tile_it = next_center_tile(device);
+		else
+			tile_it = next_simple_tile(device, tile_order);
+	}
 	else
-		tile_it = next_simple_tile(device);
+		tile_it = next_viewport_tile(device);
 
 	if(tile_it != state.tiles.end()) {
 		tile_it->rendering = true;

Modified: trunk/blender/intern/cycles/render/tile.h
===================================================================
--- trunk/blender/intern/cycles/render/tile.h	2013-01-07 18:10:03 UTC (rev 53638)
+++ trunk/blender/intern/cycles/render/tile.h	2013-01-07 19:55:49 UTC (rev 53639)
@@ -59,7 +59,7 @@
 	} state;
 
 	TileManager(bool progressive, int num_samples, int2 tile_size, int start_resolution,
-	            bool preserve_tile_device, bool background, int num_devices = 1);
+	            bool preserve_tile_device, bool background, int tile_order, int num_devices = 1);
 	~TileManager();
 
 	void reset(BufferParams& params, int num_samples);
@@ -69,11 +69,21 @@
 	bool done();
 
 protected:
+	/* Note: this should match enum_tile_order in properties.py */
+	enum {
+		CENTER = 0,
+		RIGHT_TO_LEFT = 1,
+		LEFT_TO_RIGHT = 2,
+		TOP_TO_BOTTOM = 3,
+		BOTTOM_TO_TOP = 4
+	} TileOrder;
+	
 	void set_tiles();
 
 	bool progressive;
 	int num_samples;
 	int2 tile_size;
+	int tile_order;
 	int start_resolution;
 	int num_devices;
 
@@ -106,9 +116,12 @@
 	 * mimics behavior of blender internal's tile order
 	 */
 	list<Tile>::iterator next_center_tile(int device);
+	
+	/* returns simple tile order */
+	list<Tile>::iterator next_simple_tile(int device, int tile_order);
 
-	/* returns first unhandled tile starting from left bottom corner of the image */
-	list<Tile>::iterator next_simple_tile(int device);
+	/* returns first unhandled tile (for viewport) */
+	list<Tile>::iterator next_viewport_tile(int device);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list