Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5131 | clevermous | 1 | /* |
2 | Copyright (C) 1996-1997 Id Software, Inc. |
||
3 | |||
4 | This program is free software; you can redistribute it and/or |
||
5 | modify it under the terms of the GNU General Public License |
||
6 | as published by the Free Software Foundation; either version 2 |
||
7 | of the License, or (at your option) any later version. |
||
8 | |||
9 | This program is distributed in the hope that it will be useful, |
||
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
||
12 | |||
13 | See the GNU General Public License for more details. |
||
14 | |||
15 | You should have received a copy of the GNU General Public License |
||
16 | along with this program; if not, write to the Free Software |
||
17 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
||
18 | |||
19 | */ |
||
20 | // r_sky.c |
||
21 | |||
22 | #include "quakedef.h" |
||
23 | #include "r_local.h" |
||
24 | #include "d_local.h" |
||
25 | |||
26 | |||
27 | int iskyspeed = 8; |
||
28 | int iskyspeed2 = 2; |
||
29 | float skyspeed, skyspeed2; |
||
30 | |||
31 | float skytime; |
||
32 | |||
33 | byte *r_skysource; |
||
34 | |||
35 | int r_skymade; |
||
36 | int r_skydirect; // not used? |
||
37 | |||
38 | |||
39 | // TODO: clean up these routines |
||
40 | |||
41 | byte bottomsky[128*131]; |
||
42 | byte bottommask[128*131]; |
||
43 | byte newsky[128*256]; // newsky and topsky both pack in here, 128 bytes |
||
44 | // of newsky on the left of each scan, 128 bytes |
||
45 | // of topsky on the right, because the low-level |
||
46 | // drawers need 256-byte scan widths |
||
47 | |||
48 | |||
49 | /* |
||
50 | ============= |
||
51 | R_InitSky |
||
52 | |||
53 | A sky texture is 256*128, with the right side being a masked overlay |
||
54 | ============== |
||
55 | */ |
||
56 | void R_InitSky (texture_t *mt) |
||
57 | { |
||
58 | int i, j; |
||
59 | byte *src; |
||
60 | |||
61 | src = (byte *)mt + mt->offsets[0]; |
||
62 | |||
63 | for (i=0 ; i<128 ; i++) |
||
64 | { |
||
65 | for (j=0 ; j<128 ; j++) |
||
66 | { |
||
67 | newsky[(i*256) + j + 128] = src[i*256 + j + 128]; |
||
68 | } |
||
69 | } |
||
70 | |||
71 | for (i=0 ; i<128 ; i++) |
||
72 | { |
||
73 | for (j=0 ; j<131 ; j++) |
||
74 | { |
||
75 | if (src[i*256 + (j & 0x7F)]) |
||
76 | { |
||
77 | bottomsky[(i*131) + j] = src[i*256 + (j & 0x7F)]; |
||
78 | bottommask[(i*131) + j] = 0; |
||
79 | } |
||
80 | else |
||
81 | { |
||
82 | bottomsky[(i*131) + j] = 0; |
||
83 | bottommask[(i*131) + j] = 0xff; |
||
84 | } |
||
85 | } |
||
86 | } |
||
87 | |||
88 | r_skysource = newsky; |
||
89 | } |
||
90 | |||
91 | |||
92 | /* |
||
93 | ================= |
||
94 | R_MakeSky |
||
95 | ================= |
||
96 | */ |
||
97 | void R_MakeSky (void) |
||
98 | { |
||
99 | int x, y; |
||
100 | int ofs, baseofs; |
||
101 | int xshift, yshift; |
||
102 | unsigned *pnewsky; |
||
103 | static int xlast = -1, ylast = -1; |
||
104 | |||
105 | xshift = skytime*skyspeed; |
||
106 | yshift = skytime*skyspeed; |
||
107 | |||
108 | if ((xshift == xlast) && (yshift == ylast)) |
||
109 | return; |
||
110 | |||
111 | xlast = xshift; |
||
112 | ylast = yshift; |
||
113 | |||
114 | pnewsky = (unsigned *)&newsky[0]; |
||
115 | |||
116 | for (y=0 ; y |
||
117 | { |
||
118 | baseofs = ((y+yshift) & SKYMASK) * 131; |
||
119 | |||
120 | // FIXME: clean this up |
||
121 | #if UNALIGNED_OK |
||
122 | |||
123 | for (x=0 ; x |
||
124 | { |
||
125 | ofs = baseofs + ((x+xshift) & SKYMASK); |
||
126 | |||
127 | // PORT: unaligned dword access to bottommask and bottomsky |
||
128 | |||
129 | *pnewsky = (*(pnewsky + (128 / sizeof (unsigned))) & |
||
130 | *(unsigned *)&bottommask[ofs]) | |
||
131 | *(unsigned *)&bottomsky[ofs]; |
||
132 | pnewsky++; |
||
133 | } |
||
134 | |||
135 | #else |
||
136 | |||
137 | for (x=0 ; x |
||
138 | { |
||
139 | ofs = baseofs + ((x+xshift) & SKYMASK); |
||
140 | |||
141 | *(byte *)pnewsky = (*((byte *)pnewsky + 128) & |
||
142 | *(byte *)&bottommask[ofs]) | |
||
143 | *(byte *)&bottomsky[ofs]; |
||
144 | pnewsky = (unsigned *)((byte *)pnewsky + 1); |
||
145 | } |
||
146 | |||
147 | #endif |
||
148 | |||
149 | pnewsky += 128 / sizeof (unsigned); |
||
150 | } |
||
151 | |||
152 | r_skymade = 1; |
||
153 | } |
||
154 | |||
155 | |||
156 | /* |
||
157 | ================= |
||
158 | R_GenSkyTile |
||
159 | ================= |
||
160 | */ |
||
161 | void R_GenSkyTile (void *pdest) |
||
162 | { |
||
163 | int x, y; |
||
164 | int ofs, baseofs; |
||
165 | int xshift, yshift; |
||
166 | unsigned *pnewsky; |
||
167 | unsigned *pd; |
||
168 | |||
169 | xshift = skytime*skyspeed; |
||
170 | yshift = skytime*skyspeed; |
||
171 | |||
172 | pnewsky = (unsigned *)&newsky[0]; |
||
173 | pd = (unsigned *)pdest; |
||
174 | |||
175 | for (y=0 ; y |
||
176 | { |
||
177 | baseofs = ((y+yshift) & SKYMASK) * 131; |
||
178 | |||
179 | // FIXME: clean this up |
||
180 | #if UNALIGNED_OK |
||
181 | |||
182 | for (x=0 ; x |
||
183 | { |
||
184 | ofs = baseofs + ((x+xshift) & SKYMASK); |
||
185 | |||
186 | // PORT: unaligned dword access to bottommask and bottomsky |
||
187 | |||
188 | *pd = (*(pnewsky + (128 / sizeof (unsigned))) & |
||
189 | *(unsigned *)&bottommask[ofs]) | |
||
190 | *(unsigned *)&bottomsky[ofs]; |
||
191 | pnewsky++; |
||
192 | pd++; |
||
193 | } |
||
194 | |||
195 | #else |
||
196 | |||
197 | for (x=0 ; x |
||
198 | { |
||
199 | ofs = baseofs + ((x+xshift) & SKYMASK); |
||
200 | |||
201 | *(byte *)pd = (*((byte *)pnewsky + 128) & |
||
202 | *(byte *)&bottommask[ofs]) | |
||
203 | *(byte *)&bottomsky[ofs]; |
||
204 | pnewsky = (unsigned *)((byte *)pnewsky + 1); |
||
205 | pd = (unsigned *)((byte *)pd + 1); |
||
206 | } |
||
207 | |||
208 | #endif |
||
209 | |||
210 | pnewsky += 128 / sizeof (unsigned); |
||
211 | } |
||
212 | } |
||
213 | |||
214 | |||
215 | /* |
||
216 | ================= |
||
217 | R_GenSkyTile16 |
||
218 | ================= |
||
219 | */ |
||
220 | void R_GenSkyTile16 (void *pdest) |
||
221 | { |
||
222 | int x, y; |
||
223 | int ofs, baseofs; |
||
224 | int xshift, yshift; |
||
225 | byte *pnewsky; |
||
226 | unsigned short *pd; |
||
227 | |||
228 | xshift = skytime * skyspeed; |
||
229 | yshift = skytime * skyspeed; |
||
230 | |||
231 | pnewsky = (byte *)&newsky[0]; |
||
232 | pd = (unsigned short *)pdest; |
||
233 | |||
234 | for (y=0 ; y |
||
235 | { |
||
236 | baseofs = ((y+yshift) & SKYMASK) * 131; |
||
237 | |||
238 | // FIXME: clean this up |
||
239 | // FIXME: do faster unaligned version? |
||
240 | for (x=0 ; x |
||
241 | { |
||
242 | ofs = baseofs + ((x+xshift) & SKYMASK); |
||
243 | |||
244 | *pd = d_8to16table[(*(pnewsky + 128) & |
||
245 | *(byte *)&bottommask[ofs]) | |
||
246 | *(byte *)&bottomsky[ofs]]; |
||
247 | pnewsky++; |
||
248 | pd++; |
||
249 | } |
||
250 | |||
251 | pnewsky += TILE_SIZE; |
||
252 | } |
||
253 | } |
||
254 | |||
255 | |||
256 | /* |
||
257 | ============= |
||
258 | R_SetSkyFrame |
||
259 | ============== |
||
260 | */ |
||
261 | void R_SetSkyFrame (void) |
||
262 | { |
||
263 | int g, s1, s2; |
||
264 | float temp; |
||
265 | |||
266 | skyspeed = iskyspeed; |
||
267 | skyspeed2 = iskyspeed2; |
||
268 | |||
269 | g = GreatestCommonDivisor (iskyspeed, iskyspeed2); |
||
270 | s1 = iskyspeed / g; |
||
271 | s2 = iskyspeed2 / g; |
||
272 | temp = SKYSIZE * s1 * s2; |
||
273 | |||
274 | skytime = cl.time - ((int)(cl.time / temp) * temp); |
||
275 | |||
276 | |||
277 | r_skymade = 0; |
||
278 | }131>128>128>128> |
||
279 |