[Bf-blender-cvs] [54104599b0a] cycles_embree: Cycles: embree hair now uses curve and not line segments, no more intersection filters for closest hit queries

Stefan Werner noreply at git.blender.org
Sun Nov 26 23:11:13 CET 2017


Commit: 54104599b0aa7929f3ee83e0a9da03ec85d67f34
Author: Stefan Werner
Date:   Thu Jun 8 23:06:46 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB54104599b0aa7929f3ee83e0a9da03ec85d67f34

Cycles: embree hair now uses curve and not line segments, no more intersection filters for closest hit queries

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

M	intern/cycles/bvh/bvh_embree.cpp
M	intern/cycles/kernel/bvh/bvh.h

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

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 09aaf6d7c2b..1eda3ef9647 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -79,6 +79,13 @@ void rtc_filter_func(void* userDataPtr, RTCRay& ray_)
 		return;
 	}
 	else if(ray.type == CCLRay::RAY_SSS) {
+		/* only accept hits from the same object */
+		if(ray.instID/2 != ray.sss_object_id) {
+			/* this tells embree to continue tracing */
+			ray.geomID = RTC_INVALID_GEOMETRY_ID;
+			return;
+		}
+
 		/* see triangle_intersect_subsurface() for the native equivalent */
 		for(int i = min(ray.max_hits, ray.ss_isect->num_hits) - 1; i >= 0; --i) {
 			if(ray.ss_isect->hits[i].t == ray.tfar) {
@@ -300,7 +307,6 @@ unsigned BVHEmbree::add_object(Object *ob, int i)
 		size_t prim_offset = pack.prim_index.size();
 		geom_id = add_triangles(mesh, i);
 		rtcSetUserData(scene, geom_id, (void*)prim_offset);
-		rtcSetIntersectionFilterFunction(scene, geom_id, rtc_filter_func);
 		rtcSetOcclusionFilterFunction(scene, geom_id, rtc_filter_func);
 		rtcSetMask(scene, geom_id, ob->visibility);
 	}
@@ -308,7 +314,6 @@ unsigned BVHEmbree::add_object(Object *ob, int i)
 		size_t prim_offset = pack.prim_index.size();
 		geom_id = add_curves(mesh, i);
 		rtcSetUserData(scene, geom_id, (void*)prim_offset);
-		rtcSetIntersectionFilterFunction(scene, geom_id, rtc_filter_func);
 		rtcSetOcclusionFilterFunction(scene, geom_id, rtc_filter_func);
 		rtcSetMask(scene, geom_id, ob->visibility);
 	}
@@ -443,6 +448,14 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 	}
 
 	const size_t num_keys = mesh->curve_keys.size();
+
+	/* Make room for Cycles specific data */
+	pack.prim_object.reserve(pack.prim_object.size() + num_segments);
+	pack.prim_type.reserve(pack.prim_type.size() + num_segments);
+	pack.prim_index.reserve(pack.prim_index.size() + num_segments);
+	pack.prim_tri_index.reserve(pack.prim_index.size() + num_segments);
+
+#if 0 /* line segments */
 	unsigned geom_id = rtcNewLineSegments2(scene,
 												 RTC_GEOMETRY_STATIC,
 												 num_segments,
@@ -450,13 +463,8 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 												 num_motion_steps,
 												 i*2+1);
 
-	/* Make room for Cycles specific data */
-	pack.prim_object.reserve(pack.prim_object.size() + num_segments);
-	pack.prim_type.reserve(pack.prim_type.size() + num_segments);
-	pack.prim_index.reserve(pack.prim_index.size() + num_segments);
-	pack.prim_tri_index.reserve(pack.prim_index.size() + num_segments);
 
-	/* Split the Cycles curves into embree curve segments, each with 4 CVs */
+	/* Split the Cycles curves into embree line segments, each with 2 CVs */
 	void* raw_buffer = rtcMapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
 	unsigned *rtc_indices = (unsigned*) raw_buffer;
 	size_t rtc_index = 0;
@@ -475,7 +483,36 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 		}
 	}
 	rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
+#else
+	/* curve segments */
+	unsigned geom_id = rtcNewBSplineHairGeometry2(scene,
+												 RTC_GEOMETRY_STATIC,
+												 num_segments,
+												 num_keys + 2 * num_curves,
+												 num_motion_steps,
+												 i*2+1);
 
+
+	/* Split the Cycles curves into embree line segments, each with 2 CVs */
+	void* raw_buffer = rtcMapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
+	unsigned *rtc_indices = (unsigned*) raw_buffer;
+	size_t rtc_index = 0;
+	for(size_t j = 0; j < num_curves; j++) {
+		Mesh::Curve c = mesh->get_curve(j);
+		for(size_t k = 0; k < c.num_segments(); k++) {
+			rtc_indices[rtc_index] = c.first_key + k;
+
+			/* Cycles specific data */
+			pack.prim_object.push_back_reserved(i);
+			pack.prim_type.push_back_reserved(PRIMITIVE_PACK_SEGMENT(num_motion_steps > 1 ? PRIMITIVE_MOTION_CURVE : PRIMITIVE_CURVE, k));
+			pack.prim_index.push_back_reserved(j);
+			pack.prim_tri_index.push_back_reserved(rtc_index);
+
+			rtc_index++;
+		}
+	}
+	rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
+#endif
 	/* Copy the CV data to embree */
 	int t_mid = (num_motion_steps - 1) / 2;
 	const float *curve_radius = &mesh->curve_radius[0];
@@ -496,6 +533,11 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 #endif
 			raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
 			float *rtc_verts = (float*) raw_buffer;
+			rtc_verts[0] = verts[0].x;
+			rtc_verts[1] = verts[0].y;
+			rtc_verts[2] = verts[0].z;
+			rtc_verts[3] = curve_radius[0];
+			rtc_verts += 4;
 			for(size_t j = 0; j < num_keys; j++) {
 				rtc_verts[0] = verts[j].x;
 				rtc_verts[1] = verts[j].y;
@@ -503,6 +545,10 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 				rtc_verts[3] = curve_radius[j];
 				rtc_verts += 4;
 			}
+			rtc_verts[0] = verts[num_keys-1].x;
+			rtc_verts[1] = verts[num_keys-1].y;
+			rtc_verts[2] = verts[num_keys-1].z;
+			rtc_verts[3] = curve_radius[num_keys-1];
 			rtcUnmapBuffer(scene, geom_id, buffer_type);
 		}
 	}
diff --git a/intern/cycles/kernel/bvh/bvh.h b/intern/cycles/kernel/bvh/bvh.h
index c8db09c3357..166b6007c3f 100644
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@ -172,6 +172,7 @@ ccl_device_intersect bool scene_intersect(KernelGlobals *kg,
 {
 #ifdef __EMBREE__
 	if(kernel_data.bvh.scene) {
+		isect->t = ray.t;
 		CCLRay rtc_ray(ray, kg, visibility, CCLRay::RAY_REGULAR);
 		rtcIntersect(kernel_data.bvh.scene, rtc_ray);
 		if(rtc_ray.geomID != RTC_INVALID_GEOMETRY_ID && rtc_ray.primID != RTC_INVALID_GEOMETRY_ID) {



More information about the Bf-blender-cvs mailing list