protected virtual void AdjustForEarlyCollisions(Vector3 jointPosition, Vector3 downPosition) { Vector3 newDownPosition = downPosition; Vector3 newJointPosition = jointPosition; // Debug.Log("Exit1"); if (collisionCheckFrequency > 0 && actualTracer != null) { collisionCheckFrequency = Mathf.Clamp(collisionCheckFrequency, 0, tracerDensity); Vector3[] beamPoints = new Vector3[] { GetOrigin().position, jointPosition + new Vector3(0f, curveOffset, 0f), downPosition, downPosition, }; Vector3[] checkPoints = actualTracer.GetPoints(beamPoints); int checkFrequency = tracerDensity / collisionCheckFrequency; for (int i = 0; i < tracerDensity - checkFrequency; i += checkFrequency) { Vector3 currentPoint = checkPoints[i]; Vector3 nextPoint = (i + checkFrequency < checkPoints.Length ? checkPoints[i + checkFrequency] : checkPoints[checkPoints.Length - 1]); Vector3 nextPointDirection = (nextPoint - currentPoint).normalized; float nextPointDistance = Vector3.Distance(currentPoint, nextPoint); Ray checkCollisionRay = new Ray(currentPoint, nextPointDirection); RaycastHit checkCollisionHit; #pragma warning disable 0618 if (VRTK_CustomRaycast.Raycast(customRaycast, checkCollisionRay, out checkCollisionHit, layersToIgnore, nextPointDistance)) #pragma warning restore 0618 { Vector3 collisionPoint = checkCollisionRay.GetPoint(checkCollisionHit.distance); Ray downwardCheckRay = new Ray(collisionPoint + (Vector3.up * 0.01f), Vector3.down); RaycastHit downwardCheckHit; #pragma warning disable 0618 if (VRTK_CustomRaycast.Raycast(customRaycast, downwardCheckRay, out downwardCheckHit, layersToIgnore, float.PositiveInfinity)) #pragma warning restore 0618 { destinationHit = downwardCheckHit; newDownPosition = downwardCheckRay.GetPoint(downwardCheckHit.distance);; newJointPosition = (newDownPosition.y < jointPosition.y ? new Vector3(newDownPosition.x, jointPosition.y, newDownPosition.z) : jointPosition); break; } } } } DisplayCurvedBeam(newJointPosition, newDownPosition); SetPointerCursor(); }
protected virtual void AdjustForEarlyCollisions(Vector3 jointPosition, Vector3 downPosition) { Vector3 newDownPosition = downPosition; Vector3 newJointPosition = jointPosition; if (collisionCheckFrequency > 0) { collisionCheckFrequency = Mathf.Clamp(collisionCheckFrequency, 0, tracerDensity); Vector3[] beamPoints = new Vector3[] { GetOrigin().position, jointPosition + new Vector3(0f, curveOffset, 0f), downPosition, downPosition, }; Vector3[] checkPoints = actualTracer.GetPoints(beamPoints); int checkFrequency = tracerDensity / collisionCheckFrequency; for (int i = 0; i < tracerDensity - checkFrequency; i += checkFrequency) { var currentPoint = checkPoints[i]; var nextPoint = (i + checkFrequency < checkPoints.Length ? checkPoints[i + checkFrequency] : checkPoints[checkPoints.Length - 1]); var nextPointDirection = (nextPoint - currentPoint).normalized; var nextPointDistance = Vector3.Distance(currentPoint, nextPoint); Ray checkCollisionRay = new Ray(currentPoint, nextPointDirection); RaycastHit checkCollisionHit; if (Physics.Raycast(checkCollisionRay, out checkCollisionHit, nextPointDistance, ~layersToIgnore)) { var collisionPoint = checkCollisionRay.GetPoint(checkCollisionHit.distance); Ray downwardCheckRay = new Ray(collisionPoint + (Vector3.up * 0.01f), Vector3.down); RaycastHit downwardCheckHit; if (Physics.Raycast(downwardCheckRay, out downwardCheckHit, float.PositiveInfinity, ~layersToIgnore)) { destinationHit = downwardCheckHit; newDownPosition = downwardCheckRay.GetPoint(downwardCheckHit.distance);; newJointPosition = (newDownPosition.y < jointPosition.y ? new Vector3(newDownPosition.x, jointPosition.y, newDownPosition.z) : jointPosition); break; } } } } DisplayCurvedBeam(newJointPosition, newDownPosition); SetPointerCursor(); }