2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\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
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
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
25 #define MAX_SPRFRAMES MAX_MD2SKINS
\r
28 dsprframe_t frames[MAX_SPRFRAMES];
\r
30 byte *byteimage, *lbmpalette;
\r
31 int byteimagewidth, byteimageheight;
\r
33 qboolean TrueColorImage;
\r
34 unsigned *longimage;
\r
35 int longimagewidth, longimageheight;
\r
37 char spritename[1024];
\r
40 void FinishSprite (void);
\r
41 void Cmd_Spritename (void);
\r
43 char spr_prefix[1024];
\r
44 char pic_prefix[1024];
\r
46 extern char *g_outputDir;
\r
54 void FinishSprite (void)
\r
56 FILE *spriteouthandle;
\r
58 dsprite_t spritetemp;
\r
59 char savename[1024];
\r
61 if (sprite.numframes == 0)
\r
64 if (!strlen(spritename))
\r
65 Error ("Didn't name sprite file");
\r
67 sprintf (savename, "%sSprites/%s/%s.sp2", g_outputDir, spr_prefix, spritename);
\r
73 sprintf (name, "%s.sp2", spritename);
\r
75 spritename[0] = 0; // clear for a new sprite
\r
76 sprite.numframes = 0;
\r
81 printf ("saving in %s\n", savename);
\r
82 CreatePath (savename);
\r
83 spriteouthandle = SafeOpenWrite (savename);
\r
87 // write out the sprite header
\r
89 spritetemp.ident = LittleLong (IDSPRITEHEADER);
\r
90 spritetemp.version = LittleLong (SPRITE_VERSION);
\r
91 spritetemp.numframes = LittleLong (sprite.numframes);
\r
93 SafeWrite (spriteouthandle, &spritetemp, 12);
\r
96 // write out the frames
\r
100 for (i=0 ; i<sprite.numframes ; i++)
\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
107 SafeWrite (spriteouthandle, frames, sizeof(frames[0])*sprite.numframes);
\r
109 fclose (spriteouthandle);
\r
111 spritename[0] = 0; // clear for a new sprite
\r
112 sprite.numframes = 0;
\r
121 void Cmd_Load (void)
\r
125 GetScriptToken (false);
\r
130 name = ExpandPathAndArchive(token);
\r
133 printf ("loading %s\n", name);
\r
134 TrueColorImage = LoadAnyImage (name, &byteimage, &lbmpalette, &byteimagewidth, &byteimageheight);
\r
136 if (!TrueColorImage)
\r
138 // RemapZero (byteimage, lbmpalette, byteimagewidth, byteimageheight);
\r
144 longimage = (unsigned *)byteimage;
\r
145 longimagewidth = byteimagewidth;
\r
146 longimageheight = byteimageheight;
\r
149 byteimagewidth = 0;
\r
150 byteimageheight = 0;
\r
161 void Cmd_SpriteFrame (void)
\r
163 int x,y,xl,yl,xh,yh,w,h;
\r
164 dsprframe_t *pframe;
\r
165 int ox, oy, linedelta, size;
\r
167 char filename[1024];
\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
175 GetScriptToken (false);
\r
177 GetScriptToken (false);
\r
179 GetScriptToken (false);
\r
181 GetScriptToken (false);
\r
184 // origin offset is optional
\r
185 if (ScriptTokenAvailable ())
\r
187 GetScriptToken (false);
\r
189 GetScriptToken (false);
\r
190 oy = atoi (token);
\r
198 if ((xl & 0x0f) || (yl & 0x0f) || (w & 0x0f) || (h & 0x0f))
\r
199 Error ("Sprite dimensions not multiples of 16\n");
\r
201 if ((w > 256) || (h > 256))
\r
202 Error ("Sprite has a dimension longer than 256");
\r
207 if (sprite.numframes >= MAX_SPRFRAMES)
\r
208 Error ("Too many frames; increase MAX_SPRFRAMES\n");
\r
210 pframe = &frames[sprite.numframes];
\r
212 pframe->height = h;
\r
213 pframe->origin_x = ox;
\r
214 pframe->origin_y = oy;
\r
218 ReleaseFile (pframe->name);
\r
222 if (TrueColorImage)
\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
228 return; // textures are only released by $maps
\r
233 if (xl >= longimagewidth || xh > longimagewidth ||
\r
234 yl >= longimageheight || yh > longimageheight)
\r
236 Error ("line %i: bad clip dimmensions (%d,%d) (%d,%d) > image (%d,%d)", scriptline, xl,yl,w,h,longimagewidth,longimageheight);
\r
239 sourcel = longimage + (yl*longimagewidth) + xl;
\r
241 linedelta = (longimagewidth - w);
\r
243 for (y=yl ; y<yh ; y++)
\r
245 for (x=xl ; x<xh ; x++)
\r
247 *destl++ = *sourcel++; // RGBA
\r
249 sourcel += linedelta;
\r
252 qtex32 = CreateMip32(bufferl, w, h, &size, true);
\r
254 qtex32->contents = 0;
\r
256 strcpy(qtex32->name, pframe->name);
\r
260 printf ("writing %s\n", filename);
\r
261 SaveFile (filename, (byte *)qtex32, size);
\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
271 return; // textures are only released by $maps
\r
276 if (xl >= byteimagewidth || xh > byteimagewidth ||
\r
277 yl >= byteimageheight || yh > byteimageheight)
\r
279 Error ("line %i: bad clip dimmensions (%d,%d) (%d,%d) > image (%d,%d)", scriptline, xl,yl,w,h,byteimagewidth,byteimageheight);
\r
282 source = byteimage + yl*byteimagewidth + xl;
\r
284 linedelta = byteimagewidth - w;
\r
286 for (y=yl ; y<yh ; y++)
\r
288 for (x=xl ; x<xh ; x++)
\r
290 *dest++ = *source++;
\r
292 source += linedelta;
\r
295 qtex = CreateMip(buffer, w, h, lbmpalette, &size, true);
\r
298 qtex->contents = 0;
\r
300 strcpy(qtex->name, pframe->name);
\r
304 printf ("writing %s\n", filename);
\r
305 SaveFile (filename, (byte *)qtex, size);
\r
310 sprite.numframes++;
\r
319 void Cmd_SpriteName (void)
\r
321 if (sprite.numframes)
\r
324 GetScriptToken (false);
\r
325 strcpy (spritename, token);
\r
326 memset (&sprite, 0, sizeof(sprite));
\r
327 memset (&frames, 0, sizeof(frames));
\r
336 void Cmd_Sprdir (void)
\r
338 char filename[1024];
\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