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)); } } }