
struct autoLocStruct
(
	setCon,
	getChildExtent,
	getMaxValue,
	setBodyMass,
	calcLoc,
	setLoc
)


autoLoc = autoLocStruct()


autoLoc.setCon = function setCon node time =
(
	try
	(
		for i = 1 to node.controller.keys.count do
		(
			try
			(
				tempKey = biped.getKey node.controller i
				if tempKey.time == time then
				(
					tempKey.continuity = 0
				)
			)
			catch()
		)
	)
	catch()
)
setCon = undefined



autoLoc.calcLoc = function calcLoc =
(
	cycleLoc = true
	rotateLoc = #none
	posChange = false
	startLoc = #none
	locoCycle = false
	
	
	
	at time animationRange.start
	(
		startRot = $Bip01.transform.rotation as eulerangles
		startPos = $Bip01.transform.pos
		
		startLFootPos = $'Bip01 L Toe0'.transform.pos
		startRFootPos = $'Bip01 R Toe0'.transform.pos
	)
	
	at time animationRange.end
	(
		endRot = $Bip01.transform.rotation as eulerangles
		endPos = $Bip01.transform.pos
	)
	
	at time ((animationRange.start + animationRange.end) / 2)
		midRot = $Bip01.transform.rotation as eulerangles
	
	at time 2f
	(
		startMidPos = $Bip01.transform.pos
		
		startMidLFootPos = $'Bip01 L Toe0'.transform.pos
		startMidRFootPos = $'Bip01 R Toe0'.transform.pos
	)
	
	at time (animationRange.end - 2)
		endMidPos = $Bip01.transform.pos
	
	

	diffRot = #(endRot.x, endRot.y, endRot.z)
	diffRot[1] -= startRot.x
	diffRot[2] -= startRot.y
	diffRot[3] -= startRot.z
	
	diffMidRot = #(midRot.x, midRot.y, midRot.z)
	diffMidRot[1] -= startRot.x
	diffMidRot[2] -= startRot.y
	diffMidRot[3] -= startRot.z
	
	
	
	diffPos = endPos - startPos	
	diffStartPos = startMidPos - startPos
	diffEndPos = endPos - endMidPos
	
	diffLFootPos = startLFootPos - startMidLFootPos
	diffRFootPos = startRFootPos - startMidRFootPos
	
	diffRotPositiv = copy diffRot #noMap
	
	for i = 1 to 3 do
	(
		if diffPos[i] < 0 then diffPos[i] *= -1
		if diffPos[i] > 10 then posChange = true
		if diffRotPositiv[i] < 0 then diffRotPositiv[i] *= -1
		if diffRotPositiv[i] > 2 then cycleLoc = false	
		--if diffMidRot[i] < 0 then diffMidRot[i] *= -1
		
		if diffLFootPos[i] < 0 then diffLFootPos[i] *= -1
		if diffLFootPos[i] > 10 then locoCycle = true
		
		if diffRFootPos[i] < 0 then diffRFootPos[i] *= -1			
		if diffRFootPos[i] > 10 then locoCycle = true
	)
	
	
	
	if cycleLoc == false then locoCycle = false 
	
	
	diffStartPos = distance startPos startMidPos
	diffEndPos = distance endMidPos endPos
		
	
	
	if diffStartPos < 5 and diffStartPos > 0.4 then
	(
		if locoCycle == false then
			startLoc = #start
	)
	if diffStartPos > 4 and diffEndPos < 2 then
		if locoCycle == false then
			if cycleLoc == false then
				startLoc = #stop	
	
	
	
	
	if diffRot[3] < 140 and diffRot[3] > 80 then
		rotateLoc = #left
	if diffRot[3] < -40 and diffRot[3] > -100 then
		rotateLoc = #right
	
	
	if diffMidRot[3] > -220 and diffMidRot[3] < -140 then	
	(
		if diffRot[3] < -140 and diffRot[3] > -180 then
			rotateLoc = #revL
	)
	
	if diffMidRot[3] > -140 and diffMidRot[3] < -60 then	
	(
		if diffRot[3] < -130 and diffRot[3] > -170 then
			rotateLoc = #revR
	)

--	print ("diffMidRot = " + diffMidRot as String)
--	print ("diffRot = " + diffRot as String)
--	print ("diffEndPos = " + diffEndPos as String)
--	print ("diffStartPos = " + diffStartPos as String)
--	print ("diffLFootPos = " + diffLFootPos as String)
--	print ("diffRFootPos = " + diffRFootPos as String)
--	print ("startLoc = " + startLoc as String)
--	print ("rotateLoc = " + rotateLoc as String)
--	print ("cycleLoc = " + cycleLoc as String)
--	print ("posChange = " + posChange as String)
--	print ("locoCycle = " + locoCycle as String)
	
	
	struct locStruct ( start, rotate, cycle, position )
	local tempValue = locStruct start:startLoc rotate:rotateLoc cycle:cycleLoc position:posChange
	
--	print tempValue
		
	return tempValue
)
calcLoc = undefined


autoLoc.setLoc = function setLoc =
(
	analyseLoc = autoLoc.calcLoc()
	
	cryTools.cryAnim._f.resetLocator()
	
	cryTools.cryAnim._f.moveToBodyMass()
	
	if analyseLoc.rotate != #none then
	(
		at time 10f
		(
			biped.setTransform $Locator_Locomotion #pos $Locator_Locomotion.transform.pos true
			autoLoc.setCon $Locator_Locomotion 10f
		)
		
		at time animationRange.end
			cryTools.cryAnim._f.moveToBodyMass()
		
		
		with animate on
		(
			at time 16f
			(
				case analyseLoc.rotate of
				(
					#left: rotate $Locator_Locomotion (eulerangles 0 0 89)
					#right: rotate $Locator_Locomotion (eulerangles 0 0 -89)
					#revL: rotate $Locator_Locomotion (eulerangles 0 0 179)
					#revR: rotate $Locator_Locomotion (eulerangles 0 0 -179)
				)
				autoLoc.setCon $Locator_Locomotion 16f
			)
			
			at time animationRange.end
			(
				case analyseLoc.rotate of
				(
					#left: rotate $Locator_Locomotion (eulerangles 0 0 89)
					#right: rotate $Locator_Locomotion (eulerangles 0 0 -89)
					#revL: rotate $Locator_Locomotion (eulerangles 0 0 179)
					#revR: rotate $Locator_Locomotion (eulerangles 0 0 -179)
				)	
			)
		)
	)
	else
	(
		if analyseLoc.position == true then
		(
			if analyseLoc.start == #start then
			(
				at time 10f
				(
					biped.setTransform $Locator_Locomotion #pos $Locator_Locomotion.transform.pos true
					autoLoc.setCon $Locator_Locomotion 10f
				)
				
				at time animationRange.end
					cryTools.cryAnim._f.moveToBodyMass()
			)
			else
			(
				at time animationRange.end
					cryTools.cryAnim._f.moveToBodyMass()
			)
		)
		else
		(
			if analyseLoc.start == #start then
				at time animationRange.end
					cryTools.cryAnim._f.moveToBodyMass()
		)
	)
	
	sliderTime = animationRange.start + 1
	sliderTime = animationRange.start
	
)
setLoc = undefined
		
autoLoc.setLoc()




	
	
	