291 lines
7.7 KiB
C++
291 lines
7.7 KiB
C++
#include "TRACK.h"
|
|
|
|
#include "..\LIBS\Input\MAD\MAD_Struct_V0.h"
|
|
#include "..\LIBS\Input\MAD\MAD_mem.h"
|
|
#include "MAD_Rasterize.h"
|
|
#define RENDER
|
|
|
|
//#define RENDER_NORMALS
|
|
|
|
void MAD_Rasterize_TriQuad3D
|
|
(
|
|
MAD_R_Vertex * P32,
|
|
MAD_R_Clipping_Info * C,
|
|
float *Surface
|
|
);
|
|
|
|
|
|
|
|
Vector MATCHMAX,MATCHMIN;
|
|
//float RANDOM[65536];
|
|
float PILOWLENGHT = 0.08f;
|
|
extern MATRIX MatrixSrc;
|
|
|
|
static u32 InitRandom = 65536;
|
|
//extern float RANDOM[65536];
|
|
|
|
void CAMCAM_ProjectVertexCLBK(MAD_R_Vertex *P3D, MAD_R_Vertex *P2D , struct MAD_R_Clipping_Info_ *C)
|
|
{
|
|
*P2D = *P3D;
|
|
}
|
|
|
|
#define IRSIZE 64
|
|
s32 IR[IRSIZE * IRSIZE];
|
|
s32 IRE[IRSIZE * IRSIZE];
|
|
|
|
MAP *RASTERMAP;
|
|
void CAMCAM_RasterizeCallback_SAVE(ULONG Y, MAD_R_Raster * R, MAD_R_Vertex * PIncremental)
|
|
{
|
|
s32 *PB,*PBE,XE,XB;
|
|
XB = (s32)(R->P.X);
|
|
XE = (s32)(R->XEnd);
|
|
PB = IR + Y * IRSIZE + XB;
|
|
PBE = PB + XE - XB;
|
|
while (PB < PBE )
|
|
{
|
|
s32 UX,UY;
|
|
UX = R->P.SclrToInt[0];
|
|
UY = R->P.SclrToInt[1];
|
|
if ((UX>0) && (UY>0))
|
|
if ((UX < RASTERMAP->SX) && (UY < RASTERMAP->SY))
|
|
*PB = *(RASTERMAP->BASE + UX + UY * RASTERMAP->PITCH);
|
|
R->P.SclrToInt[0] += PIncremental->SclrToInt[0];
|
|
R->P.SclrToInt[1] += PIncremental->SclrToInt[1];
|
|
PB++;
|
|
}
|
|
}
|
|
float CAMCAM_RasterizeCallback_ERRORError;
|
|
float CAMCAM_RasterizeCallback_BigSurf;
|
|
void CAMCAM_RasterizeCallback_ERROR(ULONG Y, MAD_R_Raster * R, MAD_R_Vertex * PIncremental)
|
|
{
|
|
s32 *PB,*PBE,XE,XB;
|
|
XB = (s32)(R->P.X);
|
|
XE = (s32)(R->XEnd);
|
|
PB = IR + Y * IRSIZE + XB;
|
|
PBE = PB + XE - XB;
|
|
CAMCAM_RasterizeCallback_BigSurf += XE - XB;
|
|
while (PB < PBE )
|
|
{
|
|
s32 UX,UY;
|
|
UX = R->P.SclrToInt[0];
|
|
UY = R->P.SclrToInt[1];
|
|
float L;
|
|
if ((UX>0) && (UY>0))
|
|
if ((UX < RASTERMAP->SX) && (UY < RASTERMAP->SY))
|
|
{
|
|
L = (*PB - *(RASTERMAP->BASE + UX + UY * RASTERMAP->PITCH));
|
|
CAMCAM_RasterizeCallback_ERRORError+= fabs((float)L);
|
|
*(IRE + (PB - IR))= *(RASTERMAP->BASE + UX + UY * RASTERMAP->PITCH);//fabs((float)L);;
|
|
//*PB = *(RASTERMAP->BASE + UX + UY * RASTERMAP->PITCH);
|
|
}
|
|
R->P.SclrToInt[0] += PIncremental->SclrToInt[0];
|
|
R->P.SclrToInt[1] += PIncremental->SclrToInt[1];
|
|
|
|
PB++;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void BuildGightLeft(s32 SizeY,s32 *RightLeftBuffer,s32 X1,s32 Y1,s32 X2,s32 Y2)
|
|
{
|
|
s32 *Base,*BaseEnd;
|
|
s32 Inc;
|
|
if ((Y1 <= 0) && (Y2 <= 0)) return;
|
|
if ((Y1 >= SizeY) && (Y2 >= SizeY)) return;
|
|
if (Y1 > Y2)
|
|
{
|
|
Inc = X1;
|
|
X1 = X2;
|
|
X2 = Inc;
|
|
Inc = Y1;
|
|
Y1 = Y2;
|
|
Y2 = Inc;
|
|
}
|
|
if (Y2 - Y1)
|
|
{
|
|
Base = RightLeftBuffer + (Y1 << 1);
|
|
BaseEnd = RightLeftBuffer + (Y2 << 1);
|
|
Inc = ((X2 - X1)<<16) / (Y2 - Y1);
|
|
X1 <<= 16;
|
|
while (Y1 < 0)
|
|
{
|
|
X1 += Inc;
|
|
Base=RightLeftBuffer;
|
|
Y1++;
|
|
}
|
|
if (Y1 > SizeY) Base = BaseEnd;
|
|
if (BaseEnd > RightLeftBuffer + SizeY * 2) BaseEnd = RightLeftBuffer + SizeY * 2;
|
|
while (Base < BaseEnd)
|
|
{
|
|
if (X1 < *Base) *Base = X1;
|
|
if (X1 > *(Base+1)) *(Base+1) = X1;
|
|
X1 += Inc;
|
|
Base+=2;
|
|
if (Y1 > SizeY) Base = BaseEnd;
|
|
}
|
|
}
|
|
}
|
|
|
|
void BuildRightLeftScale(MAP &SOURCEMAP , Mesh *pMyMesh, s32 *RightLeftBuffer , Vector *Scale)
|
|
{
|
|
u32 Counter;
|
|
|
|
Counter = SOURCEMAP.SY;
|
|
while (Counter--)
|
|
{
|
|
RightLeftBuffer[Counter<<1] = 1000<<16;
|
|
RightLeftBuffer[(Counter<<1)+1] = -1000<<16;
|
|
}
|
|
|
|
pMyMesh->Tranform(&MatrixSrc,&SOURCEMAP);
|
|
|
|
Counter = pMyMesh->NumberOfFaces;
|
|
while (Counter--)
|
|
{
|
|
u32 I1,I2,I3;
|
|
if (IsBackFace(pMyMesh,Counter))
|
|
|
|
{
|
|
I1 = pMyMesh->Indexes[Counter].I[0];
|
|
I2 = pMyMesh->Indexes[Counter].I[1];
|
|
I3 = pMyMesh->Indexes[Counter].I[2];
|
|
if ((T_Table[I1].z > 0.0f) && (T_Table[I2].z > 0.0f) && (T_Table[I3].z > 0.0f))
|
|
{
|
|
if ((pMyMesh->NeightBIndexes[Counter].I[0] == -1) || !IsBackFace(pMyMesh,pMyMesh->NeightBIndexes[Counter].I[0]))
|
|
BuildGightLeft(SOURCEMAP.SY,RightLeftBuffer,T_Table[I1].x , T_Table[I1].y, T_Table[I2].x , T_Table[I2].y );
|
|
if ((pMyMesh->NeightBIndexes[Counter].I[1] == -1) || !IsBackFace(pMyMesh,pMyMesh->NeightBIndexes[Counter].I[1]))
|
|
BuildGightLeft(SOURCEMAP.SY,RightLeftBuffer,T_Table[I2].x , T_Table[I2].y, T_Table[I3].x , T_Table[I3].y );
|
|
if ((pMyMesh->NeightBIndexes[Counter].I[2] == -1) || !IsBackFace(pMyMesh,pMyMesh->NeightBIndexes[Counter].I[2]))
|
|
BuildGightLeft(SOURCEMAP.SY,RightLeftBuffer,T_Table[I3].x , T_Table[I3].y, T_Table[I1].x , T_Table[I1].y );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
Counter = SOURCEMAP.SY<<1;
|
|
while (Counter--)
|
|
{
|
|
RightLeftBuffer[Counter]>>=16;
|
|
if (RightLeftBuffer[Counter]>=(s32)SOURCEMAP.SX-1) RightLeftBuffer[Counter]=SOURCEMAP.SX-1;
|
|
if (RightLeftBuffer[Counter]<=(s32)0) RightLeftBuffer[Counter]=0;
|
|
}
|
|
|
|
|
|
|
|
Counter = SOURCEMAP.SY - 2;
|
|
while (Counter--)
|
|
{
|
|
s32 *B0,*B1,*B2;
|
|
B0 = SOURCEMAP.BASE + Counter * SOURCEMAP.PITCH;
|
|
B1 = SOURCEMAP.BASE + Counter * SOURCEMAP.PITCH + (RightLeftBuffer[Counter<<1]);
|
|
B2 = SOURCEMAP.BASE + Counter * SOURCEMAP.PITCH + (RightLeftBuffer[(Counter<<1)+1]);
|
|
while (B0 < B1)
|
|
{
|
|
*B0 = 0;
|
|
B0++;
|
|
}
|
|
B0 = SOURCEMAP.BASE + Counter * SOURCEMAP.PITCH + SOURCEMAP.SX;
|
|
while (B2 < B0)
|
|
{
|
|
*B2 = 0;
|
|
B2++;
|
|
}
|
|
}//*/
|
|
}
|
|
|
|
|
|
#pragma optimize ("",off)
|
|
|
|
float RenderMesh_ERROR(MAP &SOURCEMAP , Mesh *pMyMesh, MATRIX *pM , u32 Save)
|
|
{
|
|
u32 Counter;
|
|
MAD_R_Clipping_Info CI;
|
|
float S;
|
|
MAD_Rasterize_Init();
|
|
|
|
RASTERMAP = &SOURCEMAP;
|
|
memset(&CI,0,sizeof(CI));
|
|
CI.XMin = 0.0f;
|
|
CI.YMin = 0.0f;
|
|
CI.ZMin = 0.00001f;
|
|
CI.ZMax = 1000000000.0f;
|
|
CAMCAM_RasterizeCallback_BigSurf = CAMCAM_RasterizeCallback_ERRORError = 0;
|
|
|
|
if (Save)
|
|
{
|
|
CI.XMax = IRSIZE;
|
|
CI.YMax = IRSIZE;
|
|
CI.RasterizeCallback = CAMCAM_RasterizeCallback_SAVE;
|
|
CI.Force2sidedFLAG = 1;
|
|
CI.ProjectVertexCLBK = CAMCAM_ProjectVertexCLBK;
|
|
CI.ClipFlags |= MAD_RASTERIZE_NoClipZ;
|
|
CI.NmbrOfSclrToInt = 2;
|
|
pMyMesh->Tranform(pM,&SOURCEMAP);
|
|
Counter = pMyMesh->NumberOfFaces;
|
|
MAD_R_Vertex Sum[3];
|
|
memset(Sum,0,sizeof(Sum));
|
|
while (Counter--)
|
|
{
|
|
u32 I1,I2,I3;
|
|
if (IsBackFace(pMyMesh,Counter))
|
|
{
|
|
I1 = pMyMesh->Indexes[Counter].I[0];
|
|
I2 = pMyMesh->Indexes[Counter].I[1];
|
|
I3 = pMyMesh->Indexes[Counter].I[2];
|
|
|
|
Sum[0] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[0]] * IRSIZE);
|
|
Sum[1] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[1]] * IRSIZE);
|
|
Sum[2] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[2]] * IRSIZE);
|
|
Sum[0].SclrToInt[0] = T_Table[I1].x;
|
|
Sum[0].SclrToInt[1] = T_Table[I1].y;
|
|
Sum[1].SclrToInt[0] = T_Table[I2].x;
|
|
Sum[1].SclrToInt[1] = T_Table[I2].y;
|
|
Sum[2].SclrToInt[0] = T_Table[I3].x;
|
|
Sum[2].SclrToInt[1] = T_Table[I3].y;
|
|
MAD_Rasterize_TriQuad3D((MAD_R_Vertex *)Sum,&CI,&S);
|
|
}
|
|
}
|
|
|
|
} else
|
|
|
|
{
|
|
CI.XMax = IRSIZE;
|
|
CI.YMax = IRSIZE;
|
|
CI.RasterizeCallback = CAMCAM_RasterizeCallback_ERROR;
|
|
CI.Force2sidedFLAG = 1;
|
|
CI.ProjectVertexCLBK = CAMCAM_ProjectVertexCLBK;
|
|
CI.ClipFlags |= MAD_RASTERIZE_NoClipZ;
|
|
CI.NmbrOfSclrToInt = 2;
|
|
pMyMesh->Tranform(pM,&SOURCEMAP);
|
|
Counter = pMyMesh->NumberOfFaces;
|
|
MAD_R_Vertex Sum[3];
|
|
memset(Sum,0,sizeof(Sum));
|
|
while (Counter--)
|
|
{
|
|
u32 I1,I2,I3;
|
|
if (IsBackFace(pMyMesh,Counter))
|
|
{
|
|
I1 = pMyMesh->Indexes[Counter].I[0];
|
|
I2 = pMyMesh->Indexes[Counter].I[1];
|
|
I3 = pMyMesh->Indexes[Counter].I[2];
|
|
|
|
Sum[0] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[0]] * IRSIZE);
|
|
Sum[1] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[1]] * IRSIZE);
|
|
Sum[2] = *(MAD_R_Vertex *)&(pMyMesh->PointsUV[pMyMesh->Indexes_UV[Counter].I[2]] * IRSIZE);
|
|
Sum[0].SclrToInt[0] = T_Table[I1].x;
|
|
Sum[0].SclrToInt[1] = T_Table[I1].y;
|
|
Sum[1].SclrToInt[0] = T_Table[I2].x;
|
|
Sum[1].SclrToInt[1] = T_Table[I2].y;
|
|
Sum[2].SclrToInt[0] = T_Table[I3].x;
|
|
Sum[2].SclrToInt[1] = T_Table[I3].y;
|
|
MAD_Rasterize_TriQuad3D((MAD_R_Vertex *)Sum,&CI,&S);
|
|
}
|
|
}
|
|
if (CAMCAM_RasterizeCallback_BigSurf)
|
|
CAMCAM_RasterizeCallback_ERRORError *= 1.0f / CAMCAM_RasterizeCallback_BigSurf;
|
|
}
|
|
|
|
|
|
return CAMCAM_RasterizeCallback_ERRORError;
|
|
}
|