90#define PSYQO_GTE_MATH_INLINE [[gnu::always_inline]] static inline
101 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
102 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
103 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
104 *
out =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
113 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
114 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
115 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
116 Vec3 r =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
127 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m);
128 GTE::writeSafe<GTE::PseudoRegister::V0>(v);
129 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
130 return Vec3(GTE::readSafe<GTE::PseudoRegister::SV>()).
z;
163 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(m2);
164 const Vec3 cols[3] = {
170 for (
unsigned j = 0; j < 3; j++) {
171 GTE::writeSafe<GTE::PseudoRegister::V0>(cols[j]);
172 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0>();
173 res[j] =
Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
175 out->vs[0] = {res[0].
x, res[1].
x, res[2].
x};
176 out->vs[1] = {res[0].
y, res[1].
y, res[2].
y};
177 out->vs[2] = {res[0].
z, res[1].
z, res[2].
z};
195 GTE::write<GTE::Register::R11R12, GTE::Unsafe>(a.x.raw());
196 GTE::write<GTE::Register::R22R23, GTE::Unsafe>(a.y.raw());
197 GTE::write<GTE::Register::R33, GTE::Unsafe>(a.z.raw());
198 GTE::write<GTE::Register::IR1, GTE::Unsafe>(
reinterpret_cast<uint32_t *
>(&
b.x));
199 GTE::write<GTE::Register::IR2, GTE::Unsafe>(
reinterpret_cast<uint32_t *
>(&
b.y));
200 GTE::write<GTE::Register::IR3, GTE::Safe>(
reinterpret_cast<uint32_t *
>(&
b.z));
202 GTE::read<GTE::PseudoRegister::LV>(*
out);
224 GTE::write<GTE::Register::LZCS, GTE::Safe>(x.raw());
225 int32_t shift = (5 + int32_t(GTE::readRaw<GTE::Register::LZCR>())) / 2;
226 return FixedPoint<>(int32_t(1) << shift, FixedPoint<>::RAW);
279 using namespace psyqo::fixed_point_literals;
280 FixedPoint<> mt = 1.0_fp -
t;
281 FixedPoint<> mt2 = mt * mt;
282 FixedPoint<> t2 =
t *
t;
283 FixedPoint<> f4 = t2 *
t;
284 GTE::writeUnsafe<GTE::PseudoRegister::Rotation>(
fromColumns(a,
b,
c));
285 GTE::writeUnsafe<GTE::PseudoRegister::Translation>(
Vec3{d.
x * f4, d.
y * f4, d.
z * f4});
286 GTE::writeSafe<GTE::PseudoRegister::V0>(
Vec3{mt2 * mt, mt2 *
t * 3, mt * t2 * 3});
287 GTE::Kernels::mvmva<GTE::Kernels::MX::RT, GTE::Kernels::MV::V0, GTE::Kernels::TV::TR>();
288 return Vec3(GTE::readSafe<GTE::PseudoRegister::SV>());
305 using namespace psyqo::fixed_point_literals;
306 FixedPoint<> mt = 1.0_fp -
t;
307 Vec3 ab = {
b.
x - a.x,
b.y - a.y,
b.z - a.z};
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 cdltest.c:291
uint32_t r
Definition cpu.c:310
uint32_t out
Definition cpu.c:62
uint8_t cd
Definition gte-depthcue.c:208
uint8_t b
Definition gte-depthcue.c:41
#define PSYQO_GTE_MATH_INLINE
Definition gte-math.hh:90
volatile void * c1
Definition load-timings.c:874
volatile void * c0
Definition load-timings.c:873
PSYQO_GTE_MATH_INLINE void fastNormalizeVec3(Vec3 *v)
Normalises a vector in place, without the exact square root.
Definition gte-math.hh:257
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:278
PSYQO_GTE_MATH_INLINE void multiplyMatrix33(const Matrix33 &m1, const Matrix33 &m2, Matrix33 *out)
Multiplies two matrices.
Definition gte-math.hh:162
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:126
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:142
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:112
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:304
PSYQO_GTE_MATH_INLINE void matrixVecMul3(const Matrix33 &m, const Vec3 &v, Vec3 *out)
Multiplies a vector by a matrix.
Definition gte-math.hh:100
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:223
PSYQO_GTE_MATH_INLINE void crossProductVec3(const Vec3 &v1, const Vec3 &v2, Vec3 *out)
Cross product of two vectors.
Definition gte-math.hh:192
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:172
uint16_t v2
Definition timers.c:262
uint16_t v1
Definition timers.c:260