Commit e18cd079 authored by hybrid's avatar hybrid

Another improvement from the selector patch

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3982 dfc29bdd-3216-0410-991c-e03cc46cb475
parent b961a769
...@@ -113,24 +113,19 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, ...@@ -113,24 +113,19 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles,
const core::aabbox3d<f32>& box, const core::aabbox3d<f32>& box,
const core::matrix4* transform) const const core::matrix4* transform) const
{ {
core::matrix4 mat ( core::matrix4::EM4CONST_NOTHING ); core::matrix4 mat(core::matrix4::EM4CONST_NOTHING);
core::aabbox3d<f32> invbox = box; core::aabbox3d<f32> invbox = box;
if (SceneNode) if (SceneNode)
{ {
SceneNode->getAbsoluteTransformation().getInverse ( mat ); SceneNode->getAbsoluteTransformation().getInverse(mat);
mat.transformBoxEx(invbox); mat.transformBoxEx(invbox);
} }
if (transform) if (transform)
{
mat = *transform; mat = *transform;
}
else else
{
mat.makeIdentity(); mat.makeIdentity();
}
if (SceneNode) if (SceneNode)
mat *= SceneNode->getAbsoluteTransformation(); mat *= SceneNode->getAbsoluteTransformation();
...@@ -153,21 +148,28 @@ void COctreeTriangleSelector::getTrianglesFromOctree( ...@@ -153,21 +148,28 @@ void COctreeTriangleSelector::getTrianglesFromOctree(
if (!box.intersectsWithBox(node->Box)) if (!box.intersectsWithBox(node->Box))
return; return;
s32 cnt = node->Triangles.size(); const u32 cnt = node->Triangles.size();
if (cnt + trianglesWritten > maximumSize)
cnt -= cnt + trianglesWritten - maximumSize;
s32 i;
for (i=0; i<cnt; ++i) for (u32 i=0; i<cnt; ++i)
{ {
mat->transformVect(triangles[trianglesWritten].pointA, node->Triangles[i].pointA ); const core::triangle3df& srcTri = node->Triangles[i];
mat->transformVect(triangles[trianglesWritten].pointB, node->Triangles[i].pointB ); // This isn't an accurate test, but it's fast, and the
mat->transformVect(triangles[trianglesWritten].pointC, node->Triangles[i].pointC ); // 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; ++trianglesWritten;
// Halt when the out array is full.
if (trianglesWritten == maximumSize)
return;
} }
for (i=0; i<8; ++i) for (u32 i=0; i<8; ++i)
if (node->Child[i]) if (node->Child[i])
getTrianglesFromOctree(node->Child[i], trianglesWritten, getTrianglesFromOctree(node->Child[i], trianglesWritten,
maximumSize, box, mat, triangles); maximumSize, box, mat, triangles);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment