/// Convert local matrix coordinates to world position. Keeps offsets in mind (+ rotation and pivot if MatrixMove is present) public static Vector3 LocalToWorld(Vector3 localPos, MatrixInfo matrix, MatrixState state = default(MatrixState)) { //Invalid matrix info provided if (matrix.Equals(MatrixInfo.Invalid) || localPos == TransformState.HiddenPos) { return(TransformState.HiddenPos); } // return matrix.MetaTileMap.LocalToWorld( localPos ); if (!matrix.MatrixMove) { return(localPos + matrix.Offset); } if (state.Equals(default(MatrixState))) { state = matrix.MatrixMove.ClientState; } Vector3 unpivotedPos = localPos - matrix.MatrixMove.Pivot; //localPos - localPivot Vector3 rotatedPos = state.FacingOffsetFromInitial(matrix.MatrixMove).Quaternion *unpivotedPos; //unpivotedPos rotated by N degrees Vector3 rotatedPivoted = rotatedPos + matrix.MatrixMove.Pivot + matrix.GetOffset(state); //adding back localPivot and applying localToWorldOffset return(rotatedPivoted); }
/// <inheritdoc cref="WorldToLocal(Vector3, Matrix)"/> public static Vector3 WorldToLocal(Vector3 worldPos, MatrixInfo matrix) { // Invalid matrix info provided if (matrix is null || matrix.Equals(MatrixInfo.Invalid) || worldPos == TransformState.HiddenPos) { return(TransformState.HiddenPos); } if (matrix.MatrixMove == null) { return(worldPos - matrix.Offset); } var state = matrix.MatrixMove.ClientState; return((state.FacingOffsetFromInitial(matrix.MatrixMove).QuaternionInverted * (worldPos - matrix.MatrixMove.Pivot - matrix.GetOffset(state))) + matrix.MatrixMove.Pivot); }
/// Convert local matrix coordinates to world position. Keeps offsets in mind (+ rotation and pivot if MatrixMove is present) public static Vector3 LocalToWorld(Vector3 localPos, MatrixInfo matrix, MatrixState state = default(MatrixState)) { //Invalid matrix info provided if (matrix.Equals(MatrixInfo.Invalid)) { return(TransformState.HiddenPos); } if (!matrix.MatrixMove) { return(localPos + matrix.Offset); } if (state.Equals(default(MatrixState))) { state = matrix.MatrixMove.ClientState; } Vector3 unpivotedPos = localPos - matrix.MatrixMove.Pivot; //localPos - localPivot Vector3 rotatedPos = state.Orientation.Euler * unpivotedPos; //unpivotedPos rotated by N degrees Vector3 rotatedPivoted = rotatedPos + matrix.MatrixMove.Pivot + matrix.GetOffset(state); //adding back localPivot and applying localToWorldOffset return(rotatedPivoted); }