using System.Collections; using System.Collections.Generic; using UnityEngine; public enum Area { LeftWall, RightWall, TopWall, Floor } public class FrozenScreenToWorldSpace : MonoBehaviour { public static FrozenScreenToWorldSpace Instance { get { /* if (instacnce == null && GameObject.Find("FrozenScreenToWorldSpace").GetComponent() != null) instacnce = GameObject.Find("FrozenScreenToWorldSpace").GetComponent(); else instacnce = new GameObject("FrozenScreenToWorldSpace").AddComponent(); */ return instacnce; } } private static FrozenScreenToWorldSpace instacnce; public float width = 8; public float length = 5; public float height = 3; public float blackLength = 0.89f; public float PixelsByMeter = 360; public float finalPixelsByMeter = 90; [System.Serializable] public class RenderTextureROI { public float X; public float Y; public float ROI_X; public float ROI_Y; public RenderTextureROI(float x, float y, float roi_x, float roi_y) { X = x; Y = y; ROI_X = roi_x; ROI_Y = roi_y; } public RenderTextureROI() { } } [SerializeField] RenderTextureROI LeftWall = new RenderTextureROI(); [SerializeField] RenderTextureROI TopWall = new RenderTextureROI(); [SerializeField] RenderTextureROI RightWall = new RenderTextureROI(); [SerializeField] RenderTextureROI Floor = new RenderTextureROI(); Dictionary RenderTextureROIList = new Dictionary(); Dictionary wallPlaneList = new Dictionary(); private float totalLength; private float totalWidth; private void Awake() { instacnce = this; InitailROISetting(); } void InitailROISetting() { totalLength = height * 2 + width; totalWidth = height + length + blackLength; LeftWall = new RenderTextureROI(0, height / totalWidth, height / totalLength, length / totalWidth); RightWall = new RenderTextureROI((height + width) / totalLength, height / totalWidth, height / totalLength, length / totalWidth); TopWall = new RenderTextureROI((height) / totalLength, 0, width / totalLength, height / totalWidth); Floor = new RenderTextureROI(height / totalLength, height / totalWidth, width / totalLength, length / totalWidth); RenderTextureROIList.Add(Area.LeftWall, LeftWall); RenderTextureROIList.Add(Area.RightWall, RightWall); RenderTextureROIList.Add(Area.TopWall, TopWall); RenderTextureROIList.Add(Area.Floor, Floor); wallPlaneList.Add(Area.LeftWall, new Plane(Vector3.right, new Vector3(-width * 0.5f, 0, 0))); wallPlaneList.Add(Area.RightWall, new Plane(Vector3.left, new Vector3(width * 0.5f, 0, 0))); wallPlaneList.Add(Area.TopWall, new Plane(Vector3.back, new Vector3(0, 0, length * 0.5f))); } public RenderTextureROI GetROI(Area area) { if (RenderTextureROIList.ContainsKey(area)) return RenderTextureROIList[area]; return null; } public Plane GetWallPlane(Area area) { if (wallPlaneList.ContainsKey(area)) return wallPlaneList[area]; return new Plane(); } public Vector2 GetFinalScreenPos(Area area, Vector2 wallROI) { if(!RenderTextureROIList.ContainsKey(area)) return Vector2.zero; RenderTextureROI textureROI = GetROI(area); Vector2 currenPos = Vector2.zero; if (area == Area.LeftWall) { float x = textureROI.X + (1 - wallROI.y) * textureROI.ROI_X; float y = textureROI.Y + (1 - wallROI.x) * textureROI.ROI_Y; currenPos = new Vector2(x, y); } if (area == Area.RightWall) { float x = textureROI.X + wallROI.y * textureROI.ROI_X; float y = textureROI.Y + (1 - wallROI.x) * textureROI.ROI_Y; currenPos = new Vector2(x, y); } if (area == Area.TopWall) { float x = textureROI.X + wallROI.x * textureROI.ROI_X; float y = textureROI.Y + (1 - wallROI.y) * textureROI.ROI_Y; currenPos = new Vector2(x, y); } currenPos = new Vector2(currenPos.x * Screen.width, ( 1 - currenPos.y) * Screen.height); return currenPos; } public Vector2 GetWallRoiFromPosition(Area area, Vector3 position) { position -= transform.position; Vector2 roi = Vector2.zero; switch (area) { case Area.TopWall: { roi.x = (position.x + width * 0.5f) / width; roi.y = position.y / height; } break; case Area.LeftWall: { roi.x = (position.z + length * 0.5f) / length; roi.y = position.y / height; } break; case Area.RightWall: { roi.x = (position.z + length * 0.5f) / length; roi.y = position.y / height; } break; } return roi; } public Vector3 Position { get { return transform.position; } } }