05 Jan 2008

This commit is contained in:
g-cont 2008-01-05 00:00:00 +03:00 committed by Alibek Omarov
parent 9503c8ed70
commit bdaa7d5530
25 changed files with 798 additions and 934 deletions

View File

@ -3,24 +3,27 @@
Ньютон - это просто пипец какой-то. С версии 1.3 до 1.53 левостороняя система координат сменилась на правую.
Коллижен менеджер (который фейсы добавляет) на версии 1.53 вылетает при парсинге половины q2 карт почему-то.
DDS Converter 2.1 некорректно высчитывает размер dds файла (баг в devil ?), юзаем только nvdxt
SprExplorer писали редкостные идиоты - он у них не то что версию файла, он даже заголовок не проверяет,
действительно, раз расширение spr, значит правильный ресурс. Если б программисты строили дома...
// замеченные баги
1. не выводится текущее значение переменной в консоль OK
2. imglib не выводит сообщения в консоль OK
3. SC_ParseToken вылетает при парсинге сейв-файла
Имплементация idconv
1. Конвертация .spr -> xash spr OK
2. Конвертация .sp2 -> xash spr OK
3. Конвертация .pcx -> xash gfx OK
4. Конвертация .flat-> xash mip OK
5. Конвертация .mip -> xash mip OK
6. Конвертация .lmp -> xash gfx OK
7. Конвертация .fnt -> xash gfx OK
8. Конвертация .wal -> xash mip OK
Имплементация XashSpriteFormat
1. Переписать conv_sprite, для генерации qc скрипта OK
2. Сжать кадры в spritegen OK
3. распаковать кадры на рендере OK
4. Разобраться с групами OK
5. Удалить framerate (опять beamlength свободен) OK
6. Добавить SPR_ANGLED, переработать заголовок, для SprExlorer Ok
7. Сделать, чтобы последний кадр сохранялся в скрипт
8. Придумать, как флипнуть кадр
Текущие задачи:
1. Доделать сохранялку шейдеров
1. Перевести движок на spr32
1. Еще раз пересмотреть типы файлов для wadlib
2. подключить звуковой кодер к roqlib
3. Имплементация save-restore для физики

View File

