@@ -337,7 +337,7 @@ def generate_pinegen_tree(params, palette_name):
337337 branchlength = clamp (params ["branchlength" ], 0 , 3 ) * size * 20
338338 branchdir = clamp (params ["branchdir" ], - 5 , 5 )
339339 leaves = clamp (params ["leaves" ], 0 , 2 )
340- trunk_width = size * params .get ("trunksize" , 2 )
340+ trunk_width = size * params .get ("trunksize" , 2 ) * 1.1 # slightly amplify trunk size strength
341341 max_iter = math .floor (100 * size / 5 )
342342 fixed_size = 5
343343
@@ -511,7 +511,8 @@ def _preview_export(self, voxels, palette, leaf_indices, trunk_indices, prefix):
511511 shrink = grid_size / orig_GRID
512512 params_preview = params .copy ()
513513 params_preview ['size' ] *= shrink
514- params_preview ['trunksize' ] *= shrink
514+ # remove extra shrink on trunk size so thickness varies in preview
515+ # params_preview['trunksize'] *= shrink
515516 params_preview ['trunkheight' ] *= shrink
516517 vox , palette = generate_pinegen_tree (params_preview , palette_name )
517518 finally :
@@ -547,6 +548,8 @@ def reset():
547548 if tooltip is not None :
548549 row .bind ("<Enter>" , lambda e : status_var .set (tooltip ))
549550 row .bind ("<Leave>" , lambda e : status_var .set ("Ready" ))
551+ # update displayed value whenever the variable changes
552+ var .trace_add ('write' , lambda * args , v = var , lbl = val_label : lbl .config (text = f"{ v .get ():.2f} " if isinstance (v .get (), float ) else str (v .get ())))
550553 return row
551554
552555def build_treegen_gui (tab ):
@@ -558,7 +561,7 @@ def build_treegen_gui(tab):
558561 preview_label_tree = ttk .Label (tab )
559562 preview_label_tree .pack (side = "right" , anchor = "n" , padx = (20 ,0 ), pady = (20 ,10 ))
560563
561- ttk .Label (tab , text = "Treegen v1.4 🌳 by NGNT" , font = ("Arial" , 14 , "bold" )).pack ()
564+ ttk .Label (tab , text = "Treegen v1.4.1 🌳 by NGNT" , font = ("Arial" , 14 , "bold" )).pack ()
562565
563566 # === Palette dropdown
564567 tree_palette_path = resource_path ("palettes/tree" )
@@ -587,7 +590,7 @@ def build_treegen_gui(tab):
587590
588591 slider_defs = [
589592 ("Size" , controls ["size" ], 0.1 , 3.0 ),
590- ("Trunk Size" , controls ["trunksize" ], 0.1 , 3.0 ),
593+ ("Trunk Size" , controls ["trunksize" ], 0.1 , 1.2 ),
591594 ("Spread" , controls ["spread" ], 0.0 , 1.0 ),
592595 ("Twist" , controls ["twisted" ], 0.0 , 1.0 ),
593596 ("Leafiness" , controls ["leaves" ], 0.0 , 3.0 ),
@@ -635,6 +638,14 @@ def update_preview(*args):
635638 # initial preview
636639 update_preview ()
637640
641+ # Randomize sliders
642+ def randomize_sliders ():
643+ for _ , var , mn , mx in slider_defs :
644+ if isinstance (var , tk .DoubleVar ):
645+ var .set (random .uniform (mn , mx ))
646+ elif isinstance (var , tk .IntVar ):
647+ var .set (random .randint (int (mn ), int (mx )))
648+ update_preview ()
638649 def generate ():
639650 try :
640651 # Collect and validate parameters via dataclass
@@ -652,8 +663,11 @@ def generate():
652663 except Exception as e :
653664 messagebox .showerror ("Error" , str (e ))
654665 controls ["status" ].set ("⚠️ Generation failed" )
655-
656- ttk .Button (tab , text = "🌳 Generate Tree" , command = generate ).pack (pady = 10 )
666+ # group Randomize and Generate side by side
667+ btn_frame = ttk .Frame (tab )
668+ btn_frame .pack (pady = 10 )
669+ ttk .Button (btn_frame , text = "🔀 Randomize" , command = randomize_sliders ).pack (side = "left" , padx = (0 ,5 ))
670+ ttk .Button (btn_frame , text = "🌳 Generate Tree" , command = generate ).pack (side = "left" )
657671 ttk .Label (tab , textvariable = controls ["status" ]).pack (pady = 5 )
658672
659673 return controls
@@ -667,7 +681,7 @@ def build_pinegen_gui(tab):
667681 preview_label_pine = ttk .Label (tab )
668682 preview_label_pine .pack (side = "right" , anchor = "n" , padx = (20 ,0 ), pady = (20 ,10 ))
669683
670- ttk .Label (tab , text = "Pinegen v1.4 🌲 by NGNT" , font = ("Arial" , 14 , "bold" )).pack ()
684+ ttk .Label (tab , text = "Pinegen v1.4.1 🌲 by NGNT" , font = ("Arial" , 14 , "bold" )).pack ()
671685
672686 pine_palette_path = resource_path ("palettes/pine" )
673687 palette_files = [f for f in os .listdir (pine_palette_path ) if f .endswith (".png" )]
@@ -748,6 +762,14 @@ def update_pine_preview(*args):
748762 # initial pine preview
749763 update_pine_preview ()
750764
765+ # Randomize sliders
766+ def randomize_sliders ():
767+ for _ , var , mn , mx in slider_defs :
768+ if isinstance (var , tk .DoubleVar ):
769+ var .set (random .uniform (mn , mx ))
770+ elif isinstance (var , tk .IntVar ):
771+ var .set (random .randint (int (mn ), int (mx )))
772+ update_pine_preview ()
751773 def generate ():
752774 try :
753775 # Collect and validate parameters via dataclass
@@ -765,8 +787,11 @@ def generate():
765787 except Exception as e :
766788 messagebox .showerror ("Error" , str (e ))
767789 controls ["status" ].set ("⚠️ Generation failed" )
768-
769- ttk .Button (tab , text = "🌲 Generate Pine Tree" , command = generate ).pack (pady = 10 )
790+ # group Randomize and Generate side by side
791+ btn_frame = ttk .Frame (tab )
792+ btn_frame .pack (pady = 10 )
793+ ttk .Button (btn_frame , text = "🔀 Randomize" , command = randomize_sliders ).pack (side = "left" , padx = (0 ,5 ))
794+ ttk .Button (btn_frame , text = "🌲 Generate Pine Tree" , command = generate ).pack (side = "left" )
770795 ttk .Label (tab , textvariable = controls ["status" ]).pack (pady = 5 )
771796
772797 return controls
0 commit comments