Example #1
0
    private void LateUpdate()
    {
        for (int i = 0; i < m_LptTravellers.Count; i++)
        {
            PortalTraveller traveller        = m_LptTravellers[i];
            Transform       travTrans        = traveller.transform;
            Vector3         offsetFromPortal = travTrans.position - m_tTransform.position;
            int             portalSide       = (int)Mathf.Sign(Vector3.Dot(offsetFromPortal, m_tTransform.forward));
            int             portalSideOld    = (int)Mathf.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, m_tTransform.forward));

            if (portalSide != portalSideOld)
            {
                Matrix4x4 m = m_tTransform.localToWorldMatrix * m_tOtherPortal.worldToLocalMatrix
                              * m_tPlayerCamera.localToWorldMatrix;
                traveller.Teleport(m_tTransform, m_tOtherPortal, m.GetColumn(3), m.rotation);

                m_pLinkedPortal.OnTravellerEnterPortal(traveller);
                m_LptTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #2
0
    //////////////////////////////////////////////////////////////////////
    public void OnExitTrigger(Collider localCollider, Collider externalCollider)
    {
        PortalTraveller traveller = externalCollider.GetComponentInParent <PortalTraveller>();

        if (!traveller || traveller.TravellerCollider != externalCollider)
        {
            return;
        }

        if (localCollider == _physZoneA)
        {
            traveller.OnLeavePortalZone(this);
        }
        else if (localCollider == _physZoneB)
        {
            traveller.OnLeavePortalZone(this);
        }
        else if (localCollider == _portalZone)
        {
            if (_trackedTravellers.Contains(traveller))
            {
                traveller.OnExitPortal();
            }
        }
    }
Example #3
0
 //////////////////////////////////////////////////////////////////////
 public void OnTravellerApprochingPortal(PortalTraveller traveller)
 {
     if (!_trackedTravellers.Contains(traveller))
     {
         _trackedTravellers.Add(traveller);
     }
 }
Example #4
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            var             m          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));
            // Teleport if you cross through to other side
            if (portalSide != portalSideOld)
            {
                var positionOld = travellerT.position;
                var rotOld      = travellerT.rotation;
                traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation);
                traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                Debug.Log("Player passed through portal");
                // trigger enter/exit wont call reliably since running on fixxed update
                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation);
                // UpdateSliceParams
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #5
0
    private void LateUpdate()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller          = trackedTravellers[i];
            Transform       travellerTransform = traveller.transform;
            Vector3         offsetFromPortal   = travellerTransform.position - transform.position;

            int portalSide    = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));

            if (portalSide != portalSideOld)
            {
                Debug.Log("PLAYER VA A VIAJAR");
                Matrix4x4 m = otherPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerTransform.localToWorldMatrix;
                traveller.Teleport(transform, otherPortal.transform, m.GetColumn(3), m.rotation);

                otherPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #6
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            var             m          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));
            // Teleport the traveller if it has crossed from one side of the portal to the other
            if (portalSide != portalSideOld)
            {
                var positionOld = travellerT.position;
                var rotOld      = travellerT.rotation;
                traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation);

                //Added By Me
                traveller.gameObject.layer = gameObject.layer;

                traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation);
                //UpdateSliceParams (traveller);
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #7
0
    void LateUpdate()
    {
        for (int i = 0; i < _trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = _trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            Matrix4x4       m          = otherPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = Math.Sign(Vector3.Dot(traveller.prevOffsetFromPortal, transform.forward));
            // Teleport the traveller if it has crossed from one side of the portal to the other
            if (portalSide != portalSideOld)
            {
                traveller.Teleport(transform, otherPortal.transform, m.GetColumn(3), m.rotation);
                // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                otherPortal.OnTravellerEnterPortal(traveller);
                _trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.prevOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #8
0
    void UpdateSliceParams(PortalTraveller traveller)
    {
        if (traveller == null)
        {
            return;
        }
        // Calculate slice normal
        int     side             = SideOfPortal(traveller.transform.position);
        Vector3 sliceNormal      = transform.forward * -side;
        Vector3 cloneSliceNormal = linkedPortal.transform.forward * side;

        // Calculate slice centre
        Vector3 slicePos      = transform.position;
        Vector3 cloneSlicePos = linkedPortal.transform.position;

        // Adjust slice offset so that when player standing on other side of portal to the object, the slice doesn't clip through
        float sliceOffsetDst      = 0;
        float cloneSliceOffsetDst = 0;
        float screenThickness     = screen.transform.localScale.z;

        bool playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position);

        if (!playerSameSideAsTraveller)
        {
            sliceOffsetDst = -screenThickness;
        }
        bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position);

        if (!playerSameSideAsCloneAppearing)
        {
            cloneSliceOffsetDst = -screenThickness;
        }

        // Apply parameters
        for (int i = 0; i < traveller.OriginalMaterials.Length; i++)
        {
            traveller.OriginalMaterials[i].SetVector("sliceCentre", slicePos);
            traveller.OriginalMaterials[i].SetVector("sliceNormal", sliceNormal);
            traveller.OriginalMaterials[i].SetFloat("sliceOffsetDst", sliceOffsetDst);

            traveller.CloneMaterials[i].SetVector("sliceCentre", cloneSlicePos);
            traveller.CloneMaterials[i].SetVector("sliceNormal", cloneSliceNormal);
            traveller.CloneMaterials[i].SetFloat("sliceOffsetDst", cloneSliceOffsetDst);
        }
        if (traveller.GraphicsObject2 != null)
        {
            for (int i2 = 0; i2 < traveller.OriginalMaterials2.Length; i2++)
            {
                traveller.OriginalMaterials2[i2].SetVector("sliceCentre", slicePos);
                traveller.OriginalMaterials2[i2].SetVector("sliceNormal", sliceNormal);
                traveller.OriginalMaterials2[i2].SetFloat("sliceOffsetDst", sliceOffsetDst);

                traveller.CloneMaterials2[i2].SetVector("sliceCentre", cloneSlicePos);
                traveller.CloneMaterials2[i2].SetVector("sliceNormal", cloneSliceNormal);
                traveller.CloneMaterials2[i2].SetFloat("sliceOffsetDst", cloneSliceOffsetDst);
            }
        }
    }
    void OnTriggerEnter(Collider other)
    {
        PortalTraveller traveller = other.GetComponent <PortalTraveller>();

        if (traveller)
        {
            OnTravellerEnterPortal(traveller);
        }
    }
Example #10
0
 private void OnTravellerEnterPortal(PortalTraveller pTraveller)
 {
     if (!m_LptTravellers.Contains(pTraveller))
     {
         pTraveller.EnterPortalThreshold();
         pTraveller.previousOffsetFromPortal = pTraveller.transform.position - m_tTransform.position;
         m_LptTravellers.Add(pTraveller);
     }
 }
Example #11
0
 void OnTravellerEnterPortal(PortalTraveller traveller)
 {
     if (!trackedTravellers.Contains(traveller))
     {
         traveller.EnterPortalThreshold();
         traveller.PreviousOffsetFromPortal = traveller.transform.position - transform.position;
         trackedTravellers.Add(traveller);
     }
 }
Example #12
0
    void OnTriggerExit(Collider other)
    {
        PortalTraveller traveller = other.GetComponent <PortalTraveller>();

        if (traveller && _trackedTravellers.Contains(traveller))
        {
            traveller.ExitPortalTreshold();
            _trackedTravellers.Remove(traveller);
        }
    }
Example #13
0
 void OnTravellerEnterPortal(PortalTraveller traveller)
 {
     if ((!differentEyePortal.trackedTravellers.Contains(traveller)) && (!trackedTravellers.Contains(traveller)))
     {
         traveller.EnterPortalThreshold();
         traveller.previousOffsetFromPortal = traveller.transform.position - transform.position;
         trackedTravellers.Add(traveller);
         //Debug.Log("Add " + traveller.gameObject.name + " to " + gameObject.name);
     }
 }
Example #14
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            var             m          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));
            // Teleport the traveller if it has crossed from one side of the portal to the other
            if (portalSide != portalSideOld)
            {
                //traveller.GetComponent<Rigidbody>().velocity = linkedPortal.transform.rotation
                //    * (Quaternion.Inverse(transform.rotation)
                //    * traveller.GetComponent<Rigidbody>().velocity);



                //Physics.gravity = linkedPortal.transform.rotation * GM.initialGrav;
                //GM.Dir = linkedPortal.directionIndex;
                //Physics.gravity = transform.rotation * Physics.gravity;
                var positionOld = travellerT.position;
                var rotOld      = travellerT.rotation;
                traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation);
                traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                if (traveller.gameObject.layer == 9 || traveller.gameObject.layer == 10)
                {
                    if (traveller.gameObject.layer == 9)
                    {
                        Physics.gravity = travellerT.rotation * GM.initialGrav;
                    }

                    traveller.GetComponent <Rigidbody>().velocity = travellerT.rotation
                                                                    * (Quaternion.Inverse(rotOld)
                                                                       * traveller.GetComponent <Rigidbody>().velocity);
                }



                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                //Physics.gravity = linkedPortal.transform.rotation * Physics.gravity;
                traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation);
                //UpdateSliceParams (traveller);
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
    private void OnTriggerExit(Collider other)
    {
        PortalTraveller travel = other.GetComponent <PortalTraveller>();

        if (travel == null)
        {
            return;
        }

        travel.ExitPortal(this);
    }
