/// <summary> /// Attempts to add a branch generator to the list. /// Branches are generated last so as not to mess up vertex order. /// A generator is only added if a randomly selected face doesn't face down. /// </summary> /// <param name="remainingSegments">Remaning number of segments</param> private void AddBranchGenerator(float segmentLength, int remainingSegments) { int ringStartIndex = vertices.Count - 2 * numSides; int faceIndex = Random.Range(0, numSides - 1); //Find the normal of the face int i = ringStartIndex + faceIndex; int j = (faceIndex < numSides - 1) ? i + 1 : ringStartIndex; Vector3 normal = MeshHelper.Normal( vertices[i + numSides], vertices[j + numSides], vertices[i] ); //Only generate if not facing down if (normal.y > 0) { //Find the center of the face Vector3 l = Vector3.Lerp(vertices[i], vertices[i + numSides], 0.5f); Vector3 r = Vector3.Lerp(vertices[j], vertices[j + numSides], 0.5f); Vector3 center = Vector3.Lerp(l, r, 0.5f); float radius = (l - r).magnitude / 2; var generator = new BranchGenerator( tree, mesh, this, center, normal, radius, segmentLength, remainingSegments ); branchGenerators.Add(generator); } }
private GeneratedBranch GenerateBranch(IEntity branchEntity, IEntity sender, Portal portal, IProgress <string> progress) { var generator = new BranchGenerator(); var generatedBranch = generator.Generate(_systemContainer, branchEntity, progress); foreach (Map map in generatedBranch.Maps) { _systemContainer.MapSystem.MapCollection.AddMap(map); } _systemContainer.ActivitySystem.Pop(); _systemContainer.PositionSystem.SetPosition(sender, portal.Destination); _systemContainer.EventSystem.Try(EventType.UsePortal, sender, portal); return(generatedBranch); }
public override void Generate(ISystemContainer systemContainer, GeneratedBranch generatedBranch, IEntity branch, IRandom random, IProgress <string> progress) { progress.Report("Generating random exit portals"); BranchGenerator.PlaceDefaultExitPortal(systemContainer, generatedBranch, random); }
public override void Generate(ISystemContainer systemContainer, GeneratedBranch generatedBranch, IEntity branch, IRandom random, IProgress<string> progress) { progress.Report("Placing stairs"); BranchGenerator.PlaceStairs(systemContainer, generatedBranch, random); }