/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.lib.utils;
import net.minecraftforge.common.util.ForgeDirection;
public final class MatrixTranformations {
/**
* Deactivate constructor
*/
private MatrixTranformations() {
}
/**
* Mirrors the array on the Y axis by calculating offsets from 0.5F
*
* @param targetArray
*/
public static void mirrorY(float[][] targetArray) {
float temp = targetArray[1][0];
targetArray[1][0] = (targetArray[1][1] - 0.5F) * -1F + 0.5F; // 1 -> 0.5F -> -0.5F -> 0F
targetArray[1][1] = (temp - 0.5F) * -1F + 0.5F; // 0 -> -0.5F -> 0.5F -> 1F
}
/**
* Shifts the coordinates around effectively rotating something. Zero state
* is DOWN then -> NORTH -> WEST Note - To obtain Position, do a mirrorY() before
* rotating
*
* @param targetArray the array that should be rotated
*/
public static void rotate(float[][] targetArray) {
for (int i = 0; i < 2; i++) {
float temp = targetArray[2][i];
targetArray[2][i] = targetArray[1][i];
targetArray[1][i] = targetArray[0][i];
targetArray[0][i] = temp;
}
}
/**
* @param targetArray the array that should be transformed
* @param direction
*/
public static void transform(float[][] targetArray, ForgeDirection direction) {
if ((direction.ordinal() & 0x1) == 1) {
mirrorY(targetArray);
}
for (int i = 0; i < (direction.ordinal() >> 1); i++) {
rotate(targetArray);
}
}
/**
* Clones both dimensions of a float[][]
*
* @param source the float[][] to deepClone
*/
public static float[][] deepClone(float[][] source) {
float[][] target = source.clone();
for (int i = 0; i < target.length; i++) {
target[i] = source[i].clone();
}
return target;
}
}