--"Auto IK Stretch Script" written by Tyson Ibele based on the original
--script controller by Michael Comet (comet-cartoons.com)

global lowerleg
global endbone
global ikchainpoint
global IKscript
global distance1
global numbones1
global parentbones = #()

rollout autoIKrollout "Auto IK Stretch"
(
	button autoik "Make the chain stretchy!" width:150 height:30
	
	on autoik pressed do
	(
		if selection != undefined then
		(
			ikchainpoint = selection[1]
			print ikchainpoint.name
			ikchainpointfixindex = 1
			while ikchainpointfixindex != undefined do
			(
				ikchainpointfixindex = findstring (ikchainpoint.name as string) " "
				ikchainpointfix = (ikchainpoint.name as string)
				if ikchainpointfixindex != undefined then
					ikchainpoint.name = ((replace ikchainpointfix ikchainpointfixindex 1 "_") as name)
			)		
			ikchainpoint.name = uniquename ikchainpoint.name
			
			
			
			endbone = ikchainpoint.controller.endjoint
			startjoint = ikchainpoint.controller.endjoint
			numbones1 = 0
			while startjoint != ikchainpoint.controller.startjoint do
			(
				startjoint = startjoint.parent
				numbones1 += 1
			
			)
			parentbones[1] = endbone.parent
			parentbones.count = 1
			for i in 1 to (numbones1-1) do
			(
				parentbones[i+1] = parentbones[i].parent	
					
			)
			for j in 1 to numbones1 do
			(
				parentbonesfixindex = 1
				while parentbonesfixindex != undefined do
				(
					parentbonesfixindex = findstring (parentbones[j].name as string) " "
					parentbonesfix = (parentbones[j].name as string)
					if parentbonesfixindex != undefined then
						parentbones[j].name = ((replace parentbonesfix parentbonesfixindex 1 "_") as name)
				)
				
			)
	
			endbonefixindex = 1
			while endbonefixindex != undefined do
			(
				endbonefixindex = findstring (endbone.name as string) " "
				endbonefix = (endbone.name as string)
				if endbonefixindex != undefined then
					endbone.name = ((replace endbonefix endbonefixindex 1 "_") as name)
			)		
			endbone.name = uniquename endbone.name
			for k in 1 to parentbones.count do
			(
				parentbones[k].name = uniquename parentbones[k].name
			)
		
		
		
		
		
		
		
		
		
			if endbone != undefined and ikchainpoint != undefined then
			(
				for l in 1 to parentbones.count do
				(
					parentbones[l].position.controller=Position_XYZ()
					parentbones[l].position.x_position.controller=float_script()
				)
				endbone.position.controller=Position_XYZ()
				endbone.position.x_position.controller=float_script()	
				
				
				distance1 = distance ikchainpoint.pos parentbones[1].pos
				for m in 1 to parentbones.count-1 do
				(
					distance1 = distance1 + (distance parentbones[m] parentbones[m+1]) 			
				
				)
				for q in 1 to (parentbones.count-1) do
				(
				IKscript = ("dependsOn $" + (parentbones[parentbones.count].name as string) + " $" + (ikchainpoint.name as string) + ".pos.controller; \r" +
							"d = distance $" + (parentbones[parentbones.count].name as string) + ".pos $" + (ikchainpoint.name as string) + ".pos; \r" +
							"st = (d - " + (distance1 as string) + "); \r" +
							"orig = " + (parentbones[q].position.x_position.controller.script as string) + " \r" +
							"if (st < 0) then \r \t st = 0; \r" +
							"p = orig + (st/" + (parentbones.count as string) + ");")
							
				parentbones[q].position.x_position.controller.script = IKscript
				)			
				IKscript2 = ("dependsOn $" + (parentbones[parentbones.count].name as string) + " $" + (ikchainpoint.name as string) + ".pos.controller; \r" +
							"d = distance $" + (parentbones[parentbones.count].name as string) + ".pos $" + (ikchainpoint.name as string) + ".pos; \r" +
							"st = (d - " + (distance1 as string) + "); \r" +
							"orig = " + (endbone.position.x_position.controller.script as string) + " \r" +
							"if (st < 0) then \r \t st = 0; \r" +
							"p = orig + (st/" + (parentbones.count as string) + ");")
							
				
				endbone.position.x_position.controller.script = IKscript2		
			)
			
			endbone = undefined
			
			ikchainpoint = undefined
		)
	
	)
	
	
	
)
ikit=newrolloutfloater "Auto IK Stretch" 250 80 350 300
addrollout autoIKrollout ikit

