mirror of
https://github.com/nzp-team/dquakeplus.git
synced 2024-11-10 06:31:40 +00:00
Add standard C versions of math+matrix functions
This commit is contained in:
parent
26d21b1c88
commit
67d7f1f663
2 changed files with 92 additions and 14 deletions
|
@ -42,7 +42,7 @@ float rsqrt( float number )
|
||||||
{
|
{
|
||||||
#ifdef PSP_VFPU
|
#ifdef PSP_VFPU
|
||||||
float d;
|
float d;
|
||||||
__asm__ ( //from official pspsdk by sony
|
__asm__ (
|
||||||
".set push\n" // save assember option
|
".set push\n" // save assember option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
"lv.s s000, %1\n" // s000 = s
|
"lv.s s000, %1\n" // s000 = s
|
||||||
|
@ -77,6 +77,10 @@ SinCos
|
||||||
*/
|
*/
|
||||||
void SinCos( float radians, float *sine, float *cosine )
|
void SinCos( float radians, float *sine, float *cosine )
|
||||||
{
|
{
|
||||||
|
#ifndef __PSP__
|
||||||
|
sincos(radians, sine, cosine);
|
||||||
|
#else
|
||||||
|
|
||||||
#ifdef PSP_VFPU
|
#ifdef PSP_VFPU
|
||||||
vfpu_sincos(radians,sine,cosine);
|
vfpu_sincos(radians,sine,cosine);
|
||||||
#else
|
#else
|
||||||
|
@ -88,7 +92,9 @@ void SinCos( float radians, float *sine, float *cosine )
|
||||||
"mfv %0, S000\n"
|
"mfv %0, S000\n"
|
||||||
"mfv %1, S001\n"
|
"mfv %1, S001\n"
|
||||||
: "=r"(*sine), "=r"(*cosine): "r"(radians));
|
: "=r"(*sine), "=r"(*cosine): "r"(radians));
|
||||||
#endif
|
#endif // PSP_VFPU
|
||||||
|
|
||||||
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal )
|
void ProjectPointOnPlane( vec3_t dst, const vec3_t p, const vec3_t normal )
|
||||||
|
@ -175,8 +181,16 @@ void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point,
|
||||||
m[1][2] = vf[1];
|
m[1][2] = vf[1];
|
||||||
m[2][2] = vf[2];
|
m[2][2] = vf[2];
|
||||||
|
|
||||||
|
#ifdef PSP_VFPU
|
||||||
|
|
||||||
memcpy_vfpu( im, m, sizeof( im ) );
|
memcpy_vfpu( im, m, sizeof( im ) );
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
memcpy( im, m, sizeof( im ) );
|
||||||
|
|
||||||
|
#endif // PSP_VFPU
|
||||||
|
|
||||||
im[0][1] = m[1][0];
|
im[0][1] = m[1][0];
|
||||||
im[0][2] = m[2][0];
|
im[0][2] = m[2][0];
|
||||||
im[1][0] = m[0][1];
|
im[1][0] = m[0][1];
|
||||||
|
@ -233,6 +247,9 @@ Returns 1, 2, or 1 + 2
|
||||||
int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, mplane_t *p)
|
int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, mplane_t *p)
|
||||||
{
|
{
|
||||||
int sides;
|
int sides;
|
||||||
|
|
||||||
|
#ifdef __PSP__
|
||||||
|
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -405,6 +422,62 @@ int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, mplane_t *p)
|
||||||
[dist] "m" ( p->dist )
|
[dist] "m" ( p->dist )
|
||||||
: "$8"
|
: "$8"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
float dist1, dist2;
|
||||||
|
|
||||||
|
// general case
|
||||||
|
switch (p->signbits)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
||||||
|
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
||||||
|
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
dist1 = dist2 = 0; // shut up compiler
|
||||||
|
Sys_Error ("BoxOnPlaneSide: Bad signbits");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sides = 0;
|
||||||
|
if (dist1 >= p->dist)
|
||||||
|
sides = 1;
|
||||||
|
if (dist2 < p->dist)
|
||||||
|
sides |= 2;
|
||||||
|
|
||||||
|
return sides;
|
||||||
|
|
||||||
|
#endif // __PSP__
|
||||||
|
|
||||||
return sides;
|
return sides;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -248,6 +248,7 @@ const matrix4x4 matrix4x4_identity =
|
||||||
*/
|
*/
|
||||||
void Matrix4x4_VectorTransform( const matrix4x4 in, const float v[3], float out[3] )
|
void Matrix4x4_VectorTransform( const matrix4x4 in, const float v[3], float out[3] )
|
||||||
{
|
{
|
||||||
|
#ifdef __PSP__
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -267,15 +268,16 @@ void Matrix4x4_VectorTransform( const matrix4x4 in, const float v[3], float out[
|
||||||
: "=m"( *out )
|
: "=m"( *out )
|
||||||
: "m"( *in ), "m"( *v )
|
: "m"( *in ), "m"( *v )
|
||||||
);
|
);
|
||||||
/*
|
#else
|
||||||
out[0] = v[0] * in[0][0] + v[1] * in[0][1] + v[2] * in[0][2] + in[0][3];
|
out[0] = v[0] * in[0][0] + v[1] * in[0][1] + v[2] * in[0][2] + in[0][3];
|
||||||
out[1] = v[0] * in[1][0] + v[1] * in[1][1] + v[2] * in[1][2] + in[1][3];
|
out[1] = v[0] * in[1][0] + v[1] * in[1][1] + v[2] * in[1][2] + in[1][3];
|
||||||
out[2] = v[0] * in[2][0] + v[1] * in[2][1] + v[2] * in[2][2] + in[2][3];
|
out[2] = v[0] * in[2][0] + v[1] * in[2][1] + v[2] * in[2][2] + in[2][3];
|
||||||
*/
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void Matrix4x4_VectorITransform( const matrix4x4 in, const float v[3], float out[3] )
|
void Matrix4x4_VectorITransform( const matrix4x4 in, const float v[3], float out[3] )
|
||||||
{
|
{
|
||||||
|
#ifdef __PSP__
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -300,7 +302,7 @@ void Matrix4x4_VectorITransform( const matrix4x4 in, const float v[3], float out
|
||||||
: "=m"( *out )
|
: "=m"( *out )
|
||||||
: "m"( *in ), "m"( *v )
|
: "m"( *in ), "m"( *v )
|
||||||
);
|
);
|
||||||
/*
|
#else
|
||||||
vec3_t dir;
|
vec3_t dir;
|
||||||
|
|
||||||
dir[0] = v[0] - in[0][3];
|
dir[0] = v[0] - in[0][3];
|
||||||
|
@ -310,7 +312,7 @@ void Matrix4x4_VectorITransform( const matrix4x4 in, const float v[3], float out
|
||||||
out[0] = dir[0] * in[0][0] + dir[1] * in[1][0] + dir[2] * in[2][0];
|
out[0] = dir[0] * in[0][0] + dir[1] * in[1][0] + dir[2] * in[2][0];
|
||||||
out[1] = dir[0] * in[0][1] + dir[1] * in[1][1] + dir[2] * in[2][1];
|
out[1] = dir[0] * in[0][1] + dir[1] * in[1][1] + dir[2] * in[2][1];
|
||||||
out[2] = dir[0] * in[0][2] + dir[1] * in[1][2] + dir[2] * in[2][2];
|
out[2] = dir[0] * in[0][2] + dir[1] * in[1][2] + dir[2] * in[2][2];
|
||||||
*/
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void Matrix4x4_VectorRotate( const matrix4x4 in, const float v[3], float out[3] )
|
void Matrix4x4_VectorRotate( const matrix4x4 in, const float v[3], float out[3] )
|
||||||
|
@ -329,6 +331,7 @@ void Matrix4x4_VectorIRotate( const matrix4x4 in, const float v[3], float out[3]
|
||||||
|
|
||||||
void Matrix4x4_ConcatTransforms( matrix4x4 out, const matrix4x4 in1, const matrix4x4 in2 )
|
void Matrix4x4_ConcatTransforms( matrix4x4 out, const matrix4x4 in1, const matrix4x4 in2 )
|
||||||
{
|
{
|
||||||
|
#ifdef __PSP__
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -348,7 +351,7 @@ void Matrix4x4_ConcatTransforms( matrix4x4 out, const matrix4x4 in1, const matri
|
||||||
: "=m"( *out )
|
: "=m"( *out )
|
||||||
: "m"( *in1 ), "m"( *in2 )
|
: "m"( *in1 ), "m"( *in2 )
|
||||||
);
|
);
|
||||||
/*
|
#else
|
||||||
out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
|
out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
|
||||||
out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
|
out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
|
||||||
out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
|
out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
|
||||||
|
@ -361,7 +364,7 @@ void Matrix4x4_ConcatTransforms( matrix4x4 out, const matrix4x4 in1, const matri
|
||||||
out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
|
out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
|
||||||
out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
|
out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
|
||||||
out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + in1[2][2] * in2[2][3] + in1[2][3];
|
out[2][3] = in1[2][0] * in2[0][3] + in1[2][1] * in2[1][3] + in1[2][2] * in2[2][3] + in1[2][3];
|
||||||
*/
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void Matrix4x4_SetOrigin( matrix4x4 out, float x, float y, float z )
|
void Matrix4x4_SetOrigin( matrix4x4 out, float x, float y, float z )
|
||||||
|
@ -520,6 +523,7 @@ void Matrix4x4_ConvertToEntity( const matrix4x4 in, vec3_t angles, vec3_t origin
|
||||||
|
|
||||||
void Matrix4x4_TransformPositivePlane( const matrix4x4 in, const vec3_t normal, float d, vec3_t out, float *dist )
|
void Matrix4x4_TransformPositivePlane( const matrix4x4 in, const vec3_t normal, float d, vec3_t out, float *dist )
|
||||||
{
|
{
|
||||||
|
#ifdef __PSP__
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -546,7 +550,7 @@ void Matrix4x4_TransformPositivePlane( const matrix4x4 in, const vec3_t normal,
|
||||||
: "=m"( *out ), "=m"( *dist )
|
: "=m"( *out ), "=m"( *dist )
|
||||||
: "m"( *in ), "m"( *normal ), "m"( d )
|
: "m"( *in ), "m"( *normal ), "m"( d )
|
||||||
);
|
);
|
||||||
/*
|
#else
|
||||||
float scale = sqrt( in[0][0] * in[0][0] + in[0][1] * in[0][1] + in[0][2] * in[0][2] );
|
float scale = sqrt( in[0][0] * in[0][0] + in[0][1] * in[0][1] + in[0][2] * in[0][2] );
|
||||||
float iscale = 1.0f / scale;
|
float iscale = 1.0f / scale;
|
||||||
|
|
||||||
|
@ -554,11 +558,12 @@ void Matrix4x4_TransformPositivePlane( const matrix4x4 in, const vec3_t normal,
|
||||||
out[1] = (normal[0] * in[1][0] + normal[1] * in[1][1] + normal[2] * in[1][2]) * iscale;
|
out[1] = (normal[0] * in[1][0] + normal[1] * in[1][1] + normal[2] * in[1][2]) * iscale;
|
||||||
out[2] = (normal[0] * in[2][0] + normal[1] * in[2][1] + normal[2] * in[2][2]) * iscale;
|
out[2] = (normal[0] * in[2][0] + normal[1] * in[2][1] + normal[2] * in[2][2]) * iscale;
|
||||||
*dist = d * scale + ( out[0] * in[0][3] + out[1] * in[1][3] + out[2] * in[2][3] );
|
*dist = d * scale + ( out[0] * in[0][3] + out[1] * in[1][3] + out[2] * in[2][3] );
|
||||||
*/
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void Matrix4x4_TransformStandardPlane( const matrix4x4 in, const vec3_t normal, float d, vec3_t out, float *dist )
|
void Matrix4x4_TransformStandardPlane( const matrix4x4 in, const vec3_t normal, float d, vec3_t out, float *dist )
|
||||||
{
|
{
|
||||||
|
#ifdef __PSP__
|
||||||
__asm__ (
|
__asm__ (
|
||||||
".set push\n" // save assembler option
|
".set push\n" // save assembler option
|
||||||
".set noreorder\n" // suppress reordering
|
".set noreorder\n" // suppress reordering
|
||||||
|
@ -585,7 +590,7 @@ void Matrix4x4_TransformStandardPlane( const matrix4x4 in, const vec3_t normal,
|
||||||
: "=m"( *out ), "=m"( *dist )
|
: "=m"( *out ), "=m"( *dist )
|
||||||
: "m"( *in ), "m"( *normal ), "m"( d )
|
: "m"( *in ), "m"( *normal ), "m"( d )
|
||||||
);
|
);
|
||||||
/*
|
#else
|
||||||
float scale = sqrt( in[0][0] * in[0][0] + in[0][1] * in[0][1] + in[0][2] * in[0][2] );
|
float scale = sqrt( in[0][0] * in[0][0] + in[0][1] * in[0][1] + in[0][2] * in[0][2] );
|
||||||
float iscale = 1.0f / scale;
|
float iscale = 1.0f / scale;
|
||||||
|
|
||||||
|
@ -593,7 +598,7 @@ void Matrix4x4_TransformStandardPlane( const matrix4x4 in, const vec3_t normal,
|
||||||
out[1] = (normal[0] * in[1][0] + normal[1] * in[1][1] + normal[2] * in[1][2]) * iscale;
|
out[1] = (normal[0] * in[1][0] + normal[1] * in[1][1] + normal[2] * in[1][2]) * iscale;
|
||||||
out[2] = (normal[0] * in[2][0] + normal[1] * in[2][1] + normal[2] * in[2][2]) * iscale;
|
out[2] = (normal[0] * in[2][0] + normal[1] * in[2][1] + normal[2] * in[2][2]) * iscale;
|
||||||
*dist = d * scale - ( out[0] * in[0][3] + out[1] * in[1][3] + out[2] * in[2][3] );
|
*dist = d * scale - ( out[0] * in[0][3] + out[1] * in[1][3] + out[2] * in[2][3] );
|
||||||
*/
|
#endif // __PSP__
|
||||||
}
|
}
|
||||||
|
|
||||||
void Matrix4x4_Invert_Simple( matrix4x4 out, const matrix4x4 in1 )
|
void Matrix4x4_Invert_Simple( matrix4x4 out, const matrix4x4 in1 )
|
||||||
|
|
Loading…
Reference in a new issue