Example #16
0
 // instantiate model clone for slicingv
 void OnTravellerEnterPortal(PortalTraveller traveller)
 {
     if (!trackedTravellers.Contains(traveller))
     {
         Debug.Log("player entered portal");
         //player.enabled = false;
         traveller.EnterPortalThreshold();
         traveller.previousOffsetFromPortal = traveller.transform.position - transform.position;
         trackedTravellers.Add(traveller);
     }
 }
    private void OnTriggerStay(Collider other)
    {
        PortalTraveller travel = other.GetComponent <PortalTraveller>();

        if (travel == null)
        {
            return;
        }

        travel.AttemptTeleport();
    }
Example #18
0
    void OnTravellerEnterPortal(PortalTraveller traveller)
    {
        if (!trackedTravellers.Contains(traveller))
        {
            traveller.EnterPortalThreshold();
            traveller.previousOffsetFromPortal = traveller.transform.position - transform.position;
            trackedTravellers.Add(traveller);

            Physics.IgnoreCollision(traveller.GetComponent <Collider>(), embeddedWall, true);
        }
    }
    private void OnTriggerEnter(Collider other)
    {
        PortalTraveller travel = other.GetComponent <PortalTraveller>();

        if (travel == null)
        {
            return;
        }

        //entering the entrance portal
        travel.EnterPortal(this);
    }
