public void GenerateLightningBoltStandard(LightningBolt bolt, Vector3 start, Vector3 end, int generation, int totalGenerations, float offsetAmount, LightningBoltParameters p) { if (generation < 1) { return; } LightningBoltSegmentGroup group = bolt.AddGroup(); group.Segments.Add(new LightningBoltSegment { Start = start, End = end }); // every generation, get the percentage we have gone down and square it, this makes lines thinner float widthMultiplier = (float)generation / (float)totalGenerations; widthMultiplier *= widthMultiplier; Vector3 randomVector; group.LineWidth = p.TrunkWidth * widthMultiplier; group.Generation = generation; group.Color = new Color32(byte.MaxValue, byte.MaxValue, byte.MaxValue, (byte)(255.0f * widthMultiplier)); group.EndWidthMultiplier = p.EndWidthMultiplier * p.ForkEndWidthMultiplier; if (offsetAmount <= 0.0f) { offsetAmount = (end - start).magnitude * p.ChaosFactor; } while (generation-- > 0) { int previousStartIndex = group.StartIndex; group.StartIndex = group.Segments.Count; for (int i = previousStartIndex; i < group.StartIndex; i++) { start = group.Segments[i].Start; end = group.Segments[i].End; // determine a new direction for the split Vector3 midPoint = (start + end) * 0.5f; // adjust the mid point to be the new location RandomVector(bolt, ref start, ref end, offsetAmount, p.Random, out randomVector); midPoint += randomVector; // add two new segments group.Segments.Add(new LightningBoltSegment { Start = start, End = midPoint }); group.Segments.Add(new LightningBoltSegment { Start = midPoint, End = end }); CreateFork(bolt, p, generation, totalGenerations, start, midPoint); } // halve the distance the lightning can deviate for each generation down offsetAmount *= 0.5f; } }
public LightningBoltSegmentGroup CreateGroup() { LightningBoltSegmentGroup g; if (groupCache.Count == 0) { g = new LightningBoltSegmentGroup(); } else { int index = groupCache.Count - 1; g = groupCache[index]; groupCache.RemoveAt(index); } CurrentBolt.AddGroup(g); return(g); }
public void GenerateLightningBoltPath(LightningBolt bolt, Vector3 start, Vector3 end, LightningBoltParameters p) { if (p.Points.Count < 2) { Debug.LogError("Lightning path should have at least two points"); return; } int generation = p.Generations; int totalGenerations = generation; float offsetAmount, d; int smoothingFactor = p.SmoothingFactor - 1; Vector3 distance, randomVector; LightningBoltSegmentGroup group = bolt.AddGroup(); group.LineWidth = p.TrunkWidth; group.Generation = generation--; group.EndWidthMultiplier = p.EndWidthMultiplier; group.Color = Color.white; p.Start = p.Points[0] + start; p.End = p.Points[p.Points.Count - 1] + end; end = p.Start; for (int i = 1; i < p.Points.Count; i++) { start = end; end = p.Points[i]; distance = (end - start); d = Mathf.Sqrt(distance.sqrMagnitude); if (p.ChaosFactor > 0.0f) { if (bolt.CameraMode == CameraMode.Perspective) { end += (d * p.ChaosFactor * RandomDirection3D(p.Random)); } else if (bolt.CameraMode == CameraMode.OrthographicXY) { end += (d * p.ChaosFactor * RandomDirection2D(p.Random)); } else { end += (d * p.ChaosFactor * RandomDirection2DXZ(p.Random)); } distance = (end - start); } group.Segments.Add(new LightningBoltSegment { Start = start, End = end }); offsetAmount = d * p.ChaosFactor; RandomVector(bolt, ref start, ref end, offsetAmount, p.Random, out randomVector); if (ShouldCreateFork(p, generation, totalGenerations)) { Vector3 branchVector = distance * p.ForkMultiplier() * smoothingFactor * 0.5f; Vector3 forkEnd = end + branchVector + randomVector; GenerateLightningBoltStandard(bolt, start, forkEnd, generation, totalGenerations, 0.0f, p); } if (--smoothingFactor == 0) { smoothingFactor = p.SmoothingFactor - 1; } } }
public static void ReturnGroupToCache(LightningBoltSegmentGroup group) { groupCache.Add(group); }