[Bf-blender-cvs] [2f92f5c4c65] cycles_embree: Cycles: Added volume support for embree

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


Commit: 2f92f5c4c65cce0b69e0a4e955eac59fc6c4e0c3
Author: Stefan Werner
Date:   Wed Jun 7 20:21:09 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB2f92f5c4c65cce0b69e0a4e955eac59fc6c4e0c3

Cycles: Added volume support for embree

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

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 37fffc28977..030a4787a42 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -115,6 +115,22 @@ void cclFilterFunc(void* userDataPtr, RTCRay& ray_)
 		ray.geomID = RTC_INVALID_GEOMETRY_ID;
 		return;
 	} else if(ray.type == CCLRay::RAY_VOLUME_ALL) {
+		// append the intersection to the end of the array
+		if(ray.num_hits < ray.max_hits) {
+			Intersection *isect = &ray.isect_s[ray.num_hits];
+			ray.num_hits++;
+			ray.isect_to_ccl(isect);
+			int prim = kernel_tex_fetch(__prim_index, isect->prim);
+			/* only primitives from volume object */
+			uint tri_object = kernel_tex_fetch(__prim_object, isect->prim);
+			int object_flag = kernel_tex_fetch(__object_flag, tri_object);
+			if((object_flag & SD_OBJECT_HAS_VOLUME) == 0) {
+				ray.num_hits--;
+			}
+			/* this tells embree to continue tracing */
+			ray.geomID = RTC_INVALID_GEOMETRY_ID;
+			return;
+		}
 		return;
 	}
 
diff --git a/intern/cycles/kernel/bvh/bvh.h b/intern/cycles/kernel/bvh/bvh.h
index 6835819b824..43be3756e08 100644
--- a/intern/cycles/kernel/bvh/bvh.h
+++ b/intern/cycles/kernel/bvh/bvh.h
@@ -270,7 +270,7 @@ ccl_device_intersect bool scene_intersect_shadow_all(KernelGlobals *kg,
 		rtc_ray.isect_s = isect;
 		rtc_ray.max_hits = max_hits;
 		rtc_ray.num_hits = 0;
-		rtcIntersect(kernel_data.bvh.scene, rtc_ray);
+		rtcOccluded(kernel_data.bvh.scene, rtc_ray);
 		if(rtc_ray.num_hits > 0) {
 			*num_hits = rtc_ray.num_hits;
 			return (rtc_ray.geomID != RTC_INVALID_GEOMETRY_ID);
@@ -366,6 +366,16 @@ ccl_device_intersect uint scene_intersect_volume_all(KernelGlobals *kg,
                                                      const uint max_hits,
                                                      const uint visibility)
 {
+#ifdef __EMBREE__
+	if(kernel_data.bvh.scene) {
+		CCLRay rtc_ray(*ray, kg, visibility, CCLRay::RAY_VOLUME_ALL);
+		rtc_ray.isect_s = isect;
+		rtc_ray.max_hits = max_hits;
+		rtc_ray.num_hits = 0;
+		rtcOccluded(kernel_data.bvh.scene, rtc_ray);
+		return rtc_ray.num_hits;
+	}
+#endif
 #  ifdef __OBJECT_MOTION__
 	if(kernel_data.bvh.have_motion) {
 		return bvh_intersect_volume_all_motion(kg, ray, isect, max_hits, visibility);



More information about the Bf-blender-cvs mailing list