[Bf-blender-cvs] [1480ef3107a] soc-2019-embree-gpu: Add support for Triangle4i and InstancedPrimitive

MATILLAT Quentin noreply at git.blender.org
Thu Jul 4 13:15:42 CEST 2019


Commit: 1480ef3107accb19827d3bbfe41f92c93c07c5ea
Author: MATILLAT Quentin
Date:   Thu Jul 4 13:15:05 2019 +0200
Branches: soc-2019-embree-gpu
https://developer.blender.org/rB1480ef3107accb19827d3bbfe41f92c93c07c5ea

Add support for Triangle4i and InstancedPrimitive

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

M	intern/cycles/bvh/bvh_embree.cpp
M	intern/cycles/bvh/bvh_embree_converter.cpp
M	intern/cycles/bvh/bvh_embree_converter.h
M	intern/cycles/render/object.h
M	release/scripts/addons
M	release/scripts/addons_contrib

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

diff --git a/intern/cycles/bvh/bvh_embree.cpp b/intern/cycles/bvh/bvh_embree.cpp
index 9e6f6a07294..2fb216ad88c 100644
--- a/intern/cycles/bvh/bvh_embree.cpp
+++ b/intern/cycles/bvh/bvh_embree.cpp
@@ -527,6 +527,8 @@ void BVHEmbree::add_instance(Object *ob, int i)
     assert(0);
     return;
   }
