[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