private void CalculateSortedFrontFaces( IEnumerable <Opaque> opaqueObjs, LightViewTriangle lightTriangle) { Profiler.BeginSample("Calculate shadow front faces"); sortedFrontFaces.Clear(); foreach (Opaque opaque in opaqueObjs) { if (lightTriangle.CalculateFrontFace(opaque) is LineSegment frontFace) { sortedFrontFaces.Add(System.Tuple.Create(frontFace, opaque)); } } sortedFrontFaces.Add(System.Tuple.Create(lightTriangle.FarEdge(), (Opaque)null)); Profiler.EndSample(); //foreach (var pair in sortedFrontFaces) { // Debug.Log(pair.Item1 + ", " + pair.Item2); // Debug.Log( // lightTriangle.Angle(pair.Item1.p1) + ", " + // lightTriangle.Angle(pair.Item1.p2)); //} //MinimalUnion<Opaque>.CalculateAndSort(ref sortedFrontFaces, lightTriangle.GetOrigin(), lightTriangle.Angle); //MinimalUnionImproved<Opaque>.SortedMinimalUnion(ref sortedFrontFaces, lightTriangle.GetOrigin(), lightTriangle.Angle); MinimalUnionImprovedAgain <Opaque> .SortedMinimalUnion(ref sortedFrontFaces, lightTriangle.GetOrigin(), lightTriangle.Angle); //foreach (var pair in sortedFrontFaces) { // Debug.Log(pair.Item1 + ", " + pair.Item2); // Debug.Log( // lightTriangle.Angle(pair.Item1.p1) + ", " + // lightTriangle.Angle(pair.Item1.p2)); //} }
void Update() { #if UNITY_EDITOR bool selected = UnityEditor.Selection.activeGameObject == gameObject; #else bool selected = true; #endif if (selected) { segsCopy.Clear(); foreach (var item in segs) { segsCopy.Add(item.ToTuple()); } MinimalUnionImprovedAgain <string> .SortedMinimalUnion( ref segsCopy, lightPosition, (Vector2 vec) => Vector2.SignedAngle(metricStart, vec - lightPosition) ); } if (!Input.GetMouseButton(0)) { return; } if (MouseMove(ref lightPosition)) { return; } for (int i = 0; i < segs.Count; i++) { var seg = segs[i]; if (MouseMove(ref seg)) { segs[i] = seg; break; } } }