fun map(point: Offset): Offset { // See top-level comment if (values.size < 16) return point val v00 = this[0, 0] val v01 = this[0, 1] val v03 = this[0, 3] val v10 = this[1, 0] val v11 = this[1, 1] val v13 = this[1, 3] val v30 = this[3, 0] val v31 = this[3, 1] val v33 = this[3, 3] val x = point.x val y = point.y val z = v03 * x + v13 * y + v33 val inverseZ = 1 / z val pZ = if (inverseZ.fastIsFinite()) inverseZ else 0f return Offset(x = pZ * (v00 * x + v10 * y + v30), y = pZ * (v01 * x + v11 * y + v31)) }
/** Scale this matrix by [x], [y], [z] */ fun scale(x: Float = 1f, y: Float = 1f, z: Float = 1f) { // See top-level comment if (values.size < 16) return this[0, 0] *= x this[0, 1] *= x this[0, 2] *= x this[0, 3] *= x this[1, 0] *= y this[1, 1] *= y this[1, 2] *= y this[1, 3] *= y this[2, 0] *= z this[2, 1] *= z this[2, 2] *= z this[2, 3] *= z }
fun rotateZ(degrees: Float) { // See top-level comment if (values.size < 16) return val r = degrees * (PI / 180.0) val s = sin(r).toFloat() val c = cos(r).toFloat() val a00 = this[0, 0] val a10 = this[1, 0] val v00 = c * a00 + s * a10 val v10 = -s * a00 + c * a10 val a01 = this[0, 1] val a11 = this[1, 1] val v01 = c * a01 + s * a11 val v11 = -s * a01 + c * a11 val a02 = this[0, 2] val a12 = this[1, 2] val v02 = c * a02 + s * a12 val v12 = -s * a02 + c * a12 val a03 = this[0, 3] val a13 = this[1, 3] val v03 = c * a03 + s * a13 val v13 = -s * a03 + c * a13 this[0, 0] = v00 this[0, 1] = v01 this[0, 2] = v02 this[0, 3] = v03 this[1, 0] = v10 this[1, 1] = v11 this[1, 2] = v12 this[1, 3] = v13 }
fun rotateY(degrees: Float) { // See top-level comment if (values.size < 16) return val r = degrees * (PI / 180.0) val s = sin(r).toFloat() val c = cos(r).toFloat() val a00 = this[0, 0] val a02 = this[0, 2] val v00 = a00 * c + a02 * s val v02 = -a00 * s + a02 * c val a10 = this[1, 0] val a12 = this[1, 2] val v10 = a10 * c + a12 * s val v12 = -a10 * s + a12 * c val a20 = this[2, 0] val a22 = this[2, 2] val v20 = a20 * c + a22 * s val v22 = -a20 * s + a22 * c val a30 = this[3, 0] val a32 = this[3, 2] val v30 = a30 * c + a32 * s val v32 = -a30 * s + a32 * c this[0, 0] = v00 this[0, 2] = v02 this[1, 0] = v10 this[1, 2] = v12 this[2, 0] = v20 this[2, 2] = v22 this[3, 0] = v30 this[3, 2] = v32 }
fun rotateX(degrees: Float) { // See top-level comment if (values.size < 16) return val r = degrees * (PI / 180.0) val s = sin(r).toFloat() val c = cos(r).toFloat() val a01 = this[0, 1] val a02 = this[0, 2] val v01 = a01 * c - a02 * s val v02 = a01 * s + a02 * c val a11 = this[1, 1] val a12 = this[1, 2] val v11 = a11 * c - a12 * s val v12 = a11 * s + a12 * c val a21 = this[2, 1] val a22 = this[2, 2] val v21 = a21 * c - a22 * s val v22 = a21 * s + a22 * c val a31 = this[3, 1] val a32 = this[3, 2] val v31 = a31 * c - a32 * s val v32 = a31 * s + a32 * c this[0, 1] = v01 this[0, 2] = v02 this[1, 1] = v11 this[1, 2] = v12 this[2, 1] = v21 this[2, 2] = v22 this[3, 1] = v31 this[3, 2] = v32 }