JD2022-TU1/main/extern/Camcam/LIBS/Trackeur/Render.cpp

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;
}