// Path: src/main/java/com/github/worldsender/mcanm/client/model/IModelStateInformation.java
// public interface IModelStateInformation {
// 
// 	IAnimation getAnimation();
// 
// 	float getFrame();
// 
// 	boolean shouldRenderPart(String part);
// 
// }
// 
// Path: src/main/java/com/github/worldsender/mcanm/common/animation/IAnimation.java
// public interface IAnimation {
// 	/**
// 	 * Describes a BoneTransformation, including rotation, translation and scaling. This class is opaque i.e. all
// 	 * getters and setters don't make defensive copies and states can be manipulated from the outside.
// 	 *
// 	 * @author WorldSEnder
// 	 *
// 	 */
// 	public static class BoneTransformation {
// 		public static final BoneTransformation identity = new BoneTransformation();
// 
// 		private static Vector3f identityScale() {
// 			return new Vector3f(1.0F, 1.0F, 1.0F);
// 		}
// 
// 		public final Matrix4f matrix;
// 
// 		public BoneTransformation() {
// 			this(null, null, null);
// 		}
// 
// 		public BoneTransformation(Vector3f translation, Quat4f quat) {
// 			this(translation, quat, identityScale());
// 		}
// 
// 		public BoneTransformation(Vector3f translation, Quat4f quat, Vector3f scale) {
// 			if (quat == null)
// 				quat = new Quat4f();
// 			if (translation == null)
// 				translation = new Vector3f();
// 			if (scale == null)
// 				scale = identityScale();
// 			this.matrix = Utils.fromRTS(quat, translation, scale, new Matrix4f());
// 		}
// 
// 		public Matrix4f getMatrix() {
// 			return matrix;
// 		}
// 	}
// 
// 	/**
// 	 * Stores the bone's current {@link BoneTransformation} in transform(identified by name). <br>
// 	 * If the requested bone is not known to the animation transform is left untouched and this return
// 	 * <code>false</code>. Otherwise transform is set to the bone's current transform state.
// 	 *
// 	 * @param bone
// 	 *            the name of the bone the matrix is requested
// 	 * @param frame
// 	 *            the current frame in the animation
// 	 * @param transform
// 	 *            the transform to set
// 	 * @return if a transformation has been set
// 	 */
// 	public boolean storeCurrentTransformation(String bone, float frame, BoneTransformation transform);
// }


import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import com.github.worldsender.mcanm.client.model.IModelStateInformation;
import com.github.worldsender.mcanm.common.animation.IAnimation;
package com.github.worldsender.mcanm.client.model.util;



public class ModelStateInformation implements IModelStateInformation {
	/**
	 * A suitable {@link Predicate} to return in {@link #getPartPredicate(float)} to render all parts without exception.
	 * Note that this will not test if the currently executed animation wants to display the part.
	 */
	public static final Predicate<String> RENDER_ALL = g -> true;
	/**
	 * A suitable {@link Predicate} to return in {@link #getPartPredicate(float)} to render no parts without exception.
	 * Note that this will not test if the currently executed animation wants to display the part.
	 */
	public static final Predicate<String> RENDER_NONE = g -> false;

	/**
	 * This is a default animation that never returns a pose for any bone it is asked for.
	 */
// Path: src/main/java/com/github/worldsender/mcanm/client/model/IModelStateInformation.java
// public interface IModelStateInformation {
// 
// 	IAnimation getAnimation();
// 
// 	float getFrame();
// 
// 	boolean shouldRenderPart(String part);
// 
// }
// 
// Path: src/main/java/com/github/worldsender/mcanm/common/animation/IAnimation.java
// public interface IAnimation {
// 	/**
// 	 * Describes a BoneTransformation, including rotation, translation and scaling. This class is opaque i.e. all
// 	 * getters and setters don't make defensive copies and states can be manipulated from the outside.
// 	 *
// 	 * @author WorldSEnder
// 	 *
// 	 */
// 	public static class BoneTransformation {
// 		public static final BoneTransformation identity = new BoneTransformation();
// 
// 		private static Vector3f identityScale() {
// 			return new Vector3f(1.0F, 1.0F, 1.0F);
// 		}
// 
// 		public final Matrix4f matrix;
// 
// 		public BoneTransformation() {
// 			this(null, null, null);
// 		}
// 
// 		public BoneTransformation(Vector3f translation, Quat4f quat) {
// 			this(translation, quat, identityScale());
// 		}
// 
// 		public BoneTransformation(Vector3f translation, Quat4f quat, Vector3f scale) {
// 			if (quat == null)
// 				quat = new Quat4f();
// 			if (translation == null)
// 				translation = new Vector3f();
// 			if (scale == null)
// 				scale = identityScale();
// 			this.matrix = Utils.fromRTS(quat, translation, scale, new Matrix4f());
// 		}
// 
// 		public Matrix4f getMatrix() {
// 			return matrix;
// 		}
// 	}
// 
// 	/**
// 	 * Stores the bone's current {@link BoneTransformation} in transform(identified by name). <br>
// 	 * If the requested bone is not known to the animation transform is left untouched and this return
// 	 * <code>false</code>. Otherwise transform is set to the bone's current transform state.
// 	 *
// 	 * @param bone
// 	 *            the name of the bone the matrix is requested
// 	 * @param frame
// 	 *            the current frame in the animation
// 	 * @param transform
// 	 *            the transform to set
// 	 * @return if a transformation has been set
// 	 */
// 	public boolean storeCurrentTransformation(String bone, float frame, BoneTransformation transform);
// }


// Path: src/main/java/com/github/worldsender/mcanm/client/model/util/ModelStateInformation.java
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import com.github.worldsender.mcanm.client.model.IModelStateInformation;
import com.github.worldsender.mcanm.common.animation.IAnimation;

package com.github.worldsender.mcanm.client.model.util;



public class ModelStateInformation implements IModelStateInformation {
	/**
	 * A suitable {@link Predicate} to return in {@link #getPartPredicate(float)} to render all parts without exception.
	 * Note that this will not test if the currently executed animation wants to display the part.
	 */
	public static final Predicate<String> RENDER_ALL = g -> true;
	/**
	 * A suitable {@link Predicate} to return in {@link #getPartPredicate(float)} to render no parts without exception.
	 * Note that this will not test if the currently executed animation wants to display the part.
	 */
	public static final Predicate<String> RENDER_NONE = g -> false;

	/**
	 * This is a default animation that never returns a pose for any bone it is asked for.
	 */
	public static final IAnimation BIND_POSE = new IAnimation() {