Exemple #1
0
        public static void RemoveVLSLight(VLSLight _light)
        {
            AllLightsInScene.Remove(_light);

            if (VisibleLights.Contains(_light))
                VisibleLights.Remove(_light);
        }
Exemple #2
0
        public static void AddVLSLight(VLSLight _light)
        {
            AllLightsInScene.Add(_light);

            if (IsInView(_light.bounds))
                VisibleLights.Add(_light);
        }
Exemple #3
0
        public static void RemoveVLSLight(VLSLight _light)
        {
            AllLightsInScene.Remove(_light);

            if (VisibleLights.Contains(_light))
            {
                VisibleLights.Remove(_light);
            }
        }
Exemple #4
0
        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
        }
Exemple #9
0
        //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);
        }
Exemple #10
0
 public static void GenerateDirectionalMesh(VLSLight _light, LayerMask _layerMask)
 {
     _light.Buffer.Clear();
     CollectVisibleEdges(_light, _layerMask);
 }
Exemple #11
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
        }