Merge branch 'master' of mutantstargoat.com:/home/nuclear/git/dosdemo
[dosdemo] / src / mike.c
index 411592a..850c09a 100644 (file)
@@ -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,14 +112,16 @@ 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;
+               disp += backgroundW;
        }
 }
 
@@ -135,22 +141,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 +205,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
+}