[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