diff --git a/CHANGELOG.md b/CHANGELOG.md index 9639576..7714aea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Fixed - Fixed item stack iotas using an untranslated lang key when referenced in a mishap message. +- Fixed the element-wise matrix operations not coercing numbers or vectors to matrices like the other matrix patterns do. - Fixed Patternmaster's Purification throwing an exception when used on any non-static pattern, by beholderface in [#59](https://github.com/FallingColors/MoreIotas/pull/59). - Fixed a crash when trying to invert a non-invertible matrix, by c-Caelum in [#66](https://github.com/FallingColors/MoreIotas/pull/66). diff --git a/Common/src/main/java/ram/talia/moreiotas/common/casting/arithmetic/MatrixArithmetic.kt b/Common/src/main/java/ram/talia/moreiotas/common/casting/arithmetic/MatrixArithmetic.kt index cf52cca..caed1d7 100644 --- a/Common/src/main/java/ram/talia/moreiotas/common/casting/arithmetic/MatrixArithmetic.kt +++ b/Common/src/main/java/ram/talia/moreiotas/common/casting/arithmetic/MatrixArithmetic.kt @@ -10,12 +10,17 @@ import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaMultiPredicate import at.petrak.hexcasting.api.casting.arithmetic.predicates.IotaPredicate import at.petrak.hexcasting.api.casting.iota.DoubleIota import at.petrak.hexcasting.api.casting.iota.Iota +import at.petrak.hexcasting.api.casting.iota.Vec3Iota import at.petrak.hexcasting.api.casting.math.HexDir import at.petrak.hexcasting.api.casting.math.HexPattern import at.petrak.hexcasting.api.casting.mishaps.MishapInvalidIota +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.DOUBLE +import at.petrak.hexcasting.common.lib.hex.HexIotaTypes.VEC3 import org.ejml.simple.SimpleMatrix +import ram.talia.moreiotas.api.asSimpleMatrix import ram.talia.moreiotas.api.casting.iota.MatrixIota import ram.talia.moreiotas.api.matrixWrongSize +import ram.talia.moreiotas.api.util.Anyone import ram.talia.moreiotas.common.casting.arithmetic.operator.matrix.OperatorMatrixAdd import ram.talia.moreiotas.common.casting.arithmetic.operator.matrix.OperatorMatrixDiv import ram.talia.moreiotas.common.casting.arithmetic.operator.matrix.OperatorMatrixMul @@ -95,10 +100,25 @@ object MatrixArithmetic : Arithmetic { op.apply(Operator.downcast(i, MATRIX).simpleMatrix) ) } - private fun make2SameSize(op: BinaryOperator): OperatorBinary = OperatorBinary(IotaMultiPredicate.all(IotaPredicate.ofType(MATRIX))) + val numVecMatPred = IotaPredicate.any(IotaPredicate.ofType(DOUBLE), IotaPredicate.ofType(VEC3), IotaPredicate.ofType(MATRIX)) + + fun parseNumVecMat(iota: Iota, argc: Int, idx: Int): SimpleMatrix { + return when (iota) { + is DoubleIota -> SimpleMatrix(1, 1, false, iota.double) + is Vec3Iota -> iota.vec3.asSimpleMatrix + is MatrixIota -> iota.simpleMatrix + else -> throw MishapInvalidIota.of( + iota, + argc - (idx + 1), + "numvecmat" + ) + } + } + + private fun make2SameSize(op: BinaryOperator): OperatorBinary = OperatorBinary(IotaMultiPredicate.all(numVecMatPred)) { i, j -> - val mat0 = Operator.downcast(i, MATRIX).simpleMatrix - val mat1 = Operator.downcast(j, MATRIX).simpleMatrix + val mat0 = parseNumVecMat(i, argc = 2, idx = 0) + val mat1 = parseNumVecMat(j, argc = 2, idx = 1) if (mat0.numRows != mat1.numRows || mat0.numCols != mat1.numCols) throw MishapInvalidIota.matrixWrongSize(MatrixIota(mat1), 0, mat0.numRows, mat1.numCols)