This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/ripper/conv_sprite2.c

125 lines
3.4 KiB
C
Raw Normal View History

2008-01-02 22:00:00 +01:00
//=======================================================================
// Copyright XashXT Group 2007 <20>
2008-01-03 22:00:00 +01:00
// conv_sprite2.c - convert quake2 sprites
2008-01-02 22:00:00 +01:00
//=======================================================================
2008-01-05 22:00:00 +01:00
#include "ripper.h"
#include "qc_gen.h"
#include "pal_utils.h"
2008-01-02 22:00:00 +01:00
/*
========================================================================
.SP2 sprite file format
========================================================================
*/
2008-01-04 22:00:00 +01:00
#define SPRITEQ2_VERSION 2
#define IDSPRQ2HEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDS2"
2008-01-02 22:00:00 +01:00
typedef struct
{
int width;
int height;
int origin_x;
int origin_y; // raster coordinates inside pic
char name[64]; // name of pcx file
} dsprframeq2_t;
typedef struct
{
int ident;
int version;
int numframes;
dsprframeq2_t frames[1]; // variable sized
} dspriteq2_t;
2008-01-04 22:00:00 +01:00
//
// sprite2_decompiler.c
//
2008-01-02 22:00:00 +01:00
void SP2_ConvertFrame( const char *name, int framenum )
{
byte *fin;
int filesize;
// store framename
2008-01-05 22:00:00 +01:00
FS_FileBase( name, spr.frame[framenum].name );
2008-01-02 22:00:00 +01:00
fin = FS_LoadFile( name, &filesize );
2008-01-05 22:00:00 +01:00
PCX_ConvertImage( name, fin, filesize );
2008-01-02 22:00:00 +01:00
Mem_Free( fin ); // release buffer
}
bool SP2_WriteScript( const char *name )
{
int i;
2008-01-05 22:00:00 +01:00
file_t *f = FS_Open( va("%s/sprites/%s.qc", gs_gamedir, name ), "w" );
2008-01-02 22:00:00 +01:00
if( !f )
{
2008-01-05 22:00:00 +01:00
Msg("Can't write qc-script \"%s.qc\"\n", name );
2008-01-02 22:00:00 +01:00
return false;
}
// description
FS_Printf(f,"//=======================================================================\n");
FS_Printf(f,"//\t\t\tCopyright XashXT Group 2007 <20>\n");
2008-01-05 22:00:00 +01:00
FS_Printf(f,"//\t\t\twritten by Xash Miptex Decompiler\n", name );
2008-01-02 22:00:00 +01:00
FS_Printf(f,"//=======================================================================\n");
// sprite header
2008-01-05 22:00:00 +01:00
FS_Printf(f, "\n$spritename\t%s.spr\n", name );
FS_Printf(f, "$type\t\t%s\n",SPR_RenderType());
FS_Printf(f, "$texture\t\t%s\n\n",SPR_RenderMode());
2008-01-02 22:00:00 +01:00
// frames description
2008-01-05 22:00:00 +01:00
for( i = 0; i < spr.totalframes - spr.numgroup; i++)
2008-01-02 22:00:00 +01:00
{
2008-01-05 22:00:00 +01:00
FS_Printf(f,"$load\t\t%s.tga\n", spr.frame[i].name );
FS_Printf(f,"$frame\t\t0 0 %d %d", spr.frame[i].width, spr.frame[i].height );
if(!spr.frame[i].origin[0] && !spr.frame[i].origin[1]) FS_Print(f, "\n" );
else FS_Printf(f, " %.1f %d %d\n", 0.1f, spr.frame[i].origin[0],spr.frame[i].origin[1]);
2008-01-02 22:00:00 +01:00
}
FS_Close(f);
Msg("%s.sp2\n", name ); // echo to console about current sprite
return true;
}
/*
============
ConvSP2
============
*/
bool ConvSP2( const char *name, char *buffer, int filesize )
{
dspriteq2_t *pin;
2008-01-03 22:00:00 +01:00
string scriptname;
2008-01-02 22:00:00 +01:00
int i;
pin = (dspriteq2_t *)buffer;
2008-01-05 22:00:00 +01:00
memset( &spr, 0, sizeof(spr));
2008-01-02 22:00:00 +01:00
2008-01-03 22:00:00 +01:00
if( LittleLong(pin->ident) != IDSPRQ2HEADER || LittleLong(pin->version) != SPRITEQ2_VERSION )
2008-01-02 22:00:00 +01:00
{
Msg("\"%s.spr\" it's not a Quake2 sprite\n", name );
return false;
}
2008-01-05 22:00:00 +01:00
spr.totalframes = LittleLong (pin->numframes);
spr.texFormat = SPR_INDEXALPHA; // constant
spr.type = SPR_VP_PARALLEL;
2008-01-02 22:00:00 +01:00
// byte swap everything
2008-01-05 22:00:00 +01:00
for(i = 0; i < spr.totalframes; i++)
2008-01-02 22:00:00 +01:00
{
2008-01-05 22:00:00 +01:00
spr.frame[i].width = LittleLong(pin->frames[i].width);
spr.frame[i].height = LittleLong(pin->frames[i].height);
spr.frame[i].origin[0] = LittleLong(pin->frames[i].origin_x);
spr.frame[i].origin[1] = LittleLong(pin->frames[i].origin_y);
2008-01-02 22:00:00 +01:00
SP2_ConvertFrame( pin->frames[i].name, i );
}
// write script file and out
2008-01-03 22:00:00 +01:00
FS_FileBase( name, scriptname );
return SP2_WriteScript( scriptname );
2008-01-02 22:00:00 +01:00
}