void Scene::traceRay(PhysicalRay *ray) { Point3D *point = 0, *minpoint = 0; Virtual3DObject *nearestObj = 0; double mindist = 0; // Searching for nearest collision with any object Q_FOREACH(Virtual3DObject* obj, m_objects) { point = NULL; PictureObject* picobj = dynamic_cast<PictureObject*>(obj); if (picobj) point = picobj->intercrossWithRay(*ray); LensObject* lensobj = dynamic_cast<LensObject*>(obj); if (lensobj) point = lensobj->intercrossWithRay(*ray); ThinLensObject* thinlensobj = dynamic_cast<ThinLensObject*>(obj); if (thinlensobj) point = thinlensobj->intercrossWithRay(*ray); FlatMirrorObject* flatmirrorobj = dynamic_cast<FlatMirrorObject*>(obj); if (flatmirrorobj) point = flatmirrorobj->intercrossWithRay(*ray); if (point != NULL) { double dist = point->dist(ray->point()); if ((dist > 1e-5) && ((minpoint == NULL) || (dist < mindist))) { if (minpoint != NULL) delete minpoint; minpoint = point; mindist = dist; nearestObj = obj; } else delete point; } }