2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
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.
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.
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
25 #define MAX_SPRFRAMES MAX_MD2SKINS
28 dsprframe_t frames[MAX_SPRFRAMES];
30 char spritename[1024];
33 void FinishSprite( void );
34 void Cmd_Spritename( void );
36 char spr_prefix[1024];
37 char pic_prefix[1024];
39 extern char *g_outputDir;
47 void FinishSprite( void ){
48 FILE *spriteouthandle;
53 if ( sprite.numframes == 0 ) {
57 if ( !strlen( spritename ) ) {
58 Error( "Didn't name sprite file" );
61 sprintf( savename, "%sSprites/%s/%s.sp2", g_outputDir, spr_prefix, spritename );
66 sprintf( name, "%s.sp2", spritename );
68 spritename[0] = 0; // clear for a new sprite
74 printf( "saving in %s\n", savename );
75 CreatePath( savename );
76 spriteouthandle = SafeOpenWrite( savename );
80 // write out the sprite header
82 spritetemp.ident = LittleLong( IDSPRITEHEADER );
83 spritetemp.version = LittleLong( SPRITE_VERSION );
84 spritetemp.numframes = LittleLong( sprite.numframes );
86 SafeWrite( spriteouthandle, &spritetemp, 12 );
89 // write out the frames
93 for ( i = 0 ; i < sprite.numframes ; i++ )
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 );
100 SafeWrite( spriteouthandle, frames, sizeof( frames[0] ) * sprite.numframes );
102 fclose( spriteouthandle );
104 spritename[0] = 0; // clear for a new sprite
105 sprite.numframes = 0;
114 void Cmd_Load( void ){
117 GetScriptToken( false );
123 name = ExpandPathAndArchive( token );
126 printf( "loading %s\n", name );
127 TrueColorImage = LoadAnyImage( name, &byteimage, &lbmpalette, &byteimagewidth, &byteimageheight );
129 if ( !TrueColorImage ) {
130 // RemapZero (byteimage, lbmpalette, byteimagewidth, byteimageheight);
137 longimage = (unsigned *)byteimage;
138 longimagewidth = byteimagewidth;
139 longimageheight = byteimageheight;
154 void Cmd_SpriteFrame( void ){
155 int x,y,xl,yl,xh,yh,w,h;
157 int ox, oy, linedelta, size;
162 unsigned *destl, *sourcel;
163 unsigned bufferl[256 * 256];
165 byte buffer[256 * 256];
167 GetScriptToken( false );
169 GetScriptToken( false );
171 GetScriptToken( false );
173 GetScriptToken( false );
176 // origin offset is optional
177 if ( ScriptTokenAvailable() ) {
178 GetScriptToken( false );
180 GetScriptToken( false );
189 if ( ( xl & 0x0f ) || ( yl & 0x0f ) || ( w & 0x0f ) || ( h & 0x0f ) ) {
190 Error( "Sprite dimensions not multiples of 16\n" );
193 if ( ( w > 256 ) || ( h > 256 ) ) {
194 Error( "Sprite has a dimension longer than 256" );
200 if ( sprite.numframes >= MAX_SPRFRAMES ) {
201 Error( "Too many frames; increase MAX_SPRFRAMES\n" );
204 pframe = &frames[sprite.numframes];
207 pframe->origin_x = ox;
208 pframe->origin_y = oy;
211 ReleaseFile( pframe->name );
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 );
220 return; // textures are only released by $maps
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 );
231 sourcel = longimage + ( yl * longimagewidth ) + xl;
233 linedelta = ( longimagewidth - w );
235 for ( y = yl ; y < yh ; y++ )
237 for ( x = xl ; x < xh ; x++ )
239 *destl++ = *sourcel++; // RGBA
241 sourcel += linedelta;
244 qtex32 = CreateMip32( bufferl, w, h, &size, true );
246 qtex32->contents = 0;
248 strcpy( qtex32->name, pframe->name );
252 printf( "writing %s\n", filename );
253 SaveFile( filename, (byte *)qtex32, size );
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 );
263 return; // textures are only released by $maps
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 );
274 source = byteimage + yl * byteimagewidth + xl;
276 linedelta = byteimagewidth - w;
278 for ( y = yl ; y < yh ; y++ )
280 for ( x = xl ; x < xh ; x++ )
287 qtex = CreateMip( buffer, w, h, lbmpalette, &size, true );
292 strcpy( qtex->name, pframe->name );
296 printf( "writing %s\n", filename );
297 SaveFile( filename, (byte *)qtex, size );
311 void Cmd_SpriteName( void ){
312 if ( sprite.numframes ) {
316 GetScriptToken( false );
317 strcpy( spritename, token );
318 memset( &sprite, 0, sizeof( sprite ) );
319 memset( &frames, 0, sizeof( frames ) );
328 void Cmd_Sprdir( void ){
331 GetScriptToken( false );
332 strcpy( spr_prefix, token );
333 // create the directory if needed
334 sprintf( filename, "%sSprites", g_outputDir );
336 sprintf( filename, "%sSprites/%s", g_outputDir, spr_prefix );