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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs