Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
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.
2026-06-24 21:28:16 -05:00

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