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>
73 lines
1.4 KiB
C++
73 lines
1.4 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)
|
|
{
|
|
float recip, temp, cc;
|
|
|
|
d[X0] = s[0][X];
|
|
d[Y0] = s[0][Y];
|
|
d[X1] = s[i][X] - s[0][X];
|
|
d[Y1] = s[i][Y] - s[0][Y];
|
|
d[X2] = s[i+1][X] - s[0][X];
|
|
d[Y2] = s[i+1][Y] - s[0][Y];
|
|
cc = d[X1]*d[Y2] - d[Y1]*d[X2];
|
|
temp = cc;
|
|
if (cc < 0)
|
|
temp = -cc;
|
|
if (temp < MINAREA) return -1; /* is polygon degenerate ? */
|
|
recip = 1.0f/cc;
|
|
d[X1] *= recip;
|
|
d[Y1] *= recip;
|
|
d[X2] *= recip;
|
|
d[Y2] *= recip;
|
|
return(0);
|
|
}
|
|
|
|
#define FitPlane(A, B, C, d,x0,x1,x2) \
|
|
{ \
|
|
dz1 = (x1) - (x0); \
|
|
dz2 = (x2) - (x0); \
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|