89#define PSYQO_GTE_MATH_INLINE [[gnu::always_inline]] static inline
100 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
101 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
102 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
103 *
out =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
112 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
113 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
114 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
115 Vec3 r =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
126 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
127 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
128 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
129 return Vec3(GTE::readSafe<GTE::PseudoRegister::SV>()).
z;
162 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m2);
163 const Vec3 cols[3] = {
169 for (
unsigned j = 0; j < 3; j++) {
170 GTE::writeSafe<GTE::PseudoRegister::V0>(cols[j]);
171 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
172 res[j] =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
174 out->vs[0] = {res[0].
x, res[1].
x, res[2].
x};
175 out->vs[1] = {res[0].
y, res[1].
y, res[2].
y};
176 out->vs[2] = {res[0].
z, res[1].
z, res[2].
z};
194 GTE::write<GTE::Register::R11R12, GTE::Unsafe>(a.
x.raw());
195 GTE::write<GTE::Register::R22R23, GTE::Unsafe>(a.
y.raw());
196 GTE::write<GTE::Register::R33, GTE::Unsafe>(a.
z.raw());
197 GTE::write<GTE::Register::IR1, GTE::Unsafe>(
reinterpret_cast<uint32_t *
>(&
b.x));
198 GTE::write<GTE::Register::IR2, GTE::Unsafe>(
reinterpret_cast<uint32_t *
>(&
b.y));
199 GTE::write<GTE::Register::IR3, GTE::Safe>(
reinterpret_cast<uint32_t *
>(&
b.z));
201 GTE::read<GTE::PseudoRegister::LV>(*
out);
223 GTE::write<GTE::Register::LZCS, GTE::Safe>(x.raw());
224 int32_t shift = (5 + int32_t(GTE::readRaw<GTE::Register::LZCR>())) / 2;
225 return FixedPoint<>(int32_t(1) << shift, FixedPoint<>::RAW);
278 using namespace psyqo::fixed_point_literals;
279 FixedPoint<> mt = 1.0_fp -
t;
280 FixedPoint<> mt2 = mt * mt;
281 FixedPoint<> t2 =
t *
t;
282 FixedPoint<> f4 = t2 *
t;
283 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(
fromColumns(a,
b,
c));
284 GTE::writeUnsafe<GTE::PseudoRegister::Translation>(
Vec3{d.
x * f4, d.
y * f4, d.
z * f4});
285 GTE::writeSafe<GTE::PseudoRegister::V0>(
Vec3{mt2 * mt, mt2 *
t * 3, mt * t2 * 3});
286 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0, GTE::Kernels::TV::TR>();
287 return Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
305 using namespace psyqo::fixed_point_literals;
306 FixedPoint<> mt = 1.0_fp -
t;
310 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(
fromColumns(ab, bc,
cd));
311 GTE::writeSafe<GTE::PseudoRegister::V0>(
Vec3{mt * mt, mt *
t * 2,
t *
t});
312 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
313 return Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
316#undef PSYQO_GTE_MATH_INLINE
uint32_t t
Definition cop0.c:79
uint32_t r
Definition cpu.c:222
uint32_t out
Definition cpu.c:62
uint8_t cd
Definition gte-depthcue.c:206
uint8_t b
Definition gte-depthcue.c:39
#define PSYQO_GTE_MATH_INLINE
Definition gte-math.hh:89
volatile void * c1
Definition load-timings.c:505
volatile void * c0
Definition load-timings.c:504
PSYQO_GTE_MATH_INLINE void fastNormalizeVec3(Vec3 *v)
Normalises a vector in place, without the exact square root.
Definition gte-math.hh:256
void normalizeVec3(Vec3 *v)
Normalises a vector in place.
Definition gte-math.cpp:38
PSYQO_GTE_MATH_INLINE Vec3 cubic(const Vec3 &a, const Vec3 &b, const Vec3 &c, const Vec3 &d, FixedPoint<> t)
Evaluates a cubic Bezier at t.
Definition gte-math.hh:277
PSYQO_GTE_MATH_INLINE void multiplyMatrix33(const Matrix33 &m1, const Matrix33 &m2, Matrix33 *out)
Multiplies two matrices.
Definition gte-math.hh:161
PSYQO_GTE_MATH_INLINE FixedPoint matrixVecMul3z(const Matrix33 &m, const Vec3 &v)
Multiplies a vector by a matrix, keeping only z.
Definition gte-math.hh:125
PSYQO_GTE_MATH_INLINE Matrix33 fromColumns(const Vec3 &c0, const Vec3 &c1, const Vec3 &c2)
Builds a matrix from three column vectors.
Definition gte-math.hh:141
PSYQO_GTE_MATH_INLINE void matrixVecMul3xy(const Matrix33 &m, const Vec3 &v, Vec2 *out)
Multiplies a vector by a matrix, keeping only x and y.
Definition gte-math.hh:111
PSYQO_GTE_MATH_INLINE Vec3 cubicDerivative(const Vec3 &a, const Vec3 &b, const Vec3 &c, const Vec3 &d, FixedPoint<> t)
Evaluates the derivative of a cubic Bezier at t.
Definition gte-math.hh:303
PSYQO_GTE_MATH_INLINE void matrixVecMul3(const Matrix33 &m, const Vec3 &v, Vec3 *out)
Multiplies a vector by a matrix.
Definition gte-math.hh:99
PSYQO_GTE_MATH_INLINE FixedPoint inverseSquareRootSeed(FixedPoint<> x)
The seed for an inverse square root, from the GTE's leading-bit count.
Definition gte-math.hh:222
PSYQO_GTE_MATH_INLINE void crossProductVec3(const Vec3 &v1, const Vec3 &v2, Vec3 *out)
Cross product of two vectors.
Definition gte-math.hh:191
Vector< 3 > Vec3
Definition vector.hh:242
Vec3 vs[3]
Definition matrix.hh:34
FixedPoint< precisionBits, T > x
Definition vector.hh:49
PSYQO_NO_UNIQUE_ADDR std::conditional_t<(N > 2), FixedPoint< precisionBits, T >, EmptyZ > z
Definition vector.hh:51
FixedPoint< precisionBits, T > y
Definition vector.hh:49
static int c
Definition syscalls.h:122
void uint32_t(classId, spec)
uint16_t v2
Definition timers.c:262
uint16_t v1
Definition timers.c:260