package Connectivity; import Common.Matrix4; import Common.Vector3f; import LDraw.Support.MatrixMath; public enum Direction6T { X_Plus('X'), X_Minus('X'), Y_Plus('Y'), Y_Minus('Y'), Z_Plus('Z'), Z_Minus('Z'); private char value; private Direction6T(char value){ this.value = value; } public static Direction6T getDirectionOfTransformMatrix( Matrix4 transformMatrix) { Vector3f normalVector = new Vector3f(0, -1.0f, 0); normalVector = MatrixMath.V3RotateByTransformMatrix(normalVector, transformMatrix); float absMax = Math.max(Math.abs(normalVector.x), Math.abs(normalVector.y)); absMax = Math.max(absMax, Math.abs(normalVector.z)); if (MatrixMath.compareFloat(absMax, normalVector.y) == 0) return Y_Plus; else if (MatrixMath.compareFloat(-absMax, normalVector.y) == 0) return Y_Minus; else if (MatrixMath.compareFloat(absMax, normalVector.x) == 0) return X_Plus; else if (MatrixMath.compareFloat(-absMax, normalVector.x) == 0) return X_Minus; else if (MatrixMath.compareFloat(absMax, normalVector.z) == 0) return Z_Plus; else if (MatrixMath.compareFloat(-absMax, normalVector.z) == 0) return Z_Minus; return null; } public static Matrix4 getSnappedTransformMatrix(Matrix4 partTransformMatrix) { Matrix4 transformMatrix = Matrix4.getIdentityMatrix4(); Direction6T direction = Direction6T .getDirectionOfTransformMatrix(partTransformMatrix); float degree = getDegreeOfTransformMatrixInDirection(direction, partTransformMatrix); switch (direction) { case X_Minus: transformMatrix.rotate((float) Math.PI / 2, new Vector3f(0, 0, 1)); transformMatrix.rotate(degree, new Vector3f(-1, 0, 0)); break; case X_Plus: transformMatrix.rotate((float) Math.PI / 2, new Vector3f(0, 0, -1)); transformMatrix.rotate(degree, new Vector3f(-1, 0, 0)); break; case Y_Minus: transformMatrix.rotate(degree, new Vector3f(0, 1, 0)); break; case Y_Plus: transformMatrix.rotate((float) Math.PI, new Vector3f(1, 0, 0)); transformMatrix.rotate(degree, new Vector3f(0, -1, 0)); break; case Z_Minus: transformMatrix.rotate((float) Math.PI / 2, new Vector3f(-1, 0, 0)); transformMatrix.rotate(degree, new Vector3f(0, 0, 1)); break; case Z_Plus: transformMatrix.rotate((float) Math.PI / 2, new Vector3f(1, 0, 0)); transformMatrix.rotate(degree, new Vector3f(0, 0, 1)); break; } return transformMatrix; } public static float getDegreeOfTransformMatrixInDirection(Direction6T direction, Matrix4 transformMatrix) { float degree = 0; Vector3f unitVector = new Vector3f(1, 1, 1); unitVector = MatrixMath.V3RotateByTransformMatrix(unitVector, transformMatrix); switch (direction) { case X_Minus: if (unitVector.y >= 0 && unitVector.z >= 0) degree = (float) (Math.PI / 2 * 3); else if (unitVector.y < 0 && unitVector.z >= 0) degree = 0; else if (unitVector.y < 0 && unitVector.z < 0) degree = (float) (Math.PI / 2); else if (unitVector.y >= 0 && unitVector.z < 0) degree = (float) (Math.PI); break; case X_Plus: if (unitVector.y >= 0 && unitVector.z >= 0) degree = 0; else if (unitVector.y < 0 && unitVector.z >= 0) degree = (float) (Math.PI / 2); else if (unitVector.y < 0 && unitVector.z < 0) degree = (float) (Math.PI); else if (unitVector.y >= 0 && unitVector.z < 0) degree = (float) (Math.PI / 2 * 3); break; case Y_Minus: if (unitVector.x >= 0 && unitVector.z >= 0) degree = 0; else if (unitVector.x < 0 && unitVector.z >= 0) degree = (float) (Math.PI / 2); else if (unitVector.x < 0 && unitVector.z < 0) degree = (float) (Math.PI); else if (unitVector.x >= 0 && unitVector.z < 0) degree = (float) (Math.PI / 2 * 3); break; case Y_Plus: if (unitVector.x >= 0 && unitVector.z >= 0) degree = (float) (Math.PI / 2 * 3); else if (unitVector.x < 0 && unitVector.z >= 0) degree = (float) (Math.PI); else if (unitVector.x < 0 && unitVector.z < 0) degree = (float) (Math.PI / 2); else if (unitVector.x >= 0 && unitVector.z < 0) degree = 0; break; case Z_Minus: if (unitVector.y >= 0 && unitVector.x >= 0) degree = (float) (Math.PI / 2 * 3); else if (unitVector.y < 0 && unitVector.x >= 0) degree = 0; else if (unitVector.y < 0 && unitVector.x < 0) degree = (float) (Math.PI / 2); else if (unitVector.y >= 0 && unitVector.x < 0) degree = (float) (Math.PI); break; case Z_Plus: if (unitVector.y >= 0 && unitVector.x >= 0) degree = 0; else if (unitVector.y < 0 && unitVector.x >= 0) degree = (float) (Math.PI / 2); else if (unitVector.y < 0 && unitVector.x < 0) degree = (float) (Math.PI); else if (unitVector.y >= 0 && unitVector.x < 0) degree = (float) (Math.PI / 2 * 3); break; } return degree; } public char getValue(){ return value; } }