bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool StopAtFirstHit, uint32 ph_mask) const { if (!(phasemask & ph_mask) || !owner->isSpawned()) return false; float time = ray.intersectionTime(iBound); if (time == G3D::inf()) return false; // child bounds are defined in object space: Vector3 p = iInvRot * (ray.origin() - iPos) * iInvScale; Ray modRay(p, iInvRot * ray.direction()); float distance = MaxDist * iInvScale; bool hit = iModel->IntersectRay(modRay, distance, StopAtFirstHit); if (hit) { distance *= iScale; MaxDist = distance; } return hit; }
bool ModelInstance::intersectRay(const G3D::Ray& pRay, float& pMaxDist, bool pStopAtFirstHit) const { if (!iModel) return false; float time = pRay.intersectionTime(iBound); if (time == G3D::inf()) return false; // child bounds are defined in object space: Vector3 p = iInvRot * (pRay.origin() - iPos) * iInvScale; Ray modRay(p, iInvRot * pRay.direction()); float distance = pMaxDist * iInvScale; bool hit = iModel->IntersectRay(modRay, distance, pStopAtFirstHit); if (hit) { distance *= iScale; pMaxDist = distance; } return hit; }
bool GameObjectModel::intersectRay(G3D::Ray const& ray, float& maxDist, bool stopAtFirstHit, PhaseShift const& phaseShift, VMAP::ModelIgnoreFlags ignoreFlags) const { if (!isCollisionEnabled() || !owner->IsSpawned()) return false; if (!owner->IsInPhase(phaseShift)) return false; float time = ray.intersectionTime(iBound); if (time == G3D::finf()) return false; // child bounds are defined in object space: Vector3 p = iInvRot * (ray.origin() - iPos) * iInvScale; Ray modRay(p, iInvRot * ray.direction()); float distance = maxDist * iInvScale; bool hit = iModel->IntersectRay(modRay, distance, stopAtFirstHit, ignoreFlags); if (hit) { distance *= iScale; maxDist = distance; } return hit; }