//----------------------------------------------------------------------------- void RayIntersector::intersectGeometry(Actor* act, Geometry* geom) { ArrayAbstract* posarr = geom->vertexArray() ? geom->vertexArray() : geom->vertexAttribArray(vl::VA_Position) ? geom->vertexAttribArray(vl::VA_Position)->data() : NULL; if (posarr) { fmat4 matrix = act->transform() ? (fmat4)act->transform()->worldMatrix() : fmat4(); for(int i=0; i<geom->drawCalls()->size(); ++i) { DrawCall* prim = geom->drawCalls()->at(i); int itri = 0; for(TriangleIterator trit = prim->triangleIterator(); trit.hasNext(); trit.next(), ++itri) { int ia = trit.a(); int ib = trit.b(); int ic = trit.c(); fvec3 a = posarr->getAsVec3(ia); fvec3 b = posarr->getAsVec3(ib); fvec3 c = posarr->getAsVec3(ic); if (act->transform()) { a = matrix * a; b = matrix * b; c = matrix * c; } intersectTriangle(a, b, c, ia, ib, ic, act, geom, prim, itri); } } } }
/** Counts the number of virtual triangles of a DrawCall., i.e. the number of triangles you would retrieve by iterating over the iterator returned by triangleIterator(). */ u32 countTriangles() const { u32 count = 0; for( TriangleIterator it = triangleIterator(); it.hasNext(); it.next() ) ++count; return count; }