Example #20
0
 void OnTravellerEnterPortal(PortalTraveller traveller)
 {
     //Debug.Log(gameObject.name);
     //Debug.Log("Traveller in");
     if (!trackedTravellers.Contains(traveller))
     {
         //Debug.Log("Traveller ADDED");
         traveller.EnterPortalThreshold();
         traveller.previousOffsetFromPortal = traveller.transform.position - transform.position;
         trackedTravellers.Add(traveller);
     }
 }
Example #21
0
    // Use custom projection matrix to align portal camera's near clip plane with the surface of the portal
    // Note that this affects precision of the depth buffer, which can cause issues with effects like screenspace AO


    void OnTravellerEnterPortal(PortalTraveller traveller)
    {
        if (!trackedTravellers.Contains(traveller))
        {
            if (linkedPortal.linkedPortal != this)
            {
                linkedPortal.linkedPortal = this;
            }
            traveller.EnterPortalThreshold();
            traveller.previousOffsetFromPortal = traveller.transform.position - transform.position;
            trackedTravellers.Add(traveller);
        }
    }
Example #22
0
    void UpdateSliceParams(PortalTraveller traveller)
    {
        // Calculate slice normal
        int side = SideOfPortal(playerCam.transform.position);

        Vector3 sliceNormal      = transform.forward * -side;
        Vector3 cloneSliceNormal = linkedPortal.transform.forward * side;

        // Calculate slice centre
        Vector3 slicePos      = transform.position;
        Vector3 cloneSlicePos = linkedPortal.transform.position;

        // Adjust slice offset so that when player standing on other side of portal to the object, the slice doesn't clip through
        float sliceOffsetDst      = 0;
        float cloneSliceOffsetDst = 0;
        float screenThickness     = screen.transform.localScale.z;
        bool  playerSameSideAsTraveller;

        if (traveller.tag != "Player")
        {
            playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position);
        }
        else
        {
            playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.GetChild(0).GetChild(0).position);
        }

        if (!playerSameSideAsTraveller)
        {
            sliceOffsetDst = -screenThickness;
        }
        bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position);

        if (!playerSameSideAsCloneAppearing)
        {
            cloneSliceOffsetDst = -screenThickness;
        }

        // Apply parameters
        for (int j = 0; j < traveller.originalMaterials.Length; j++)
        {
            traveller.originalMaterials[j].SetVector("sliceCentre", slicePos);
            traveller.originalMaterials[j].SetVector("sliceNormal", sliceNormal);
            traveller.originalMaterials[j].SetFloat("sliceOffsetDst", sliceOffsetDst);

            traveller.cloneMaterials[j].SetVector("sliceCentre", cloneSlicePos);
            traveller.cloneMaterials[j].SetVector("sliceNormal", cloneSliceNormal);
            traveller.cloneMaterials[j].SetFloat("sliceOffsetDst", cloneSliceOffsetDst);
        }
    }
