[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