Trunk Generator

Maxscript
 avatar
JO00
plain_text
4 months ago
7.3 kB
3
Indexable
rollout bob_ross "Tree Maker" width:330 height:375
(	
	global tree_location=[0,0,0]
	global arr_spline_for_del=#()
	
	fn thisshape =
	(
		local sp = splineShape()
		addnewSpline sp
		addKnot sp 1 #corner #line [20,10,0]
		addKnot sp 1 #corner #line [-20,11,0]
		addKnot sp 1 #corner #line [-20,-11,0]
		addKnot sp 1 #corner #line [20,-10,0]
		close sp 1
		updateShape sp
		select sp
		subobjectlevel = 1
		setKnotSelection sp 1 #(1,4) keep:false
		weldSpline sp 21.0
		local knotCount = numknots sp
		if (knotCount != 3) do
		 throw ("Spline should have 3 knots, found "+ (knotCount as string))
	)
	
	label 'lbl_bob_quote' "There are no mistakes, only happy accidents. bob ross" pos:[104,334] width:216 height:56 align:#left
	pickButton 'btn_curve_tree_trunk' "Pick Curve here!" pos:[8,24] width:100 height:22 align:#left
	pickButton 'btn_created_tree' "Slot_created_Tree_here" pos:[8,24] width:100 height:22 align:#left
	spinner spin_tree_thickness "Thickness of Tree" align:#left pos:[64,100] range:[0,20,3]
	button 'btn2' "make me that tree" pos:[64,136] width:192 height:26 align:#left
	button 'btn3_del' "delete selected" pos:[64,166] width:192 height:26 align:#left
	slider 'sld_wiggle' "Tree_Trunk_Wiggle" pos:[74,218] width:165 height:44 range:[0,1,1] align:#left ticks:3 type:#float
	slider 'sld_height' "Tree_Trunk_Height" pos:[74,278] width:165 height:44 range:[0.1,1,1] align:#left ticks:3 type:#float
	
	fn making_tr length_spline =
	(
		--local spline_make = splineShape()
		spline_make=line transform:(matrix3 [1,0,0] [0,0,1] [0,-1,0] tree_location) isSelected:on
		print"appended"
		append arr_spline_for_del spline_make
		--spline_make.pos=tree_location
		spline_make.name="Tree Trunk"
			--select spline_make
			--actionMan.executeAction 0 "50001"
			--select spline_make
		addnewSpline spline_make
		spline_make.render_renderable=true
		spline_make.render_displayRenderMesh =true
			
		spline_make.render_thickness=1.2*spin_tree_thickness.value
		spline_make.render_sides=15
		
			--spline_make.pos.x=
		pos_trunk_point_1=spline_make.pos
		--print sld_height.value as string
		
		pos_trunk_point_2=[spline_make.pos.x+20*sld_wiggle.value,spline_make.pos.y,spline_make.pos.z+86*sld_height.value]
		pos_trunk_point_3=[spline_make.pos.x+90*sld_wiggle.value,spline_make.pos.y,spline_make.pos.z+160*sld_height.value]
		pos_trunk_point_4=[spline_make.pos.x+80*sld_wiggle.value,spline_make.pos.y-22,spline_make.pos.z+225*sld_height.value]
	
	
		--print spline_make.pos as string
		--print pos_trunk_point_2 as string
		addKnot spline_make 1 #smooth #curve pos_trunk_point_1
		addKnot spline_make 1 #smooth  #curve  pos_trunk_point_2
		addKnot spline_make 1 #smooth  #curve  pos_trunk_point_3
		addKnot spline_make 1 #corner  #line pos_trunk_point_4
		
		updateshape spline_make
		weldSpline spline_make 6.0
		
		print"made spline"
		max modify mode
		convertTo spline_make PolyMeshObject
		subobjectLevel = 0
		---making the trunk more and less thick depending on its scale
		int_verts_total=polyop.getNumVerts spline_make
		ring_count=int_verts_total/12
		float_half_selection=ring_count/3*12 as integer
		arr_vertext_to_select=#()
		for i=1 to float_half_selection do
		(
			append arr_vertext_to_select i
		)
		print "done the append vertex select i"
		subobjectLevel = 1
		polyop.setVertSelection spline_make arr_vertext_to_select
		spline_make.useSoftSel = on
		spline_make.falloff=spline_make.max.z-spline_make.min.z
		--print spline_make.falloff as string
		spline_make.pinch=0.4
		
		print"subobjected"
		--subobjectLevel = 1
		try
		(
			print"pushing mesh"
			modPanel.addModToSelection (Push ()) ui:off
		)
		
		catch 
		(
			print"failed to push"
		)
		--print spin_tree_thickness.value as string
		
		spline_make.modifiers[#Push].Push_Value = spin_tree_thickness.value
		print"modifier done"
		convertTo spline_make PolyMeshObject
		print"converted and alll"
		--maxOps.CollapseNode spline_make ui:off	

		--spline_make.EditablePoly.SetSelection #Vertex #{arr_vertext_to_select}
		
		--now selecting the very bottom and pushing it a bit more plus it again
		
		print"selecting the very bottom and pushing it a bit more plus it again"
		arr_vertext_to_select=#()
		for i=1 to 12 do
		(
			append arr_vertext_to_select i
		)
		polyop.setVertSelection spline_make arr_vertext_to_select
		spline_make.useSoftSel = on
		spline_make.falloff=(spline_make.max.z-spline_make.min.z)*1.5
		--spline_make.pinch=0.4
		subobjectLevel = 1
		modPanel.addModToSelection (Push ()) ui:off
		spline_make.modifiers[#Push].Push_Value = spin_tree_thickness.value*2.5
		convertTo spline_make PolyMeshObject
		--maxOps.CollapseNode spline_make ui:off
			
		print"selecting bottom"

		polyop.setVertSelection spline_make arr_vertext_to_select
		--spline_make.useSoftSel = on
		--spline_make.falloff=(spline_make.max.z-spline_make.min.z)/4
		--spline_make.pinch=0.4
		subobjectLevel = 1
		modPanel.addModToSelection (Push ()) ui:off
		spline_make.modifiers[#Push].Push_Value = spin_tree_thickness.value*3
		subobjectLevel = 0
		convertTo spline_make Editable_Poly
		--convertToMesh spline_make

		--maxOps.CollapseNode spline_make ui:off
			
								
		print "complete all"
	)
	
	
		
	fn making_trunk splineinput =
	(
		print"starting"
		tree_location=getKnotPoint splineinput 1 1
		splineinput.render_renderable=true
		splineinput.render_displayRenderMesh =true
		
		--print splineinput.render_length as string
		float_length=splineinput.render_length 
		print"doing float length"
		if float_length<10 then
		(
			float_length=12
			print float_length as string
			--print"spline too short lengthing"
		)
		--print Tree_Trunk.render_useViewportSettings as string
		making_tr(float_length)
		print"deciding length"
		--Tree_Trunk.pos=[20,0,0]
	)
	
	
	on btn_curve_tree_trunk picked picked_item do
	(
		try
		(
			if classof picked_item == Line then
			(
				--print" its a line"
				btn_curve_tree_trunk.text="Picked "+picked_item.name as string
			)
			else
			(
				btn_curve_tree_trunk.object=undefined
			)
		)
		catch
		(
			print"did nottt work oops"
		)
	)
	on btn_curve_tree_trunk	rightclick do
	(
		btn_curve_tree_trunk.text="Pick Curve here!"
		btn_curve_tree_trunk.object=undefined
	)
	on btn2 pressed do
	(
		try
		(
			spline_picked=btn_curve_tree_trunk.object
			--print spline_picked as string
			if spline_picked!=undefined do
			(
				print spline_picked as string
				making_trunk(spline_picked)
			)
			--thisshape()	
		)
		catch
		(
			print "Nothing is selected! Trying again" 
			delete arr_spline_for_del[1]
			arr_spline_for_del=#()
			try
			(
				spline_picked=btn_curve_tree_trunk.object
				--print spline_picked as string
				if spline_picked!=undefined do
				(
					print spline_picked as string
					making_trunk(spline_picked)
				)	
			)
			catch
			(
				print"Failure again"
				delete arr_spline_for_del[1]
				arr_spline_for_del=#()
			)
		)

	)
	on btn3_del pressed do
	(
		try
		(
			for obj in getCurrentSelection() do
			(
				delete obj
			)
		)
		catch
		(
			print "couldnt delete for some reason"
		)
	)
)

CreateDialog bob_ross
Editor is loading...
Leave a Comment