All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.brashmonkey.spriter.ik.SpriterCCDResolver Maven / Gradle / Ivy

There is a newer version: 1.1
Show newest version
package com.brashmonkey.spriter.ik;

import com.brashmonkey.spriter.SpriterCalculator;
import com.brashmonkey.spriter.draw.AbstractDrawer;
import com.brashmonkey.spriter.objects.SpriterAbstractObject;
import com.brashmonkey.spriter.objects.SpriterBone;
import com.brashmonkey.spriter.player.SpriterAbstractPlayer;

public class SpriterCCDResolver extends SpriterIKResolver {

	@Override
	public void resolve(float x, float y, int chainLength,	SpriterAbstractObject effector, SpriterAbstractPlayer player) {
		super.updateRecursively(player, effector);
		float xx = effector.getX()+(float)Math.cos(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX(),
				yy = effector.getY()+(float)Math.sin(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
		effector.setAngle(SpriterCalculator.angleBetween(effector.getX(), effector.getY(), x, y));
		if(player.getFlipX() == -1) effector.setAngle(effector.getAngle()+180f);
		SpriterBone parent = null;
		if(effector.hasParent()){ 
			parent = player.getRuntimeBones()[effector.getParentId()];
			//effector.copyValuesTo(temp);
			//SpriterCalculator.reTranslateRelative(parent, temp);
			//if(effector instanceof SpriterBone)	temp.copyValuesTo(player.lastFrame.getBones()[effector.getId()]);
			//else temp.copyValuesTo(player.lastFrame.getObjects()[effector.getId()]);
		}
		for(int i = 0; i < chainLength && parent != null; i++){
			if(SpriterCalculator.distanceBetween(xx, yy, x, y) <= this.tolerance){
				SpriterBone p = null;
				if(parent.hasParent()) p = player.getRuntimeBones()[parent.getParentId()];
				int j = 0;
				while(p != null && j < chainLength){
					super.updateRecursively(player, p);
					if(p.hasParent()) p = player.getRuntimeBones()[p.getParentId()];
					else p = null;
					j++;
				}
				return;
			}
			parent.setAngle(parent.getAngle() + SpriterCalculator.angleDifference(SpriterCalculator.angleBetween(parent.getX(), parent.getY(), x, y),
					SpriterCalculator.angleBetween(parent.getX(), parent.getY(), xx, yy)));
			super.updateRecursively(player, parent);
			if(parent.hasParent())	parent = player.getRuntimeBones()[parent.getParent().getId()];
			else parent = null;
			xx = effector.getX()+(float)Math.cos(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
			yy = effector.getY()+(float)Math.sin(Math.toRadians(effector.getAngle()))*AbstractDrawer.BONE_LENGTH*effector.getScaleX();
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy