/// <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);
        }
Esempio n. 4
0
        public override void Generate(ISystemContainer systemContainer, GeneratedBranch generatedBranch, IEntity branch, IRandom random, IProgress<string> progress)
        {
            progress.Report("Placing stairs");

            BranchGenerator.PlaceStairs(systemContainer, generatedBranch, random);
        }