[Bf-blender-cvs] [7986f6eee08] cycles_embree: Cycles: Progress with embree integration, still incomplete however

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


Commit: 7986f6eee08b040ca81b536961a32eeb73040930
Author: Stefan Werner
Date:   Fri Jun 2 17:26:01 2017 +0200
Branches: cycles_embree
https://developer.blender.org/rB7986f6eee08b040ca81b536961a32eeb73040930

Cycles: Progress with embree integration, still incomplete however

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

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

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

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index c4eefe5581d..220e5b1d6e0 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -27,6 +27,7 @@
 
 CCL_NAMESPACE_BEGIN
 
+/* This is to have a shared device between all BVH instances */
 RTCDevice BVHEmbree::rtc_shared_device = NULL;
 int BVHEmbree::rtc_shared_users = 0;
 thread_mutex BVHEmbree::rtc_shared_mutex;
@@ -40,6 +41,7 @@ BVHEmbree::BVHEmbree(const BVHParams& params_, const vector<Object*>& objects_)
 	}
 	rtc_shared_users++;
 
+	/* BVH_CUSTOM as root index signals to the rest of the code that this is not Cycle's own BVH */
 	pack.root_index = BVH_CUSTOM;
 }
 
@@ -77,21 +79,25 @@ void BVHEmbree::build(Progress& progress)
 
 	int i = 0;
 
-	pack.object_node.resize(objects.size());
+	pack.object_node.clear();
 
 	foreach(Object *ob, objects) {
+		unsigned geom_id;
+
 		if(params.top_level) {
 			if(!ob->is_traceable()) {
 				++i;
 				continue;
 			}
 			if(!ob->mesh->is_instanced())
-				add_reference_mesh(ob->mesh, i);
+				geom_id = add_reference_mesh(ob->mesh, i);
 			else
-				add_reference_object(ob, i);
+				geom_id = add_reference_object(ob, i);
+
+			rtcSetUserData(scene, geom_id, (void*)ob->mesh->tri_offset);
 		}
 		else
-			add_reference_mesh(ob->mesh, i);
+			geom_id = add_reference_mesh(ob->mesh, i);
 
 		i++;
 
@@ -119,41 +125,54 @@ void BVHEmbree::build(Progress& progress)
 	//root->deleteSubtree();
 }
 
-void BVHEmbree::add_reference_mesh(Mesh *mesh, int i)
+unsigned BVHEmbree::add_reference_mesh(Mesh *mesh, int i)
 {
+	unsigned geom_id = 0;
 	if(params.primitive_mask & PRIMITIVE_ALL_TRIANGLE) {
-		add_reference_triangles(mesh, i);
+		geom_id = add_reference_triangles(mesh, i);
 	}
-	if(params.primitive_mask & PRIMITIVE_ALL_CURVE) {
-		add_reference_curves(mesh, i);
+	if(params.primitive_mask & PRIMITIVE_ALL_CURVE && mesh->num_curves()) {
+		geom_id = add_reference_curves(mesh, i);
 	}
+//	assert(0);
+	return geom_id;
 }
 
-void BVHEmbree::add_reference_object(Object *ob, int i)
+unsigned BVHEmbree::add_reference_object(Object *ob, int i)
 {
 	if(!ob || !ob->mesh) {
-		return;
+		assert(0);
+		return 0;
 	}
 	BVHEmbree *instance_bvh = (BVHEmbree*)(ob->mesh->bvh);
-	unsigned geom_id = rtcNewInstance2(scene, instance_bvh->scene);
-	rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->tfm);
 
-	size_t start = 0;
-	if(i > 0) {
-		start = pack.object_node[i-1];
-	}
-	if(i < pack.object_node.size()) {
-		pack.object_node[i] = start;
+	const size_t num_motion_steps = ob->use_motion ? 3 : 1;
+	unsigned geom_id = rtcNewInstance2(scene, instance_bvh->scene, num_motion_steps);
+
+	if(ob->use_motion) {
+		rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->motion.pre, 0);
+		rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->tfm, 1);
+		rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->motion.post, 2);
+	} else {
+		rtcSetTransform2(scene, geom_id, RTC_MATRIX_ROW_MAJOR, (const float*)&ob->tfm);
 	}
+
+	return geom_id;
 }
 
-void BVHEmbree::add_reference_triangles(Mesh *mesh, int i)
+unsigned BVHEmbree::add_reference_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);
 		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_triangles = mesh->num_triangles();
@@ -162,9 +181,12 @@ void BVHEmbree::add_reference_triangles(Mesh *mesh, int i)
 						RTC_GEOMETRY_DEFORMABLE,
 						num_triangles,
 						num_verts,
-						num_motion_steps,
-						i);
+						num_motion_steps);
 
+#if 0
+	// 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);
 	unsigned *rtc_indices = (unsigned*) raw_buffer;
 	for(size_t j = 0; j < num_triangles; j++) {
@@ -174,8 +196,8 @@ void BVHEmbree::add_reference_triangles(Mesh *mesh, int i)
 		rtc_indices[j*3+2] = t.v[2];
 	}
 	rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
+#endif
 
-	int t_mid = (num_motion_steps - 1) / 2;
 	for(int t = 0; t < num_motion_steps; t++) {
 		RTCBufferType buffer_type = (RTCBufferType)(RTC_VERTEX_BUFFER+t);
 		const float3 *verts;
@@ -185,6 +207,9 @@ void BVHEmbree::add_reference_triangles(Mesh *mesh, int i)
 			int t_ = (t > t_mid) ? (t - 1) : t;
 			verts = &attr_mP->data_float3()[t_ * num_verts];
 		}
