void COctreeTriangleSelector::getTrianglesFromOctree( SOctreeNode* node, s32& trianglesWritten, s32 maximumSize, const core::aabbox3d<f32>& box, const core::matrix4* mat, core::triangle3df* triangles) const { if (!box.intersectsWithBox(node->Box)) return; const u32 cnt = node->Triangles.size(); for (u32 i=0; i<cnt; ++i) { const core::triangle3df& srcTri = node->Triangles[i]; // This isn't an accurate test, but it's fast, and the // API contract doesn't guarantee complete accuracy. if (srcTri.isTotalOutsideBox(box)) continue; core::triangle3df& dstTri = triangles[trianglesWritten]; mat->transformVect(dstTri.pointA, srcTri.pointA ); mat->transformVect(dstTri.pointB, srcTri.pointB ); mat->transformVect(dstTri.pointC, srcTri.pointC ); ++trianglesWritten; // Halt when the out array is full. if (trianglesWritten == maximumSize) return; } for (u32 i=0; i<8; ++i) if (node->Child[i]) getTrianglesFromOctree(node->Child[i], trianglesWritten, maximumSize, box, mat, triangles); }
void COctTreeTriangleSelector::getTrianglesFromOctTree( SOctTreeNode* node, s32& trianglesWritten, s32 maximumSize, const core::aabbox3d<f32>& box, const core::matrix4* mat, core::triangle3df* triangles) const { if (!box.intersectsWithBox(node->Box)) return; s32 cnt = node->Triangles.size(); if (cnt + trianglesWritten > maximumSize) cnt -= cnt + trianglesWritten - maximumSize; s32 i; for (i=0; i<cnt; ++i) { triangles[trianglesWritten] = node->Triangles[i]; mat->transformVect(triangles[trianglesWritten].pointA); mat->transformVect(triangles[trianglesWritten].pointB); mat->transformVect(triangles[trianglesWritten].pointC); ++trianglesWritten; } for (i=0; i<8; ++i) if (node->Child[i]) getTrianglesFromOctTree(node->Child[i], trianglesWritten, maximumSize, box, mat, triangles); }