using Fragilem17.MirrorsAndPortals; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Fragilem17.MirrorsAndPortals { [ExecuteInEditMode] public class PortalAffectorSphere : MonoBehaviour { public List renderers; private static List _shaderNames = new List(new string[] { "_SphereParams1", "_SphereParams2", "_SphereParams3" }); //private static int _portalAffectorsInUse = 0; private string _myShaderName = "unset"; private Portal _inPortal; private Vector3 _originalPortalScaleIn; private Vector3 _originalPortalScaleOut; private static readonly Quaternion halfTurn = Quaternion.Euler(0.0f, 180.0f, 0.0f); private void OnEnable() { if (_shaderNames.Count == 0) { Debug.LogWarning("a maximum of 3 portal affectors will have an effect on the portal shader"); return; } _myShaderName = _shaderNames[0]; _shaderNames.RemoveAt(0); } private void OnDisable() { if (_myShaderName != "unset" && !_shaderNames.Contains(_myShaderName)) { _shaderNames.Add(_myShaderName); } } private void Update() { } private void LateUpdate() { if (_inPortal) { Vector3 p = transform.position; _inPortal.PortalSurface.myMeshRenderer.sharedMaterial.SetVector(_myShaderName, new Vector4(p.x, p.y, p.z, transform.lossyScale.x)); } /*if (renderers != null && renderers.Count > 0) { foreach (MeshRenderer r in renderers) { Vector3 p = transform.position; if (r != null && r.sharedMaterial != null) { r.sharedMaterial.SetVector(_myShaderName, new Vector4(p.x, p.y, p.z, transform.lossyScale.x)); } } //Debug.Log(transform.parent.name + "used " + _shaderNames[_usedShaderSlotIndex]); //PositionClone(); }*/ } private void PositionClone() { if (_inPortal != null) { Transform inTransform = _inPortal.PortalSurface.transform; Transform outTransform = _inPortal.OtherPortal.PortalSurface.transform; float scaleFactor = (_inPortal.OtherPortal.transform.lossyScale.x / _inPortal.transform.lossyScale.x); _originalPortalScaleIn = inTransform.localScale; _originalPortalScaleOut = outTransform.localScale; inTransform.localScale = Vector3.one; outTransform.localScale = Vector3.one; // Update position of clone. Vector3 relativePos = inTransform.InverseTransformPoint(transform.position); relativePos = halfTurn * relativePos; Vector3 p = outTransform.TransformPoint(relativePos); _inPortal.OtherPortal.PortalSurface.myMeshRenderer.sharedMaterial.SetVector(_myShaderName, new Vector4(p.x, p.y, p.z, transform.lossyScale.x)); inTransform.localScale = _originalPortalScaleIn; outTransform.localScale = _originalPortalScaleOut; } } public void SetIsInPortal(Portal portal) { //Debug.Log("SetIsInPortal " + transform.parent.name + " inPortal: " + portal.name); _inPortal = portal; if (portal.PortalSurface && !renderers.Contains(portal.PortalSurface.myMeshRenderer)) { renderers.Add(portal.PortalSurface.myMeshRenderer); } //PositionClone(); } public void ExitPortal(Portal portal) { //Debug.Log("ExitPortal " + transform.parent.name + " inPortal: " + portal.name); if (portal.PortalSurface) { Vector3 p = new Vector3(999f, 999f, 999f); portal.PortalSurface.myMeshRenderer.sharedMaterial.SetVector(_myShaderName, new Vector4(p.x, p.y, p.z, 0.0001f)); _inPortal = null; renderers.Remove(portal.PortalSurface.myMeshRenderer); } } } }