I am trying to create a BVH tree structure to speed up raytracing. So far it has been fine. I have created the BVH tree. It works for 202 triangles/spheres.

However, when the scene has more spheres/triangles, I get a segmentation fault when the rays are traces, not when the tree is being built.

To let you understand, there is a Surface class, from which "BVHNode", "Sphere" and "Triangle" inherit.

I have written a small function that prints the BVH tree recursively. Here it is:

void printBVH(Surface root, int i = 0, string str = "")
{
        if( root is null )
                return;
        
        writeln("------PRINT()------");
        writeln("icy");//writeln(root.boundingBox());
        writeln("name = ", root.name, " depth = ", i, " [", str, "]");
        writeln("------~~~~~~~------\n");
        
        if( (cast(BVHNode)root) !is null ) // OOPS! SEG FAULT HERE
        {
                printBVH((cast(BVHNode)(root)).left, i+1, "left");
                printBVH((cast(BVHNode)(root)).right, i+1, "right");
        }
}

And I pass to printBVH() the root node that the function that builds the tree has returned.

// replaces every two Surfaces with one that is their parent. Proceeds until there is only one surface, which is the root. BVHNode createBVHTree2(Surface[] objects, ubyte axis = 0, int depth = 0)
{
        import std.algorithm, std.stdio;
        
        BVHNode root;
        
// sort left out for now until the seg fault is fixed
//sort!("(a.boundingBox().min.x + a.boundingBox().max.x) * 0.5f < (b.boundingBox().min.x + b.boundingBox().max.x) * 0.5f", SwapStrategy.unstable)(objects);
        
        while( objects.length > 1 )
        {
                writeln("--- Level ---");
                foreach(o; objects)
                        write("[", o.name, "] ");
                writeln();
                
                auto temp = new Surface[objects.length/2 + 1];
                auto sz = 0UL;
                
                for(auto i = 0UL; i < objects.length; i += 2)
                {
                        writeln("i = ", i, " sz = ", sz+1);
                        
                        BVHNode parent = new BVHNode();
                        parent.name = "p";
                        
                        parent.left = objects[i];
                        if( i + 1 < objects.length )
                        {       
                                parent.right = objects[i+1];
                        
auto box1 = objects[i].boundingBox(), box2 = objects[i+1].boundingBox();
                                parent.box = combine(box1, box2);
                        }
                        else
                        {
                                parent.right = null;
                                parent.box = objects[i].boundingBox();
                        }
                        
                        temp[sz++] = parent;
                }
                
                temp.length = sz;
                objects = temp;
        }
        
        root = cast(BVHNode)objects[0];
        
        return root;
}

Ok, so when I print the scene using printBVH(), I get a segfault in the line:
if( (cast(BVHNode)root) !is null )

GDB says: Program received signal SIGSEGV, Segmentation fault.
0x00000000004b55fc in _d_dynamic_cast ()

Note that I have written the createBVHTree() and printBVH() functions in Java to see if it would be different. The code works in Java. I guess something is wrong with the compiler here and the way it handles recursion(?) -- By the way the code seg faults at the 11 depth level. Are there any know bugs for this?

Thanks.

Reply via email to