[Bf-blender-cvs] [871b1f57958] cycles_embree: Cycles: Added support for BVH refitting/dynamic meshes with embree

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


Commit: 871b1f57958b64e2a54a152a659cde224b972dd3
Author: Stefan Werner
Date:   Mon Jun 12 14:01:58 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB871b1f57958b64e2a54a152a659cde224b972dd3

Cycles: Added support for BVH refitting/dynamic meshes with embree

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

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

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

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index a2466722e66..047fc2cb4f3 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -35,7 +35,12 @@
 #include "xmmintrin.h"
 #include "pmmintrin.h"
 
-#define EMBREE_SHARED_MEM 1
+/* this doesn't work with refitting unforutnately
+ * #define EMBREE_SHARED_MEM 1
+ */
+
+/* this should eventually come from render settings. */
+//#define HAIR_CURVES
 
 CCL_NAMESPACE_BEGIN
 
@@ -244,7 +249,7 @@ void BVHEmbree::build(Progress& progress, Stats *stats_)
 		scene = NULL;
 	}
 
-	RTCSceneFlags flags = RTC_SCENE_STATIC|RTC_SCENE_INCOHERENT|RTC_SCENE_ROBUST;
+	RTCSceneFlags flags = RTC_SCENE_DYNAMIC|RTC_SCENE_COMPACT|RTC_SCENE_HIGH_QUALITY|RTC_SCENE_ROBUST;
 	if(params.use_spatial_split) {
 		flags = flags|RTC_SCENE_HIGH_QUALITY;
 	}
@@ -353,12 +358,10 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 {
 	const Attribute *attr_mP = NULL;
 	size_t num_motion_steps = 1;
-	size_t t_mid = 0;
 	if(mesh->has_motion_blur()) {
 		attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
 		if(attr_mP) {
 			num_motion_steps = mesh->motion_steps;
-			t_mid = (num_motion_steps - 1) / 2;
 			if(num_motion_steps > RTC_MAX_TIME_STEPS) {
 				assert(0);
 				num_motion_steps = RTC_MAX_TIME_STEPS;
@@ -369,14 +372,14 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 	const size_t num_triangles = mesh->num_triangles();
 	const size_t num_verts = mesh->verts.size();
 	unsigned geom_id = rtcNewTriangleMesh2(scene,
-						RTC_GEOMETRY_STATIC,
+						RTC_GEOMETRY_DEFORMABLE,
 						num_triangles,
 						num_verts,
 						num_motion_steps,
 						i*2);
 
 #ifdef EMBREE_SHARED_MEM
-	// embree and Cycles use the same memory layout, so we can conveniently use the rtcSetBuffer2 calls
+	/* embree and Cycles use the same memory layout, so we can conveniently use the rtcSetBuffer2 calls */
 	rtcSetBuffer2(scene, geom_id, RTC_INDEX_BUFFER, &mesh->triangles[0], 0, sizeof(int) * 3);
 #else
 	void* raw_buffer = rtcMapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
@@ -390,6 +393,41 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 	rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
 #endif
 
+	update_tri_vertex_buffer(geom_id, mesh);
+
+	pack.prim_object.reserve(pack.prim_object.size() + num_triangles);
+	pack.prim_type.reserve(pack.prim_type.size() + num_triangles);
+	pack.prim_index.reserve(pack.prim_index.size() + num_triangles);
+	pack.prim_tri_index.reserve(pack.prim_index.size() + num_triangles);
+	for(size_t j = 0; j < num_triangles; j++) {
+		pack.prim_object.push_back_reserved(i);
+		pack.prim_type.push_back_reserved(num_motion_steps > 1 ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE);
+		pack.prim_index.push_back_reserved(j);
+		pack.prim_tri_index.push_back_reserved(j);
+	}
+
+	return geom_id;
+}
+
+void BVHEmbree::update_tri_vertex_buffer(unsigned geom_id, const Mesh* mesh)
+{
+	const Attribute *attr_mP = NULL;
+	size_t num_motion_steps = 1;
+	int t_mid = 0;
+	if(mesh->has_motion_blur()) {
+		attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+		if(attr_mP) {
+			num_motion_steps = mesh->motion_steps;
+			t_mid = (num_motion_steps - 1) / 2;
+			if(num_motion_steps > RTC_MAX_TIME_STEPS) {
+				assert(0);
+				num_motion_steps = RTC_MAX_TIME_STEPS;
+			}
+		}
+	}
+	const size_t num_verts = mesh->verts.size();
+
+
 	for(int t = 0; t < num_motion_steps; t++) {
 		RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
 		const float3 *verts;
@@ -402,7 +440,7 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 #ifdef EMBREE_SHARED_MEM
 		rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float3));
 #else
-		raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
+		void *raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
 		float *rtc_verts = (float*) raw_buffer;
 		for(size_t j = 0; j < num_verts; j++) {
 			rtc_verts[0] = verts[j].x;
@@ -414,23 +452,66 @@ unsigned BVHEmbree::add_triangles(Mesh *mesh, int i)
 		rtcUnmapBuffer(scene, geom_id, buffer_type);
 #endif
 	}
+}
 
-	pack.prim_object.reserve(pack.prim_object.size() + num_triangles);
-	pack.prim_type.reserve(pack.prim_type.size() + num_triangles);
-	pack.prim_index.reserve(pack.prim_index.size() + num_triangles);
-	pack.prim_tri_index.reserve(pack.prim_index.size() + num_triangles);
-	for(size_t j = 0; j < num_triangles; j++) {
-		pack.prim_object.push_back_reserved(i);
-		pack.prim_type.push_back_reserved(num_motion_steps > 1 ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE);
-		pack.prim_index.push_back_reserved(j);
-		pack.prim_tri_index.push_back_reserved(j);
+void BVHEmbree::update_curve_vertex_buffer(unsigned geom_id, const Mesh* mesh)
+{
+	const Attribute *attr_mP = NULL;
+	size_t num_motion_steps = 1;
+	if(mesh->has_motion_blur()) {
+		attr_mP = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+		if(attr_mP) {
+			num_motion_steps = mesh->motion_steps;
+		}
 	}
 
-	return geom_id;
-}
+	const size_t num_keys = mesh->curve_keys.size();
 
-/* this should eventually come from render settings. */
-//#define HAIR_CURVES
+	/* Copy the CV data to embree */
+	int t_mid = (num_motion_steps - 1) / 2;
+	const float *curve_radius = &mesh->curve_radius[0];
+	for(int t = 0; t < num_motion_steps; t++) {
+		RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
+		const float3 *verts;
+		if(t == t_mid) {
+			verts = &mesh->curve_keys[0];
+		} else {
+			int t_ = (t > t_mid) ? (t - 1) : t;
+			verts = &attr_mP->data_float3()[t_ * num_keys];
+		}
+
+#ifdef EMBREE_SHARED_MEM
+		if(t != t_mid) {
+			rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float4));
+		} else
+#endif
+		{
+			void *raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
+			float *rtc_verts = (float*) raw_buffer;
+#ifdef HAIR_CURVES
+			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;
+#endif
+			for(size_t j = 0; j < num_keys; j++) {
+				rtc_verts[0] = verts[j].x;
+				rtc_verts[1] = verts[j].y;
+				rtc_verts[2] = verts[j].z;
+				rtc_verts[3] = curve_radius[j];
+				rtc_verts += 4;
+			}
+#ifdef HAIR_CURVES
+			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];
+#endif
+			rtcUnmapBuffer(scene, geom_id, buffer_type);
+		}
+	}
+}
 
 unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 {
@@ -460,7 +541,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 
 #ifndef HAIR_CURVES /* line segments */
 	unsigned geom_id = rtcNewLineSegments2(scene,
-												 RTC_GEOMETRY_STATIC,
+												 RTC_GEOMETRY_DEFORMABLE,
 												 num_segments,
 												 num_keys,
 												 num_motion_steps,
@@ -488,8 +569,9 @@ 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_segments / 2;
+	unsigned geom_id = rtcNewBezierHairGeometry2(scene,
+												 RTC_GEOMETRY_DEFORMABLE,
 												 num_segments,
 												 num_keys + 2 * num_curves,
 												 num_motion_steps,
@@ -502,7 +584,7 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 	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++) {
+		for(size_t k = 0; k < c.num_segments(); k+=3) {
 			rtc_indices[rtc_index] = c.first_key + k;
 
 			/* Cycles specific data */
@@ -516,49 +598,8 @@ unsigned BVHEmbree::add_curves(Mesh *mesh, int i)
 	}
 	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];
-	for(int t = 0; t < num_motion_steps; t++) {
-		RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
-		const float3 *verts;
-		if(t == t_mid) {
-			verts = &mesh->curve_keys[0];
-		} else {
-			int t_ = (t > t_mid) ? (t - 1) : t;
-			verts = &attr_mP->data_float3()[t_ * num_keys];
-		}
 
-#ifdef EMBREE_SHARED_MEM
-		if(t != t_mid) {
-			rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float4));
-		} else {
-#endif
-			raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
-			float *rtc_verts = (float*) raw_buffer;
-#ifdef HAIR_CURVES
-			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;
-#endif
-			for(size_t j = 0; j < num_keys; j++) {
-				rtc_verts[0] = verts[j].x;
-				rtc_verts[1] = verts[j].y;
-				rtc_verts[2] = verts[j].z;
-				rtc_verts[3] = curve_radius[j];
-				rtc_verts += 4;
-			}
-#ifdef HAIR_CURVES
-			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];
-#endif
-			rtcUnmapBuffer(scene, geom_id, buffer_type);
-		}
-	}
+	update_curve_vertex_buffer(geom_id, mesh);
 
 	return geom_id;
 }