Example #23
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            var             m          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * getTransfParent(travellerT, traveller.deepParentScript).localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));
            // Teleport the traveller if it has crossed from one side of the portal to the other
            if ((portalSide != portalSideOld) /*&&(traveller.readyToTeleport)*/)
            {
                for (int j = 0; j < trackedTravellers.Count; j++)
                {
                    Debug.Log(trackedTravellers[j].gameObject.name + "  " + j);
                }

                /* Debug.Log("Linked " + linkedPortal.transform.localToWorldMatrix.GetColumn(0) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(1) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(2) + " " + linkedPortal.transform.localToWorldMatrix.GetColumn(3));
                 * Debug.Log("portal world " + transform.localToWorldMatrix.GetColumn(0) + " " + transform.localToWorldMatrix.GetColumn(1) + " " + transform.localToWorldMatrix.GetColumn(2) + " " + transform.localToWorldMatrix.GetColumn(3));
                 * Debug.Log("portal " + transform.worldToLocalMatrix.GetColumn(0) + " " + transform.worldToLocalMatrix.GetColumn(1) + " " + transform.worldToLocalMatrix.GetColumn(2) + " " + transform.worldToLocalMatrix.GetColumn(3));
                 *
                 * Debug.Log("traveller " + travellerT.transform.localToWorldMatrix.GetColumn(0) + " " + travellerT.transform.localToWorldMatrix.GetColumn(1) + " " + travellerT.transform.localToWorldMatrix.GetColumn(2) + " " + travellerT.transform.localToWorldMatrix.GetColumn(3));
                 * Debug.Log("all " + m.GetColumn(0) + " " + m.GetColumn(1) + " " + m.GetColumn(2) + " " + m.GetColumn(3));
                 * Debug.Log("Matrix" + m.GetColumn(3));*/
                var             positionOld  = getTransfParent(travellerT, traveller.deepParentScript).position;
                var             rotOld       = getTransfParent(travellerT, traveller.deepParentScript).rotation;
                PortalTraveller newtraveller = traveller;
                if (getTransfParent(travellerT, traveller.deepParentScript).GetComponent <PortalTraveller>() != null)
                {
                    newtraveller = getTransfParent(travellerT, traveller.deepParentScript).GetComponent <PortalTraveller>();
                }
                newtraveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation);
                newtraveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);

                // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation);
                //UpdateSliceParams (traveller);
                /*if  (traveller.readyToTeleport)*/ traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #24
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;
            if (!traveller.gameObject.activeSelf || !traveller.collider.bounds.Intersects(collider.bounds))
            {
                traveller.ExitPortalThreshold();
                trackedTravellers.Remove(traveller);
                i--;
                continue;
            }
            var m = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;

            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));
            // Teleport the traveller if it has crossed from one side of the portal to the other
            if (portalSide != portalSideOld)
            {
                var positionOld = travellerT.position;
                var rotOld      = travellerT.rotation;
                traveller.Teleport(transform, traveller.graphicsClone.transform, m.GetColumn(3), m.rotation, m);
                traveller.graphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                traveller.graphicsClone.transform.localScale = MyFunc.Div(transform.lossyScale, linkedPortal.transform.lossyScale);
                // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
                Portal temp = linkedPortal;
                if (portalController != null)
                {
                    portalController.OnOutFromPortal(linkedPortal);
                }
                if (temp.portalController != null)
                {
                    temp.portalController.OnComeToPortal(this);
                }
            }
            else
            {
                traveller.graphicsClone.transform.SetPositionAndRotation(m.GetColumn(3), m.rotation);
                traveller.graphicsClone.transform.localScale = MyFunc.Div(m.lossyScale, travellerT.transform.lossyScale);
                traveller.previousOffsetFromPortal           = offsetFromPortal;
            }
        }
    }