@ -10,17 +10,19 @@ bool ConvertImagePixels ( byte *mempool, const char *name, byte parms )
{
rgbdata_t *image = FS_LoadImage( name, NULL, 0 );
char savename[MAX_QPATH];
int w, h;
char width[4], height[4];
if(!image || !image->buffer) return false;
com.strncpy( savename, name, sizeof(savename)-1);
FS_StripExtension( savename ); // remove extension if needed
FS_DefaultExtension( savename, ".tga" );// set new extension
w = image->width, h = image->height;
FS_GetParmFromCmdLine("-w", width );
FS_GetParmFromCmdLine("-h", height);
if(FS_CheckParm("-resample"))
Image_Processing( name, &image );
{
Image_Processing( name, &image, com.atoi(width), com.atoi(height));
}
Msg("%s\n", name );
FS_SaveImage( savename, image );// save as TGA

View File

@ -4,28 +4,32 @@
//=======================================================================
#include "platform.h"
#include "basefiles.h"
#include "mathlib.h"
#include "utils.h"
#define MAX_BUFFER_SIZE ((sizeof(frames) * MAX_FRAMES) + (MAX_FRAME_DIM * 2 * MAX_FRAMES))
#define MAX_FRAMES 1024
#define MAX_FRAMES 512
#define MAX_FRAME_DIM 512
#define MIN_INTERVAL 0.001f
#define MAX_INTERVAL 64.0f
dspritehl_t sprite;
byte *byteimage, *lbmpalette;
dsprite_t sprite;
byte *spritepool;
int byteimagewidth, byteimageheight;
rgbdata_t *byteimage;
byte *lumpbuffer = NULL, *plump;
char spriteoutname[MAX_SYSPATH];
int framesmaxs[2];
float frameinterval;
int framecount;
int origin_x;
int origin_y;
typedef struct
{
int type; // single frame or group of frames
void *pdata; // either a dspriteframe_t
frametype_t type; // single frame or group of frames
void *pdata; // either a dspriteframe_t or group info
float interval; // only used for frames in groups
int numgroupframes; // only used by group headers
} spritepackage_t;
spritepackage_t frames[MAX_FRAMES];
@ -35,63 +39,84 @@ spritepackage_t frames[MAX_FRAMES];
WriteFrame
============
*/
void WriteFrame (vfile_t *f, int framenum)
void WriteFrame( file_t *f, int framenum )
{
dspriteframe_t *pframe;
dspriteframe_t frametemp;
dframe_t *pframe, frametemp;
vfile_t *h = VFS_Open( f, "wz" );
fs_offset_t hdrstart, bufstart, bufend;
pframe = (dspriteframe_t *)frames[framenum].pdata;
pframe = (dframe_t *)frames[framenum].pdata;
frametemp.origin[0] = LittleLong (pframe->origin[0]);
frametemp.origin[1] = LittleLong (pframe->origin[1]);
frametemp.width = LittleLong (pframe->width);
frametemp.height = LittleLong (pframe->height);
frametemp.compsize = 0; // not used
VFS_Write (f, &frametemp, sizeof(frametemp));
VFS_Write (f, (byte *)(pframe + 1), pframe->height * pframe->width);
hdrstart = FS_Tell(f);
FS_Write(f, &frametemp, sizeof(frametemp));
bufstart = FS_Tell(f);
VFS_Write(h, (byte *)(pframe + 1), pframe->height * pframe->width * 4 );
f = VFS_Close(h); // compress frame buffer
bufend = FS_Tell(f);
frametemp.compsize = bufend - bufstart; // size of compressed frame
FS_Seek(f, hdrstart, SEEK_SET );
FS_Write(f, &frametemp, sizeof(frametemp)); // merge header
FS_Seek(f, bufend, SEEK_SET ); // go to end of frame
}
/*
============
WriteSprite
============
*/
void WriteSprite (vfile_t *f)
void WriteSprite( file_t *f )
{
int i, curframe;
short cnt = 256;
dspritehl_t spritetemp;
sprite.boundingradius = sqrt(((framesmaxs[0] >> 1) * (framesmaxs[0] >> 1)) + ((framesmaxs[1] >> 1) * (framesmaxs[1] >> 1)));
int i, curframe = 0, groupframe = 0;
// write out the sprite header
spritetemp.type = LittleLong (sprite.type);
spritetemp.texFormat = LittleLong (sprite.texFormat);
spritetemp.boundingradius = LittleFloat (sprite.boundingradius);
spritetemp.width = LittleLong (framesmaxs[0]);
spritetemp.height = LittleLong (framesmaxs[1]);
spritetemp.numframes = LittleLong (sprite.numframes);
spritetemp.version = LittleLong (sprite.version);
spritetemp.ident = LittleLong (IDSPRHLHEADER);
spritetemp.beamlength = LittleFloat (sprite.beamlength);
spritetemp.synctype = LittleFloat (sprite.synctype);
VFS_Write( f, &spritetemp, sizeof(spritetemp));
// Write out palette in 16bit mode
VFS_Write( f, (void *)&cnt, sizeof(cnt));
VFS_Write( f, lbmpalette, cnt * 3 );
// write out the frames
curframe = 0;
SwapBlock( (int *)&sprite, sizeof(dsprite_t));
FS_Write( f, &sprite, sizeof(sprite));
for (i = 0; i < sprite.numframes; i++)
{
VFS_Write ( f, &frames[curframe].type, sizeof(frames[curframe].type));
WriteFrame ( f, curframe); // only single frame supported
curframe++;
}
FS_Write( f, &frames[curframe].type, sizeof(frames[curframe].type));
if( frames[curframe].type == SPR_SINGLE )
{
// single (non-grouped) frame
WriteFrame( f, curframe );
curframe++;
}
else // angled or sequence
{
int j, numframes;
dspritegroup_t dsgroup;
float totinterval;
groupframe = curframe;
curframe++;
numframes = frames[groupframe].numgroupframes;
// set and write the group header
dsgroup.numframes = LittleLong( numframes );
FS_Write(f, &dsgroup, sizeof(dsgroup));
totinterval = 0.0f; // write the interval array
for(j = 0; j < numframes; j++)
{
dspriteinterval_t temp;
totinterval += frames[groupframe+1+j].interval;
temp.interval = LittleFloat(totinterval);
FS_Write(f, &temp, sizeof(temp));
}
for(j = 0; j < numframes; j++)
{
WriteFrame(f, curframe);
curframe++;
}
}
}
}
/*
@ -99,23 +124,21 @@ void WriteSprite (vfile_t *f)
WriteSPRFile
==============
*/
void WriteSPRFile (void)
void WriteSPRFile( void )
{
vfile_t *vf;
file_t *file;
file_t *f;
if(sprite.numframes == 0) Sys_Error ("%s have no frames\n", spriteoutname );
if(sprite.numframes == 0) MsgDev(D_WARN, "WriteSPRFile: create blank sprite %s\n", spriteoutname );
if((plump - lumpbuffer) > MAX_BUFFER_SIZE)
Sys_Error ("Can't write %s, sprite package too big", spriteoutname );
Sys_Break("Can't write %s, sprite package too big", spriteoutname );
f = FS_Open( spriteoutname, "wb" );
Msg("writing %s\n", spriteoutname );
WriteSprite( f );
FS_Close( f );
file = FS_Open( spriteoutname, "wb" );
vf = VFS_Open( file, "wb" );
Msg("writing %s\n", spriteoutname);
WriteSprite( vf );
file = VFS_Close( vf );
FS_Close( file );
Msg("%d frame%s\n", sprite.numframes, sprite.numframes > 1 ? "s" : "" );
Msg("%d ungrouped frame%s, including group headers\n", framecount, framecount > 1 ? "s" : "");
spriteoutname[0] = 0;// clear for a new sprite
}
@ -149,84 +172,261 @@ void Cmd_Texture ( void )
{
Com_GetToken (false);
if (Com_MatchToken( "additive")) sprite.texFormat = SPR_ADDITIVE;
else if (Com_MatchToken( "normal")) sprite.texFormat = SPR_NORMAL;
else if (Com_MatchToken( "indexalpha")) sprite.texFormat = SPR_INDEXALPHA;
else if (Com_MatchToken( "alphatest")) sprite.texFormat = SPR_ALPHTEST;
else if (Com_MatchToken( "glow")) sprite.texFormat = SPR_ADDGLOW;
else sprite.texFormat = SPR_NORMAL; // default
if (Com_MatchToken( "additive")) sprite.rendermode = SPR_ADDITIVE;
else if (Com_MatchToken( "normal")) sprite.rendermode = SPR_NORMAL;
else if (Com_MatchToken( "indexalpha")) sprite.rendermode = SPR_INDEXALPHA;
else if (Com_MatchToken( "alphatest")) sprite.rendermode = SPR_ALPHTEST;
else if (Com_MatchToken( "glow")) sprite.rendermode = SPR_ADDGLOW;
else sprite.rendermode = SPR_NORMAL; // default
}
/*
===============
Cmd_Framerate
syntax: "$framerate value"
===============
*/
void Cmd_Framerate( void )
{
float framerate = com.atof(Com_GetToken(false));
if(framerate <= 0.0f) return; // negative framerate not allowed
frameinterval = bound( MIN_INTERVAL, (1.0f/framerate), MAX_INTERVAL );
}
/*
===============
Cmd_Load
syntax "$load fire01.bmp"
syntax "$load fire01.tga"
===============
*/
void Cmd_Load( void )
void Cmd_Load (void)
{
static byte origpalette[256*3];
char *name = Com_GetToken ( false );
dspriteframe_t *pframe;
int x, y, w, h, pix;
byte *screen_p;
char *framename;
FS_DefaultExtension( name, ".bmp" );
if( byteimage ) FS_FreeImage( byteimage ); // release old image
framename = Com_GetToken(false);
FS_DefaultExtension( framename, ".tga" );
byteimage = FS_LoadImage( framename, NULL, 0 );
if( !byteimage ) Sys_Break("Error: unable to load \"%s\"\n", framename );
}
byteimage = ReadBMP (name, &lbmpalette, &byteimagewidth, &byteimageheight);
if(!byteimage) Sys_Error( "unable to load file \"%s\"\n", name );
void iMemSwap( byte *s1, byte *s2, const uint size )
{
const uint block_size = 4096;
const uint blocks = size / block_size;
uint i;
if(sprite.numframes == 0) Mem_Copy( origpalette, lbmpalette, sizeof( origpalette ));
else if (memcmp( origpalette, lbmpalette, sizeof( origpalette )))
MsgWarn("Cmd_Load: %s doesn't share a pallette with the previous frame\n", name );
w = byteimagewidth;
h = byteimageheight;
byte *block = Mem_Alloc( zonepool, block_size );
if ((w > MAX_FRAME_DIM) || (h > MAX_FRAME_DIM))
Sys_Error ("Sprite has a dimension longer than %i", MAX_FRAME_DIM);
pframe = (dspriteframe_t *)plump;
frames[framecount].pdata = pframe;
frames[framecount].type = 0;//SPR_SINGLE
if((origin_x != 0) && (origin_y != 0))
for( i = 0; i < blocks; i++ )
{
//write shared origin
Mem_Copy( block, s1, block_size);
Mem_Copy( s1, s2, block_size);
Mem_Copy( s2, block, block_size);
s1 += block_size;
s1 += block_size;
}
i = size - i * block_size;
if( i > 0 )
{
Mem_Copy(block, s1, i);
Mem_Copy(s1, s2, i);
Mem_Copy(s2, block, i);
}
Mem_Free( block );
}
/*
===============
Cmd_Frame
syntax "$frame xoffset yoffset width height <interval> <origin x> <origin y>"
===============
*/
void Cmd_Frame( void )
{
int i, x, y, xl, yl, xh, yh, w, h;
int pixels, linedelta;
dframe_t *pframe;
byte *fin;
if (framecount >= MAX_FRAMES) Sys_Error("Too many frames in package\n");
if( !byteimage )
{
// frame not loaded, just skip arguments
while(Com_TryToken());
return;
}
pixels = byteimage->width * byteimage->height;
xl = atoi(Com_GetToken(false));
yl = atoi(Com_GetToken(false));
w = atoi(Com_GetToken(false));
h = atoi(Com_GetToken(false));
if((xl & 0x07)||(yl & 0x07)||(w & 0x07)||(h & 0x07))
{
MsgWarn("frame dimensions not multiples of 8\n" );
//return;
}
if ((w > MAX_FRAME_DIM) || (h > MAX_FRAME_DIM))
{
w = min(w, MAX_FRAME_DIM);
h = min(h, MAX_FRAME_DIM);
Image_Processing( "frame", &byteimage, w, h);
}
xh = xl + w;
yh = yl + h;
pframe = (dframe_t *)plump;
frames[framecount].pdata = pframe;
frames[framecount].type = SPR_SINGLE;
// get interval
if(Com_TryToken())
{
frames[framecount].interval = bound(MIN_INTERVAL, com.atof(com_token), MAX_INTERVAL );
}
else if(frameinterval != 0)
{
frames[framecount].interval = frameinterval;
}
else
{
// use default interval
frames[framecount].interval = (float)0.05f;
}
if(Com_TryToken())
{
pframe->origin[0] = -com.atoi(com_token);
pframe->origin[1] = com.atoi(Com_GetToken(false));
}
else if((origin_x != 0) && (origin_y != 0))
{
// write shared origin
pframe->origin[0] = -origin_x;
pframe->origin[1] = origin_y;
}
else
{
//use center of image
pframe->origin[0] = -(w >> 1);
pframe->origin[1] = h >> 1;
// use center of image
pframe->origin[0] = -(w>>1);
pframe->origin[1] = h>>1;
}
if(Com_TryToken() && Com_MatchToken("flip_x"))
{
byte *Data, *DataPtr, *Temp;
int c;
Temp = byteimage->buffer;
DataPtr = Mem_Alloc( zonepool, pixels * 4 );
for (y = 0; y < byteimage->height; y++)
{
for (x = byteimage->width - 1; x >= 0; x--)
{
for (c = 0; c < 4; c++, Temp++)
{
DataPtr[y * 4 + x * 4 + c] = *Temp;
}
}
}
byteimage->buffer = DataPtr;
/*for (x = byteimage->width - 1; x >= 0; x--)
{
in = byteimage->buffer + x * byteimage->height * 4;
bufend = in + byteimage->height * 4;
for ( ;in < bufend; in += 4)
{
*out++ = in[0];
*out++ = in[1];
*out++ = in[2];
*out++ = in[3];
}
}
for (y = byteimage->height - 1; y >= 0; y--)
{
in = byteimage->buffer + y * byteimage->width * 4;
bufend = in + byteimage->width * 4;
for ( ;in < bufend; in += 4)
{
*out++ = in[2];
*out++ = in[1];
*out++ = in[0];
*out++ = in[3];
}
}*/
}
pframe->width = w;
pframe->height = h;
//adjust maxsize
if (w > framesmaxs[0]) framesmaxs[0] = w;
if (h > framesmaxs[1]) framesmaxs[1] = h;
// adjust maxsize
if (w > sprite.width) sprite.width = w;
if (h > sprite.height) sprite.height = h;
plump = (byte *)(pframe + 1);
screen_p = byteimage;
plump = (byte *)(pframe + 1); // move pointer
fin = byteimage->buffer + yl * byteimage->width + xl;
linedelta = byteimage->width - w;
for (y = 0; y < byteimageheight; y++)
for (y = yl; y < yh; y++)
{
for (x = 0; x < byteimagewidth; x++)
{
pix = *screen_p;
*screen_p++ = 0;
*plump++ = pix;
}
for( x = xl; x < xh; x++ )
for( i = 0; i < 4; i++)
*plump++ = *fin++;
fin += linedelta * 4;
}
framecount++;
sprite.numframes++;
if (framecount >= MAX_FRAMES) Sys_Error ("Too many frames in package\n");
}
/*
===============
Cmd_Group
syntax:
$group or $angled
{
$load fire01.bmp
$frame xoffset yoffset width height <interval> <origin x> <origin y>
$load fire02.bmp
$frame xoffset yoffset width height <interval> <origin x> <origin y>"
$load fire03.bmp
$frame xoffset yoffset width height <interval> <origin x> <origin y>
}
===============
*/
void Cmd_Group( bool angled )
{
int groupframe;
int is_started = 0;
groupframe = framecount++;
frames[groupframe].type = angled ? SPR_ANGLED : SPR_GROUP;
frames[groupframe].numgroupframes = 0;
while( 1 )
{
if(!Com_GetToken(true)) Sys_Error("End of file during group\n");
if(Com_MatchToken( "{" )) is_started = 1;
else if(Com_MatchToken( "}" )) break; // end of group
else if(Com_MatchToken( "$framerate" )) Cmd_Framerate();
else if(Com_MatchToken("$frame"))
{
Cmd_Frame();
frames[groupframe].numgroupframes++;
}
else if(Com_MatchToken("$load" )) Cmd_Load();
else if(is_started) Sys_Break("missing }\n");
else Sys_Break("$frame or $load expected\n");
}
if( frames[groupframe].numgroupframes == 0 ) MsgDev(D_WARN, "Cmd_Group: create blank group\n");
}
/*
@ -242,18 +442,6 @@ void Cmd_Offset (void)
origin_y = atoi(Com_GetToken (false));
}
/*
===============
Cmd_Beamlength
syntax: "$beamlength length"
===============
*/
void Cmd_Beamlength( void )
{
sprite.beamlength = com.atof(Com_GetToken(false));
}
/*
==============
Cmd_Sync
@ -275,7 +463,7 @@ syntax: "$spritename outname"
*/
void Cmd_Spritename (void)
{
strcpy( spriteoutname, Com_GetToken (false));
strcpy( spriteoutname, Com_GetToken(false));
FS_DefaultExtension( spriteoutname, ".spr" );
}
@ -297,17 +485,19 @@ void ResetSpriteInfo( void )
//set default sprite parms
FS_FileBase(gs_mapname, spriteoutname );//kill path and ext
FS_DefaultExtension( spriteoutname, ".spr" );//set new ext
memset (&sprite, 0, sizeof(sprite));
framecount = 0;
memset(frames, 0, sizeof(frames));
framecount = origin_x = origin_y = 0;
frameinterval = 0.0f;
framesmaxs[0] = -9999999;
framesmaxs[1] = -9999999;
if (!lumpbuffer )lumpbuffer = Mem_Alloc(spritepool, (MAX_BUFFER_SIZE) * 2); // *2 for padding
if (!lumpbuffer ) lumpbuffer = Mem_Alloc( spritepool, (MAX_BUFFER_SIZE) * 2); // *2 for padding
plump = lumpbuffer;
sprite.version = SPRITEHL_VERSION;//normal sprite
sprite.width = -9999999;
sprite.height = -9999999;
sprite.ident = IDSPRITEHEADER;
sprite.version = SPRITE_VERSION;
sprite.type = SPR_VP_PARALLEL;
sprite.synctype = ST_RAND; // default
}
@ -323,30 +513,34 @@ bool ParseSpriteScript (void)
while (1)
{
if(!Com_GetToken (true))break;
if(!Com_GetToken (true)) break;
if (Com_MatchToken( "$spritename" )) Cmd_Spritename();
else if (Com_MatchToken( "$texture" )) Cmd_Texture();
else if (Com_MatchToken( "$origin" )) Cmd_Offset();
else if (Com_MatchToken( "$load" )) Cmd_Load();
else if (Com_MatchToken( "$type" )) Cmd_Type();
else if (Com_MatchToken( "$beamlength" )) Cmd_Beamlength();
else if (Com_MatchToken( "$sync" )) Cmd_Sync();
else if (Com_MatchToken( "$frame" ))
{
Cmd_Frame();
sprite.numframes++;
}
else if (Com_MatchToken( "$group" ))
{
Cmd_Group( false );
sprite.numframes++;
}
else if (Com_MatchToken( "$angled" ))
{
Cmd_Group( true );
sprite.numframes++;
}
else if (!Com_ValidScript( QC_SPRITEGEN )) return false;
else Cmd_SpriteUnknown();
}
return true;
}
void ClearSprite( void )
{
origin_x = 0;
origin_y = 0;
memset(frames, 0, sizeof(frames));
if(lumpbuffer) Free( lumpbuffer );
}
bool CompileCurrentSprite( const char *name )
{
bool load = false;
@ -360,7 +554,6 @@ bool CompileCurrentSprite( const char *name )
if(!ParseSpriteScript())
return false;
WriteSPRFile();
ClearSprite();
return true;
}

