X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmike.c;h=93b3f21c90f0fda1ee025a63eaf90a34e5687b5a;hb=de84ce114a39f35d6aa75497f66749769139ce0b;hp=411592a9c31011a4a8075b1c4421a5ad485b4679;hpb=c78787f699686cb064504ae8a83844afeb388040;p=dosdemo diff --git a/src/mike.c b/src/mike.c index 411592a..93b3f21 100644 --- a/src/mike.c +++ b/src/mike.c @@ -38,6 +38,8 @@ static unsigned int backgroundH = 0; static unsigned int lastFrameTime = 0; static float lastFrameDuration = 0.0f; +static short *displacementMap; + static float scrollSpeedTable[REFLECTION_HEIGHT]; static float scrollTable[REFLECTION_HEIGHT]; static int scrollTableRounded[REFLECTION_HEIGHT]; @@ -96,6 +98,8 @@ static void draw(void) unsigned short *src = background + scroll; int scanline = 0; int i = 0; + short *disp; + int d; lastFrameDuration = (time_msec - lastFrameTime) / 1000.0f; lastFrameTime = time_msec; @@ -108,12 +112,13 @@ static void draw(void) updateScrollTables(lastFrameDuration); - dst = fb_pixels; - dst += 100 * fb_width; - src = background + NORMALMAP_SCANLINE * backgroundW * 2; + dst = (unsigned short*) fb_pixels + HORIZON_HEIGHT * fb_width; + src = background + HORIZON_HEIGHT * backgroundW; + disp = displacementMap; for (scanline = 0; scanline < REFLECTION_HEIGHT; scanline++) { for (i = 0; i < fb_width; i++) { - *dst++ = src[(i + scrollTableRounded[scanline]) % scrollModTable[scanline]]; + d = disp[(i + scrollTableRounded[scanline]) % scrollModTable[scanline]]; + *dst++ = src[i + scroll + d]; } src += backgroundW; } @@ -135,22 +140,49 @@ static void convert32To16(unsigned int *src32, unsigned short *dst16, unsigned i /* Scale normal with depth and unpack R component (horizontal component) */ static void processNormal() { int scanline; - unsigned int *normalmap = (unsigned int*)background; - normalmap += NORMALMAP_SCANLINE * backgroundW; - unsigned short *dst = normalmap; float scale; int i; int x; + short maxDisplacement = 0; + short minDisplacement = 256; + unsigned short *dst; + short *dst2; + unsigned int *normalmap = (unsigned int*)background; + normalmap += NORMALMAP_SCANLINE * backgroundW; + dst = (unsigned short*)normalmap; + displacementMap = (short*)dst; + dst2 = displacementMap; for (scanline = 0; scanline < REFLECTION_HEIGHT; scanline++) { scale = 2.0f - (float)scanline / ((float)REFLECTION_HEIGHT - 1); scrollModTable[scanline] = (int) (backgroundW / scale + 0.5f); for (i = 0; i < backgroundW; i++) { x = (int)(i * scale + 0.5f); - *dst++ = x < backgroundW ? normalmap[x] & 0xFF : 0; + if (x < backgroundW) { + *dst = (unsigned short)normalmap[x] & 0xFF; + if ((short)*dst > maxDisplacement) maxDisplacement = (short)(*dst); + if ((short)*dst < minDisplacement) minDisplacement = (short)(*dst); + } else { + *dst = 0; + } + dst++; } normalmap += backgroundW; } + + if (maxDisplacement == minDisplacement) { + printf("Warning: grise normalmap fucked up\n"); + return; + } + + /* Second pass - subtract half maximum displacement to displace in both directions */ + for (scanline = 0; scanline < REFLECTION_HEIGHT; scanline++) { + for (i = 0; i < backgroundW; i++) { + /* Remember that MIN_SCROLL is the padding around the screen, so ti's the maximum displacement we can get (positive & negative) */ + *dst2 = 2 * MIN_SCROLL * (*dst2 - minDisplacement) / (maxDisplacement - minDisplacement) - MIN_SCROLL; + dst2++; + } + } } static void initScrollTables() { @@ -172,4 +204,4 @@ static void updateScrollTables(float dt) { scrollTable[i] += scrollSpeedTable[i] * dt; scrollTableRounded[i] = (int)(scrollTable[i] + 0.5f) % scrollModTable[i]; } -} \ No newline at end of file +}