Example #25
0
    void OnTravellerEnterPortal(PortalTraveller traveller)
    {
        if (!trackedTravellers.Contains(traveller))
        {
            traveller.EnterPortalThreshold();

            Transform tempTraveller;
            tempTraveller = traveller.transform;
            if (traveller.tag != "Player")
            {
                traveller.previousOffsetFromPortal = tempTraveller.position - transform.position;
            }
            else
            {
                traveller.previousOffsetFromPortal = tempTraveller.GetChild(0).GetChild(0).position - transform.position;
            }
            trackedTravellers.Add(traveller);
        }
    }
Example #26
0
    void UpdateSliceParams(PortalTraveller traveller)
    {
        // calculate slice normal
        int     side             = SideOfPortal(traveller.transform.position);
        Vector3 sliceNormal      = transform.forward * -side;
        Vector3 cloneSliceNormal = linkedPortal.transform.forward * side;

        // calculate slice position
        Vector3 slicePos      = transform.position;
        Vector3 cloneSlicePos = linkedPortal.transform.position;

        // Adjust slice offset so when player is standing on other side of portal to an object thatisslicing, the slice doesn't clip through
        float sliceOffsetDst      = 0;
        float cloneSliceOffsetDst = 0;
        float screenThickness     = screen.transform.localScale.z;

        bool playerSameSideAsTraveller = SameSideOfPortal(playerCam.transform.position, traveller.transform.position);

        if (!playerSameSideAsTraveller)
        {
            sliceOffsetDst = -screenThickness;
        }
        bool playerSameSideAsCloneAppearing = side != linkedPortal.SideOfPortal(playerCam.transform.position);

        if (!playerSameSideAsCloneAppearing)
        {
            cloneSliceOffsetDst = -screenThickness;
        }

        // apply slice parameters
        for (int i = 0; i < traveller.originalMaterials.Length; i++)
        {
            traveller.originalMaterials[i].SetVector("sliceCentre", slicePos);
            traveller.originalMaterials[i].SetVector("sliceNormal", sliceNormal);
            traveller.originalMaterials[i].SetFloat("sliceOffsetDst", sliceOffsetDst);

            traveller.cloneMaterials[i].SetVector("sliceCentre", cloneSlicePos);
            traveller.cloneMaterials[i].SetVector("sliceNormal", cloneSliceNormal);
            traveller.cloneMaterials[i].SetFloat("sliceOffsetDst", cloneSliceOffsetDst);
        }
    }
