JD2022-TU1/main/extern/Camcam/Tools/GlobalZRelight.cpp

291 lines
No EOL
6.2 KiB
C++

#include "SCENE.h"
//#pragma optimize("",off)
MAP MyMap;
MAP16 MyMap16;
#define XOZ 655360.0f
static double OoZFactor = 1000000.0f ;
void MAP_ValidMyMap(MAP *pColorMap)
{
MyMap.SetSize(pColorMap->SX, pColorMap->SY);
MyMap16.SetSize(pColorMap->SX, pColorMap->SY);
}
void MAP_PPRIMESENS_ComputeMatting(MAP *pColorMap )
{
MAP_ValidMyMap(pColorMap);
s32 *pColor,*pColor2;
s16 *MMPtr;
MMPtr = MyMap16.GetBase();
pColor = pColorMap->GetBase();
pColor2 = MyMap.GetBase();
for (int Y = 0 ; Y < pColorMap->SY ; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
if (*pColor & 1<<24)
*MMPtr = 0;
else
*MMPtr = 0xff;
MMPtr++;
pColor++;
}
MAP16_BLUR_Inplace(&MyMap16,3,1);
MMPtr = MyMap16.GetBase();
pColor = pColorMap->GetBase();
pColor2 = MyMap.GetBase();
for (int Y = 0 ; Y < pColorMap->SY ; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
//if (*pColor & 2<<24) *MMPtr = 255;
//if (*pColor & 1<<24) *MMPtr = 0;
if (*MMPtr < 16)
*MMPtr = 0xff;
else
if (*MMPtr < 256-4)
{
float R,G,B,D;
R = (*pColor & 0xff) - (*pColor2 & 0xff);
G = ((*pColor>>8) & 0xff) - ((*pColor2>>8) & 0xff);
B = ((*pColor>>16) & 0xff) - ((*pColor2>>16) & 0xff);
D = R*R + G*G + B*B;
if (D > 1024)
*MMPtr = 0xff;
else
*MMPtr = 0;
}
else
{
//if (*MMPtr == 255)
//if (!(*pColor & 2<<24))
*pColor2 = *pColor;
*MMPtr = 0;
}
MMPtr++;
pColor++;
pColor2++;
}
//MAP16_BLUR_Inplace(&MyMap16,1,2);
MAP16_2_MAP(&MyMap16,pColorMap,24);
}
void MAP_PPRIMESENS_ComputeNormales(u16 *ZOoMap , MAP *pColorMap )
{
s32 *pColor = pColorMap->GetBase();
ZOoMap += pColorMap->SX * pColorMap->SY;
for (int Y = 0 ; Y < pColorMap->SY ; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
ZOoMap--;
//*pColor = 0;
float R,G,B;
static float OoZfactorDim = 1.001;
float DX1,DX2;
float Z1,Z2,Z3,Z4;
static u32 Deltr = 4;
static float Errormetrometer = 0.00001f;
Z1 = (*(ZOoMap )+Errormetrometer);
Z2 = (*(ZOoMap +Deltr)+Errormetrometer);
Z3 = (*(ZOoMap -Deltr)+Errormetrometer);
DX1 = (Z1 - Z3);
DX2 = (Z2 - Z1);
if (fabs(DX1) < fabs(DX2)) DX1 = DX2;
R = OoZfactorDim * DX1;
Z2 = (*(ZOoMap +Deltr*pColorMap->PITCH)+Errormetrometer);
Z3 = (*(ZOoMap -Deltr*pColorMap->PITCH)+Errormetrometer);
DX1 = (Z1 - Z3);
DX2 = (Z2 - Z1);
if (fabs(DX1) > fabs(DX2)) DX1 = DX2;
G = OoZfactorDim * DX1;
B = 0.0f;
B += 128.0f;
R += 128.0f;
G += 128.0f;
if (R > 255.0f) R = 255.0f;
if (G > 255.0f) G = 255.0f;
if (B > 255.0f) B = 255.0f;
if (R < 0.0f) R = 0.0f;
if (G < 0.0f) G = 0.0f;
if (B < 0.0f) B = 0.0f;
((u8*)pColor)[0] = R;
((u8*)pColor)[1] = G;
((u8*)pColor)[2] = B;
((u8*)pColor)[3] = 255;
pColor++;
}
}
void MAP_PPRIMESENS_ReLightWithZ(u16 *ZOoMap , MAP *pColorMap , MAP *pShadowMAP , Vector *GCenter , float DX, float DY)
{
// MAP_PPRIMESENS_ComputeNormales(ZOoMap , pColorMap );
//return;
MAP_ValidMyMap(pColorMap);
s32 *pColor = pColorMap->GetBase();
ZOoMap += pColorMap->SX * pColorMap->SY;
s32 *LocalOoZMap = MyMap.GetBase();
for (int Y = 0 ; Y < pColorMap->SY ; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
float Z;
ZOoMap--;
*pColor = 0;
/* if (!*ZOoMap)
{
Z = ((((float)X - GCenter->x) * DX + ((float)Y - GCenter->y) * DY + GCenter->z));
Z = XOZ / Z;
if (Z > 0) *ZOoMap = Z;
}*/
if (*ZOoMap)
{
Z = 1024.0f * 4.0f * 65536.0f / (float)*ZOoMap ;
*pColor = *LocalOoZMap = (s32)Z;
}
LocalOoZMap++;
pColor++;
}
pColor -= pColorMap->SX * pColorMap->SY;
ZOoMap += pColorMap->SX * pColorMap->SY;
/* */
#define BOXBLUR 8
for (int Y = BOXBLUR ; Y < pColorMap->SY - BOXBLUR; Y++)
for (int X = BOXBLUR ; X < pColorMap->SX - BOXBLUR; X++)
{
s32 *pBase;
pBase = MyMap.GetBase() + X + Y * MyMap.PITCH;
if (*pBase)
{
double lDX,lDY;
lDX = (*(pBase + 1) - *(pBase - 1))>>1;
lDY = (*(pBase + MyMap.PITCH) - *(pBase - MyMap.PITCH))>>1;
double Value = 0,Pond = 0;
Value += (double)*pBase * (float)(BOXBLUR * BOXBLUR) *1.0f;
Pond +=(BOXBLUR * BOXBLUR) *1.f;
for (int YP = Y-BOXBLUR ; YP < Y + BOXBLUR ; YP+=2)
for (int XP = X-BOXBLUR ; XP < X + BOXBLUR ; XP+=2)
{
s32 *pBase2;
float Radius = (X-XP) * (X-XP) + (Y-YP) * (Y-YP);
if (Radius < BOXBLUR * BOXBLUR)
{
pBase2 = MyMap.GetBase() + XP + YP * MyMap.PITCH;
static double TTTTTSSSSFCQSDSD = 0.200;
double THRESH = TTTTTSSSSFCQSDSD * (double)*pBase;
if (*pBase2 )
{
Radius = 1.0f - sqrt(Radius+0.001) / (float)(BOXBLUR);
double EstimatedZ = ((double)(XP - X) * -lDX + (double)(YP - Y) * -lDY + *pBase2);
if (EstimatedZ > *pBase + 1000)
{
/* if ((abs(*pBase2 - *pBase)<TTTTTSSSSFCQSDSD))
{
Value += *pBase2;
Pond ++;
} else*/
if ((abs(EstimatedZ - *pBase)<THRESH))
{
double Factor = 1.0f - (abs(EstimatedZ - *pBase))/THRESH;
Factor *= Radius ;
Value += (double)EstimatedZ * Factor;
Pond += Factor;
}
}
}
}
}
if (Pond)
{
Value/=Pond;
*pBase = (s32)(Value);
}
}
}
//MAP16_BLUR_Inplace(&MyMap , 5 , 1);
LocalOoZMap = MyMap.GetBase();
pColor = pColorMap->GetBase();
for (int Y = 0 ; Y < pColorMap->SY ; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
if (*pColor)
{
double ZFac = OoZFactor / (float)*pColor;
*pColor -= (s32)*LocalOoZMap;
*pColor *= ZFac;
*pColor |= 1;
}
LocalOoZMap++;
pColor++;
}//*/
LocalOoZMap = MyMap.GetBase();
pColor = pColorMap->GetBase();
for (int Y = 0 ; Y < pColorMap->SY -1; Y++)
for (int X = 0 ; X < pColorMap->SX ; X++)
{
float Z;
Z = 0;
ZOoMap--;
if (*pColor)
{
Z = *pColor;
#define ZThresh 16.0*32.0f
/* if (Z > ZThresh)
{
Z = ZThresh - Z;
if (Z < 0) Z = 0;
}
if (Z < -ZThresh)
{
Z = -Z;
Z = ZThresh - Z;
if (Z < 0) Z = 0;
Z = -Z;
}*/
//if (Z>0) Z = 0.0f;
Z /= 128.0f;
}
Z += 128.0f;
if (Z > 255.0f) Z = 255.0f;
if (Z < 0.0f) Z = 0.0f;
*pColor = (s32)Z;
*pColor |= *pColor<<8;
*pColor |= *pColor<<8;
*pColor |= 0xff000000;
LocalOoZMap++;
pColor++;
}
}