Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
193 lines
4.9 KiB
C++
193 lines
4.9 KiB
C++
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void
|
|
FeatureGrid::BLENDFUNCTION (
|
|
FeatureInstance *featureInstance,
|
|
unsigned char *pix_buf,
|
|
int start_span,
|
|
int end_span,
|
|
int downScale
|
|
)
|
|
{
|
|
Feature *feature = featureInstance->feature;
|
|
|
|
Verify(feature->featureMask0!=NULL);
|
|
|
|
unsigned char *mask0data0 = featureInstance->currentMask0Ptr;
|
|
|
|
#ifdef SHOW_MATERIAL
|
|
DWORD mat_color = downScale & 0xffffff;
|
|
downScale >>= 24;
|
|
#endif
|
|
|
|
int mask0_x_off = featureInstance->mask0_x_off >> downScale;
|
|
int mask0_z_off = featureInstance->mask0_z_off >> downScale;
|
|
|
|
int shifter = feature->GetZMask0Scale() + feature->GetXMask0Scale() - 2*downScale;
|
|
|
|
int x_stretch = 1<<(feature->GetXMask0Scale()-downScale);
|
|
int z_stretch = 1<<(feature->GetZMask0Scale()-downScale);
|
|
|
|
#ifdef MASK0_HORIZONTAL_FLIP
|
|
int advancer = x_stretch-1;
|
|
#else
|
|
int advancer = ~(x_stretch-1);
|
|
#endif
|
|
|
|
int advr, mixHr, mixr, mix0r, mix1r, mix00r, mix01r, mix10r, mix11r;
|
|
int advg, mixHg, mixg, mix0g, mix1g, mix00g, mix01g, mix10g, mix11g;
|
|
int advb, mixHb, mixb, mix0b, mix1b, mix00b, mix01b, mix10b, mix11b;
|
|
int pitch = feature->featureMask0->depth * (feature->featureMask0->width + 2); // 2 - padding
|
|
|
|
int src;
|
|
|
|
src = *(int *)mask0data0;
|
|
mix00r = (src & 0x1f) << 3;
|
|
mix00g = (src & 0x3e0) >> 2;
|
|
mix00b = (src & 0x7c00) >> 7;
|
|
|
|
src = *(int *)(mask0data0 + feature->featureMask0->depth);
|
|
mix01r = (src & 0x1f) << 3;
|
|
mix01g = (src & 0x3e0) >> 2;
|
|
mix01b = (src & 0x7c00) >> 7;
|
|
|
|
src = *(int *)(mask0data0 + pitch);
|
|
mix10r = (src & 0x1f) << 3;
|
|
mix10g = (src & 0x3e0) >> 2;
|
|
mix10b = (src & 0x7c00) >> 7;
|
|
|
|
src = *(int *)(mask0data0 + pitch + feature->featureMask0->depth);
|
|
mix11r = (src & 0x1f) << 3;
|
|
mix11g = (src & 0x3e0) >> 2;
|
|
mix11b = (src & 0x7c00) >> 7;
|
|
|
|
mix0r = (mix00r*(z_stretch - mask0_z_off) + mix10r*mask0_z_off);
|
|
mix0g = (mix00g*(z_stretch - mask0_z_off) + mix10g*mask0_z_off);
|
|
mix0b = (mix00b*(z_stretch - mask0_z_off) + mix10b*mask0_z_off);
|
|
|
|
mix1r = (mix01r*(z_stretch - mask0_z_off) + mix11r*mask0_z_off);
|
|
mix1g = (mix01g*(z_stretch - mask0_z_off) + mix11g*mask0_z_off);
|
|
mix1b = (mix01b*(z_stretch - mask0_z_off) + mix11b*mask0_z_off);
|
|
|
|
mixHr = (mix0r*(x_stretch - mask0_x_off) + mix1r*mask0_x_off);
|
|
mixHg = (mix0g*(x_stretch - mask0_x_off) + mix1g*mask0_x_off);
|
|
mixHb = (mix0b*(x_stretch - mask0_x_off) + mix1b*mask0_x_off);
|
|
|
|
advr = mix1r - mix0r;
|
|
advg = mix1g - mix0g;
|
|
advb = mix1b - mix0b;
|
|
|
|
int *pix_buf_int = (int *)pix_buf;
|
|
for(int i=0;;)
|
|
{
|
|
mixr = mixHr>>shifter;
|
|
|
|
mixg = mixHg>>shifter;
|
|
|
|
mixb = mixHb>>shifter;
|
|
|
|
#ifdef MASK0_HORIZONTAL_FLIP
|
|
mixHr -= advr;
|
|
mixHg -= advg;
|
|
mixHb -= advb;
|
|
#else
|
|
mixHr += advr;
|
|
mixHg += advg;
|
|
mixHb += advb;
|
|
#endif
|
|
|
|
#ifdef SHOW_MATERIAL
|
|
pix_buf_int[i] = mat_color;
|
|
#else
|
|
DWORD buf;
|
|
|
|
buf = mixr;
|
|
|
|
buf |= mixg << 8;
|
|
|
|
buf |= mixb << 16;
|
|
|
|
pix_buf_int[i] = buf;
|
|
#endif
|
|
|
|
if(++i>=end_span-start_span)
|
|
{
|
|
break;
|
|
}
|
|
|
|
#ifdef MASK0_HORIZONTAL_FLIP
|
|
if(--mask0_x_off < 0)
|
|
{
|
|
mask0_x_off = advancer;
|
|
mask0data0 -= feature->featureMask0->depth;
|
|
|
|
mix01r = mix00r;
|
|
mix01g = mix00g;
|
|
mix01b = mix00b;
|
|
|
|
src = *(int *)mask0data0;
|
|
mix00r = (src & 0x1f) << 3;
|
|
mix00g = (src & 0x3e0) >> 2;
|
|
mix00b = (src & 0x7c00) >> 7;
|
|
|
|
mix11r = mix10r;
|
|
mix11g = mix10g;
|
|
mix11b = mix10b;
|
|
|
|
src = *(int *)(mask0data0 + pitch);
|
|
mix10r = (src & 0x1f) << 3;
|
|
mix10g = (src & 0x3e0) >> 2;
|
|
mix10b = (src & 0x7c00) >> 7;
|
|
|
|
mix1r = mix0r;
|
|
mix1g = mix0g;
|
|
mix1b = mix0b;
|
|
|
|
mix0r = (mix00r*(z_stretch - mask0_z_off) + mix10r*mask0_z_off);
|
|
mix0g = (mix00g*(z_stretch - mask0_z_off) + mix10g*mask0_z_off);
|
|
mix0b = (mix00b*(z_stretch - mask0_z_off) + mix10b*mask0_z_off);
|
|
#else
|
|
if(++mask0_x_off & advancer)
|
|
{
|
|
mask0_x_off = 0;
|
|
mask0data0 += feature->featureMask0->depth;
|
|
|
|
mix00r = mix01r;
|
|
mix00g = mix01g;
|
|
mix00b = mix01b;
|
|
|
|
src = *(int *)(mask0data0 + feature->featureMask0->depth);
|
|
mix01r = (src & 0x1f) << 3;
|
|
mix01g = (src & 0x3e0) >> 2;
|
|
mix01b = (src & 0x7c00) >> 7;
|
|
|
|
mix10r = mix11r;
|
|
mix10g = mix11g;
|
|
mix10b = mix11b;
|
|
|
|
src = *(int *)(mask0data0 + pitch + feature->featureMask0->depth);
|
|
mix11r = (src & 0x1f) << 3;
|
|
mix11g = (src & 0x3e0) >> 2;
|
|
mix11b = (src & 0x7c00) >> 7;
|
|
|
|
mix0r = mix1r;
|
|
mix0g = mix1g;
|
|
mix0b = mix1b;
|
|
|
|
mix1r = (mix01r*(z_stretch - mask0_z_off) + mix11r*mask0_z_off);
|
|
mix1g = (mix01g*(z_stretch - mask0_z_off) + mix11g*mask0_z_off);
|
|
mix1b = (mix01b*(z_stretch - mask0_z_off) + mix11b*mask0_z_off);
|
|
#endif
|
|
|
|
mixHr = (mix0r*(x_stretch - mask0_x_off) + mix1r*mask0_x_off);
|
|
advr = mix1r - mix0r;
|
|
|
|
mixHg = (mix0g*(x_stretch - mask0_x_off) + mix1g*mask0_x_off);
|
|
advg = mix1g - mix0g;
|
|
|
|
mixHb = (mix0b*(x_stretch - mask0_x_off) + mix1b*mask0_x_off);
|
|
advb = mix1b - mix0b;
|
|
}
|
|
}
|
|
}
|