public void Cast(Vector3 dir, float angle, float dist) { Reset(); if (VSL.refT == null) { return; } //cast the rays var side = Vector3.Cross(VSL.Physics.Up, dir) * VSL.Geometry.R * 1.5f; var cast_dir = Quaternion.AngleAxis(angle, side) * dir; Valid |= L.Cast(VSL.Physics.wCoM - side, cast_dir, dist, VSL.Geometry.R); Valid |= C.Cast(VSL.Physics.wCoM, cast_dir, dist, VSL.Geometry.R); Valid |= R.Cast(VSL.Physics.wCoM + side, cast_dir, dist, VSL.Geometry.R); if (Valid) { L.ClaculateAltitude(dir, angle); C.ClaculateAltitude(dir, angle); R.ClaculateAltitude(dir, angle); Altitude = VSL.Altitude.Absolute - Mathf.Min(L.Altitude, C.Altitude, R.Altitude); Ray ray; if (L.Valid && !R.Valid) { ray = L; Maneuver = ManeuverType.Horizontal; } else if (!L.Valid && R.Valid) { ray = R; Maneuver = ManeuverType.Horizontal; } else if (C.Valid) { ray = C; Maneuver = ManeuverType.Vertical; } else if (L.Valid && R.Valid) { ray = R.Distance < L.Distance? R : L; Maneuver = ManeuverType.Vertical; } else { VSL.Log("Unknown ManevuerType of a Valid Sweep. This should never happen."); return; } Obstacle = new TerrainPoint(Altitude, ray.CollisionPoint); } }