package openmods.geometry;
import net.minecraftforge.common.util.ForgeDirection;
import openmods.geometry.BlockTextureTransform.TexCoords;
import openmods.geometry.BlockTextureTransform.WorldCoords;
import org.junit.Assert;
import org.junit.Test;
public class BlockTextureTransformTest {
private static final double DELTA = 0.00001;
private static void testInversion(BlockTextureTransform t, ForgeDirection dir, double x, double y, double z) {
TexCoords c = t.worldVecToTextureCoords(dir, x, y, z);
WorldCoords r = t.textureCoordsToWorldVec(dir, c.u, c.v, c.h);
Assert.assertEquals(x, r.x, DELTA);
Assert.assertEquals(y, r.y, DELTA);
Assert.assertEquals(z, r.z, DELTA);
}
public void testInversion(BlockTextureTransform t, ForgeDirection dir) {
testInversion(t, dir, 0, 0, 0);
testInversion(t, dir, 1, 0, 0);
testInversion(t, dir, 0, 1, 0);
testInversion(t, dir, 1, 1, 0);
testInversion(t, dir, 0, 0, 1);
testInversion(t, dir, 1, 0, 1);
testInversion(t, dir, 0, 1, 1);
testInversion(t, dir, 1, 1, 1);
}
public void testInversion(BlockTextureTransform t) {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(t, dir);
}
@Test
public void testDefaultInversions() {
testInversion(BlockTextureTransform.builder().build());
}
@Test
public void testInversionAfterCWRotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().rotateCW(dir).build());
}
@Test
public void testInversionAfterCCWRotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().rotateCCW(dir).build());
}
@Test
public void testInversionAfterUWSwapRotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().swapUV(dir).build());
}
@Test
public void testInversionAfterMirrorURotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().mirrorU(dir).build());
}
@Test
public void testInversionAfterMirrorUVRotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().mirrorUV(dir).build());
}
@Test
public void testInversionAfterMirrorVRotation() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
testInversion(BlockTextureTransform.builder().mirrorV(dir).build());
}
private static void testIdentity(ForgeDirection dir, double x, double y, double z, BlockTextureTransform a, BlockTextureTransform b) {
{
final TexCoords at = a.worldVecToTextureCoords(dir, x, y, z);
final TexCoords bt = b.worldVecToTextureCoords(dir, x, y, z);
Assert.assertEquals(at.u, bt.u, DELTA);
Assert.assertEquals(at.v, bt.v, DELTA);
Assert.assertEquals(at.h, bt.h, DELTA);
}
{
final WorldCoords aw = a.textureCoordsToWorldVec(dir, x, y, z);
final WorldCoords bw = b.textureCoordsToWorldVec(dir, x, y, z);
Assert.assertEquals(aw.x, bw.x, DELTA);
Assert.assertEquals(aw.y, bw.y, DELTA);
Assert.assertEquals(aw.z, bw.z, DELTA);
}
}
private static void testIdentity(final BlockTextureTransform a, final BlockTextureTransform b) {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
testIdentity(dir, 0, 0, 0, a, b);
testIdentity(dir, 0, 1, 0, a, b);
testIdentity(dir, 1, 1, 0, a, b);
testIdentity(dir, 1, 0, 0, a, b);
}
}
@Test
public void testIdentities() {
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
{
final BlockTextureTransform normal = BlockTextureTransform.builder().build();
{
final BlockTextureTransform modified = BlockTextureTransform.builder().rotateCCW(dir).rotateCCW(dir).rotateCCW(dir).rotateCCW(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().rotateCW(dir).rotateCW(dir).rotateCW(dir).rotateCW(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().rotateCW(dir).rotateCCW(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().rotateCCW(dir).rotateCW(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().swapUV(dir).swapUV(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().swapUV(dir).swapUV(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().mirrorU(dir).mirrorU(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().mirrorV(dir).mirrorV(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().mirrorV(dir).mirrorV(dir).build();
testIdentity(normal, modified);
}
{
final BlockTextureTransform modified = BlockTextureTransform.builder().mirrorUV(dir).mirrorU(dir).mirrorV(dir).build();
testIdentity(normal, modified);
}
}
{
final BlockTextureTransform modifiedA = BlockTextureTransform.builder().rotateCW(dir).rotateCW(dir).build();
final BlockTextureTransform modifiedB = BlockTextureTransform.builder().rotateCCW(dir).rotateCCW(dir).build();
testIdentity(modifiedA, modifiedB);
}
{
final BlockTextureTransform modifiedA = BlockTextureTransform.builder().mirrorU(dir).mirrorV(dir).build();
{
final BlockTextureTransform modifiedB = BlockTextureTransform.builder().rotateCCW(dir).rotateCCW(dir).build();
testIdentity(modifiedA, modifiedB);
}
{
final BlockTextureTransform modifiedB = BlockTextureTransform.builder().rotateCW(dir).rotateCW(dir).build();
testIdentity(modifiedA, modifiedB);
}
}
{
final BlockTextureTransform modifiedA = BlockTextureTransform.builder().swapUV(dir).mirrorU(dir).build();
final BlockTextureTransform modifiedB = BlockTextureTransform.builder().rotateCW(dir).build();
testIdentity(modifiedA, modifiedB);
}
{
final BlockTextureTransform modifiedA = BlockTextureTransform.builder().swapUV(dir).mirrorV(dir).build();
final BlockTextureTransform modifiedB = BlockTextureTransform.builder().rotateCCW(dir).build();
testIdentity(modifiedA, modifiedB);
}
}
}
public static void checkCoordinates(ForgeDirection direction, double x, double y, double z, double u, double v, double h) {
// standard Minecraft model
final BlockTextureTransform mapper = BlockTextureTransform.builder().mirrorU(ForgeDirection.NORTH).mirrorU(ForgeDirection.EAST).build();
{
final TexCoords t = mapper.worldVecToTextureCoords(direction, x, y, z);
Assert.assertEquals(u, t.u, DELTA);
Assert.assertEquals(v, t.v, DELTA);
Assert.assertEquals(h, t.h, DELTA);
}
{
final WorldCoords w = mapper.textureCoordsToWorldVec(direction, u, v, h);
Assert.assertEquals(x, w.x, DELTA);
Assert.assertEquals(y, w.y, DELTA);
Assert.assertEquals(z, w.z, DELTA);
}
}
@Test
public void testDefaultNorthMapping() {
checkCoordinates(ForgeDirection.NORTH, 1, 1, 0, 0, 0, 0);
checkCoordinates(ForgeDirection.NORTH, 0, 1, 0, 1, 0, 0);
checkCoordinates(ForgeDirection.NORTH, 1, 0, 0, 0, 1, 0);
checkCoordinates(ForgeDirection.NORTH, 0, 0, 0, 1, 1, 0);
checkCoordinates(ForgeDirection.NORTH, 0.1, 0.1, 0.1, 0.9, 0.9, -0.1);
}
@Test
public void testDefaultSouthMapping() {
checkCoordinates(ForgeDirection.SOUTH, 0, 1, 1, 0, 0, 0);
checkCoordinates(ForgeDirection.SOUTH, 1, 1, 1, 1, 0, 0);
checkCoordinates(ForgeDirection.SOUTH, 0, 0, 1, 0, 1, 0);
checkCoordinates(ForgeDirection.SOUTH, 1, 0, 1, 1, 1, 0);
checkCoordinates(ForgeDirection.SOUTH, 0.1, 0.1, 1.1, 0.1, 0.9, 0.1);
}
@Test
public void testDefaultEastMapping() {
checkCoordinates(ForgeDirection.EAST, 1, 1, 1, 0, 0, 0);
checkCoordinates(ForgeDirection.EAST, 1, 1, 0, 1, 0, 0);
checkCoordinates(ForgeDirection.EAST, 1, 0, 1, 0, 1, 0);
checkCoordinates(ForgeDirection.EAST, 1, 0, 0, 1, 1, 0);
checkCoordinates(ForgeDirection.EAST, 1.1, 0.1, 0.1, 0.9, 0.9, 0.1);
}
@Test
public void testDefaultWestMapping() {
checkCoordinates(ForgeDirection.WEST, 0, 1, 0, 0, 0, 0);
checkCoordinates(ForgeDirection.WEST, 0, 1, 1, 1, 0, 0);
checkCoordinates(ForgeDirection.WEST, 0, 0, 0, 0, 1, 0);
checkCoordinates(ForgeDirection.WEST, 0, 0, 1, 1, 1, 0);
checkCoordinates(ForgeDirection.WEST, 0.1, 0.1, 0.1, 0.1, 0.9, -0.1);
}
@Test
public void testDefaultTopMapping() {
checkCoordinates(ForgeDirection.UP, 0, 1, 0, 0, 0, 0);
checkCoordinates(ForgeDirection.UP, 1, 1, 0, 1, 0, 0);
checkCoordinates(ForgeDirection.UP, 0, 1, 1, 0, 1, 0);
checkCoordinates(ForgeDirection.UP, 1, 1, 1, 1, 1, 0);
checkCoordinates(ForgeDirection.UP, 0.1, 1.1, 0.1, 0.1, 0.1, 0.1);
}
@Test
public void testDefaultBottomMapping() {
checkCoordinates(ForgeDirection.DOWN, 0, 0, 0, 0, 0, 0);
checkCoordinates(ForgeDirection.DOWN, 1, 0, 0, 1, 0, 0);
checkCoordinates(ForgeDirection.DOWN, 0, 0, 1, 0, 1, 0);
checkCoordinates(ForgeDirection.DOWN, 1, 0, 1, 1, 1, 0);
checkCoordinates(ForgeDirection.DOWN, 0.1, 0.1, 0.1, 0.1, 0.1, -0.1);
}
}