+#if 0
+		rtcSetBuffer(scene, geom_id, buffer_type, verts, 0, sizeof(float3));
+#else
 		raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
 		float *rtc_verts = (float*) raw_buffer;
 		for(size_t j = 0; j < num_verts; j++) {
@@ -195,53 +220,116 @@ void BVHEmbree::add_reference_triangles(Mesh *mesh, int i)
 			rtc_verts += 4;
 		}
 		rtcUnmapBuffer(scene, geom_id, buffer_type);
+#endif
 	}
 
-	size_t start = 0;
-	if(i > 0) {
-		start = pack.object_node[i-1];
-	}
-	if(i < pack.object_node.size()) {
-		pack.object_node[i] = start + num_triangles;
-	}
-
-	pack.prim_object.resize(pack.prim_object.size() + num_triangles);
-	pack.prim_type.resize(pack.prim_type.size() + num_triangles);
-	pack.prim_index.resize(pack.prim_index.size() + num_triangles);
-	pack.prim_tri_index.resize(pack.prim_index.size() + num_triangles);
+	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[start + j] = geom_id;
-		pack.prim_type[start + j] = PRIMITIVE_TRIANGLE;
-		pack.prim_index[start + j] = j;
-		pack.prim_tri_index[start + j] = j;
+		pack.prim_object.push_back_reserved(i);
+		pack.prim_type.push_back_reserved(PRIMITIVE_TRIANGLE);
+		pack.prim_index.push_back_reserved(j);
+		pack.prim_tri_index.push_back_reserved(j);
 	}
+
+	return geom_id;
 }
 
-void BVHEmbree::add_reference_curves(Mesh *mesh, int i)
+unsigned BVHEmbree::add_reference_curves(Mesh *mesh, int i)
 {
-	// TODO Stefan
+	const Attribute *attr_mP = NULL;
+	size_t num_motion_steps = 1;
+	if(mesh->has_motion_blur()) {
+		attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+		num_motion_steps = mesh->motion_steps;
+	}
+
+	const size_t num_curves = mesh->num_curves();
+	size_t num_segments = 0;
+	for(size_t j = 0; j < num_curves; j++) {
+		Mesh::Curve c = mesh->get_curve(j);
+		num_segments += c.num_segments();
+	}
+	const size_t num_keys = mesh->curve_keys.size();
+	unsigned geom_id = rtcNewBezierHairGeometry2(scene,
+												 RTC_GEOMETRY_DEFORMABLE,
+												 num_curves,
+												 num_keys,
+												 num_motion_steps);
+
+	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);
+				rtc_indices[rtc_index] = max(c.first_key - 1,c.first_key);
+				rtc_index++;
+	}
+	rtcUnmapBuffer(scene, geom_id, RTC_INDEX_BUFFER);
+
+	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];
+		}
+		raw_buffer = rtcMapBuffer(scene, geom_id, buffer_type);
+		float *rtc_verts = (float*) raw_buffer;
+		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;
+		}
+		rtcUnmapBuffer(scene, geom_id, buffer_type);
+	}
+
+	pack.prim_object.reserve(pack.prim_object.size() + num_curves);
+	pack.prim_type.reserve(pack.prim_type.size() + num_curves);
+	pack.prim_index.reserve(pack.prim_index.size() + num_curves);
+	pack.prim_tri_index.reserve(pack.prim_index.size() + num_curves);
+	for(size_t j = 0; j < num_curves; j++) {
+		pack.prim_object.push_back_reserved(i);
+		pack.prim_type.push_back_reserved(PRIMITIVE_CURVE);
+		pack.prim_index.push_back_reserved(j);
+		pack.prim_tri_index.push_back_reserved(j);
+	}
+	
+	return geom_id;
 }
 
 void BVHEmbree::pack_nodes(const BVHNode *root)
 {
-	if(params.top_level) {
-		for(size_t i = 0; i < pack.prim_index.size(); i++) {
-			if(pack.prim_index[i] != -1) {
-				if(pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
-					pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset;
-				else
-					pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
-			}
+	if(!params.top_level) {
+		return;
+	}
+
+	for(size_t i = 0; i < pack.prim_index.size(); i++) {
+		if(pack.prim_index[i] != -1) {
+			if(pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
+				pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset;
+			else
+				pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
 		}
 	}
 
+	size_t prim_offset = pack.prim_index.size();
+
 	/* reserve */
 	size_t prim_index_size = pack.prim_index.size();
 	size_t prim_tri_verts_size = pack.prim_tri_verts.size();
 
-//	size_t pack_prim_index_offset = prim_index_size;
-//	size_t pack_prim_tri_verts_offset = prim_tri_verts_size;
-//	size_t object_offset = 0;
+	size_t pack_prim_index_offset = prim_index_size;
+	size_t pack_prim_tri_verts_offset = prim_tri_verts_size;
+	size_t object_offset = 0;
 
 	map<Mesh*, int> mesh_map;
 
@@ -260,8 +348,96 @@ void BVHEmbree::pack_nodes(const BVHNode *root)
 
 	mesh_map.clear();
 
+	pack.prim_index.resize(prim_index_size);
+	pack.prim_type.resize(prim_index_size);
+	pack.prim_object.resize(prim_index_size);
+	pack.prim_visibility.resize(prim_index_size);
+	pac

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list