Segments CSGNode::intersectLocal(const ray& r) const{ Segments ret; if (isLeaf){ SegmentPoint pNear, pFar; isect i; ray backR(r.at(-10000), r.getDirection()); if(!item->intersect(backR, i))return ret; pNear.t = i.t - 10000; pNear.normal = i.N; pNear.isRight = false; ray contiR(r.at(pNear.t+RAY_EPSILON*10),r.getDirection()); if (!item->intersect(contiR, i))pFar = pNear; else { pFar.t = i.t + pNear.t; pFar.normal = i.N; } pFar.isRight = true; ret.addPoint(pNear); ret.addPoint(pFar); return ret; } else { if (!lchild || !rchild)return ret; Segments leftSeg, rightSeg; leftSeg = lchild->intersectLocal(r); rightSeg = rchild->intersectLocal(r); leftSeg.Merge(rightSeg,relation); return leftSeg; } }