summaryrefslogtreecommitdiff
path: root/src/refresh/sw/block.h
blob: 8b774fa933e6426ff6536d7207f53b9cf83e3ede (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#define BLOCK_SIZE  (1 << BLOCK_SHIFT)

static void BLOCK_FUNC(void)
{
    int     lightleft[3], lightright[3];
    int     lightleftstep[3], lightrightstep[3];
    int     v, i, b, lightstep[3], light[3];
    byte    *psource, *prowdest;

    psource = pbasesource;
    prowdest = prowdestbase;

    for (v = 0 ; v < r_numvblocks ; v++) {
        // FIXME: use delta rather than both right and left, like ASM?
        lightleft[0] = r_lightptr[0 * LIGHTMAP_BYTES + 0];
        lightleft[1] = r_lightptr[0 * LIGHTMAP_BYTES + 1];
        lightleft[2] = r_lightptr[0 * LIGHTMAP_BYTES + 2];
        lightright[0] = r_lightptr[1 * LIGHTMAP_BYTES + 0];
        lightright[1] = r_lightptr[1 * LIGHTMAP_BYTES + 1];
        lightright[2] = r_lightptr[1 * LIGHTMAP_BYTES + 2];
        r_lightptr += r_lightwidth;
        lightleftstep[0] = (r_lightptr[0 * LIGHTMAP_BYTES + 0] - lightleft[0]) >> BLOCK_SHIFT;
        lightleftstep[1] = (r_lightptr[0 * LIGHTMAP_BYTES + 1] - lightleft[1]) >> BLOCK_SHIFT;
        lightleftstep[2] = (r_lightptr[0 * LIGHTMAP_BYTES + 2] - lightleft[2]) >> BLOCK_SHIFT;
        lightrightstep[0] = (r_lightptr[1 * LIGHTMAP_BYTES + 0] - lightright[0]) >> BLOCK_SHIFT;
        lightrightstep[1] = (r_lightptr[1 * LIGHTMAP_BYTES + 1] - lightright[1]) >> BLOCK_SHIFT;
        lightrightstep[2] = (r_lightptr[1 * LIGHTMAP_BYTES + 2] - lightright[2]) >> BLOCK_SHIFT;

        for (i = 0 ; i < BLOCK_SIZE ; i++) {
            lightstep[0] = (lightleft[0] - lightright[0]) >> BLOCK_SHIFT;
            lightstep[1] = (lightleft[1] - lightright[1]) >> BLOCK_SHIFT;
            lightstep[2] = (lightleft[2] - lightright[2]) >> BLOCK_SHIFT;

            light[0] = lightright[0];
            light[1] = lightright[1];
            light[2] = lightright[2];

            for (b = BLOCK_SIZE - 1; b >= 0; b--) {
                prowdest[b * TEX_BYTES + 0] = (psource[b * TEX_BYTES + 0] * light[0]) >> 16;
                prowdest[b * TEX_BYTES + 1] = (psource[b * TEX_BYTES + 1] * light[1]) >> 16;
                prowdest[b * TEX_BYTES + 2] = (psource[b * TEX_BYTES + 2] * light[2]) >> 16;
                light[0] += lightstep[0];
                light[1] += lightstep[1];
                light[2] += lightstep[2];
            }

            psource += sourcetstep;
            lightright[0] += lightrightstep[0];
            lightright[1] += lightrightstep[1];
            lightright[2] += lightrightstep[2];
            lightleft[0] += lightleftstep[0];
            lightleft[1] += lightleftstep[1];
            lightleft[2] += lightleftstep[2];
            prowdest += surfrowbytes;
        }

        if (psource >= r_sourcemax)
            psource -= r_stepback;
    }
}

#undef BLOCK_FUNC
#undef BLOCK_SIZE
#undef BLOCK_SHIFT