[Bf-blender-cvs] [e0cc40f93c6] soc-2019-embree-gpu: Move most of the export code to Embree

MATILLAT Quentin noreply at git.blender.org
Fri Aug 2 18:52:11 CEST 2019


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 &params)
-    : 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. @@



More information about the Bf-blender-cvs mailing list