[Bf-blender-cvs] [86e58e7] cycles_bvh: Cycles: Fix node refitting

Sergey Sharybin noreply at git.blender.org
Wed Jun 15 11:39:18 CEST 2016


Commit: 86e58e7bf2637ed53152df81e6e3d19326752822
Author: Sergey Sharybin
Date:   Wed Jun 15 11:33:46 2016 +0200
Branches: cycles_bvh
https://developer.blender.org/rB86e58e7bf2637ed53152df81e6e3d19326752822

Cycles: Fix node refitting

It'll fall back to identity transform since otherwise it gets
too expensive to re-calculate all heuristics.

===================================================================

M	intern/cycles/bvh/bvh.cpp

===================================================================

diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index 2b242d7..5b1f5c5 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -362,9 +362,6 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size)
 
 			for(size_t i = 0, j = 0; i < bvh_nodes_size; j++) {
 				size_t nsize, nsize_bbox;
-				if(use_qbvh) {
-					assert(bvh_nodes[i].y == 0);
-				}
 				if(bvh_nodes[i].x & PATH_RAY_NODE_UNALIGNED) {
 					nsize = use_qbvh
 					            ? BVH_UNALIGNED_QNODE_SIZE
@@ -1063,7 +1060,14 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 	}
 	else {
 		int4 *data = &pack.nodes[idx];
-		int4 c = data[7];
+		bool is_unaligned = (data[0].x & PATH_RAY_NODE_UNALIGNED) != 0;
+		int4 c;
+		if(is_unaligned) {
+			c = data[13];
+		}
+		else {
+			c = data[7];
+		}
 		/* Refit inner node, set bbox from children. */
 		BoundBox child_bbox[4] = {BoundBox::empty,
 		                          BoundBox::empty,
@@ -1082,23 +1086,62 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 			}
 		}
 
-		float4 inner_data[BVH_QNODE_SIZE];
-		inner_data[0] = make_float4(__int_as_float(data[0].x),
-		                            __int_as_float(data[1].y),
-		                            __int_as_float(data[2].z),
-		                            __int_as_float(data[3].w));
-		for(int i = 0; i < 4; ++i) {
-			float3 bb_min = child_bbox[i].min;
-			float3 bb_max = child_bbox[i].max;
-			inner_data[1][i] = bb_min.x;
-			inner_data[2][i] = bb_max.x;
-			inner_data[3][i] = bb_min.y;
-			inner_data[4][i] = bb_max.y;
-			inner_data[5][i] = bb_min.z;
-			inner_data[6][i] = bb_max.z;
-			inner_data[7][i] = __int_as_float(c[i]);
+		/* TODO(sergey): To be de-duplicated with pack_inner(),
+		 * but for that need some sort of pack_node(). which operates with
+		 * direct data, not stack element.
+		 */
+		if(is_unaligned) {
+			Transform aligned_space = transform_identity();
+			float4 inner_data[BVH_UNALIGNED_QNODE_SIZE];
+			inner_data[0] = make_float4(
+			        __int_as_float(visibility | PATH_RAY_NODE_UNALIGNED),
+			        0.0f,
+			        0.0f,
+			        0.0f);
+			for(int i = 0; i < 4; ++i) {
+				Transform space = BVHUnaligned::compute_node_transform(
+				        child_bbox[i],
+				        aligned_space);
+				inner_data[1][i] = space.x.x;
+				inner_data[2][i] = space.x.y;
+				inner_data[3][i] = space.x.z;
+
+				inner_data[4][i] = space.y.x;
+				inner_data[5][i] = space.y.y;
+				inner_data[6][i] = space.y.z;
+
+				inner_data[7][i] = space.z.x;
+				inner_data[8][i] = space.z.y;
+				inner_data[9][i] = space.z.z;
+
+				inner_data[10][i] = space.x.w;
+				inner_data[11][i] = space.y.w;
+				inner_data[12][i] = space.z.w;
+
+				inner_data[13][i] = __int_as_float(c[i]);
+			}
+			memcpy(&pack.nodes[idx], inner_data, sizeof(float4)*BVH_UNALIGNED_QNODE_SIZE);
+		}
+		else {
+			float4 inner_data[BVH_QNODE_SIZE];
+			inner_data[0] = make_float4(
+			        __int_as_float(visibility & ~PATH_RAY_NODE_UNALIGNED),
+			        0.0f,
+			        0.0f,
+			        0.0f);
+			for(int i = 0; i < 4; ++i) {
+				float3 bb_min = child_bbox[i].min;
+				float3 bb_max = child_bbox[i].max;
+				inner_data[1][i] = bb_min.x;
+				inner_data[2][i] = bb_max.x;
+				inner_data[3][i] = bb_min.y;
+				inner_data[4][i] = bb_max.y;
+				inner_data[5][i] = bb_min.z;
+				inner_data[6][i] = bb_max.z;
+				inner_data[7][i] = __int_as_float(c[i]);
+			}
+			memcpy(&pack.nodes[idx], inner_data, sizeof(float4)*BVH_QNODE_SIZE);
 		}
-		memcpy(&pack.nodes[idx], inner_data, sizeof(float4)*BVH_QNODE_SIZE);
 	}
 }




More information about the Bf-blender-cvs mailing list