Commit: e0cc40f93c64093fd6c42d8f9df1bb36280fe6f3 Author: MATILLAT Quentin Date: Fri Aug 2 18:49:45 2019 +0200 Branches: soc-2019-embree-gpu https://developer.blender.org/rBe0cc40f93c64093fd6c42d8f9df1bb36280fe6f3
Move most of the export code to Embree Need to be compiled with a modified version of Embree available on github: https://github.com/tinou98/embree =================================================================== M intern/cycles/bvh/bvh_embree_converter.cpp M intern/cycles/bvh/bvh_embree_converter.h =================================================================== diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp b/intern/cycles/bvh/bvh_embree_converter.cpp index e9e72aa1f6b..22a5ec11f06 100644 --- a/intern/cycles/bvh/bvh_embree_converter.cpp +++ b/intern/cycles/bvh/bvh_embree_converter.cpp @@ -44,16 +44,10 @@ void packPush(PackedBVH *pack, const size_t packIdx, const int object_id, const } -void pushVec(PackedBVH *pack, const embree::Vec3f p0, const embree::Vec3f p1, const embree::Vec3f p2) { - pack->prim_tri_verts.push_back_slow(make_float4(p0.x, p0.y, p0.z, 1)); - pack->prim_tri_verts.push_back_slow(make_float4(p1.x, p1.y, p1.z, 1)); - pack->prim_tri_verts.push_back_slow(make_float4(p2.x, p2.y, p2.z, 1)); -} - -ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa &bound) { +ccl::BoundBox RTCBoundBoxToCCL(const RTCBounds &bound) { return ccl::BoundBox( - make_float3(bound.lower.x, bound.lower.y, bound.lower.z), - make_float3(bound.upper.x, bound.upper.y, bound.upper.z)); + make_float3(bound.lower_x, bound.lower_y, bound.lower_z), + make_float3(bound.upper_x, bound.upper_y, bound.upper_z)); } @@ -110,275 +104,122 @@ BVHNode *bvh_shrink(BVHNode *root) { } BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, std::vector<Object *> objects, const BVHParams ¶ms) - : s(reinterpret_cast<embree::Scene *>(scene)), + : s(scene), objects(objects), params(params) {} -template<> -std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::Triangle4i>(const embree::BVH4::NodeRef &node, const BoundBox &bb) { - size_t from = this->packIdx, - size = 0; - size_t nb; - embree::Triangle4i *prims = reinterpret_cast<embree::Triangle4i *>(node.leaf(nb)); +struct Data { + unsigned int packIdx = 0; + std::vector<Object *> object; + PackedBVH *pack; +}; + +BVHNode* createLeaf(unsigned int nbPrim, BVHPrimitive prims[], const RTCBounds &bounds, Data *userData) { + const BoundBox bb = RTCBoundBoxToCCL(bounds); + const unsigned int from = userData->packIdx; uint visibility = 0; - for(size_t i = 0; i < nb; i++) { - for(size_t j = 0; j < prims[i].size(); j++) { - size++; - const auto geom_id = prims[i].geomID(j); - const auto prim_id = prims[i].primID(j); - - const int object_id = geom_id / 2; - Object *obj = this->objects.at(object_id); - Mesh::Triangle tri = obj->mesh->get_triangle(prim_id); - - int prim_type = obj->mesh->has_motion_blur() ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE; - - visibility |= obj->visibility; - packPush(this->pack, this->packIdx++, object_id, prim_id, prim_type, obj->visibility, this->pack->prim_tri_verts.size()); - - /* - pushVec(this->pack, - prims[i].getVertex(prims[i].v0, j, this->s), - prims[i].getVertex(prims[i].v1, j, this->s), - prims[i].getVertex(prims[i].v2, j, this->s)); - */ - - this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[0]])); - this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[1]])); - this->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[2]])); - - /* - std::cout << "Vertex " << prim_id << " " - << prims[i].getVertex(prims[i].v0, j, this->s) << ", " - << prims[i].getVertex(prims[i].v1, j, this->s) << ", " - << prims[i].getVertex(prims[i].v2, j, this->s) << std::endl; - - std::cout << "VERTEX " << prim_id << " " - << "(" << obj->mesh->verts[tri.v[0]].x << ", " << obj->mesh->verts[tri.v[0]].y << ", " << obj->mesh->verts[tri.v[0]].z << "), " - << "(" << obj->mesh->verts[tri.v[1]].x << ", " << obj->mesh->verts[tri.v[1]].y << ", " << obj->mesh->verts[tri.v[1]].z << "), " - << "(" << obj->mesh->verts[tri.v[2]].x << ", " << obj->mesh->verts[tri.v[2]].y << ", " << obj->mesh->verts[tri.v[2]].z << ")" << std::endl; - - std::cout << "Indices " - << prims[i].v0[j] << ", " - << prims[i].v1[j] << ", " - << prims[i].v2[j] << " <=> " - << tri.v[0] << ", " - << tri.v[1] << ", " - << tri.v[2] << std::endl; - */ - } - } + for(unsigned int i = 0; i < nbPrim; i++) { + const auto geom_id = prims[i].geomID; + const auto prim_id = prims[i].primID; - return {new LeafNode(bb, visibility, from, from + size)}; -} + const unsigned int object_id = geom_id / 2; + Object *obj = userData->object.at(object_id); + Mesh::Triangle tri = obj->mesh->get_triangle(prim_id); -template<> -std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::Triangle4v>(const embree::BVH4::NodeRef &node, const BoundBox &bb) { - size_t from = this->packIdx, - size = 0; + int prim_type = obj->mesh->has_motion_blur() ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE; - size_t nb; - embree::Triangle4v *prims = reinterpret_cast<embree::Triangle4v *>(node.leaf(nb)); + visibility |= obj->visibility; + packPush(userData->pack, userData->packIdx++, object_id, prim_id, prim_type, obj->visibility, userData->pack->prim_tri_verts.size()); - uint visibility = 0; - for(size_t i = 0; i < nb; i++) { - for(size_t j = 0; j < prims[i].size(); j++) { - size++; - const auto geom_id = prims[i].geomID(j); - const auto prim_id = prims[i].primID(j); - - const int object_id = geom_id / 2; - Object *obj = this->objects.at(object_id); - - int prim_type = obj->mesh->has_motion_blur() ? PRIMITIVE_MOTION_TRIANGLE : PRIMITIVE_TRIANGLE; - - visibility |= obj->visibility; - packPush(this->pack, this->packIdx++, object_id, prim_id, prim_type, obj->visibility, this->pack->prim_tri_verts.size()); - - this->pack->prim_tri_verts.push_back_slow(make_float4( - prims[i].v0.x[j], - prims[i].v0.y[j], - prims[i].v0.z[j], - 1)); - this->pack->prim_tri_verts.push_back_slow(make_float4( - prims[i].v1.x[j], - prims[i].v1.y[j], - prims[i].v1.z[j], - 1)); - this->pack->prim_tri_verts.push_back_slow(make_float4( - prims[i].v2.x[j], - prims[i].v2.y[j], - prims[i].v2.z[j], - 1)); - } + userData->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[0]])); + userData->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[1]])); + userData->pack->prim_tri_verts.push_back_slow(float3_to_float4(obj->mesh->verts[tri.v[2]])); } - return {new LeafNode(bb, visibility, from, from + size)}; + return new LeafNode(bb, visibility, from, from + nbPrim); } -template<> -std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::InstancePrimitive>(const embree::BVH4::NodeRef &node, const BoundBox &) { - size_t nb; - embree::InstancePrimitive *prims = reinterpret_cast<embree::InstancePrimitive *>(node.leaf(nb)); +BVHNode* createInstance(int nbPrim, unsigned int geomID[], const RTCBounds &bounds, Data *userData) { + const BoundBox bb = RTCBoundBoxToCCL(bounds); + std::deque<BVHNode *> nodes; - std::deque<BVHNode *> leafs; + for(size_t i = 0; i < nbPrim; i++) { + uint id = geomID[i] / 2; + Object *obj = userData->object.at(id); + LeafNode *leafNode = new LeafNode(obj->bounds, obj->visibility, userData->packIdx, userData->packIdx + 1); - for(size_t i = 0; i < nb; i++) { - uint id = prims[i].instance->geomID / 2; - Object *obj = objects.at(id); - /* TODO Better solution, but crash - * BoundBox bb = RTCBoundBoxToCCL(prims[i].instance->bounds(0)); - */ - LeafNode *leafNode = new LeafNode(obj->bounds, obj->visibility, this->packIdx, this->packIdx + 1); - leafs.push_back(leafNode); + packPush(userData->pack, userData->packIdx++, id, -1, PRIMITIVE_NONE, obj->visibility, -1); - packPush(this->pack, this->packIdx++, id, -1, PRIMITIVE_NONE, obj->visibility, -1); + nodes.push_back(leafNode); } - return leafs; -} - -template<typename Primitive> -BVHNode* BVHEmbreeConverter::nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::BoundBox bb, ccl::BoundBox *t0bound, ccl::BoundBox *deltaBound) { - if(node.isLeaf()) { - BVHNode *ret = nullptr; - std::deque<BVHNode *> nodes = this->handleLeaf<Primitive>(node, bb); - - while(!nodes.empty()) { - if(ret == nullptr) { - ret = nodes.front(); - nodes.pop_front(); - continue; - } - /* If it's a leaf or a full node -> create a new parrent */ - if(ret->is_leaf() || ret->num_children() == 4) { - ret = new InnerNode(bb, &ret, 1); - } - - InnerNode *innerNode = dynamic_cast<InnerNode*>(ret); - innerNode->children[innerNode->num_children_++] = nodes.front(); - innerNode->bounds.grow(nodes.front()->bounds); + BVHNode *ret = nullptr; + while(!nodes.empty()) { + if(ret == nullptr) { + ret = nodes.front(); nodes.pop_front(); - - if(ret->num_children() == 4) { - nodes.p @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
