]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake2/qdata_heretic2/sprites.c
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / tools / quake2 / qdata_heretic2 / sprites.c
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 \r
23 #include "qdata.h"\r
24 \r
25 #define MAX_SPRFRAMES                   MAX_MD2SKINS\r
26 \r
27 dsprite_t               sprite;\r
28 dsprframe_t             frames[MAX_SPRFRAMES];\r
29 \r
30 byte                    *byteimage, *lbmpalette;\r
31 int                             byteimagewidth, byteimageheight;\r
32 \r
33 qboolean                TrueColorImage;\r
34 unsigned                *longimage;\r
35 int                             longimagewidth, longimageheight;\r
36 \r
37 char                    spritename[1024];\r
38 \r
39 \r
40 void FinishSprite (void);\r
41 void Cmd_Spritename (void);\r
42 \r
43 char spr_prefix[1024];\r
44 char pic_prefix[1024];\r
45 \r
46 extern  char            *g_outputDir;\r
47 \r
48 \r
49 /*\r
50 ==============\r
51 FinishSprite    \r
52 ==============\r
53 */\r
54 void FinishSprite (void)\r
55 {\r
56         FILE    *spriteouthandle;\r
57         int                     i, curframe;\r
58         dsprite_t       spritetemp;\r
59         char            savename[1024];\r
60 \r
61         if (sprite.numframes == 0)\r
62                 return;\r
63 \r
64         if (!strlen(spritename))\r
65                 Error ("Didn't name sprite file");\r
66                 \r
67         sprintf (savename, "%sSprites/%s/%s.sp2", g_outputDir, spr_prefix, spritename);\r
68 \r
69         if (g_release)\r
70         {\r
71                 char    name[1024];\r
72 \r
73                 sprintf (name, "%s.sp2", spritename);\r
74                 ReleaseFile (name);\r
75                 spritename[0] = 0;              // clear for a new sprite\r
76                 sprite.numframes = 0;\r
77                 return;\r
78         }\r
79 \r
80 \r
81         printf ("saving in %s\n", savename);\r
82         CreatePath (savename);\r
83         spriteouthandle = SafeOpenWrite (savename);\r
84 \r
85 \r
86 //\r
87 // write out the sprite header\r
88 //\r
89         spritetemp.ident = LittleLong (IDSPRITEHEADER);\r
90         spritetemp.version = LittleLong (SPRITE_VERSION);\r
91         spritetemp.numframes = LittleLong (sprite.numframes);\r
92 \r
93         SafeWrite (spriteouthandle, &spritetemp, 12);\r
94 \r
95 //\r
96 // write out the frames\r
97 //\r
98         curframe = 0;\r
99 \r
100         for (i=0 ; i<sprite.numframes ; i++)\r
101         {\r
102                 frames[i].width = LittleLong(frames[i].width);\r
103                 frames[i].height = LittleLong(frames[i].height);\r
104                 frames[i].origin_x = LittleLong(frames[i].origin_x);\r
105                 frames[i].origin_y = LittleLong(frames[i].origin_y);\r
106         }\r
107         SafeWrite (spriteouthandle, frames, sizeof(frames[0])*sprite.numframes);\r
108 \r
109         fclose (spriteouthandle);\r
110         \r
111         spritename[0] = 0;              // clear for a new sprite\r
112         sprite.numframes = 0;\r
113 }\r
114 \r
115 \r
116 /*\r
117 ===============\r
118 Cmd_Load\r
119 ===============\r
120 */\r
121 void Cmd_Load (void)\r
122 {\r
123         char    *name;\r
124 \r
125         GetScriptToken (false);\r
126 \r
127         if (g_release)\r
128                 return;\r
129 \r
130         name = ExpandPathAndArchive(token);\r
131 \r
132         // load the image\r
133         printf ("loading %s\n", name);\r
134         TrueColorImage = LoadAnyImage (name, &byteimage, &lbmpalette, &byteimagewidth, &byteimageheight);\r
135 \r
136         if (!TrueColorImage)\r
137         {\r
138 //              RemapZero (byteimage, lbmpalette, byteimagewidth, byteimageheight);\r
139         }\r
140         else\r
141         {\r
142                 if (longimage)\r
143                         free(longimage);\r
144                 longimage = (unsigned *)byteimage;\r
145                 longimagewidth = byteimagewidth;\r
146                 longimageheight = byteimageheight;\r
147 \r
148                 byteimage = NULL;\r
149                 byteimagewidth = 0;\r
150                 byteimageheight = 0;\r
151         }\r
152 }\r
153 \r
154 \r
155 /*\r
156 ===============\r
157 Cmd_SpriteFrame\r
158 ===============\r
159 */\r
160 \r
161 void Cmd_SpriteFrame (void)\r
162 {\r
163         int             x,y,xl,yl,xh,yh,w,h;\r
164         dsprframe_t             *pframe;\r
165         int                             ox, oy, linedelta, size;\r
166 //      byte                    *cropped;\r
167         char                    filename[1024];\r
168         miptex_t                *qtex;\r
169         miptex32_t              *qtex32;\r
170         unsigned        *destl, *sourcel;\r
171         unsigned                bufferl[256*256];\r
172         byte            *dest, *source;\r
173         byte                    buffer[256*256];\r
174 \r
175         GetScriptToken (false);\r
176         xl = atoi (token);\r
177         GetScriptToken (false);\r
178         yl = atoi (token);\r
179         GetScriptToken (false);\r
180         w = atoi (token);\r
181         GetScriptToken (false);\r
182         h = atoi (token);\r
183 \r
184         // origin offset is optional\r
185         if (ScriptTokenAvailable ())\r
186         {\r
187                 GetScriptToken (false);\r
188                 ox = atoi (token);\r
189                 GetScriptToken (false);\r
190                 oy = atoi (token);              \r
191         }\r
192         else\r
193         {\r
194                 ox = w/2;\r
195                 oy = h/2;\r
196         }\r
197 \r
198         if ((xl & 0x0f) || (yl & 0x0f) || (w & 0x0f) || (h & 0x0f))\r
199                 Error ("Sprite dimensions not multiples of 16\n");\r
200 \r
201         if ((w > 256) || (h > 256))\r
202                 Error ("Sprite has a dimension longer than 256");\r
203 \r
204         xh = xl+w;\r
205         yh = yl+h;\r
206 \r
207         if (sprite.numframes >= MAX_SPRFRAMES)\r
208                 Error ("Too many frames; increase MAX_SPRFRAMES\n");\r
209 \r
210         pframe = &frames[sprite.numframes];\r
211         pframe->width = w;\r
212         pframe->height = h;\r
213         pframe->origin_x = ox;\r
214         pframe->origin_y = oy;\r
215 \r
216         if (g_release)\r
217         {\r
218                 ReleaseFile (pframe->name);\r
219                 return;\r
220         }\r
221 \r
222         if (TrueColorImage)\r
223         {\r
224                 sprintf (filename, "%ssprites/%s/%s_%i.m32", g_outputDir, spr_prefix, spritename, sprite.numframes);\r
225                 sprintf (pframe->name, "%s/%s_%i.m32", spr_prefix, spritename, sprite.numframes);\r
226 \r
227                 if (g_release)\r
228                         return; // textures are only released by $maps\r
229 \r
230                 xh = xl+w;\r
231                 yh = yl+h;\r
232 \r
233                 if (xl >= longimagewidth || xh > longimagewidth ||\r
234                         yl >= longimageheight || yh > longimageheight)\r
235                 {\r
236                         Error ("line %i: bad clip dimmensions (%d,%d) (%d,%d) > image (%d,%d)", scriptline, xl,yl,w,h,longimagewidth,longimageheight);\r
237                 }\r
238 \r
239                 sourcel = longimage + (yl*longimagewidth) + xl;\r
240                 destl = bufferl;\r
241                 linedelta = (longimagewidth - w);\r
242 \r
243                 for (y=yl ; y<yh ; y++)\r
244                 {\r
245                         for (x=xl ; x<xh ; x++)\r
246                         {\r
247                                 *destl++ = *sourcel++;  // RGBA\r
248                         }\r
249                         sourcel += linedelta;\r
250                 }\r
251 \r
252                 qtex32 = CreateMip32(bufferl, w, h, &size, true);\r
253 \r
254                 qtex32->contents = 0;\r
255                 qtex32->value = 0;\r
256                 strcpy(qtex32->name, pframe->name);\r
257         //\r
258         // write it out\r
259         //\r
260                 printf ("writing %s\n", filename);\r
261                 SaveFile (filename, (byte *)qtex32, size);\r
262 \r
263                 free (qtex32);\r
264         }\r
265         else\r
266         {\r
267                 sprintf (filename, "%ssprites/%s/%s_%i.m8", g_outputDir, spr_prefix, spritename, sprite.numframes);\r
268                 sprintf (pframe->name, "%s/%s_%i.m8", spr_prefix, spritename, sprite.numframes);\r
269 \r
270                 if (g_release)\r
271                         return; // textures are only released by $maps\r
272 \r
273                 xh = xl+w;\r
274                 yh = yl+h;\r
275 \r
276                 if (xl >= byteimagewidth || xh > byteimagewidth ||\r
277                         yl >= byteimageheight || yh > byteimageheight)\r
278                 {\r
279                         Error ("line %i: bad clip dimmensions (%d,%d) (%d,%d) > image (%d,%d)", scriptline, xl,yl,w,h,byteimagewidth,byteimageheight);\r
280                 }\r
281 \r
282                 source = byteimage + yl*byteimagewidth + xl;\r
283                 dest = buffer;\r
284                 linedelta = byteimagewidth - w;\r
285 \r
286                 for (y=yl ; y<yh ; y++)\r
287                 {\r
288                         for (x=xl ; x<xh ; x++)\r
289                         {\r
290                                 *dest++ = *source++;\r
291                         }\r
292                         source += linedelta;\r
293                 }\r
294 \r
295                 qtex = CreateMip(buffer, w, h, lbmpalette, &size, true);\r
296 \r
297                 qtex->flags = 0;\r
298                 qtex->contents = 0;\r
299                 qtex->value = 0;\r
300                 strcpy(qtex->name, pframe->name);\r
301         //\r
302         // write it out\r
303         //\r
304                 printf ("writing %s\n", filename);\r
305                 SaveFile (filename, (byte *)qtex, size);\r
306 \r
307                 free (qtex);\r
308         }\r
309 \r
310         sprite.numframes++;\r
311 }\r
312 \r
313 \r
314 /*\r
315 ==============\r
316 Cmd_SpriteName\r
317 ==============\r
318 */\r
319 void Cmd_SpriteName (void)\r
320 {\r
321         if (sprite.numframes)\r
322                 FinishSprite ();\r
323 \r
324         GetScriptToken (false);\r
325         strcpy (spritename, token);\r
326         memset (&sprite, 0, sizeof(sprite));\r
327         memset (&frames, 0, sizeof(frames));\r
328 }\r
329 \r
330 \r
331 /*\r
332 ===============\r
333 Cmd_Sprdir\r
334 ===============\r
335 */\r
336 void Cmd_Sprdir (void)\r
337 {\r
338         char    filename[1024];\r
339 \r
340         GetScriptToken (false);\r
341         strcpy (spr_prefix, token);\r
342         // create the directory if needed\r
343         sprintf (filename, "%sSprites", g_outputDir);\r
344         Q_mkdir (filename); \r
345         sprintf (filename, "%sSprites/%s", g_outputDir, spr_prefix);\r
346         Q_mkdir (filename); \r
347 }\r
348 \r
349 \r