Example #27
0
    //////////////////////////////////////////////////////////////////////
    private void UpdateTravellers()
    {
        for (int i = _trackedTravellers.Count - 1; i >= 0; --i)
        {
            PortalTraveller traveller = _trackedTravellers[i];
            if (traveller.IsInPortal)
            {
                Matrix4x4 relativeMat = _linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * traveller.transform.localToWorldMatrix;
                if (traveller.HasCrossedPortal(this))
                {
                    traveller.Teleport(relativeMat.GetColumn(3), relativeMat.rotation);

                    _linkedPortal.OnTravellerApprochingPortal(traveller);
                    OnTravellerLeavingPortal(traveller);
                }
                else
                {
                    traveller.UpdateClone(relativeMat.GetColumn(3), relativeMat.rotation);
                }
            }
        }
    }
Example #28
0
    //////////////////////////////////////////////////////////////////////
    public void OnEnterTrigger(Collider localCollider, Collider externalCollider)
    {
        PortalTraveller traveller = externalCollider.GetComponentInParent <PortalTraveller>();

        if (!traveller || traveller.TravellerCollider != externalCollider)
        {
            return;
        }

        if (localCollider == _physZoneA)
        {
            traveller.OnApproachPortalZone(this, GlobalVars.Instance._layerPortalSideA, GlobalVars.Instance._layerPortalSideB);
        }
        else if (localCollider == _physZoneB)
        {
            traveller.OnApproachPortalZone(this, GlobalVars.Instance._layerPortalSideB, GlobalVars.Instance._layerPortalSideA);
        }
        else if (localCollider == _portalZone)
        {
            traveller.OnEnterPortal();
        }
    }
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            // set traveller and traveller transform
            PortalTraveller traveller  = trackedTravellers[i];
            Transform       travellerT = traveller.transform;

            var m = linkedPortal.transform.localToWorldMatrix
                    * transform.worldToLocalMatrix
                    * travellerT.localToWorldMatrix;
            // calculate offset from portal from the traveller transform to the portals transform
            Vector3 offsetFromPortal = travellerT.position - transform.position;
            int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
            int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.previousOffsetFromPortal, transform.forward));

            // Teleport Traveller if it has crossed one side of the portal to the other
            if (portalSide != portalSideOld) // check the portal side isnt the old side
            {
                //Debug.Log("You have entered the portal");

                // traveller can teleport
                traveller.Teleport(transform, linkedPortal.transform, m.GetColumn(3), m.rotation);

                // Can't rely on OnTriggerExit to remove tracked traveller next frame since it's
                // dependent on when fixed update is next called
                linkedPortal.OnTravellerEnterPortal(traveller);
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                // if portal side is same as old portal side set previous offset equal to offset
                traveller.previousOffsetFromPortal = offsetFromPortal;
            }
        }
    }