+  ob->pack_index = pack.prim_index.size();
+
   BVHEmbree *instance_bvh = (BVHEmbree *)(ob->mesh->bvh);
 
   if (instance_bvh->top_level != this) {
diff --git a/intern/cycles/bvh/bvh_embree_converter.cpp b/intern/cycles/bvh/bvh_embree_converter.cpp
index 567390b3f7c..77dbcdc6747 100644
--- a/intern/cycles/bvh/bvh_embree_converter.cpp
+++ b/intern/cycles/bvh/bvh_embree_converter.cpp
@@ -40,8 +40,8 @@ struct RangeInput {
 
 std::stack<LeafNode*> groupByRange(std::vector<RangeInput> &ids) {
     std::sort(ids.begin(), ids.end(), [](const RangeInput &lhs, const RangeInput &rhs) -> bool {
-		    return lhs.id > rhs.id;
-		    });
+        return lhs.id > rhs.id;
+    });
     std::stack<LeafNode*> groups;
 
     for(const RangeInput &r : ids) {
@@ -68,10 +68,17 @@ ccl::BoundBox RTCBoundBoxToCCL(const embree::BBox3fa &bound) {
 }
 
 BVHNode *bvh_shrink(BVHNode *root) {
-    if(root->num_children() <= 2) return root;
+    if(root->is_leaf()) return root;
 
     InnerNode *node = dynamic_cast<InnerNode*>(root);
 
+    if(node->num_children() == 1) return bvh_shrink(root->get_child(0));
+    if(node->num_children() <= 2) {
+        node->children[0] = bvh_shrink(node->children[0]);
+        node->children[1] = bvh_shrink(node->children[1]);
+        return node;
+    }
+
     node->children[0] = new InnerNode(merge(node->children[0]->bounds, node->children[1]->bounds), bvh_shrink(node->children[0]), bvh_shrink(node->children[1]));
     if(root->num_children() == 3) {
         node->children[1] = bvh_shrink(node->children[2]);
@@ -88,39 +95,61 @@ BVHEmbreeConverter::BVHEmbreeConverter(RTCScene scene, std::vector<Object *> obj
       params(params) {}
 
 
-template<>
-std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::Triangle4v>(const embree::BVH4::NodeRef &node, const BoundBox &) {
-        size_t nb;
-        embree::Triangle4v *prims = reinterpret_cast<embree::Triangle4v *>(node.leaf(nb));
-        std::vector<RangeInput> ids; ids.reserve(nb * 4);
+template<typename Primitive>
+std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf(const embree::BVH4::NodeRef &node, const BoundBox &) {
+    size_t nb;
+    Primitive *prims = reinterpret_cast<Primitive *>(node.leaf(nb));
+    std::vector<RangeInput> ids; ids.reserve(nb * 4);
+
+    for(size_t i = 0; i < nb; i++) {
+        for(size_t j = 0; j < prims[i].size(); j++) {
+            const auto geom_id = prims[i].geomID(j);
+            const auto prim_id = prims[i].primID(j);
 
-        for(size_t i = 0; i < nb; i++) {
-            for(size_t j = 0; j < prims[i].size(); j++) {
-                const auto geom_id = prims[i].geomID(j);
-                const auto prim_id = prims[i].primID(j);
+            embree::Geometry *g = s->get(geom_id);
 
-                embree::Geometry *g = s->get(geom_id);
+            size_t prim_offset = reinterpret_cast<size_t>(g->getUserData());
 
-                size_t prim_offset = reinterpret_cast<size_t>(g->getUserData());
+            Object *obj = this->objects.at(geom_id / 2);
+            Mesh *m = obj->mesh;
+            BoundBox bb = BoundBox::empty;
 
-                Object *obj = this->objects.at(geom_id / 2);
-                Mesh *m = obj->mesh;
-                BoundBox bb = BoundBox::empty;//obj->bounds;
-                m->get_triangle(prim_id).bounds_grow(m->verts.data(), bb);
+            const Mesh::Triangle t = m->get_triangle(prim_id);
+            const float3 *mesh_verts = m->verts.data();
+            const float3 *mesh_vert_steps = nullptr;
+            size_t motion_steps = 1;
 
-                ids.push_back(RangeInput(prim_offset + prim_id, objects.at(geom_id / 2)->visibility, bb));
+            if (m->has_motion_blur()) {
+                const Attribute *attr_motion_vertex = m->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+                if (attr_motion_vertex) {
+                    mesh_vert_steps = attr_motion_vertex->data_float3();
+                    motion_steps = m->motion_steps;
+                }
             }
-        }
 
-        std::stack<LeafNode *> leafs = groupByRange(ids);
-        std::deque<BVHNode *> nodes;
+            for (uint step = 0; step < motion_steps; ++step) {
+                float3 verts[3];
+                t.verts_for_step(mesh_verts, mesh_vert_steps, m->num_triangles(), motion_steps, step, verts);
+
+
+              for (int i = 0; i < 3; i++) {
+                  bb.grow(verts[i]);
+              }
+            }
 
-        while(!leafs.empty()) {
-            nodes.push_back(leafs.top());
-            leafs.pop();
+            ids.push_back(RangeInput(prim_offset + prim_id, obj->visibility, bb));
         }
+    }
 
-        return nodes;
+    std::stack<LeafNode *> leafs = groupByRange(ids);
+    std::deque<BVHNode *> nodes;
+
+    while(!leafs.empty()) {
+        nodes.push_back(leafs.top());
+        leafs.pop();
+    }
+
+    return nodes;
 }
 
 template<>
@@ -131,10 +160,10 @@ std::deque<BVHNode*> BVHEmbreeConverter::handleLeaf<embree::InstancePrimitive>(c
     std::stack<LeafNode *> leafs;
 
     for(size_t i = 0; i < nb; i++) {
-        uint id = prims[i].instance->geomID;
+        uint id = prims[i].instance->geomID / 2;
         Object *obj = objects.at(id);
         // Better solution, but crash -> RTCBoundBoxToCCL(prims[i].instance->bounds(0));
-        LeafNode *leafNode = new LeafNode(obj->bounds, obj->visibility, id, id + 1);
+        LeafNode *leafNode = new LeafNode(obj->bounds, obj->visibility, obj->pack_index, obj->pack_index + 1);
         leafs.push(leafNode);
     }
 
@@ -181,20 +210,64 @@ BVHNode* BVHEmbreeConverter::nodeEmbreeToCcl(embree::BVH4::NodeRef node, ccl::Bo
         if(node.isAlignedNode()) {
             embree::BVH4::AlignedNode *anode = node.alignedNode();
 
-	    int nb = 0;
+            int nb = 0;
             BVHNode *children[4];
             for(uint i = 0; i < 4; i++) {
                 BVHNode *child = this->nodeEmbreeToCcl<Primitive>(anode->children[i], RTCBoundBoxToCCL(anode->bounds(i)));
-		if(child != nullptr)
+                if(child != nullptr)
                     children[nb++] = child;
             }
 
+            ret = new InnerNode(
+                        bb,
+                        children,
+                        nb);
+        } else if(node.isAlignedNodeMB()) {
+            embree::BVH4::AlignedNodeMB *anode = node.alignedNodeMB();
+
+            int nb = 0;
+            BVHNode *children[4];
+            for(uint i = 0; i < 4; i++) {
+                BVHNode *child = this->nodeEmbreeToCcl<Primitive>(anode->children[i], RTCBoundBoxToCCL(anode->bounds(i)));
+                if(child != nullptr) {
+                    children[nb++] = child;
+                }
+            }
+
+            ret = new InnerNode(
+                        bb,
+                        children,
+                        nb);
+        } else if (node.isUnalignedNode()) {
+            std::cout << "[EMBREE - BVH] Node type is unaligned" << std::endl;
+        } else if (node.isUnalignedNodeMB()) {
+            std::cout << "[EMBREE - BVH] Node type is unaligned MB" << std::endl;
+        } else if (node.isBarrier()) {
+            std::cout << "[EMBREE - BVH] Node type is barrier ??" << std::endl;
+        } else if (node.isQuantizedNode()) {
+            std::cout << "[EMBREE - BVH] Node type is Quantized node !" << std::endl;
+        } else if (node.isAlignedNodeMB4D()) {
+            // He is an aligned node MB
+            embree::BVH4::AlignedNodeMB4D *anode = node.alignedNodeMB4D();
+
+            int nb = 0;
+            BVHNode *children[4];
+            for(uint i = 0; i < 4; i++) {
+                BVHNode *child = this->nodeEmbreeToCcl<Primitive>(anode->children[i], RTCBoundBoxToCCL(anode->bounds(i)));
+                if(child != nullptr) {
+                    embree::BBox1f timeRange = anode->timeRange(i);
+                    child->time_from = timeRange.lower;
+                    child->time_to = timeRange.upper;
+                    children[nb++] = child;
+                }
+            }
+
             ret = new InnerNode(
                         bb,
                         children,
                         nb);
         } else {
-            std::cout << "Unknown node" << std::endl;
+            std::cout << "[EMBREE - BVH] Node type is unknown -> " << node.type() << std::endl;
         }
 
         return ret;
@@ -213,23 +286,25 @@ BVHNode* BVHEmbreeConverter::getBVH4() {
             embree::BVH4 *bvh = dynamic_cast<embree::BVHN<4> *>(ad);
             std::cout << "Prim type -> " << bvh->primTy->name() << std::endl;
 
+            embree::BVH4::NodeRef root = bvh->root;
+            BVHNode *rootNode = nullptr;
             if(bvh->primTy == &embree::Triangle4v::type) {
-                embree::BVH4::NodeRef root = bvh->root;
-                BVHNode *rootNode = this->nodeEmbreeToCcl<embree::Triangle4v>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()));
-                bb.grow(rootNode->bounds);
-                nodes.push_back(rootNode);
+                rootNode = this->nodeEmbreeToCcl<embree::Triangle4v>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()));
             } else if(bvh->primTy == &embree::InstancePrimitive::type) {
-                embree::BVH4::NodeRef root = bvh->root;
-                BVHNode *rootNode = nodeEmbreeToCcl<embree::InstancePrimitive>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()));
-                bb.grow(rootNode->bounds);
-                nodes.push_back(rootNode);
+                rootNode = nodeEmbreeToCcl<embree::InstancePrimitive>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()));
+            } else if(bvh->primTy == &embree::Triangle4i::type) {
+                rootNode = nodeEmbreeToCcl<embree::Triangle4i>(root, RTCBoundBoxToCCL(bvh->bounds.bounds()));
             } else {
-
+                std::cout << "[EMBREE - BVH] Unknown primitive type " << bvh->primTy->name() << std::endl;
             }
 
+      

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list