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