Files
RoomAwareVR/Assets/Fragilem17/Portals for VR/Scripts/PortalAffectorSphere.cs
2025-05-26 00:46:28 +02:00

124 lines
4.4 KiB
C#

using Fragilem17.MirrorsAndPortals;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Fragilem17.MirrorsAndPortals
{
[ExecuteInEditMode]
public class PortalAffectorSphere : MonoBehaviour
{
public List<MeshRenderer> renderers;
private static List<string> _shaderNames = new List<string>(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);
}
}
}
}