View File

@ -1969,7 +1969,7 @@ syntax: $sequence "seqname"
}
==============
*/
int Cmd_Sequence( void )
static int Cmd_Sequence( void )
{
int i, depth = 0;
char smdfilename[4][1024];

View File

@ -32,14 +32,7 @@ int Lump_GetFileType( const char *name, byte *buf )
if(!buf) return TYPE_NONE;
switch(LittleLong(*(uint *)buf))
{
case IDSPRHLHEADER: return TYPE_SPRITE;
case IDSTUDIOHEADER: return TYPE_STUDIO;
case DDSHEADER: return TYPE_MIPDDS;
}
// otherwise get file type by extension
// get file type by extension
if(!com.stricmp( ext, "tga" )) return TYPE_MIPTGA;
else if(!com.stricmp( ext, "mip" ))
{
@ -47,6 +40,9 @@ int Lump_GetFileType( const char *name, byte *buf )
return TYPE_MIPTEX2; // half-life texture
return TYPE_MIPTEX; // quake1 texture
}
else if(!com.stricmp( ext, "dds" )) return TYPE_MIPDDS; // ms dds
else if(!com.stricmp( ext, "mdl" )) return TYPE_STUDIO; // hl mdl
else if(!com.stricmp( ext, "spr" )) return TYPE_SPRITE; // spr32
else if(!com.stricmp( ext, "lmp" )) return TYPE_QPIC; // hud pics
else if(!com.stricmp( ext, "pal" )) return TYPE_QPAL; // palette
else if(!com.stricmp( ext, "wav" )) return TYPE_SOUND; // wav sound

View File

@ -1,48 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: editor - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\WINDOWS\Temp\RSP382.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\editor\!debug/" /Fo"..\temp\editor\!debug/" /Fd"..\temp\editor\!debug/" /FD /GZ /c
"D:\XASH3D\src_main\!source\editor\editor.c"
"D:\XASH3D\src_main\!source\editor\guiforms.c"
"D:\XASH3D\src_main\!source\editor\guiutils.c"
]
Creating command line "cl.exe @C:\WINDOWS\Temp\RSP382.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP383.tmp" with contents
[
msvcrt.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib /nologo /dll /incremental:yes /pdb:"..\temp\editor\!debug/editor.pdb" /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /out:"..\temp\editor\!debug/editor.dll" /implib:"..\temp\editor\!debug/editor.lib" /pdbtype:sept
"\XASH3D\src_main\!source\temp\editor\!debug\editor.obj"
"\XASH3D\src_main\!source\temp\editor\!debug\guiforms.obj"
"\XASH3D\src_main\!source\temp\editor\!debug\guiutils.obj"
"\XASH3D\src_main\!source\temp\editor\!debug\editor.res"
]
Creating command line "link.exe @C:\WINDOWS\Temp\RSP383.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP384.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\editor\!debug\editor.dll "D:\Xash3D\bin\editor.dll"
]
Creating command line "C:\WINDOWS\Temp\RSP384.bat"
Compiling...
editor.c
guiforms.c
guiutils.c
Generating Code...
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \XASH3D\src_main\!source\temp\editor\!debug\editor.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
<h3>Results</h3>
editor.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// cmodel.c -- model loading
#include "engine.h"
#include "basefiles.h"
#include "server.h"
#include "collision.h"
@ -1806,13 +1807,13 @@ cmodel_t *CM_StudioModel( char *name, edict_t *ent, byte *buffer)
cmodel_t *CM_SpriteModel( char *name, edict_t *ent, byte *buffer)
{
cmodel_t *out;
dspritehl_t *phdr;
dsprite_t *phdr;
phdr = (dspritehl_t *)buffer;
phdr = (dsprite_t *)buffer;
if(phdr->version != SPRITEHL_VERSION )
if(phdr->version != SPRITE_VERSION )
{
MsgWarn("CM_SpriteModel: %s has wrong version number (%i should be %i)\n", name, phdr->version, SPRITEHL_VERSION );
MsgWarn("CM_SpriteModel: %s has wrong version number (%i should be %i)\n", name, phdr->version, SPRITE_VERSION );
return NULL;
}
@ -1871,7 +1872,7 @@ cmodel_t *CM_LoadModel( edict_t *ent )
case IDSTUDIOHEADER:
mod = CM_StudioModel( name, ent, buffer );
break;
case IDSPRHLHEADER:
case IDSPRITEHEADER:
mod = CM_SpriteModel( name, ent, buffer );
break;
}

View File

