[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 ¶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. @@
More information about the Bf-blender-cvs
mailing list