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
|