@ -1,187 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: engine - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\WINDOWS\Temp\RSP386.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "uimenu" /I "server" /I "client" /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\engine\!debug/" /Fo"..\temp\engine\!debug/" /Fd"..\temp\engine\!debug/" /FD /c
"D:\XASH3D\src_main\!source\engine\cg_user.c"
"D:\XASH3D\src_main\!source\engine\client\cl_cin.c"
"D:\XASH3D\src_main\!source\engine\client\cl_cmds.c"
"D:\XASH3D\src_main\!source\engine\client\cl_console.c"
"D:\XASH3D\src_main\!source\engine\client\cl_ents.c"
"D:\XASH3D\src_main\!source\engine\client\cl_fx.c"
"D:\XASH3D\src_main\!source\engine\client\cl_input.c"
"D:\XASH3D\src_main\!source\engine\client\cl_keys.c"
"D:\XASH3D\src_main\!source\engine\client\cl_main.c"
"D:\XASH3D\src_main\!source\engine\client\cl_newfx.c"
"D:\XASH3D\src_main\!source\engine\client\cl_parse.c"
"D:\XASH3D\src_main\!source\engine\client\cl_pred.c"
"D:\XASH3D\src_main\!source\engine\client\cl_scrn.c"
"D:\XASH3D\src_main\!source\engine\client\cl_sound.c"
"D:\XASH3D\src_main\!source\engine\client\cl_tent.c"
"D:\XASH3D\src_main\!source\engine\client\cl_view.c"
"D:\XASH3D\src_main\!source\engine\cmodel.c"
"D:\XASH3D\src_main\!source\engine\common.c"
"D:\XASH3D\src_main\!source\engine\host.c"
"D:\XASH3D\src_main\!source\engine\uimenu\menu.c"
"D:\XASH3D\src_main\!source\engine\net_chan.c"
"D:\XASH3D\src_main\!source\engine\net_msg.c"
"D:\XASH3D\src_main\!source\engine\net_wins.c"
"D:\XASH3D\src_main\!source\engine\pmove.c"
"D:\XASH3D\src_main\!source\engine\uimenu\qmenu.c"
"D:\XASH3D\src_main\!source\engine\server\sv_cmds.c"
"D:\XASH3D\src_main\!source\engine\server\sv_ents.c"
"D:\XASH3D\src_main\!source\engine\server\sv_init.c"
"D:\XASH3D\src_main\!source\engine\server\sv_main.c"
"D:\XASH3D\src_main\!source\engine\server\sv_phys.c"
"D:\XASH3D\src_main\!source\engine\server\sv_save.c"
"D:\XASH3D\src_main\!source\engine\server\sv_send.c"
"D:\XASH3D\src_main\!source\engine\server\sv_spawn.c"
"D:\XASH3D\src_main\!source\engine\server\sv_studio.c"
"D:\XASH3D\src_main\!source\engine\server\sv_user.c"
"D:\XASH3D\src_main\!source\engine\server\sv_utils.c"
"D:\XASH3D\src_main\!source\engine\server\sv_world.c"
"D:\XASH3D\src_main\!source\engine\system.c"
"D:\XASH3D\src_main\!source\engine\uimenu\ui_cmds.c"
"D:\XASH3D\src_main\!source\engine\uimenu\ui_main.c"
"D:\XASH3D\src_main\!source\engine\vm_cmds.c"
"D:\XASH3D\src_main\!source\engine\vm_edict.c"
"D:\XASH3D\src_main\!source\engine\vm_exec.c"
]
Creating command line "cl.exe @C:\WINDOWS\Temp\RSP386.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP387.tmp" with contents
[
winmm.lib user32.lib msvcrt.lib ole32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\engine\!debug/engine.pdb" /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /out:"..\temp\engine\!debug/engine.dll" /implib:"..\temp\engine\!debug/engine.lib" /pdbtype:sept
"\XASH3D\src_main\!source\temp\engine\!debug\cg_user.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_cin.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_cmds.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_console.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_ents.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_fx.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_input.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_keys.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_main.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_newfx.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_parse.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_pred.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_scrn.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_sound.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_tent.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cl_view.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\cmodel.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\common.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\host.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\menu.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_chan.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_msg.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\net_wins.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\pmove.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\qmenu.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_cmds.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_ents.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_init.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_main.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_phys.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_save.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_send.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_spawn.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_studio.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_user.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_utils.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\sv_world.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\system.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\ui_cmds.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\ui_main.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\vm_cmds.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\vm_edict.obj"
"\XASH3D\src_main\!source\temp\engine\!debug\vm_exec.obj"
]
Creating command line "link.exe @C:\WINDOWS\Temp\RSP387.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP388.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\engine\!debug\engine.dll "D:\Xash3D\bin\engine.dll"
]
Creating command line "C:\WINDOWS\Temp\RSP388.bat"
Compiling...
cg_user.c
cl_cin.c
cl_cmds.c
cl_console.c
cl_ents.c
cl_fx.c
cl_input.c
cl_keys.c
cl_main.c
cl_newfx.c
cl_parse.c
cl_pred.c
cl_scrn.c
cl_sound.c
cl_tent.c
cl_view.c
cmodel.c
d:\xash3d\src_main\!source\engine\cmodel.c(1809) : error C2065: 'dsprite_t' : undeclared identifier
d:\xash3d\src_main\!source\engine\cmodel.c(1809) : error C2065: 'phdr' : undeclared identifier
d:\xash3d\src_main\!source\engine\cmodel.c(1809) : warning C4552: '*' : operator has no effect; expected operator with side-effect
d:\xash3d\src_main\!source\engine\cmodel.c(1811) : error C2059: syntax error : ')'
d:\xash3d\src_main\!source\engine\cmodel.c(1813) : error C2223: left of '->version' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1813) : error C2065: 'SPRITE_VERSION' : undeclared identifier
d:\xash3d\src_main\!source\engine\cmodel.c(1815) : error C2223: left of '->version' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1820) : error C2223: left of '->numframes' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1825) : error C2223: left of '->width' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1826) : error C2223: left of '->width' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1827) : error C2223: left of '->height' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1828) : error C2223: left of '->height' must point to struct/union
d:\xash3d\src_main\!source\engine\cmodel.c(1834) : error C2143: syntax error : missing '{' before '*'
d:\xash3d\src_main\!source\engine\cmodel.c(1835) : error C2371: 'CM_LoadModel' : redefinition; different basic types
d:\xash3d\src_main\!source\engine\collision.h(32) : see declaration of 'CM_LoadModel'
d:\xash3d\src_main\!source\engine\cmodel.c(1844) : warning C4133: 'return' : incompatible types - from 'struct cmodel_s *' to 'int *'
d:\xash3d\src_main\!source\engine\cmodel.c(1850) : warning C4133: 'return' : incompatible types - from 'struct cmodel_s *' to 'int *'
d:\xash3d\src_main\!source\engine\cmodel.c(1878) : warning C4133: 'return' : incompatible types - from 'struct cmodel_s *' to 'int *'
common.c
host.c
menu.c
Generating Code...
Compiling...
net_chan.c
net_msg.c
net_wins.c
pmove.c
qmenu.c
sv_cmds.c
sv_ents.c
sv_init.c
sv_main.c
sv_phys.c
sv_save.c
sv_send.c
sv_spawn.c
sv_studio.c
sv_user.c
sv_utils.c
sv_world.c
system.c
ui_cmds.c
ui_main.c
Generating Code...
Compiling...
vm_cmds.c
vm_edict.c
vm_exec.c
Generating Code...
Error executing cl.exe.
<h3>Output Window</h3>
<h3>Results</h3>
engine.dll - 13 error(s), 4 warning(s)
</pre>
</body>
</html>

View File

