//-----------------------------------------------------------------------------
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);
      }
    }
  }
}
Ejemplo n.º 2
0
 /** 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;
 }