Added swf_exportAtlas

This commit is contained in:
Robert Beckebans 2013-08-10 18:51:22 +02:00
parent 4502588338
commit 9c58fdf6f9
2 changed files with 107 additions and 1 deletions

View file

@ -29,12 +29,14 @@ If you have questions concerning this license or the applicable additional terms
#pragma hdrstop
#include "precompiled.h"
#include "../renderer/Image.h"
#include "../renderer/DXT//DXTCodec.h"
#pragma warning(disable: 4355) // 'this' : used in base member initializer list
idCVar swf_loadBinary( "swf_loadBinary", "1", CVAR_INTEGER, "used to set whether to load binary swf from generated" );
// RB begin
idCVar swf_exportXML( "swf_exportXML", "1", CVAR_INTEGER, "" );
idCVar swf_exportAtlas( "swf_exportAtlas", "1", CVAR_INTEGER, "" );
// RB end
int idSWF::mouseX = -1;
@ -157,12 +159,114 @@ idSWF::idSWF( const char* filename_, idSoundWorld* soundWorld_ )
WriteXML( xmlFileName );
}
// RB end
idStr atlasFileName = binaryFileName;
atlasFileName.SetFileExtension( ".tga" );
atlasMaterial = declManager->FindMaterial( atlasFileName );
if( swf_exportAtlas.GetBool() )
{
idStrStatic< MAX_OSPATH > generatedName = atlasFileName;
generatedName.StripFileExtension();
idImage::GetGeneratedName( generatedName, TD_DEFAULT, CF_2D );
idBinaryImage im( generatedName );
ID_TIME_T binaryFileTime = im.LoadFromGeneratedFile( FILE_NOT_FOUND_TIMESTAMP );
if( binaryFileTime != FILE_NOT_FOUND_TIMESTAMP )
{
const bimageFile_t& imgHeader = im.GetFileHeader();
const bimageImage_t& img = im.GetImageHeader( 0 );
const byte* data = im.GetImageData( 0 );
//( img.level, 0, 0, img.destZ, img.width, img.height, data );
idTempArray<byte> rgba( img.width * img.height * 4 );
memset( rgba.Ptr(), 255, rgba.Size() );
if( imgHeader.format == FMT_DXT1 )
{
idDxtDecoder dxt;
dxt.DecompressImageDXT1( data, rgba.Ptr(), img.width, img.height );
}
else if( imgHeader.format == FMT_DXT5 )
{
idDxtDecoder dxt;
if( imgHeader.colorFormat == CFM_NORMAL_DXT5 )
{
dxt.DecompressNormalMapDXT5( data, rgba.Ptr(), img.width, img.height );
}
else if( imgHeader.colorFormat == CFM_YCOCG_DXT5 )
{
dxt.DecompressYCoCgDXT5( data, rgba.Ptr(), img.width, img.height );
}
else
{
dxt.DecompressImageDXT5( data, rgba.Ptr(), img.width, img.height );
}
}
else if( imgHeader.format == FMT_LUM8 || imgHeader.format == FMT_INT8 )
{
// LUM8 and INT8 just read the red channel
byte* pic = rgba.Ptr();
for( int i = 0; i < img.dataSize; i++ )
{
pic[ i * 4 ] = data[ i ];
}
}
else if( imgHeader.format == FMT_ALPHA )
{
// ALPHA reads the alpha channel
byte* pic = rgba.Ptr();
for( int i = 0; i < img.dataSize; i++ )
{
pic[ i * 4 + 3 ] = data[ i ];
}
}
else if( imgHeader.format == FMT_L8A8 )
{
// L8A8 reads the alpha and red channels
byte* pic = rgba.Ptr();
for( int i = 0; i < img.dataSize / 2; i++ )
{
pic[ i * 4 + 0 ] = data[ i * 2 + 0 ];
pic[ i * 4 + 3 ] = data[ i * 2 + 1 ];
}
}
else if( imgHeader.format == FMT_RGB565 )
{
// FIXME
/*
byte* pic = rgba.Ptr();
for( int i = 0; i < img.dataSize / 2; i++ )
{
unsigned short color = ( ( pic[ i * 4 + 0 ] >> 3 ) << 11 ) | ( ( pic[ i * 4 + 1 ] >> 2 ) << 5 ) | ( pic[ i * 4 + 2 ] >> 3 );
img.data[ i * 2 + 0 ] = ( color >> 8 ) & 0xFF;
img.data[ i * 2 + 1 ] = color & 0xFF;
}
*/
}
else
{
byte* pic = rgba.Ptr();
for( int i = 0; i < img.dataSize; i++ )
{
pic[ i ] = data[ i ];
}
}
idStr atlasFileNameExport = atlasFileName;
atlasFileNameExport.SetFileExtension( ".png" );
R_WritePNG( atlasFileNameExport, rgba.Ptr(), 4, img.width, img.height, true, "fs_basepath" );
}
}
// RB end
globals = idSWFScriptObject::Alloc();
globals->Set( "_global", globals );

View file

@ -321,6 +321,7 @@ void idSWFSprite::WriteXML( idFile* f, const char* indentPrefix, int characterID
}
#if 1
idBase64 base64;
for( int i = 0; i < commands.Num(); i++ )
@ -366,6 +367,7 @@ void idSWFSprite::WriteXML( idFile* f, const char* indentPrefix, int characterID
//f->WriteFloatString( "%s\t<DoInitAction streamLength=\"%i\">%s</DoInitAction>\n", indentPrefix, doInitActions[i].Length(), doInitActions[i].Ptr() );
}
#endif
f->WriteFloatString( "%s</Sprite>\n", indentPrefix );
}