Exemple #1
0
    public bool SphereCast(
        RayStep step,
        float radius,
        LayerMask[] prioritizedLayerMasks,
        bool focusIndividualCompoundCollider,
        out MixedRealityRaycastHit hitInfo)
    {
        // For now, this is just using the default behavior for sphere cast.
        // Leaving MapRenderer integration for a future change.

        var result =
            MixedRealityRaycaster.RaycastSpherePhysicsStep(
                step,
                radius,
                step.Length,
                prioritizedLayerMasks,
                focusIndividualCompoundCollider,
                out RaycastHit physicsHit);

        hitInfo = new MixedRealityRaycastHit(result, physicsHit);
        return(result);
    }
Exemple #2
0
    public bool Raycast(
        RayStep step,
        LayerMask[] prioritizedLayerMasks,
        bool focusIndividualCompoundCollider,
        out MixedRealityRaycastHit hitInfo)
    {
        var hasPhysicsHit =
            MixedRealityRaycaster.RaycastSimplePhysicsStep(
                step,
                prioritizedLayerMasks,
                focusIndividualCompoundCollider,
                out RaycastHit physicsHit);

        MapRendererRaycastHit?closestMapHitInfo  = null;
        MapRenderer           closestMapRenderer = null;

        foreach (var mapRenderer in _mapRenderers)
        {
            if (
                mapRenderer.Raycast(
                    step,
                    out var mapHitInfo,
                    hasPhysicsHit ? physicsHit.distance : step.Length))
            {
                if (hasPhysicsHit)
                {
                    if (physicsHit.distance > mapHitInfo.Distance)
                    {
                        if (!closestMapHitInfo.HasValue || closestMapHitInfo.Value.Distance > mapHitInfo.Distance)
                        {
                            closestMapRenderer = mapRenderer;
                            closestMapHitInfo  = mapHitInfo;
                        }
                    }
                }
                else
                {
                    if (!closestMapHitInfo.HasValue || closestMapHitInfo.Value.Distance > mapHitInfo.Distance)
                    {
                        closestMapRenderer = mapRenderer;
                        closestMapHitInfo  = mapHitInfo;
                    }
                }
            }
        }

        if (closestMapHitInfo != null)
        {
            hitInfo = new MixedRealityRaycastHit();
            var mapRendererHitInfo = closestMapHitInfo.Value;
            hitInfo.distance  = mapRendererHitInfo.Distance;
            hitInfo.point     = mapRendererHitInfo.Point;
            hitInfo.normal    = mapRendererHitInfo.Normal;
            hitInfo.transform = closestMapRenderer.transform;
            return(true);
        }
        else
        {
            hitInfo = new MixedRealityRaycastHit(hasPhysicsHit, physicsHit);
            return(hasPhysicsHit);
        }
    }