public void addBranchesToLimb(TreePart limb, int limbRemaining)
        {
            int    branchSections = (int)(limbRemaining * species.averageBranchLength + (random.NextDouble() * species.branchLengthVariation - species.branchLengthVariation / 2));
            Branch newBranch      = new Branch(this, species.getRect(species.weightedBranchRects, random));

            limb.addPart(newBranch);
            float initialRot = (float)(random.NextDouble() * (Math.PI * 2f));

            newBranch.rotation = initialRot;
            newBranch.performSetup();
            for (int i = 0; i < branchSections; i++)
            {
                Branch newSection = new Branch(this, species.getRect(species.weightedBranchRects, random));
                newBranch.findAnyEnd().addPart(newSection);
                newSection.rotation = ((float)(random.NextDouble() * 0.5 - 0.25f));
                newSection.performSetup();
            }

            Rectangle   leafSprite  = species.getRect(species.weightedLeafRects, random);
            LeafCluster leafCluster = new LeafCluster(this, leafSprite, species.getColor(species.weightedLeafColors, leafSprite, random));

            newBranch.findAnyEnd().addPart(leafCluster);
            leafCluster.depth -= (float)(random.NextDouble() + 0.5);
            leafCluster.performSetup();
            Logger.log("Leaf cluster is on " + (leafCluster.left ? "left" : "right"));
        }
        public void addLimbToPart(TreePart part, bool left, int sectionsUp, int sectionsDown, float rotationOverride = float.MinValue)
        {
            Logger.log("Limb was on the " + (left ? "left" : "right"));
            Limb newLimb = new Limb(this, species.getRect(species.weightedLimbRects, random));

            float initialRot;

            if (rotationOverride == float.MinValue)
            {
                initialRot = species.limbAngle * (left ? -1 : 1);
            }
            else
            {
                initialRot = rotationOverride;
            }

            float depth = (float)(random.NextDouble() * 2 + 1) * (random.Next(2) == 0 ? -1 : 1);

            newLimb.depth    = depth;
            newLimb.rotation = initialRot;
            part.addPart(newLimb);
            newLimb.left = left;
            newLimb.performSetup();
            int sectionsToGrow = (int)(sectionsDown * species.limbGrowth);

            Logger.log("Growing " + sectionsToGrow + " sections on limb...");
            for (int i = 0; i < sectionsToGrow; i++)
            {
                Limb newSection = new Limb(this, species.getRect(species.weightedLimbRects, random));
                newLimb.findAnyEnd(new Type[] { typeof(Limb) }).addPart(newSection);
                newSection.rotation = ((float)(random.NextDouble() * 0.5 - 0.25f));
                newSection.performSetup();
                if (i >= species.minBranchDistance && random.NextDouble() < species.branchFrequency)
                {
                    Logger.log("Adding branch to limb section " + i);
                    if (species.limbAlternate)
                    {
                        addBranchesToLimb(newSection, sectionsToGrow - i);
                    }
                    else
                    {
                        addBranchesToLimb(newSection, sectionsToGrow - i);
                        addBranchesToLimb(newSection, sectionsToGrow - i);
                    }
                    //sectionsBetweenLimbs = (int)(averageLimbInterval + (random.NextDouble() * limbIntervalVariation) - (limbIntervalVariation / 2));
                }
            }
            //newLimb.addGravity(true);
            addBranchesToLimb(newLimb.findAnyEnd(new Type[] { typeof(Limb) }), sectionsToGrow / 2);
        }