]> git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake2/qdata/tables.c
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / tools / quake2 / qdata / tables.c
1 #include "qdata.h"\r
2 \r
3 /*\r
4 =============================================================================\r
5 \r
6 ALPHALIGHT GENERATION\r
7 \r
8 Find alphamap values that best match modulated lightmap values\r
9 \r
10 This isn't used anymore, but I'm keeping it around...\r
11 =============================================================================\r
12 */\r
13 \r
14 unsigned short  alphamap[32*32*32];\r
15 unsigned char   inverse16to8table[65536];\r
16 \r
17 /*\r
18 static int FindNearestColor( unsigned int color )\r
19 {\r
20         int i;\r
21         int closest_so_far = 0;\r
22         float closest_distance_so_far = 100000000;\r
23         float d;\r
24         float r[2], g[2], b[2];\r
25 \r
26         // incoming color is assumed to be in 0xRRGGBB format\r
27         r[0] = ( color & 31 ) << 3;\r
28         g[0] = ( ( color >> 5 ) & 63 ) << 2;\r
29         b[0] = ( ( color >> 11 ) & 31 ) << 3;\r
30 \r
31         for ( i = 0; i < 256; i++ )\r
32         {\r
33                 r[1] = ( d_8to24table[i] >> 0 ) & 0xFF;\r
34                 g[1] = ( d_8to24table[i] >> 8 ) & 0xFF;\r
35                 b[1] = ( d_8to24table[i] >> 16 ) & 0xFF;\r
36 \r
37                 d = ( r[1] - r[0] ) * ( r[1] - r[0] ) +\r
38                         ( g[1] - g[0] ) * ( g[1] - g[0] ) +\r
39                         ( b[1] - b[0] ) * ( b[1] - b[0] );\r
40 \r
41                 if ( d < closest_distance_so_far )\r
42                 {\r
43                         closest_distance_so_far = d;\r
44                         closest_so_far = i;\r
45                 }\r
46         }\r
47 \r
48         return closest_so_far;\r
49 }\r
50 */\r
51 \r
52 extern byte BestColor( int, int, int, int, int );\r
53 \r
54 void Inverse16_BuildTable( void )\r
55 {\r
56         int i;\r
57 \r
58         /*\r
59         ** create the 16-to-8 table\r
60         */\r
61         for ( i = 0; i < 65536; i++ )\r
62         {\r
63                 int r = i & 31;\r
64                 int g = ( i >> 5 ) & 63;\r
65                 int b = ( i >> 11 ) & 31;\r
66 \r
67                 r <<= 3;\r
68                 g <<= 2;\r
69                 b <<= 3;\r
70 \r
71                 inverse16to8table[i] = BestColor( r, g, b, 0, 255 );\r
72         }\r
73 }\r
74 \r
75 void Alphalight_Thread (int i)\r
76 {\r
77         int             j;\r
78         float   r, g, b;\r
79         float   mr, mg, mb, ma;\r
80         float   distortion, bestdistortion;\r
81         float   v;\r
82 \r
83         r = (i>>10) * (1.0/16);\r
84         g = ((i>>5)&31)  * (1.0/16);\r
85         b = (i&31) * (1.0/16);\r
86 \r
87         bestdistortion = 999999;\r
88         for (j=0 ; j<16*16*16*16 ; j++)\r
89         {\r
90                 mr = (j>>12) * (1.0/16);\r
91                 mg = ((j>>8)&15) * (1.0/16);\r
92                 mb = ((j>>4)&15) * (1.0/16);\r
93                 ma = (j&15) * (1.0/16);\r
94 \r
95                 v = r * 0.5 - (mr*ma + 0.5*(1.0-ma));\r
96                 distortion = v*v;\r
97                 v = g * 0.5 - (mg*ma + 0.5*(1.0-ma));\r
98                 distortion += v*v;\r
99                 v = b * 0.5 - (mb*ma + 0.5*(1.0-ma));\r
100                 distortion += v*v;\r
101 \r
102                 distortion *= 1.0 + ma*4;\r
103 \r
104                 if (distortion < bestdistortion)\r
105                 {\r
106                         bestdistortion = distortion;\r
107                         alphamap[i] = j;\r
108                 }\r
109         }\r
110 }\r
111 \r
112 void Cmd_Alphalight (void)\r
113 {\r
114         char    savename[1024];\r
115 \r
116         GetToken (false);\r
117 \r
118         if (g_release)\r
119         {\r
120                 ReleaseFile (token);\r
121                 return;\r
122         }\r
123 \r
124         sprintf (savename, "%s%s", gamedir, token);\r
125         printf ("Building alphalight table...\n");\r
126 \r
127         RunThreadsOnIndividual (32*32*32, true, Alphalight_Thread);\r
128 \r
129         SaveFile (savename, (byte *)alphamap, sizeof(alphamap));\r
130 }\r
131 \r
132 \r
133 void Cmd_Inverse16Table( void )\r
134 {\r
135         char savename[1024];\r
136 \r
137         if ( g_release )\r
138         {\r
139                 sprintf (savename, "pics/16to8.dat");\r
140                 ReleaseFile( savename );\r
141                 return;\r
142         }\r
143 \r
144         sprintf (savename, "%spics/16to8.dat", gamedir);\r
145         printf ("Building inverse 16-to-8 table...\n");\r
146 \r
147         Inverse16_BuildTable();\r
148 \r
149         SaveFile( savename, (byte *) inverse16to8table, sizeof( inverse16to8table ) );\r
150 }\r