public static void RemoveVLSLight(VLSLight _light) { AllLightsInScene.Remove(_light); if (VisibleLights.Contains(_light)) VisibleLights.Remove(_light); }
public static void AddVLSLight(VLSLight _light) { AllLightsInScene.Add(_light); if (IsInView(_light.bounds)) VisibleLights.Add(_light); }
public static void RemoveVLSLight(VLSLight _light) { AllLightsInScene.Remove(_light); if (VisibleLights.Contains(_light)) { VisibleLights.Remove(_light); } }
public static void AddVLSLight(VLSLight _light) { AllLightsInScene.Add(_light); if (IsInView(_light.bounds)) { VisibleLights.Add(_light); } }
static void CreateRadialLight() { VLSRadial l2D = VLSLight.CreateRadial(); Selection.activeGameObject = l2D.gameObject; }
//private static Vector3 zOffset = new Vector3(0, 0, 0); public static void GenerateRadialMesh(VLSLight _light, LayerMask _layerMask, float _obstPenetration = 0) { lightTransform = _light.transform; lightPosition = lightTransform.position; //zOffset.Set(0, 0, lightPosition.z); _light.Buffer.Clear(); CollectVisibleEdges(_light, _layerMask); visibleEdges.AddRange(_light.edges); #if UNITY_EDITOR if (VLSDebug.IsModeActive(VLSDebugMode.Geometry)) { for (int e = 0; e < visibleEdges.Count; e++) { if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting)) { Debug.DrawLine(visibleEdges[e].PointA.position, visibleEdges[e].PointB.position, Color.magenta); if (visibleEdges[e].IsEnd) { Debug.DrawRay(visibleEdges[e].PointB.position, visibleEdges[e].Normal * 0.2f, Color.red); } if (visibleEdges[e].IsStart) { Debug.DrawRay(visibleEdges[e].PointA.position, visibleEdges[e].Normal * 0.2f, Color.green); } } } } #endif target.Set(0, 0, 0); hit = false; for (int e = 0; e < visibleEdges.Count; e++) { for (int e2 = 0; e2 < visibleEdges.Count; e2++) { if (LineIntersects(visibleEdges[e].PointA.position, visibleEdges[e].PointB.position, visibleEdges[e2].PointA.position, visibleEdges[e2].PointB.position, ref kPoint)) { LineCast(lightPosition, kPoint, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } if (_light.bounds.Contains(visibleEdges[e].PointA.position)) { if (visibleEdges[e].IsStart) { target = visibleEdges[e].PointA.position - (visibleEdges[e].Direction * 0.001f); hit = LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointA.position.y - lightPosition.y, visibleEdges[e].PointA.position.x - lightPosition.x)); if (!hit) { RayCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } else { target = visibleEdges[e].PointA.position; LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointA.position.y - lightPosition.y, visibleEdges[e].PointA.position.x - lightPosition.x)); } } if (_light.bounds.Contains(visibleEdges[e].PointB.position)) { if (visibleEdges[e].IsEnd) { target = visibleEdges[e].PointB.position + (visibleEdges[e].Direction * 0.001f); hit = LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointB.position.y - lightPosition.y, visibleEdges[e].PointB.position.x - lightPosition.x)); if (!hit) { RayCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } } } _light.Buffer.vertices.Sort(); _light.Buffer.AddPoint(Vector3.zero, 0); }
public static void GenerateDirectionalMesh(VLSLight _light, LayerMask _layerMask) { _light.Buffer.Clear(); CollectVisibleEdges(_light, _layerMask); }
private static void CollectVisibleEdges(VLSLight _light, LayerMask _layerMask) { visibleEdges.Clear(); #region Collect Radial Edges if (_light is VLSRadial || _light is VLSRadialCS) { for (int o = 0; o < VLSViewer.VisibleObstructions.Count; o++)//VLSObstructor obst in VLSViewer.VisibleObstructions) { if (VLSViewer.VisibleObstructions[o] == null) { continue; } if ((_layerMask.value & (1 << VLSViewer.VisibleObstructions[o].gameObject.layer)) == 0) { continue; } if (VLSViewer.VisibleObstructions[o].bounds.Overlaps(_light.bounds, true)) { bool prevEdgeVisible = false; for (int i = 0; i < VLSViewer.VisibleObstructions[o].edges.Count; i++) { VLSViewer.VisibleObstructions[o].edges[i].IsStart = false; VLSViewer.VisibleObstructions[o].edges[i].IsEnd = false; if (QuickDot(VLSViewer.VisibleObstructions[o].edges[i].PointA.position - _light.transform.position, VLSViewer.VisibleObstructions[o].edges[i].Normal) <= 0) { if (!prevEdgeVisible) { VLSViewer.VisibleObstructions[o].edges[i].IsStart = true; } prevEdgeVisible = true; visibleEdges.Add(VLSViewer.VisibleObstructions[o].edges[i]); } else if (prevEdgeVisible) { VLSViewer.VisibleObstructions[o].edges[i - 1].IsEnd = true; prevEdgeVisible = false; } } if (VLSViewer.VisibleObstructions[o].edges[0].IsEnd && VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsStart) { VLSViewer.VisibleObstructions[o].edges[0].IsStart = false; VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsEnd = false; } else { VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsEnd = true; } } } } #endregion #region Collect Directional Edges if (_light is VLSDirectional) { foreach (VLSObstructor obst in VLSViewer.VisibleObstructions) { if ((_layerMask.value & (1 << obst.gameObject.layer)) == 0) { continue; } if (obst.bounds.Overlaps(_light.bounds)) { bool prevEdgeVisible = false; for (int i = 0; i < obst.edges.Count; i++) { obst.edges[i].IsStart = false; obst.edges[i].IsEnd = false; if (QuickDot(-_light.transform.up, obst.edges[i].Normal) < 0) { if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting)) { Debug.DrawLine(obst.edges[i].PointA.position, obst.edges[i].PointB.position, Color.red); } if (!prevEdgeVisible) { obst.edges[i].IsStart = true; } prevEdgeVisible = true; visibleEdges.Add(obst.edges[i]); } else if (prevEdgeVisible) { obst.edges[i - 1].IsEnd = true; prevEdgeVisible = false; } } if (obst.edges[0].IsEnd && obst.edges[obst.edges.Count - 1].IsStart) { obst.edges[0].IsStart = false; obst.edges[obst.edges.Count - 1].IsEnd = false; } else { obst.edges[obst.edges.Count - 1].IsEnd = true; } } } } #endregion }
//private static Vector3 zOffset = new Vector3(0, 0, 0); public static void GenerateRadialMesh(VLSLight _light, LayerMask _layerMask, float _obstPenetration = 0) { lightTransform = _light.transform; lightPosition = lightTransform.position; //zOffset.Set(0, 0, lightPosition.z); _light.Buffer.Clear(); CollectVisibleEdges(_light, _layerMask); visibleEdges.AddRange(_light.edges); #if UNITY_EDITOR if (VLSDebug.IsModeActive(VLSDebugMode.Geometry)) { for (int e = 0; e < visibleEdges.Count; e++) { if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting)) { Debug.DrawLine(visibleEdges[e].PointA.position, visibleEdges[e].PointB.position, Color.magenta); if (visibleEdges[e].IsEnd) Debug.DrawRay(visibleEdges[e].PointB.position, visibleEdges[e].Normal * 0.2f, Color.red); if (visibleEdges[e].IsStart) Debug.DrawRay(visibleEdges[e].PointA.position, visibleEdges[e].Normal * 0.2f, Color.green); } } } #endif target.Set(0, 0, 0); hit = false; for (int e = 0; e < visibleEdges.Count; e++) { for (int e2 = 0; e2 < visibleEdges.Count; e2++) { if (LineIntersects(visibleEdges[e].PointA.position, visibleEdges[e].PointB.position, visibleEdges[e2].PointA.position, visibleEdges[e2].PointB.position, ref kPoint)) { LineCast(lightPosition, kPoint, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } if (_light.bounds.Contains(visibleEdges[e].PointA.position)) { if (visibleEdges[e].IsStart) { target = visibleEdges[e].PointA.position - (visibleEdges[e].Direction * 0.001f); hit = LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointA.position.y - lightPosition.y, visibleEdges[e].PointA.position.x - lightPosition.x)); if (!hit) { RayCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } else { target = visibleEdges[e].PointA.position; LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointA.position.y - lightPosition.y, visibleEdges[e].PointA.position.x - lightPosition.x)); } } if (_light.bounds.Contains(visibleEdges[e].PointB.position)) { if (visibleEdges[e].IsEnd) { target = visibleEdges[e].PointB.position + (visibleEdges[e].Direction * 0.001f); hit = LineCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(visibleEdges[e].PointB.position.y - lightPosition.y, visibleEdges[e].PointB.position.x - lightPosition.x)); if (!hit) { RayCast(lightPosition, target, ref rHit); _light.Buffer.AddPoint(lightTransform.InverseTransformPoint(rHit.point), Mathf.Atan2(rHit.point.y - lightPosition.y, rHit.point.x - lightPosition.x)); } } } } _light.Buffer.vertices.Sort(); _light.Buffer.AddPoint(Vector3.zero, 0); }
private static void CollectVisibleEdges(VLSLight _light, LayerMask _layerMask) { visibleEdges.Clear(); #region Collect Radial Edges if (_light is VLSRadial || _light is VLSRadialCS) { for(int o = 0; o < VLSViewer.VisibleObstructions.Count; o++)//VLSObstructor obst in VLSViewer.VisibleObstructions) { if (VLSViewer.VisibleObstructions[o] == null) continue; if ((_layerMask.value & (1 << VLSViewer.VisibleObstructions[o].gameObject.layer)) == 0) continue; if (VLSViewer.VisibleObstructions[o].bounds.Overlaps(_light.bounds, true)) { bool prevEdgeVisible = false; for (int i = 0; i < VLSViewer.VisibleObstructions[o].edges.Count; i++) { VLSViewer.VisibleObstructions[o].edges[i].IsStart = false; VLSViewer.VisibleObstructions[o].edges[i].IsEnd = false; if (QuickDot(VLSViewer.VisibleObstructions[o].edges[i].PointA.position - _light.transform.position, VLSViewer.VisibleObstructions[o].edges[i].Normal) <= 0) { if (!prevEdgeVisible) VLSViewer.VisibleObstructions[o].edges[i].IsStart = true; prevEdgeVisible = true; visibleEdges.Add(VLSViewer.VisibleObstructions[o].edges[i]); } else if (prevEdgeVisible) { VLSViewer.VisibleObstructions[o].edges[i - 1].IsEnd = true; prevEdgeVisible = false; } } if (VLSViewer.VisibleObstructions[o].edges[0].IsEnd && VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsStart) { VLSViewer.VisibleObstructions[o].edges[0].IsStart = false; VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsEnd = false; } else { VLSViewer.VisibleObstructions[o].edges[VLSViewer.VisibleObstructions[o].edges.Count - 1].IsEnd = true; } } } } #endregion #region Collect Directional Edges if(_light is VLSDirectional) { foreach (VLSObstructor obst in VLSViewer.VisibleObstructions) { if ((_layerMask.value & (1 << obst.gameObject.layer)) == 0) continue; if (obst.bounds.Overlaps(_light.bounds)) { bool prevEdgeVisible = false; for (int i = 0; i < obst.edges.Count; i++) { obst.edges[i].IsStart = false; obst.edges[i].IsEnd = false; if (QuickDot(-_light.transform.up, obst.edges[i].Normal) < 0) { if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting)) Debug.DrawLine(obst.edges[i].PointA.position, obst.edges[i].PointB.position, Color.red); if (!prevEdgeVisible) obst.edges[i].IsStart = true; prevEdgeVisible = true; visibleEdges.Add(obst.edges[i]); } else if (prevEdgeVisible) { obst.edges[i - 1].IsEnd = true; prevEdgeVisible = false; } } if (obst.edges[0].IsEnd && obst.edges[obst.edges.Count - 1].IsStart) { obst.edges[0].IsStart = false; obst.edges[obst.edges.Count - 1].IsEnd = false; } else { obst.edges[obst.edges.Count - 1].IsEnd = true; } } } } #endregion }