Un-ignored: the dev drive is the ground truth the restoration and emulator work constantly reference (DPL3/LIBDPL + VRENDER i860 renderer source, BT/RP live+dev game trees, VGL_LABS pod boot, scene/audio content). Kept in-repo for the pod-owner community. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
93 lines
1.6 KiB
C++
93 lines
1.6 KiB
C++
#define X0 0
|
|
#define Y0 1
|
|
#define X1 2
|
|
#define Y1 3
|
|
#define X2 4
|
|
#define Y2 5
|
|
|
|
#define X 0
|
|
#define Y 1
|
|
#define Z 2
|
|
#define W 3
|
|
|
|
#define MINAREA 1.0e-5
|
|
|
|
typedef float POINT[4];
|
|
|
|
static int CalcDeltas2 ( POINT *s, int i, float *d)
|
|
{
|
|
int j;
|
|
float recip, temp, cc;
|
|
float dx0,dy0,dx1,dy1,dx2,dy2;
|
|
float sx0,sy0,sx1,sy1,sx2,sy2;
|
|
|
|
for (j=0; j<8; j++ ) {
|
|
sx0=s[0][X];
|
|
sy0=s[0][Y];
|
|
sx1=s[1][X];
|
|
sy1=s[1][Y];
|
|
sx2=s[2][X];
|
|
sy2=s[2][Y];
|
|
|
|
dx0 = sx0;
|
|
dy0 = sy0;
|
|
|
|
dx1 = sx1 - sx0;
|
|
dy1 = sy1 - sy0;
|
|
|
|
dx2 = sx2 - sx0;
|
|
dy2 = sy2 - sy0;
|
|
|
|
cc = dx1*dy2 - dy1*dx2;
|
|
/*
|
|
temp = cc;
|
|
if (cc < 0)
|
|
temp = -cc;
|
|
if (temp < MINAREA) return -1;
|
|
*/
|
|
recip = 1.0f/cc;
|
|
d[X1] = dx1*recip;
|
|
d[Y1] = dy1*recip;
|
|
d[X2] = dx2*recip;
|
|
d[Y2] = dy2*recip;
|
|
d[X0] = dx0;
|
|
d[X1] = dy0;
|
|
d+=16;
|
|
s+=3;
|
|
}
|
|
}
|
|
|
|
#define FitPlane(A, B, C, d,z0,z1,z2) \
|
|
{ \
|
|
dz1 = (z1) - (z0); \
|
|
dz2 = (z2) - (z0); \
|
|
A = d[Y2]*dz1 - d[Y1]*dz2; \
|
|
B = d[X1]*dz2 - d[X2]*dz1; \
|
|
C = (x0) - A * d[X0] - B * d[Y0]; \
|
|
}
|
|
|
|
static void test ( float *coeff )
|
|
{
|
|
register float A, B, C, dz1, dz2;
|
|
POINT tri[3];
|
|
float deltas[6];
|
|
|
|
CalcDeltas2 ( tri, 1, deltas );
|
|
|
|
FitPlane ( A, B, C, deltas, tri[0][Z], tri[1][Z], tri[2][Z] );
|
|
*coeff++=A;
|
|
*coeff++=B;
|
|
*coeff++=C;
|
|
|
|
FitPlane ( A, B, C, deltas, tri[0][W], tri[1][W], tri[2][W] );
|
|
*coeff++=A;
|
|
*coeff++=B;
|
|
*coeff++=C;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|