dquakeplus/source/libpspmath/vfpu_sphere_to_cartesian.c
2022-02-08 16:49:56 -05:00

20 lines
897 B
C

#include "pspmath.h"
void vfpu_sphere_to_cartesian(float az, float ze, float rad, float *x, float *y, float *z) {
__asm__ volatile (
"mtv %3, S000\n"
"mtv %4, S001\n"
"mtv %5, S002\n"
"vcst.s S003, VFPU_2_PI\n" // C000 = [az, ze, rad, 2/pi]
"vscl.p C000, C000, S003\n" // C000 = [az*2/pi, ze*2/pi, rad, 2/pi]
"vrot.p C010, S000, [s, c]\n" // C010 = [sin(az), cos(az), ?, ?]
"vrot.p C012, S001, [s, c]\n" // C010 = [sin(az), cos(az), sin(ze), cos(ze)]
"vmul.q C020, C010[y, 1, x, 0], C010[z, w, z, 0]\n" // C020 = [0, cos(az)*sin(ez), cos(ze), sin(az)*sin(ze)]
"vscl.t C020, C020, S002\n" // C020 = [0, r*cos(az)*sin(ez), r*cos(ze), r*sin(az)*sin(ze)]
//"sv.q C020, 0 + %0\n"
"sv.s S020, %0\n"
"sv.s S021, %1\n"
"sv.s S022, %2\n"
:"+m"(*x), "+m"(*y), "+m"(*z)
:"r"(az), "r"(ze), "r"(rad));
}