public nView RemoveBranch(bTreeBranch branch) { nLog.Debug("Before remove was: " + _session.Game.Paused); if (branch.Parent != null) { branch.Parent.Trim(branch); branch.Tree.Segments = branch.Tree.Trunk.TotalSegments; branch.Tree.Branches = branch.Tree.Trunk.TotalBranches; nLog.Debug("New tree size is {0}, {1}", branch.Tree.Segments, branch.Tree.Branches); } nLog.Debug("After remove was: " + _session.Game.Paused); return View(); }
public bTree() { EditMode = false; Config = null; Trunk = new bTreeBranch() { Parent = null, Angle = 0f, Length = 0.1f, Offset = 0f, Width = 0.01f, Diminish = 0.9f, Trunk = true, IsSegment = false, Tree = this }; }
/** Trim a child branch */ public void Trim(bTreeBranch branch) { if (NextSegment == branch) NextSegment = null; else Branches.Remove(branch); branch.Die(); }
/** Update the size of a branch */ public void UpdateBranchSize(bTreeBranch b, float hours) { if (b.Age < MaxSegmentGrowAge) { b.Length += BranchGrowLengthPerHour * hours; b.Width += BranchGrowWidthPerHour * hours; if (b.Length > MaxBranchSize) b.Length = MaxBranchSize; if (b.Parent == null) { if (b.Width > MaxTrunkSize) b.Width = MaxTrunkSize; } else { if (b.Width > MaxBranchWidth) b.Width = MaxBranchWidth; } if (b.Parent != null) { if (b.Width > b.Parent.WidthAtPoint(b.Offset)) b.Width = b.Parent.WidthAtPoint(b.Offset); } } }
/** Maybe add a leaf if this is a tip segment */ public void MaybeAddLeaf(bTreeBranch b, float hours) { if (b.Trunk) return; // Never trunk //if (b.Length < (MaxBranchSize / 2.0f)) return; // Only on older branches if (b.Tree.Leaves < TotalMaxLeaves) { if ((b.Length > 0.5f) && (b.Leaves.Count < 5)) { if (b.Age < MaxSegmentGrowAge) { var chance = LeafChancePerHour * hours; if (b.NextSegment == null) chance = chance * 2.0f; if (RValue(chance)) { var texture = GetTextureForTreeType(TreeType); var new_leaf = new bLeaf() { Tree = b.Tree, Parent = b, Angle = RValue(0f, 180f), Offset = RValue(0f, b.Length, 0f), Size = 0.001f, MaxSize = RValue(MaxLeafSize, MaxLeafSizeVariation), Texture = texture }; b.Leaves.Add(new_leaf); ++b.Tree.Leaves; nLog.Debug("Added a leaf at offset {2}! New is {0} < {1}", b.Tree.Leaves, TotalMaxLeaves, new_leaf.Offset); } } } } }
/** Add a new segment to the branch, if required */ public void MaybeAddBranchSegment(bTreeBranch b, float hours) { if (b.Age < MaxSegmentGrowAge) { if (b.NextSegment == null) { var length = b.SegmentChainSize; if ((length < MaxSegmentChain) && (b.Tree.Segments < TotalMaxSegments)) { if (RValue(BranchSplitSegmentChancePerHour * hours)) { var new_segment = new bTreeBranch() { Length = 0.1f, Width = 0.1f, Offset = 0f, Parent = b, IsSegment = true, Angle = RValue(0f, BranchSplitSegmentAngleVariation), Diminish = RValue(BranchTaperFactor, 0f, BranchTaperVariation), Trunk = b.Trunk, Tree = b.Tree }; b.NextSegment = new_segment; ++b.Tree.Segments; nLog.Debug("added a new segment"); } } } } }
/** Add a new segment to the branch, if required */ public void MaybeAddBranch(bTreeBranch b, float hours) { if (b.Age < MaxSegmentGrowAge) { if ((b.Branches.Count < MaxBranchCount) && (b.Tree.Branches < TotalMaxBranches)) { var chance = BranchSplitChancePerHour; if ((b.Tree.Age > 20f) && (b.Tree.Branches < 10)) { chance += BoostBranchChange; if (chance > 1.0f) chance = 1.0f; } if (RValue(chance * hours)) { var new_branch = new bTreeBranch() { Length = 0.1f, Width = 0.1f, Offset = RValue(b.Length * 0.5f, b.Length * 0.2f), Parent = b, IsSegment = false, Diminish = RValue(BranchTaperFactor, BranchTaperVariation), Tree = b.Tree, Trunk = false }; if (RValue(0.5f)) new_branch.Angle = -RValue(BranchSplitAngleDownMin, 0f, BranchSplitAngleDownMax); else new_branch.Angle = RValue(BranchSplitAngleUpMin, BranchSplitAngleUpMax, 0f); b.Branches.Add(new_branch); ++b.Tree.Branches; nLog.Debug("added a new branch with angle: {0}", new_branch.Angle); } } } }