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