Example #30
0
    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller = trackedTravellers[i];
            if (traveller == null) // debugdestroy
            {
                continue;
            }

            if (traveller.GraphicsObject2 == null) // model 2 not here
            {
                Transform travellerT = traveller.transform;
                Transform model1T    = traveller.GraphicsObject.transform;
                var       t          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;
                var       m1         = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model1T.localToWorldMatrix;

                Vector3 offsetFromPortal = travellerT.position - transform.position;
                int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
                int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.PreviousOffsetFromPortal, transform.forward));
                // Teleport the traveller if it has crossed from one side of the portal to the other
                if (portalSide != portalSideOld)
                {
                    var positionOld = model1T.position;
                    var rotOld      = model1T.rotation;
                    if (traveller.GetComponent <PhysicsObject>())
                    {
                        traveller.GetComponent <PhysicsObject>().Drop();

                        /*if (traveller.GetComponent<PhysicsObject>().m_Held)
                         * {
                         *  GameObject mtraveller = traveller.GetComponent<PhysicsObject>().playercontroller.GetComponent<FPSWeapon>().m_HandTransform.gameObject;
                         *  Transform mtravellerT = mtraveller.transform;
                         *  var mt = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * mtravellerT.localToWorldMatrix;
                         *
                         *  var mpositionOld = model1T.position;
                         *  var mrotOld = model1T.rotation;
                         *
                         *  traveller.Teleport(transform, linkedPortal.transform, mt.GetColumn(3), mt.rotation);
                         *  traveller.GraphicsClone.transform.SetPositionAndRotation(mpositionOld, mrotOld);
                         * }*/
                    }

                    /*else
                     * {
                     *  traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation);
                     *  traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                     * }*/
                    traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation);
                    traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                    // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                    linkedPortal.OnTravellerEnterPortal(traveller);
                    trackedTravellers.RemoveAt(i);
                    i--;
                }
                else
                {
                    traveller.GraphicsClone.transform.SetPositionAndRotation(m1.GetColumn(3), m1.rotation);
                    traveller.PreviousOffsetFromPortal = offsetFromPortal;
                }
            }
            else   // model 2 is here
            {
                Transform travellerT = traveller.transform;
                Transform model1T    = traveller.GraphicsObject.transform;
                Transform model2T    = traveller.GraphicsObject2.transform;
                var       t          = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * travellerT.localToWorldMatrix;
                var       m1         = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model1T.localToWorldMatrix;
                var       m2         = linkedPortal.transform.localToWorldMatrix * transform.worldToLocalMatrix * model2T.localToWorldMatrix;

                Vector3 offsetFromPortal = travellerT.position - transform.position;
                int     portalSide       = System.Math.Sign(Vector3.Dot(offsetFromPortal, transform.forward));
                int     portalSideOld    = System.Math.Sign(Vector3.Dot(traveller.PreviousOffsetFromPortal, transform.forward));
                // Teleport the traveller if it has crossed from one side of the portal to the other
                if (portalSide != portalSideOld)
                {
                    var positionOld  = model1T.position;
                    var rotOld       = model1T.rotation;
                    var positionOld2 = model2T.position;
                    var rotOld2      = model2T.rotation;
                    if (traveller.GetComponent <PhysicsObject>())
                    {
                        traveller.GetComponent <PhysicsObject>().Drop();
                    }
                    traveller.Teleport(transform, linkedPortal.transform, t.GetColumn(3), t.rotation);
                    traveller.GraphicsClone.transform.SetPositionAndRotation(positionOld, rotOld);
                    traveller.GraphicsClone2.transform.SetPositionAndRotation(positionOld2, rotOld2);
                    // Can't rely on OnTriggerEnter/Exit to be called next frame since it depends on when FixedUpdate runs
                    linkedPortal.OnTravellerEnterPortal(traveller);
                    trackedTravellers.RemoveAt(i);
                    i--;
                }
                else
                {
                    traveller.GraphicsClone.transform.SetPositionAndRotation(m1.GetColumn(3), m1.rotation);
                    traveller.GraphicsClone2.transform.SetPositionAndRotation(m2.GetColumn(3), m2.rotation);
                    traveller.PreviousOffsetFromPortal = offsetFromPortal;
                }
            }
        }
    }