Example #1
0
 public HazDeLuz(VectorDeLuz conReloj, VectorDeLuz contraReloj)
 {
     this.conReloj    = conReloj;
     this.contraReloj = contraReloj;
     origen           = conReloj.origen;
     EstablecerForma();
 }
        public HazDeLuz(ContactFilter2D filtro, VectorDeLuz conReloj, VectorDeLuz contraReloj, float radio = 0f)
        {
            this.radio       = radio;
            this.conReloj    = conReloj;
            this.contraReloj = contraReloj;
            origen           = conReloj.origen;

            //hover = GuazuExtender.PuntoEnConoInfinito(origen, contraReloj.puntoDestino, conReloj.puntoDestino, HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).GetPoint(1f));//GuazuExtender.PuntoEnTriangulo(conReloj.puntoDestino, contraReloj.puntoDestino, origen, HandleUtility.GUIPointToWorldRay(Event.current.mousePosition).GetPoint(1f));

            EstablecerForma(filtro);
        }
    void ConstruirHacesDeLuz()
    {
        hacesDeLuz.Clear();
        destinosDeRayos.Clear();
        var referenciaAngular = 0f;

        if (aperturaDeAngulo < 180f)
        {
            referenciaAngular = -Vector2.SignedAngle(Vector2.right, transform.right);
        }
        foreach (var circulos in colliders.Values)
        {
            foreach (var circulo in circulos)
            {
                var vectorNuevo = new VectorDeLuz(circulo, transform.position, filtro, radio, aperturaDeAngulo, transform.right);
                if (vectorNuevo.enRangoAngular)
                {
                    destinosDeRayos.Add(vectorNuevo);
                }
                if (circulo.radio > 0f)
                {
                    if (vectorNuevo.horizonteAlfa.enRangoAngular)
                    {
                        destinosDeRayos.Add(vectorNuevo.horizonteAlfa);
                    }
                    if (vectorNuevo.horizonteBeta.enRangoAngular)
                    {
                        destinosDeRayos.Add(vectorNuevo.horizonteBeta);
                    }
                }
            }
        }
        //if (destinosDeRayos.Count > 0)
        {
            destinosDeRayos.Sort();
            if (aperturaDeAngulo >= 180f)
            {
                if (destinosDeRayos.Count == 0)
                {
                    referenciaAngular = -Vector2.SignedAngle(Vector2.right, transform.right) * Mathf.Deg2Rad;
                    destinosDeRayos.Add(new VectorDeLuz(referenciaAngular, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                    destinosDeRayos.Add(new VectorDeLuz(referenciaAngular + Mathf.PI * 2f / 3f, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                    destinosDeRayos.Add(new VectorDeLuz(referenciaAngular + Mathf.PI * 4f / 3f, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                }
                destinosDeRayos.Add(destinosDeRayos[0]);
            }
            else
            {
                destinosDeRayos.Add(new VectorDeLuz((referenciaAngular + aperturaDeAngulo) * Mathf.Deg2Rad, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                destinosDeRayos.Insert(0, new VectorDeLuz((referenciaAngular - aperturaDeAngulo) * Mathf.Deg2Rad, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                if (destinosDeRayos.Count == 2)
                {
                    destinosDeRayos.Insert(1, new VectorDeLuz(referenciaAngular * Mathf.Deg2Rad, transform.position, filtro, radio, aperturaDeAngulo, transform.right));
                }
            }
            if (maximaAperturaHaz > 0f)
            {
                float diferenciaAngular         = 0f;
                var   offsetAngular             = (Vector2.Angle(transform.right, Vector2.right) % (maximaAperturaHaz) - maximaAperturaHaz / 2f) * Mathf.Deg2Rad;
                var   maximaAperturaHazRadianes = maximaAperturaHaz * Mathf.Deg2Rad;
                for (int i = 0; i < destinosDeRayos.Count - 1; i++)
                {//aca chequeamos que los rayos de luz no tengan mucha diferencia angular entre si (para que el resultado no sea tan cuadrado en caso de pocos colliders en alguna region y un re fix cuando no hay al menos dos en cuadrantes opuestos
                    diferenciaAngular = destinosDeRayos[i + 1].anguloRelativo - destinosDeRayos[i].anguloRelativo;
                    if (diferenciaAngular > maximaAperturaHazRadianes)
                    {
                        var rayosExtras    = Mathf.FloorToInt(diferenciaAngular / maximaAperturaHazRadianes);
                        var distEntreRayos = diferenciaAngular / (rayosExtras + 1);
                        int indexOffset    = 0;
                        for (int r = 0; r < rayosExtras; r++)
                        {
                            indexOffset++;
                            destinosDeRayos.Insert(i + indexOffset, new VectorDeLuz(destinosDeRayos[i].angulo + distEntreRayos * indexOffset + offsetAngular, transform.position, filtro, radio));
                        }
                        if (i == 0)
                        {
                            destinosDeRayos[0].anguloRelativo += Mathf.PI * 2f;
                        }
                        i += indexOffset;
                    }
                    else if (i == 0)
                    {
                        destinosDeRayos[0].anguloRelativo += Mathf.PI * 2f;
                    }
                }
            }

            for (int i = 0; i < destinosDeRayos.Count - 1; i++)
            {
                hacesDeLuz.Add(new HazDeLuz(filtro, destinosDeRayos[i], destinosDeRayos[i + 1], radio));
            }
        }
    }