@ -196,6 +196,8 @@ void RunConvertor ( void )
void CloseConvertor( void )
{
// finalize qc-script
Skin_FinalizeScript();
Mem_Check(); // check for leaks
Mem_FreePool( &basepool );
Mem_FreePool( &zonepool );

View File

@ -4,6 +4,46 @@
//=======================================================================
#include "idconv.h"
#include "mathlib.h"
#include "basefiles.h"
/*
========================================================================
.SPR sprite file format
========================================================================
*/
#define IDSPRQ1HEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDSP"
#define SPRITEQ1_VERSION 1
#define SPRITEHL_VERSION 2
#define SPRITE32_VERSION 32
typedef struct
{
int ident;
int version;
int type;
int texFormat; // Half-Life stuff only
float boundingradius; // software rendering stuff
int width;
int height;
int numframes;
float beamlength; // software rendering stuff
synctype_t synctype;
} dspritehl_t;
typedef struct
{
int origin[2];
int width;
int height;
} dspriteframe_t;
//
// sprite_decompiler.c
//
int spr_type;
int spr_texFormat;
@ -13,17 +53,18 @@ int spr_numframes;
int spr_sequence;
byte spr_palette[256][4];
bool spr_truecolor = false;
float spr_framerate = 15.0f;
string spr_framenames[256];
string spr_groupnames[256];
vec2_t spr_origin[256];
vec2_t spr_size[256];
const char *SPR_RenderMode( void )
{
switch( spr_texFormat )
{
case SPR_ADDGLOW: return "glow";
case SPR_ALPHTEST: return "decal";
case SPR_INDEXALPHA: return "decal";
case SPR_ALPHTEST: return "alphatest";
case SPR_INDEXALPHA: return "indexalpha";
case SPR_ADDITIVE: return "additive";
case SPR_NORMAL: return "normal";
default: return "normal";
@ -64,7 +105,7 @@ void *SPR_ConvertFrame( const char *name, void *pin, int framenum )
fout = Mem_Alloc( zonepool, width * height * 4 );
// extract sprite name from path
FS_FileBase( name, framename );
com.strcat( framename, va("_#%i%i", framenum/10, framenum%10 ));
com.strcat( framename, va("_%i", framenum ));
memset( &pix, 0, sizeof(pix));
if( spr_truecolor )
@ -91,6 +132,8 @@ void *SPR_ConvertFrame( const char *name, void *pin, int framenum )
com.strncpy( spr_framenames[framenum], framename, MAX_STRING );
spr_origin[framenum][0] = (float)LittleLong(pinframe->origin[0]);
spr_origin[framenum][1] = (float)LittleLong(pinframe->origin[1]);
spr_size[framenum][0] = (float)LittleLong(pinframe->width);
spr_size[framenum][1] = (float)LittleLong(pinframe->height);
// preparing for write
pix.width = width;
@ -121,13 +164,9 @@ void *SPR_ConvertGroup( const char *name, void *pin, int framenum )
numframes = LittleLong( pingroup->numframes );
pin_intervals = (dspriteinterval_t *)(pingroup + 1);
for (i = 0; i < numframes; i++)
for (i = 0; i < numframes; i++)
{
if(LittleFloat(pin_intervals->interval) <= 0.0)
{
Sys_Break("negative interval!\n");
return NULL; // negate interval
}
//Msg("frame %d, interval %g\n", i, *pin_intervals );
pin_intervals++;
}
@ -145,40 +184,34 @@ void *SPR_ConvertGroup( const char *name, void *pin, int framenum )
bool SPR_WriteScript( const char *name )
{
int i;
file_t *f = FS_Open( va("%s/sprites/%s.txt", gs_gamedir, name ), "w" );
file_t *f = FS_Open( va("%s/sprites/%s.qc", gs_gamedir, name ), "w" );
if( !f )
{
Msg("Can't write sprite header \"%s.txt\"\n", name );
Msg("Can't generate qc-script \"%s.qc\"\n", name );
return false;
}
// description
FS_Printf(f,"//=======================================================================\n");
FS_Printf(f,"//\t\t\tCopyright XashXT Group 2007 ©\n");
FS_Printf(f,"//\t\t\t%s.spr - Xash Sprite Format\n", name );
FS_Printf(f,"//\t\t\twritten by Xash Miptex Decompiler\n", name );
FS_Printf(f,"//=======================================================================\n");
// sprite header
FS_Printf(f,"\nheader \"%s\"\n{\n\ttype\t\"%s\"\n\trender\t\"%s\"\n",name,SPR_RenderType(),SPR_RenderMode());
FS_Printf(f,"\tframerate\t\"%.1f\"\n\tsequence\t\"%d\"\n}\n", spr_framerate, spr_sequence );
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",SPR_RenderMode());
// frames description
FS_Printf(f,"\nframes \"%s\"\n{\n", name );
for( i = 0; i < spr_numframes; i++)
{
FS_Printf(f,"\tframe\t\"sprites/%s\"", spr_framenames[i] );
FS_Printf(f,"$load\t\t%s.tga\n", spr_framenames[i] );
FS_Printf(f,"$frame\t\t0 0 %.f %.f", spr_size[i][0], spr_size[i][1] );
if(!spr_origin[i][0] && !spr_origin[i][1]) FS_Print(f, "\n" );
else FS_Printf(f, "\t%d\t%d\n", (int)spr_origin[i][0], (int)spr_origin[i][1] );
else FS_Printf(f, " %.1f %.f %.f\n", 0.1f, fabs(spr_origin[i][0]), spr_origin[i][1] );
}
FS_Print(f,"}\n" );
FS_Printf(f,"\nsequence 0\n{\n\tpattern\t" ); // default sequence
if(spr_numframes > 1) FS_Printf(f,"\"%d..%d\"", 0, spr_numframes - 1 );
else FS_Print(f,"\"0\"" );
FS_Print(f,"\n}\n" );
FS_Print(f,"\n" );
FS_Close(f);
Msg("%s.spr\n", name ); // echo to console about current sprite
return true;
@ -201,7 +234,7 @@ bool ConvSPR( const char *name, char *buffer, int filesize )
pin = (dsprite_t *)buffer;
version = LittleLong( pin->version );
if( pin->ident != IDSPRHLHEADER )
if( pin->ident != IDSPRQ1HEADER )
{
Msg("\"%s.spr\" have invalid header\n", name );
return false;
@ -224,7 +257,7 @@ bool ConvSPR( const char *name, char *buffer, int filesize )
break;
case SPRITE32_VERSION:
spr_numframes = LittleLong( pin->numframes );
spr_texFormat = SPR_INDEXALPHA; // constant
spr_texFormat = SPR_ADDITIVE; // constant
spr_type = LittleLong( pin->type );
spr_width = LittleLong( pin->width );
spr_height = LittleLong( pin->height );

View File

@ -12,6 +12,9 @@
========================================================================
*/
#define SPRITEQ2_VERSION 2
#define IDSPRQ2HEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDS2"
typedef struct
{
int width;
@ -29,6 +32,10 @@ typedef struct
dsprframeq2_t frames[1]; // variable sized
} dspriteq2_t;
//
// sprite2_decompiler.c
//
int sprq2_width = 1;
int sprq2_height = 1;
int sprq2_numframes = 1;

View File

@ -4,6 +4,7 @@
//=======================================================================
#include "idconv.h"
#include "mathlib.h"
/*
============
@ -25,6 +26,172 @@ bool ConvPAL( char *name, char *buffer, int filesize )
return true;
}
typedef struct angled_s
{
char name[10]; // copy of skin name
int width; // lumpwidth
int height; // lumpheight
int origin[2]; // monster origin
byte xmirrored; // swap left and right
} angled_t;
struct angledframe_s
{
angled_t frame[8]; // angled group or single frame
byte angledframes; // count of angled frames max == 8
byte normalframes; // count of anim frames max == 1
char membername[8]; // current model name, four characsters
char animation; // current animation number
bool in_progress; // current state
} qc;
file_t *f;
void Skin_WriteSequence( void )
{
int i;
// time to dump frames :)
if( qc.angledframes == 8 )
{
// angled group is full, dump it!
FS_Print(f, "\n$angled\n{\n" );
for( i = 0; i < 8; i++)
{
FS_Printf(f,"\t$load\t\t%s.tga\n", qc.frame[i].name );
FS_Printf(f,"\t$frame\t\t0 0 %d %d", qc.frame[i].width, qc.frame[i].height );
FS_Printf(f, " 0.1 %d %d", qc.frame[i].origin[0], qc.frame[i].origin[1]);
if( qc.frame[i].xmirrored ) FS_Print(f, "\tflip_x\n" );
else FS_Print(f, "\n" );
}
FS_Print(f, "}\n" );
}
else if( qc.normalframes == 1 )
{
Msg("write %s\n", qc.frame[0].name );
// single frame stored
FS_Print(f, "\n" );
FS_Printf(f,"$load\t\t%s.tga\n", qc.frame[0].name );
FS_Printf(f,"$frame\t\t0 0 %d %d", qc.frame[0].width, qc.frame[0].height );
FS_Printf(f, " 0.1 %d %d\n", qc.frame[0].origin[0], qc.frame[0].origin[1]);
}
memset( &qc.frame, 0, sizeof(qc.frame));
qc.angledframes = qc.normalframes = 0; // clear all
}
void Skin_FindSequence( const char *name, rgbdata_t *pic )
{
int num, headlen;
char header[8];
// create header from flat name
com.strncpy( header, name, 9 );
headlen = com.strlen( name );
if( qc.animation != header[4] )
{
// write animation
Skin_WriteSequence();
qc.animation = header[4];
}
if( qc.animation == header[4] )
{
// continue collect frames
if( headlen == 6 )
{
num = header[5] - '0';
if(num == 0) qc.normalframes++; // animation frame
if(num == 8) num = 0; // merge
qc.angledframes++; // angleframe stored
com.strncpy( qc.frame[num].name, header, 9 );
qc.frame[num].width = pic->width;
qc.frame[num].height = pic->height;
qc.frame[num].origin[0] = pic->width>>1; // center
qc.frame[num].origin[1] = pic->height; // floor
qc.frame[num].xmirrored = false;
}
else if( headlen == 8 )
{
// normal image
num = header[5] - '0';
if(num == 8) num = 0; // merge
com.strncpy( qc.frame[num].name, header, 9 );
qc.frame[num].width = pic->width;
qc.frame[num].height = pic->height;
qc.frame[num].origin[0] = pic->width>>1; // center
qc.frame[num].origin[1] = pic->height; // floor
qc.frame[num].xmirrored = false;
qc.angledframes++; // frame stored
// mirrored image
num = header[7] - '0'; // angle it's a direct acess to group
if(num == 8) num = 0; // merge
com.strncpy( qc.frame[num].name, header, 9 );
qc.frame[num].width = pic->width;
qc.frame[num].height = pic->height;
qc.frame[num].origin[0] = pic->width>>1; // center
qc.frame[num].origin[1] = pic->height; // floor
qc.frame[num].xmirrored = true; // it's mirror frame
qc.angledframes++; // frame stored
}
else Sys_Break("Skin_CreateScript: invalid name %s\n", name );
}
}
void Skin_ProcessScript( const char *name )
{
if(qc.in_progress )
{
// finish script
Skin_WriteSequence();
FS_Close( f );
qc.in_progress = false;
}
if(!qc.in_progress )
{
// start from scratch
com.strncpy( qc.membername, name, 5 );
f = FS_Open( va("%s/models/%s.qc", gs_gamedir, qc.membername ), "w" );
qc.in_progress = true;
// write description
FS_Print(f,"//=======================================================================\n");
FS_Print(f,"//\t\t\tCopyright XashXT Group 2007 ©\n");
FS_Print(f,"//\t\t\twritten by Xash Miptex Decompiler\n");
FS_Print(f,"//=======================================================================\n");
// write sprite header
FS_Printf(f, "\n$spritename\t%s.spr\n", qc.membername );
FS_Print(f, "$type\t\tvp_parallel\n" ); // constant
FS_Print(f, "$texture\t\tindexalpha\n");
Msg("open script %s\n", qc.membername );
}
}
void Skin_FinalizeScript( void )
{
if(!qc.in_progress ) return;
// finish script
Skin_WriteSequence();
FS_Close( f );
qc.in_progress = false;
}
void Skin_CreateScript( const char *name, rgbdata_t *pic )
{
if(com.strnicmp( name, qc.membername, 4 ))
Skin_ProcessScript( name );
if( qc.in_progress )
Skin_FindSequence( name, pic );
}
/*
============
ConvFLT
@ -115,8 +282,8 @@ bool ConvSKN( const char *name, char *buffer, int filesize )
{
string skinpath;
FS_FileBase( name, skinpath );
FS_SaveImage(va("%s/textures/skins/%s.tga", gs_gamedir, skinpath ), pic );
Conv_CreateShader( name, pic, NULL, 0, 0 );
FS_SaveImage(va("%s/models/%s.tga", gs_gamedir, skinpath ), pic );
Skin_CreateScript( skinpath, pic );
Mem_Free( pic->buffer ); // release buffer
Mem_Free( pic ); // release buffer
Msg("%s.skin\n", skinpath ); // echo to console about current skin

View File

@ -41,6 +41,7 @@ bool ConvBSP( const char *name, char *buffer, int filesize );
#define LUMP_DECAL 2
#define LUMP_QFONT 3
void Skin_FinalizeScript( void );
bool PCX_ConvertImage( const char *name, char *buffer, int filesize );
bool Lump_ValidSize( char *name, rgbdata_t *pic, int maxwidth, int maxheight );
bool Conv_Copy8bitRGBA(const byte *in, byte *out, int pixels);

View File

@ -317,12 +317,11 @@ byte *Image_Resample(uint *in, int inwidth, int inheight, int outwidth, int outh
return (byte *)out;
}
bool Image_Processing( const char *name, rgbdata_t **pix )
bool Image_Processing( const char *name, rgbdata_t **pix, int width, int height )
{
int w, h;
rgbdata_t *image = *pix;
byte *out;
char width[4], height[4];
// check for buffers
if(!image || !image->buffer) return false;
@ -330,11 +329,11 @@ bool Image_Processing( const char *name, rgbdata_t **pix )
w = image->width;
h = image->height;
if(FS_GetParmFromCmdLine("-w", width ) && FS_GetParmFromCmdLine("-h", height ))
if(width && height)
{
// custom size
w = bound(4, atoi(width), 1024 ); // maxwidth 1024
h = bound(4, atoi(height), 1024); // maxheight 1024
w = bound(4, width, 1024 ); // maxwidth 1024
h = bound(4, height, 1024); // maxheight 1024
}
else Image_RoundDimensions( &w, &h ); // auto detect new size

View File

@ -44,8 +44,7 @@ bool SC_AddScriptToStack(const char *name, byte *buffer, int size)
script++;
com_strncpy(script->filename, name, sizeof(script->filename));
script->buffer = Mem_Alloc( Sys.basepool, size );
Mem_Move( Sys.basepool, &script->buffer, buffer, size );
script->buffer = buffer;
script->line = scriptline = 1;
script->script_p = script->buffer;
script->end_p = script->buffer + size;

View File

@ -245,7 +245,7 @@ bool FS_WriteFile (const char *filename, void *data, fs_offset_t len);
rgbdata_t *FS_LoadImage(const char *filename, char *data, int size );
void FS_SaveImage(const char *filename, rgbdata_t *buffer );
void FS_FreeImage( rgbdata_t *pack );
bool Image_Processing( const char *name, rgbdata_t **pix );
bool Image_Processing( const char *name, rgbdata_t **pix, int width, int height );
search_t *FS_Search(const char *pattern, int caseinsensitive );
search_t *FS_SearchDirs(const char *pattern, int caseinsensitive );

View File

@ -1,53 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: physic - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\WINDOWS\Temp\RSP39A.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\physic\!debug/" /Fo"..\temp\physic\!debug/" /Fd"..\temp\physic\!debug/" /FD /GZ /c
"D:\XASH3D\src_main\!source\physic\cm_collision.c"
"D:\XASH3D\src_main\!source\physic\physic.c"
"D:\XASH3D\src_main\!source\physic\utils.c"
]
Creating command line "cl.exe @C:\WINDOWS\Temp\RSP39A.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP39B.tmp" with contents
[
user32.lib msvcrtd.lib newton.lib opengl32.lib /nologo /dll /incremental:yes /pdb:"..\temp\physic\!debug/physic.pdb" /debug /machine:I386 /nodefaultlib:"libc.lib" /out:"..\temp\physic\!debug/physic.dll" /implib:"..\temp\physic\!debug/physic.lib" /pdbtype:sept /libpath:"../public/libs/"
"\XASH3D\src_main\!source\temp\physic\!debug\cm_collision.obj"
"\XASH3D\src_main\!source\temp\physic\!debug\physic.obj"
"\XASH3D\src_main\!source\temp\physic\!debug\utils.obj"
]
Creating command line "link.exe @C:\WINDOWS\Temp\RSP39B.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP39C.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\physic\!debug\physic.dll "D:\Xash3D\bin\physic.dll"
]
Creating command line "C:\WINDOWS\Temp\RSP39C.bat"
Compiling...
cm_collision.c
d:\xash3d\src_main\!source\physic\cm_collision.c(184) : warning C4101: 'i' : unreferenced local variable
physic.c
utils.c
d:\xash3d\src_main\!source\physic\utils.c(66) : warning C4101: 'ang2' : unreferenced local variable
d:\xash3d\src_main\!source\physic\utils.c(64) : warning C4101: 'vertices' : unreferenced local variable
d:\xash3d\src_main\!source\physic\utils.c(65) : warning C4101: 'numvertices' : unreferenced local variable
d:\xash3d\src_main\!source\physic\utils.c(66) : warning C4101: 'org2' : unreferenced local variable
d:\xash3d\src_main\!source\physic\utils.c(66) : warning C4101: 'rot' : unreferenced local variable
Generating Code...
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \XASH3D\src_main\!source\temp\physic\!debug\physic.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
<h3>Results</h3>
physic.dll - 0 error(s), 6 warning(s)
</pre>
</body>
</html>

View File

@ -68,7 +68,6 @@ void() monster_army = {remove(pev);};
void() monster_wizard = {remove(pev);};
void() monster_dog = {remove(pev);};
void() monster_zombie = {remove(pev);};
void() monster_boss = {remove(pev);};
void() monster_tarbaby = {remove(pev);};
void() monster_hell_knight = {remove(pev);};
void() monster_fish = {remove(pev);};
@ -193,4 +192,13 @@ void env_sprite( void )
pev->movetype = MOVETYPE_NONE;
setmodel (pev, "sprites/explode01.spr");
pev->frame = 5;
}
void env_monster( void )
{
precache_model ("sprites/boss.spr");
pev->owner = pev;
pev->solid = SOLID_NOT;
pev->movetype = MOVETYPE_NONE;
setmodel (pev, "sprites/boss.spr");
}

View File

@ -8,35 +8,64 @@
/*
==============================================================================
.aur particle file format
SPRITE MODELS
.spr extended version (non-paletted 32-bit sprites with zlib-compression for each frame)
==============================================================================
*/
#define IDAURORAHEADER (('R'<<24)+('U'<<16)+('A'<<8)+'I') // little-endian "IAUR"
#define AURORA_VERSION 1
typedef struct
{
int width, height;
int origin_x, origin_y; // raster coordinates inside pic
char name[MAX_SKINNAME]; // name of pcx file
} daurframe_t;
#define IDSPRITEHEADER (('R'<<24)+('P'<<16)+('S'<<8)+'I') // little-endian "ISPR"
#define SPRITE_VERSION 3
#define SPR_VP_PARALLEL_UPRIGHT 0
#define SPR_FACING_UPRIGHT 1
#define SPR_VP_PARALLEL 2
#define SPR_ORIENTED 3 // all axis are valid
#define SPR_VP_PARALLEL_ORIENTED 4
#define SPR_NORMAL 0 // solid sprite
#define SPR_ADDITIVE 1
#define SPR_INDEXALPHA 2
#define SPR_ALPHTEST 3
#define SPR_ADDGLOW 4 // same as additive, but without depthtest
typedef enum { ST_SYNC = 0, ST_RAND } synctype_t;
typedef enum { SPR_SINGLE = 0, SPR_GROUP, SPR_ANGLED } frametype_t;
typedef struct
{
int ident;
int version;
int type;
int rendermode; // was boundingradius
int width;
int height;
int numframes;
float beamlength; // not used
synctype_t synctype;
} dsprite_t;
// aurora description
float startcolor[3]; // RGBA
float finalcolor[3]; // RGBA
float startalpha; // alpha-value
float finalalpha;
float framerate;
byte rendermode;
typedef struct
{
int origin[2];
int width;
int height;
int compsize;
} dframe_t;
typedef struct
{
int numframes;
} dspritegroup_t;
dsprframe_t frames[1]; // variable sized
} daurora_t;
typedef struct
{
float interval;
} dspriteinterval_t;
typedef struct
{
frametype_t type;
} dframetype_t;
#endif//BASE_FILES_H

View File

@ -146,7 +146,7 @@ typedef struct stdilib_api_s
bool (*Com_WriteFile)(const char *path, void *data, long len); // write file into disk
rgbdata_t *(*Com_LoadImage)(const char *path, char *data, int size ); // extract image into rgba buffer
void (*Com_SaveImage)(const char *filename, rgbdata_t *buffer ); // save image into specified format
bool (*Com_ProcessImage)( const char *name, rgbdata_t **pix ); // convert and resample image
bool (*Com_ProcessImage)( const char *name, rgbdata_t **pix, int w, int h ); // resample image
void (*Com_FreeImage)( rgbdata_t *pack ); // free image buffer
bool (*Com_LoadLibrary)( dll_info_t *dll ); // load library
bool (*Com_FreeLibrary)( dll_info_t *dll ); // free library

View File

@ -75,89 +75,6 @@ typedef struct roq_s
/*
==============================================================================
SPRITE MODELS
==============================================================================
*/
/*
==============================================================================
.spr Half-Life sprites
==============================================================================
*/
#define SPRITEQ1_VERSION 1
#define SPRITEQ2_VERSION 2
#define SPRITEHL_VERSION 2
#define SPRITE32_VERSION 32
#define IDSPRHLHEADER (('P'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDSP"
#define IDSPRQ2HEADER (('2'<<24)+('S'<<16)+('D'<<8)+'I') // little-endian "IDS2"
#define SPR_VP_PARALLEL_UPRIGHT 0
#define SPR_FACING_UPRIGHT 1
#define SPR_VP_PARALLEL 2
#define SPR_ORIENTED 3 // all axis are valid
#define SPR_VP_PARALLEL_ORIENTED 4
#define SPR_NORMAL 0 // solid sprite
#define SPR_ADDITIVE 1
#define SPR_INDEXALPHA 2
#define SPR_ALPHTEST 3
#define SPR_ADDGLOW 4 // same as additive, but without depthtest
typedef enum { ST_SYNC = 0, ST_RAND } synctype_t;
typedef enum { SPR_SINGLE = 0, SPR_GROUP } frametype_t;
typedef struct
{
int ident;
int version;
int type;
float boundingradius;
int width;
int height;
int numframes;
float beamlength;
synctype_t synctype;
} dsprite_t;
typedef struct
{
int ident;
int version;
int type;
int texFormat; // Half-Life stuff only
float boundingradius; // software rendering stuff
int width;
int height;
int numframes;
float beamlength; // software rendering stuff
synctype_t synctype;
} dspritehl_t;
typedef struct
{
int origin[2];
int width;
int height;
} dspriteframe_t;
typedef struct
{
int numframes;
} dspritegroup_t;
typedef struct
{
float interval;
} dspriteinterval_t;
typedef struct
{
frametype_t type;
} dframetype_t;
/*
==============================================================================
STUDIO MODELS
Studio models are position independent, so the cache manager can move them.

View File

@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
// models.c -- model loading and caching
#include "gl_local.h"
#include "basefiles.h"
model_t *loadmodel;
int modfilelen;
@ -251,7 +252,7 @@ model_t *Mod_ForName(char *name, bool crash)
case IDSTUDIOHEADER:
Mod_LoadStudioModel ( mod, buf );
break;
case IDSPRHLHEADER:
case IDSPRITEHEADER:
Mod_LoadSpriteModel ( mod, buf );
break;
default:

View File

@ -18,6 +18,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "basefiles.h"
/*
d*_t structures are on-disk representations
@ -42,7 +44,14 @@ typedef struct mspriteframe_s
typedef struct
{
int frametype;
int numframes;
float *intervals;
mspriteframe_t *frames[1];
} mspritegroup_t;
typedef struct
{
frametype_t type;
mspriteframe_t *frameptr;
} mspriteframedesc_t;
@ -53,8 +62,6 @@ typedef struct
int maxwidth;
int maxheight;
int numframes;
float framerate;
vec4_t rgba;
mspriteframedesc_t frames[1];
} msprite_t;

View File

@ -12,86 +12,122 @@
=============================================================
*/
/*
====================
Sprite model loader
====================
*/
void *R_SpriteLoadFrame (model_t *mod, void *pin, mspriteframe_t **ppframe, int framenum, byte *pal )
dframetype_t *R_SpriteLoadFrame( model_t *mod, void *pin, mspriteframe_t **ppframe, int framenum )
{
dspriteframe_t *pinframe;
dframe_t *pinframe;
mspriteframe_t *pspriteframe;
int width, height, size, origin[2];
char name[64];
rgbdata_t r_frame;
rgbdata_t *spr_frame;
image_t *image;
pinframe = (dspriteframe_t *)pin;
pinframe = (dframe_t *)pin;
width = LittleLong (pinframe->width);
height = LittleLong (pinframe->height);
size = width * height;
size = width * height * 4;
pspriteframe = Mem_Alloc(mod->mempool, sizeof (mspriteframe_t));
memset (pspriteframe, 0, sizeof (mspriteframe_t));
spr_frame = (rgbdata_t *)Mem_Alloc( mod->mempool, sizeof(rgbdata_t));
*ppframe = pspriteframe;
pspriteframe->width = r_frame.width = width;
pspriteframe->height = r_frame.height = height;
origin[0] = LittleLong (pinframe->origin[0]);
origin[1] = LittleLong (pinframe->origin[1]);
pspriteframe->width = spr_frame->width = width;
pspriteframe->height = spr_frame->height = height;
origin[0] = LittleLong(pinframe->origin[0]);
origin[1] = LittleLong(pinframe->origin[1]);
pspriteframe->up = origin[1];
pspriteframe->down = origin[1] - height;
pspriteframe->left = origin[0];
pspriteframe->right = width + origin[0];
pspriteframe->texnum = 0;
r_frame.type = PF_INDEXED_32;
r_frame.numMips = 1;
r_frame.flags = IMAGE_HAS_ALPHA;
spr_frame->type = PF_RGBA_32;
spr_frame->flags = IMAGE_HAS_ALPHA;
spr_frame->numMips = 1;
// extract sprite name from path
FS_FileBase( mod->name, name );
strcat(name, va("_%i", framenum));
r_frame.palette = pal;
r_frame.size = width * height * 4; // for bounds checking
r_frame.buffer = (byte *)(pinframe + 1);
com.strcat(name, va("_%i", framenum ));
spr_frame->size = width * height * 4; // for bounds checking
spr_frame->buffer = (byte *)Mem_Alloc( mod->mempool, spr_frame->size );
image = R_LoadImage( name, &r_frame, it_sprite );
if(image)
if(!VFS_Unpack((byte *)(pinframe + 1), pinframe->compsize, &spr_frame->buffer, spr_frame->size ))
{
FS_FreeImage( spr_frame );
MsgDev(D_WARN, "R_SpriteLoadFrame: %s probably corrupted\n", name );
return (void *)((byte *)(pinframe + 1) + pinframe->compsize);
}
image = R_LoadImage( name, spr_frame, it_sprite );
if( image )
{
pspriteframe->texnum = image->texnum[0];
mod->skins[framenum] = image;
}
else MsgWarn("%s has null frame %d\n", image->name, framenum );
return (void *)((byte *)(pinframe+1) + size);
else MsgDev(D_WARN, "%s has null frame %d\n", image->name, framenum );
FS_FreeImage( spr_frame );
return (dframetype_t *)((byte *)(pinframe + 1) + pinframe->compsize);
}
dframetype_t *R_SpriteLoadGroup (model_t *mod, void * pin, mspriteframe_t **ppframe, int framenum )
{
dspritegroup_t *pingroup;
mspritegroup_t *pspritegroup;
dspriteinterval_t *pin_intervals;
float *poutintervals;
int i, groupsize, numframes;
void *ptemp;
pingroup = (dspritegroup_t *)pin;
numframes = LittleLong(pingroup->numframes);
groupsize = sizeof(mspritegroup_t) + (numframes - 1) * sizeof(pspritegroup->frames[0]);
pspritegroup = Mem_Alloc( mod->mempool, groupsize );
pspritegroup->numframes = numframes;
*ppframe = (mspriteframe_t *)pspritegroup;
pin_intervals = (dspriteinterval_t *)(pingroup + 1);
poutintervals = Mem_Alloc(mod->mempool, numframes * sizeof (float));
pspritegroup->intervals = poutintervals;
for (i = 0; i < numframes; i++)
{
*poutintervals = LittleFloat(pin_intervals->interval);
if(*poutintervals <= 0.0) *poutintervals = 1.0f; // set error value
poutintervals++;
pin_intervals++;
}
ptemp = (void *)pin_intervals;
for (i = 0; i < numframes; i++ )
{
ptemp = R_SpriteLoadFrame(mod, ptemp, &pspritegroup->frames[i], framenum + i);
}
return (dframetype_t *)ptemp;
}
void R_SpriteLoadModel( model_t *mod, void *buffer )
{
int i, size, version, numframes;
dspritehl_t *pin;
short *numi;
dsprite_t *pin;
msprite_t *psprite;
dframetype_t *pframetype;
byte pal[256][4];
vec4_t rgbacolor;
float framerate;
int i, size, numframes;
pin = (dspritehl_t *)buffer;
version = LittleLong (pin->version);
pin = (dsprite_t *)buffer;
i = LittleLong(pin->version);
if( version != SPRITEHL_VERSION)
if( i != SPRITE_VERSION)
{
Msg("Warning: %s has wrong version number (%i should be %i)", mod->name, version, SPRITEHL_VERSION );
Msg("Warning: %s has wrong version number (%i should be %i)\n", mod->name, i, SPRITE_VERSION );
return;
}
ResetRGBA( rgbacolor );
framerate = 15.0f;
numframes = LittleLong (pin->numframes);
size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames);
@ -100,81 +136,16 @@ void R_SpriteLoadModel( model_t *mod, void *buffer )
mod->extradata = psprite; //make link to extradata
psprite->type = LittleLong(pin->type);
psprite->maxwidth = LittleLong (pin->width);
psprite->maxheight = LittleLong (pin->height);
psprite->rendermode = LittleLong (pin->texFormat);
psprite->framerate = framerate;
psprite->maxwidth = LittleLong(pin->width);
psprite->maxheight = LittleLong(pin->height);
psprite->rendermode = LittleLong(pin->rendermode);
psprite->numframes = numframes;
Mem_Copy(psprite->rgba, rgbacolor, sizeof(psprite->rgba));
numi = (short *)(pin + 1);
mod->mins[0] = mod->mins[1] = -psprite->maxwidth / 2;
mod->maxs[0] = mod->maxs[1] = psprite->maxwidth / 2;
mod->mins[2] = -psprite->maxheight / 2;
mod->maxs[2] = psprite->maxheight / 2;
if (LittleShort(*numi) == 256)
{
byte *src = (byte *)(numi+1);
switch( psprite->rendermode )
{
case SPR_NORMAL:
for (i = 0; i < 256; i++)
{
pal[i][0] = *src++;
pal[i][1] = *src++;
pal[i][2] = *src++;
pal[i][3] = 0;
}
break;
case SPR_ADDGLOW:
case SPR_ADDITIVE:
for (i = 0; i < 256; i++)
{
pal[i][0] = *src++;
pal[i][1] = *src++;
pal[i][2] = *src++;
pal[i][3] = 255;
}
break;
case SPR_INDEXALPHA:
for (i = 0; i < 256; i++)
{
pal[i][0] = *src++;
pal[i][1] = *src++;
pal[i][2] = *src++;
pal[i][3] = i;
}
break;
case SPR_ALPHTEST:
for (i = 0; i < 256; i++)
{
pal[i][0] = *src++;
pal[i][1] = *src++;
pal[i][2] = *src++;
pal[i][3] = 255;
}
pal[255][0] = pal[255][1] = pal[255][2] = pal[255][3] = 0;
break;
default:
for (i = 0; i < 256; i++)
{
pal[i][0] = *src++;
pal[i][1] = *src++;
pal[i][2] = *src++;
pal[i][3] = 0;
}
Msg("Warning: %s has unknown texFormat (%i, should be in range 0-4 )\n", mod->name, psprite->rendermode );
break;
}
pframetype = (dframetype_t *)(src);
}
else
{
MsgWarn("%s has wrong number of palette colors %i (should be 256)\n", mod->name, numi);
return;
}
pframetype = (dframetype_t *)(pin + 1);
if(numframes < 1)
{
MsgWarn("%s has invalid # of frames: %d\n", mod->name, numframes );
@ -186,17 +157,20 @@ void R_SpriteLoadModel( model_t *mod, void *buffer )
for (i = 0; i < numframes; i++ )
{
int frametype;
frametype_t frametype = LittleLong (pframetype->type);
psprite->frames[i].type = frametype;
frametype = LittleLong (pframetype->type);
psprite->frames[i].frametype = frametype;
if(frametype == 0)//SPR_SINGLE
switch( frametype )
{
pframetype = (dframetype_t *)R_SpriteLoadFrame(mod, pframetype + 1, &psprite->frames[i].frameptr, i, (byte *)(&pal[0][0]));
case SPR_SINGLE:
pframetype = R_SpriteLoadFrame(mod, pframetype + 1, &psprite->frames[i].frameptr, i );
break;
case SPR_GROUP:
case SPR_ANGLED:
pframetype = R_SpriteLoadGroup(mod, pframetype + 1, &psprite->frames[i].frameptr, i );
break;
}
else Sys_Error("R_SpriteLoadModel: group frames are not supported\n");
if(pframetype == NULL) break;
if(pframetype == NULL) break; // technically an error
}
}
@ -208,8 +182,10 @@ R_GetSpriteFrame
mspriteframe_t *R_GetSpriteFrame (entity_t *currententity)
{
msprite_t *psprite;
mspritegroup_t *pspritegroup;
mspriteframe_t *pspriteframe;
int frame;
int i, numframes, frame;
float *pintervals, fullinterval, targettime, time;
psprite = currententity->model->extradata;
frame = currententity->frame;
@ -220,12 +196,36 @@ mspriteframe_t *R_GetSpriteFrame (entity_t *currententity)
frame = 0;
}
if (psprite->frames[frame].frametype == 0) // SPR_SINGLE
if (psprite->frames[frame].type == SPR_SINGLE)
{
pspriteframe = psprite->frames[frame].frameptr;
}
else Sys_Error("R_GetSpriteFrame: group frames are not supported\n");
else if (psprite->frames[frame].type == SPR_GROUP)
{
pspritegroup = (mspritegroup_t *)psprite->frames[frame].frameptr;
pintervals = pspritegroup->intervals;
numframes = pspritegroup->numframes;
fullinterval = pintervals[numframes-1];
time = r_newrefdef.time;
// when loading in Mod_LoadSpriteGroup, we guaranteed all interval values
// are positive, so we don't have to worry about division by zero
targettime = time - ((int)(time / fullinterval)) * fullinterval;
for (i = 0; i < (numframes - 1); i++)
{
if (pintervals[i] > targettime)
break;
}
pspriteframe = pspritegroup->frames[i];
}
else if (psprite->frames[frame].type == SPR_ANGLED)
{
// e.g. doom-style sprite monsters
int angleframe = (int)((r_newrefdef.viewangles[1] - currententity->angles[1])/360*8 + 0.5 - 4) & 7;
pspritegroup = (mspritegroup_t *)psprite->frames[frame].frameptr;
pspriteframe = pspritegroup->frames[angleframe];
}
return pspriteframe;
}
@ -259,10 +259,10 @@ void R_DrawSpriteModel( int passnum )
{
mspriteframe_t *frame;
vec3_t point, forward, right, up;
msprite_t *psprite;
entity_t *e = currententity;
model_t *mod = currentmodel;
float realtime = r_newrefdef.time;
float alpha = 1.0f, realtime = r_newrefdef.time;
msprite_t *psprite;
if(!R_AcceptSpritePass( e, passnum )) return;
@ -270,27 +270,11 @@ void R_DrawSpriteModel( int passnum )
// polygon without a surface cache
psprite = (msprite_t *)mod->extradata;
// xash auto-animate
if(psprite->framerate > 0 && psprite->numframes > 1)
{
float frametime;
mod->prevanimtime = mod->animtime;
mod->animtime = realtime;
frametime = mod->animtime - mod->prevanimtime;
if(frametime == 0 ) return;//first call
mod->frame += psprite->framerate * frametime;
while (mod->frame > psprite->numframes) mod->frame -= psprite->numframes;
while (mod->frame < 0) mod->frame += psprite->numframes;
e->frame = mod->frame; // set properly frame
}
else e->frame = fmod(e->frame, psprite->numframes);
e->frame = fmod(e->frame, psprite->numframes);
frame = R_GetSpriteFrame(e);
// merge alpha value
if( e->flags & RF_TRANSLUCENT ) psprite->rgba[3] = e->alpha;
if( e->flags & RF_TRANSLUCENT ) alpha = e->alpha;
if( e->scale == 0 ) e->scale = 1.0f; // merge scale
// setup oriented
@ -343,9 +327,9 @@ void R_DrawSpriteModel( int passnum )
break;
}
GL_Bind(currentmodel->skins[(int)e->frame]->texnum[0]);
GL_Bind( frame->texnum );
GL_TexEnv( GL_MODULATE );
qglColor4fv( psprite->rgba );
qglColor4f( 1.0f, 1.0f, 1.0f, alpha );
qglDisable(GL_CULL_FACE);
qglBegin (GL_QUADS);

View File

@ -1,197 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: render - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\WINDOWS\Temp\RSP39E.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\render\!debug/" /Fo"..\temp\render\!debug/" /Fd"..\temp\render\!debug/" /FD /c
"D:\XASH3D\src_main\!source\render\gl_draw.c"
"D:\XASH3D\src_main\!source\render\gl_light.c"
"D:\XASH3D\src_main\!source\render\gl_model.c"
"D:\XASH3D\src_main\!source\render\gl_rmain.c"
"D:\XASH3D\src_main\!source\render\gl_rmisc.c"
"D:\XASH3D\src_main\!source\render\gl_rsurf.c"
"D:\XASH3D\src_main\!source\render\gl_warp.c"
"D:\XASH3D\src_main\!source\render\gl_widnt.c"
"D:\XASH3D\src_main\!source\render\glw_imp.c"
"D:\XASH3D\src_main\!source\render\r_backend.c"
"D:\XASH3D\src_main\!source\render\r_bloom.c"
"D:\XASH3D\src_main\!source\render\r_bspmod.c"
"D:\XASH3D\src_main\!source\render\r_sprite.c"
"D:\XASH3D\src_main\!source\render\r_studio.c"
"D:\XASH3D\src_main\!source\render\r_texture.c"
"D:\XASH3D\src_main\!source\render\r_utils.c"
]
Creating command line "cl.exe @C:\WINDOWS\Temp\RSP39E.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP39F.tmp" with contents
[
msvcrt.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\render\!debug/render.pdb" /debug /machine:I386 /nodefaultlib:"msvcrtd.lib" /out:"..\temp\render\!debug/render.dll" /implib:"..\temp\render\!debug/render.lib" /pdbtype:sept /libpath:"../public/libs/"
"\XASH3D\src_main\!source\temp\render\!debug\gl_draw.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_light.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_model.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rmain.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rmisc.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rsurf.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_warp.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_widnt.obj"
"\XASH3D\src_main\!source\temp\render\!debug\glw_imp.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_backend.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_bloom.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_bspmod.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_sprite.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_studio.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_texture.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_utils.obj"
]
Creating command line "link.exe @C:\WINDOWS\Temp\RSP39F.tmp"
Creating temporary file "C:\WINDOWS\Temp\RSP3A0.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\render\!debug\render.dll "D:\Xash3D\bin\render.dll"
]
Creating command line "C:\WINDOWS\Temp\RSP3A0.bat"
Compiling...
gl_draw.c
gl_light.c
gl_model.c
gl_rmain.c
gl_rmisc.c
gl_rsurf.c
gl_warp.c
gl_widnt.c
glw_imp.c
r_backend.c
r_bloom.c
r_bspmod.c
r_sprite.c
d:\xash3d\src_main\!source\render\r_sprite.c(77) : error C2065: 'dsprite_t' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(77) : error C2065: 'pin' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(77) : warning C4552: '*' : operator has no effect; expected operator with side-effect
d:\xash3d\src_main\!source\render\r_sprite.c(78) : error C2143: syntax error : missing ';' before 'type'
d:\xash3d\src_main\!source\render\r_sprite.c(79) : error C2275: 'msprite_t' : illegal use of this type as an expression
d:\xash3d\src_main\!source\render\gl_model.h(59) : see declaration of 'msprite_t'
d:\xash3d\src_main\!source\render\r_sprite.c(79) : error C2065: 'psprite' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(80) : error C2275: 'dframetype_t' : illegal use of this type as an expression
d:\xash3d\src_main\!source\public\stdref.h(156) : see declaration of 'dframetype_t'
d:\xash3d\src_main\!source\render\r_sprite.c(80) : error C2065: 'pframetype' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(81) : error C2275: 'byte' : illegal use of this type as an expression
c:\program files\microsoft visual studio\vc98\include\rpcndr.h(172) : see declaration of 'byte'
d:\xash3d\src_main\!source\render\r_sprite.c(81) : error C2146: syntax error : missing ';' before identifier 'pal'
d:\xash3d\src_main\!source\render\r_sprite.c(81) : error C2065: 'pal' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(81) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(81) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(82) : error C2275: 'vec4_t' : illegal use of this type as an expression
d:\xash3d\src_main\!source\public\basetypes.h(112) : see declaration of 'vec4_t'
d:\xash3d\src_main\!source\render\r_sprite.c(82) : error C2146: syntax error : missing ';' before identifier 'rgbacolor'
d:\xash3d\src_main\!source\render\r_sprite.c(82) : error C2065: 'rgbacolor' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(83) : error C2143: syntax error : missing ';' before 'type'
d:\xash3d\src_main\!source\render\r_sprite.c(85) : error C2059: syntax error : ')'
d:\xash3d\src_main\!source\render\r_sprite.c(86) : error C2223: left of '->version' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(88) : error C2065: 'SPRITE_VERSION' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(93) : warning C4047: 'function' : 'float *' differs in levels of indirection from 'int '
d:\xash3d\src_main\!source\render\r_sprite.c(93) : warning C4024: 'ResetRGBA' : different types for formal and actual parameter 1
d:\xash3d\src_main\!source\render\r_sprite.c(94) : error C2065: 'framerate' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(96) : error C2223: left of '->numframes' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(97) : error C2223: left of '->frames' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(99) : warning C4047: '=' : 'int ' differs in levels of indirection from 'void *'
d:\xash3d\src_main\!source\render\r_sprite.c(100) : warning C4047: '=' : 'void *' differs in levels of indirection from 'int '
d:\xash3d\src_main\!source\render\r_sprite.c(102) : error C2223: left of '->type' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(102) : error C2223: left of '->type' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(103) : error C2223: left of '->maxwidth' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(103) : error C2223: left of '->width' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(104) : error C2223: left of '->maxheight' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(104) : error C2223: left of '->height' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(105) : error C2223: left of '->rendermode' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(105) : error C2223: left of '->texFormat' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(106) : error C2223: left of '->framerate' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(107) : error C2223: left of '->numframes' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(108) : error C2223: left of '->rgba' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(108) : warning C4022: 'com' : pointer mismatch for actual parameter 1
d:\xash3d\src_main\!source\render\r_sprite.c(108) : error C2223: left of '->rgba' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(108) : error C2198: 'com' : too few actual parameters
d:\xash3d\src_main\!source\render\r_sprite.c(109) : error C2065: 'numi' : undeclared identifier
d:\xash3d\src_main\!source\render\r_sprite.c(109) : warning C4047: '=' : 'int ' differs in levels of indirection from 'short *'
d:\xash3d\src_main\!source\render\r_sprite.c(111) : error C2223: left of '->maxwidth' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(112) : error C2223: left of '->maxwidth' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(113) : error C2223: left of '->maxheight' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(114) : error C2223: left of '->maxheight' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(116) : error C2100: illegal indirection
d:\xash3d\src_main\!source\render\r_sprite.c(120) : error C2223: left of '->rendermode' must point to struct/union
d:\xash3d\src_main\!source\render\r_sprite.c(125) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(125) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(125) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(126) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(126) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(126) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(127) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(127) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(127) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(128) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(128) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(128) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(135) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(135) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(135) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(136) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(136) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(136) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(137) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(137) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(137) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(138) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(138) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(138) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(144) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(144) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(144) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(145) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(145) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(145) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(146) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(146) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(146) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(147) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(147) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(147) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(153) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(153) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(153) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(154) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(154) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(154) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(155) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(155) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(155) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(156) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(156) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(156) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2109: subscript requires array or pointer type
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(158) : error C2106: '=' : left operand must be l-value
d:\xash3d\src_main\!source\render\r_sprite.c(158) : fatal error C1003: error count exceeds 100; stopping compilation
r_studio.c
r_texture.c
r_utils.c
Generating Code...
Error executing cl.exe.
<h3>Output Window</h3>
<h3>Results</h3>
render.dll - 102 error(s), 7 warning(s)
</pre>
</body>
</html>