public static bool LineCast(Vector3 _origin, Vector3 _end, ref VLSRayHit _hitInfo)
        {
            //rHit2D = Physics2D.Linecast(_origin, _end);

            //if (rHit2D.collider != null)
            //{
            //    _hitInfo.point = rHit2D.point;
            //    return true;
            //}
            //else
            //{
            //    _hitInfo.point = _end;
            //    return false;
            //}

            lc_outPnt.Set(0, 0, 0);    // = Vector3.zero;
            _hitInfo.sqrDist = Mathf.Infinity;
            lc_curDist       = 0;
            lc_Intersects    = false;

#if UNITY_EDITOR
            if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting))
            {
                Debug.DrawLine(_origin, _end, new Color(.2f, .2f, .2f, .2f));
            }
#endif

            for (int e = 0; e < visibleEdges.Count; e++)
            {
                if (LineIntersects(visibleEdges[e].PointA.position, visibleEdges[e].PointB.position, _origin, _end, ref lc_outPnt))
                {
                    lc_curDist = Vector3.SqrMagnitude(lc_outPnt - _origin);

                    if (lc_curDist < _hitInfo.sqrDist)
                    {
                        _hitInfo.sqrDist = lc_curDist;
                        _hitInfo.point.Set(lc_outPnt.x, lc_outPnt.y, lc_outPnt.z);    // +(Vector3)(-edge.Normal);
                        //_hitInfo.obstructor = edge.Parent as VLSObstructor;
                        lc_Intersects = true;
                    }
                }
            }

            if (!lc_Intersects)
            {
                _hitInfo.point = _end;
                //_hitInfo.obstructor = null;
            }

            //_hitInfo.direction = (_hitInfo.point - _origin).normalized;

#if UNITY_EDITOR
            if (VLSDebug.IsModeActive(VLSDebugMode.Raycasting))
            {
                Debug.DrawLine(_origin, _hitInfo.point, new Color(.8f, .8f, .2f, .8f));
            }
#endif

            return(lc_Intersects);
        }
        protected virtual void DebugBounds(Color _color)
        {
            if (!VLSDebug.IsModeActive(VLSDebugMode.Bounds))
            {
                return;
            }

            Gizmos.color = (isActive) ? _color : Color.gray;
            Gizmos.DrawWireCube(bounds.center, bounds.size);
        }
        protected virtual void DebugShape(Color _color, bool _force = false)
        {
            if (!_force && !VLSDebug.IsModeActive(VLSDebugMode.Geometry))
            {
                return;
            }

            Gizmos.color = (isActive) ? _color : Color.gray;
            for (int i = 0; i < edges.Count; i++)
            {
                Gizmos.DrawLine(edges[i].PointA.position, edges[i].PointB.position);
            }
        }
        protected virtual void DebugNormals(Color _color)
        {
            if (!VLSDebug.IsModeActive(VLSDebugMode.Geometry))
            {
                return;
            }

#if UNITY_EDITOR
            Gizmos.color = _color;
            for (int i = 0; i < edges.Count; i++)
            {
                Gizmos.DrawRay((edges[i].PointA.position + edges[i].PointB.position) * 0.5f, edges[i].Normal * UnityEditor.HandleUtility.GetHandleSize(transform.position) * 0.5f);
            }
#endif
        }
Example #5
0
        void OnGUI()
        {
            int value = 0;

            System.Collections.Generic.List <string> layerOptions = new System.Collections.Generic.List <string>();
            for (int i = 0; i < 31; i++)
            {
                string layerName = LayerMask.LayerToName(i);
                if (layerName.Length > 0)
                {
                    layerOptions.Add(layerName);
                }
            }

            EditorGUI.indentLevel++;
            {
                EditorGUILayout.LabelField("Default Settings");
                EditorGUI.indentLevel++;
                {
                    VLSGlobals.DEFAULT_LIGHT_LAYER        = EditorGUILayout.LayerField("Light Layer", VLSGlobals.DEFAULT_LIGHT_LAYER);
                    VLSGlobals.DEFAULT_LIGHT_SHADOW_LAYER = EditorGUILayout.MaskField("Light ShadowLayer", (int)VLSGlobals.DEFAULT_LIGHT_SHADOW_LAYER, layerOptions.ToArray());
                    VLSGlobals.DEFAULT_LIGHT_SCALE        = EditorGUILayout.FloatField("Scale", VLSGlobals.DEFAULT_LIGHT_SCALE);
                }
                EditorGUI.indentLevel--;

                EditorGUILayout.Space();

                EditorGUILayout.LabelField("Debuging");
                EditorGUI.indentLevel++;
                {
                    value += (EditorGUILayout.Toggle("Geometry", VLSDebug.IsModeActive(VLSDebugMode.Geometry))) ? 1 : 0;
                    value += (EditorGUILayout.Toggle("Bounds", VLSDebug.IsModeActive(VLSDebugMode.Bounds))) ? 2 : 0;
                    value += (EditorGUILayout.Toggle("Raycasting", VLSDebug.IsModeActive(VLSDebugMode.Raycasting))) ? 4 : 0;
                }
                EditorGUI.indentLevel--;
            }
            //GUILayout.Label(System.Convert.ToString((VLSDebugMode)value));

            if (GUI.changed)
            {
                VLSDebug.SetDebugMode((VLSDebugMode)value);
                VLSGlobals.SaveEditorPrefs();
                SceneView.RepaintAll();
            }
        }
        protected override void DebugShape(Color _color, bool _force = false)
        {
            if (!_force && !VLSDebug.IsModeActive(VLSDebugMode.Geometry))
            {
                return;
            }

            base.DebugShape(new Color(_color.r, _color.g, _color.b, 0.1f), _force);

            Gizmos.color = _color;
            if (buffer.VertexCount > 0)
            {
                for (int i = 0; i < buffer.VertexCount - 1; i++)
                {
                    Gizmos.DrawLine(transform.TransformPoint(buffer.vertices[i].position), transform.TransformPoint(buffer.vertices[(i + 1) % (buffer.VertexCount - 1)].position));
                }
            }
        }
        //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
        }