An object that branches in the following way:

pseudorandom seed (so the same tree is generated each time for this object  this would be a perinstance value, so you could instantiate copies of the same below data for a forest of trees and they would all be varied within the definition)

minmax branch_iterations (at least 1, since we have to have a trunk!) We will generate between min and max iterations (probably need a hard limit, say 6, to stop people making treethemed decompressiondatabombs!)

subiteration_terminate_use_last_object_list  if TRUE, and a branch terminates before the end iteration (because 0 branches was defined as a min), use the branchend object list from the final branch level.
for each branch iteration level:
 minmax radius, radius of each branch in this level will be between min and max meters.
 minmax length, length of each branch in this level will be between min and max meters.
 material to use (color, texture). If empty use parent.
 list of potential objects (eg leaves, fruit, beehive, coral polyp, lollipops!) and their probabilities of spawning at the branch end (this should include branches that are not endbranches  if the user doesn’t want that, just leave the list empty for intermediate levels)
 minmax number of child branches to sprout, this branch will have between min and max shoots from its end.
(Underflow case: if less levels are defined than generated, use final defined level data)
Tree is drawn with branchdefinition lines* scaled so tree fits within bounding box (which, amongst other things, would allow flat trees)
* lines defining centers of branches, but not the 3D branches themselves, which remain unflattened hemisphereendedcylinders.
So… examples…
 Iteration 1  draw trunk, 1% chance place a ‘behive’ object at branch point. Sprout 24 branches.
 Iteration 2  draw branches. Sprout 24 sub branches.
 Iteration 3  draw smaller branches, 5% chance place a ‘fruit’ object at branch point. Sprout 48 branches.
 Iteration 4  draw smallest branches, 100% chance place ‘bunch of leaves’ object at branch end.
Pine tree:
 Iteration 1  draw trunk, 100% chance, place ‘big coneshaped bunch of pine leaves’ on end. (this still allows you to vary the trunk length pseudorandomly)
Possibly the tree object can make some of its data (eg: the seed value as well as the spawning branch data) available to the object it is spawning so that that object can then adjust itself too (in this example, the pine bush could scale itself a bit randomly).
Or… (demonstrate that “tree” doesn’t have to mean /that/ kind of tree!)…
 Iteration 1  draw trunk. Sprout 1020 branches
 Iteration 2  draw branches. Sprout 1020 branches
 Iteration 3  draw branches. 50% chance of red coral polyp, 25% chance of orange coral polyp, 25% chance of yellow coral polyp object.
Hmmmm. This could get quite elaborate!
I’m sure I have explained this as clear as mud!