@@ -701,16 +742,23 @@ void BVHEmbree::pack_nodes(const BVHNode *root)
 
 void BVHEmbree::refit_nodes()
 {
-#if 0
 	unsigned geom_id = 0;
+
 	foreach(Object *ob, objects) {
-		void *raw_buffer = rtcMapBuffer(scene, geom_id, RTC_VERTEX_BUFFER);
-		float *rtc_verts = (float*) raw_buffer;
-		rtcUnmapBuffer(scene, geom_id, RTC_VERTEX_BUFFER);
-		rtcUpdate(scene, geom_id);
-		geom_id++;
+		if(!params.top_level || (ob->is_traceable() && !ob->mesh->is_instanced())) {
+			if(params.primitive_mask & PRIMITIVE_ALL_TRIANGLE && ob->mesh->num_triangles() > 0) {
+				update_tri_vertex_buffer(geom_id, ob->mesh);
+				rtcUpdate(scene, geom_id);
+			}
+
+			if(params.primitive_mask & PRIMITIVE_ALL_CURVE && ob->mesh->num_curves() > 0) {
+				update_curve_vertex_buffer(geom_id+1, ob->mesh);
+				rtcUpdate(scene, geom_id+1);
+			}
+		}
+		geom_id += 2;
 	}
-#endif
+	rtcCommit(scene);
 }
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/bvh/bvh_embree.h b/intern/cycles/bvh/bvh_embree.h
index d4443f33ecc..5d26bb9ecee 100644
--- a/intern/cycles/bvh/bvh_embree.h
+++ b/intern/cycles/bv

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list