]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - tools/quake2/qdata/sprites.c
set eol-style
[xonotic/netradiant.git] / tools / quake2 / qdata / sprites.c
1
2 #include "qdata.h"
3 #include "inout.h"
4
5 #define MAX_SPRFRAMES                   MAX_MD2SKINS
6
7 dsprite_t               sprite;
8 dsprframe_t             frames[MAX_SPRFRAMES];
9
10 byte                    *byteimage, *lbmpalette;
11 int                             byteimagewidth, byteimageheight;
12
13 char                    spritename[1024];
14
15
16 void FinishSprite (void);
17 void Cmd_Spritename (void);
18
19
20
21 /*
22 ==============
23 FinishSprite    
24 ==============
25 */
26 void FinishSprite (void)
27 {
28         FILE    *spriteouthandle;
29         int                     i, curframe;
30         dsprite_t       spritetemp;
31         char            savename[1024];
32
33         if (sprite.numframes == 0)
34                 return;
35
36         if (!strlen(spritename))
37                 Error ("Didn't name sprite file");
38                 
39         sprintf (savename, "%s%s.sp2", gamedir, spritename);
40
41         if (g_release)
42         {
43                 char    name[1024];
44
45                 sprintf (name, "%s.sp2", spritename);
46                 ReleaseFile (name);
47                 spritename[0] = 0;              // clear for a new sprite
48                 sprite.numframes = 0;
49                 return;
50         }
51
52
53         printf ("saving in %s\n", savename);
54         CreatePath (savename);
55         spriteouthandle = SafeOpenWrite (savename);
56
57
58 //
59 // write out the sprite header
60 //
61         spritetemp.ident = LittleLong (IDSPRITEHEADER);
62         spritetemp.version = LittleLong (SPRITE_VERSION);
63         spritetemp.numframes = LittleLong (sprite.numframes);
64
65         SafeWrite (spriteouthandle, &spritetemp, 12);
66
67 //
68 // write out the frames
69 //
70         curframe = 0;
71
72         for (i=0 ; i<sprite.numframes ; i++)
73         {
74                 frames[i].width = LittleLong(frames[i].width);
75                 frames[i].height = LittleLong(frames[i].height);
76                 frames[i].origin_x = LittleLong(frames[i].origin_x);
77                 frames[i].origin_y = LittleLong(frames[i].origin_y);
78         }
79         SafeWrite (spriteouthandle, frames, sizeof(frames[0])*sprite.numframes);
80
81         fclose (spriteouthandle);
82         
83         spritename[0] = 0;              // clear for a new sprite
84         sprite.numframes = 0;
85 }
86
87
88 /*
89 ===============
90 Cmd_Load
91 ===============
92 */
93 void Cmd_Load (void)
94 {
95         char    *name;
96
97         GetToken (false);
98
99         if (g_release)
100                 return;
101
102         name = ExpandPathAndArchive(token);
103
104         // load the image
105         printf ("loading %s\n", name);
106         Load256Image (name, &byteimage, &lbmpalette, 
107                 &byteimagewidth, &byteimageheight);
108         RemapZero (byteimage, lbmpalette, 
109                 byteimagewidth, byteimageheight);
110 }
111
112
113 /*
114 ===============
115 Cmd_SpriteFrame
116 ===============
117 */
118 void Cmd_SpriteFrame (void)
119 {
120         int             y,xl,yl,xh,yh,w,h;
121         dsprframe_t             *pframe;
122         int                             ox, oy;
123         byte                    *cropped;
124         char                    savename[1024];
125
126         GetToken (false);
127         xl = atoi (token);
128         GetToken (false);
129         yl = atoi (token);
130         GetToken (false);
131         w = atoi (token);
132         GetToken (false);
133         h = atoi (token);
134
135         // origin offset is optional
136         if (TokenAvailable ())
137         {
138                 GetToken (false);
139                 ox = atoi (token);
140                 GetToken (false);
141                 oy = atoi (token);              
142         }
143         else
144         {
145                 ox = w/2;
146                 oy = h/2;
147         }
148
149         if ((xl & 0x07) || (yl & 0x07) || (w & 0x07) || (h & 0x07))
150                 Error ("Sprite dimensions not multiples of 8\n");
151
152         if ((w > 256) || (h > 256))
153                 Error ("Sprite has a dimension longer than 256");
154
155         xh = xl+w;
156         yh = yl+h;
157
158         if (sprite.numframes >= MAX_SPRFRAMES)
159                 Error ("Too many frames; increase MAX_SPRFRAMES\n");
160
161         pframe = &frames[sprite.numframes];
162         pframe->width = w;
163         pframe->height = h;
164         pframe->origin_x = ox;
165         pframe->origin_y = oy;
166         sprintf (pframe->name, "%s_%i.pcx", spritename, sprite.numframes);
167         sprintf (savename, "%s%s_%i.pcx", gamedir, spritename, sprite.numframes);
168         sprite.numframes++;
169
170         if (g_release)
171         {
172                 ReleaseFile (pframe->name);
173                 return;
174         }
175
176         // crop it to the proper size
177         cropped = malloc (w*h);
178         for (y=0 ; y<h ; y++)
179         {
180                 memcpy (cropped+y*w, byteimage+(y+yl)*byteimagewidth+xl, w);
181         }
182
183         // save off the new image
184         printf ("saving %s\n", savename);
185         CreatePath (savename);
186         WritePCXfile (savename, cropped, w,     h, lbmpalette);
187
188         free (cropped);
189 }
190
191
192
193 /*
194 ==============
195 Cmd_SpriteName
196 ==============
197 */
198 void Cmd_SpriteName (void)
199 {
200         if (sprite.numframes)
201                 FinishSprite ();
202
203         GetToken (false);
204         strcpy (spritename, token);
205         memset (&sprite, 0, sizeof(sprite));
206         memset (&frames, 0, sizeof(frames));
207 }
208