mirror of
https://port.numenaute.org/aleajactaest/khanat-code-old.git
synced 2024-11-17 13:01:41 +00:00
Most of the functionality works with the new code.
This commit is contained in:
parent
80f7dd725d
commit
90b9a592b8
11 changed files with 513 additions and 875 deletions
|
@ -3,38 +3,48 @@
|
||||||
|
|
||||||
#include <QPixmap>
|
#include <QPixmap>
|
||||||
|
|
||||||
bool pixmapToCBGRA( QPixmap &pixmap, std::vector< NLMISC::CBGRA >& pixels )
|
namespace{
|
||||||
{
|
|
||||||
QImage img = pixmap.toImage();
|
|
||||||
if( img.format() != QImage::Format_ARGB32 )
|
|
||||||
img = img.convertToFormat( QImage::Format_ARGB32 );
|
|
||||||
|
|
||||||
if( img.format() != QImage::Format_ARGB32 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int c = img.width() * img.height();
|
|
||||||
|
|
||||||
const unsigned char *data = img.bits();
|
|
||||||
const unsigned int *idata = reinterpret_cast< const unsigned int* >( data );
|
|
||||||
|
|
||||||
NLMISC::CBGRA bgra;
|
|
||||||
pixels.clear();
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
while( i < c )
|
|
||||||
{
|
|
||||||
bgra.A = ( idata[ i ] & 0xFF000000 ) >> 24;
|
|
||||||
bgra.R = ( idata[ i ] & 0x00FF0000 ) >> 16;
|
|
||||||
bgra.G = ( idata[ i ] & 0x0000FF00 ) >> 8;
|
|
||||||
bgra.B = ( idata[ i ] & 0x000000FF );
|
|
||||||
pixels.push_back( bgra );
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
bool pixmapToCBGRA( QPixmap &pixmap, std::vector< NLMISC::CBGRA >& pixels )
|
||||||
|
{
|
||||||
|
QImage img = pixmap.toImage();
|
||||||
|
if( img.format() != QImage::Format_ARGB32 )
|
||||||
|
img = img.convertToFormat( QImage::Format_ARGB32 );
|
||||||
|
|
||||||
|
if( img.format() != QImage::Format_ARGB32 )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int c = img.width() * img.height();
|
||||||
|
|
||||||
|
const unsigned char *data = img.bits();
|
||||||
|
const unsigned int *idata = reinterpret_cast< const unsigned int* >( data );
|
||||||
|
|
||||||
|
NLMISC::CBGRA bgra;
|
||||||
|
pixels.clear();
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while( i < c )
|
||||||
|
{
|
||||||
|
bgra.A = ( idata[ i ] & 0xFF000000 ) >> 24;
|
||||||
|
bgra.R = ( idata[ i ] & 0x00FF0000 ) >> 16;
|
||||||
|
bgra.G = ( idata[ i ] & 0x0000FF00 ) >> 8;
|
||||||
|
bgra.B = ( idata[ i ] & 0x000000FF );
|
||||||
|
pixels.push_back( bgra );
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NL3D::CTile::TBitmap channelToTBitmap( TileConstants::TTileChannel channel )
|
||||||
|
{
|
||||||
|
return NL3D::CTile::TBitmap( int( channel ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@ -42,6 +52,124 @@ bool pixmapToCBGRA( QPixmap &pixmap, std::vector< NLMISC::CBGRA >& pixels )
|
||||||
class TileBankPvt
|
class TileBankPvt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
bool checkSize( TileConstants::TNodeTileType type, TileConstants::TTileChannel channel, int w, int h )
|
||||||
|
{
|
||||||
|
int width = -1;
|
||||||
|
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128:
|
||||||
|
width = 128;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::Tile256:
|
||||||
|
width = 256;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileTransition:
|
||||||
|
{
|
||||||
|
if( channel == TileConstants::TileAlpha )
|
||||||
|
width = 64;
|
||||||
|
else
|
||||||
|
width = 128;
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileDisplacement:
|
||||||
|
width = 32;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( width == w )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
NL3D::CTileSet::TError checkTile( NL3D::CTileSet *set, int tile, TileConstants::TNodeTileType type, NL3D::CTileBorder &border, NL3D::CTile::TBitmap bitmap, QString &msg )
|
||||||
|
{
|
||||||
|
NL3D::CTileSet::TError error;
|
||||||
|
|
||||||
|
if( bitmap == NL3D::CTile::additive )
|
||||||
|
return NL3D::CTileSet::ok;
|
||||||
|
|
||||||
|
if( type == TileConstants::TileDisplacement )
|
||||||
|
return NL3D::CTileSet::ok;
|
||||||
|
|
||||||
|
int component;
|
||||||
|
int pixel;
|
||||||
|
int idx;
|
||||||
|
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128:
|
||||||
|
error = set->checkTile128( bitmap, border, pixel, component );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::Tile256:
|
||||||
|
error = set->checkTile256( bitmap, border, pixel, component );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileTransition:
|
||||||
|
{
|
||||||
|
if( bitmap != NL3D::CTile::alpha )
|
||||||
|
error = set->checkTile128( bitmap, border, pixel, component );
|
||||||
|
else
|
||||||
|
error = set->checkTileTransition( NL3D::CTileSet::TTransition( tile ), bitmap, border, idx, pixel, component );
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( error != NL3D::CTileSet::ok ) && ( error != NL3D::CTileSet::addFirstA128128 ) )
|
||||||
|
{
|
||||||
|
static const char* comp[]={"Red", "Green", "Blue", "Alpha", ""};
|
||||||
|
|
||||||
|
msg = NL3D::CTileSet::getErrorMessage( error );
|
||||||
|
msg += "\n";
|
||||||
|
msg += " pixel %1 component %2";
|
||||||
|
msg = msg.arg( pixel );
|
||||||
|
msg = msg.arg( comp[ component ] );
|
||||||
|
}
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTile( NL3D::CTileSet *set, int tile, int rotation, const QString &name, NL3D::CTile::TBitmap bm, TileConstants::TNodeTileType type, NL3D::CTileBorder &border )
|
||||||
|
{
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128:
|
||||||
|
set->setTile128( tile, name.toUtf8().constData(), bm, m_bank );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::Tile256:
|
||||||
|
set->setTile256( tile, name.toUtf8().constData(), bm, m_bank );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileTransition:
|
||||||
|
if( bm != NL3D::CTile::alpha )
|
||||||
|
set->setTileTransition( NL3D::CTileSet::TTransition( tile ), name.toUtf8().constData(), bm, m_bank, border );
|
||||||
|
else
|
||||||
|
set->setTileTransitionAlpha( NL3D::CTileSet::TTransition( tile ), name.toUtf8().constData(), m_bank, border, rotation );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileDisplacement:
|
||||||
|
set->setDisplacement( NL3D::CTileSet::TDisplacement( tile ), name.toUtf8().constData(), m_bank );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void buildBorder( QPixmap &pm, NL3D::CTileBorder &border )
|
||||||
|
{
|
||||||
|
std::vector< NLMISC::CBGRA > pixels;
|
||||||
|
pixmapToCBGRA( pm, pixels );
|
||||||
|
border.set( pm.width(), pm.height(), pixels );
|
||||||
|
}
|
||||||
|
|
||||||
NL3D::CTileBank m_bank;
|
NL3D::CTileBank m_bank;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,6 +180,7 @@ public:
|
||||||
TileBank::TileBank()
|
TileBank::TileBank()
|
||||||
{
|
{
|
||||||
m_pvt = new TileBankPvt();
|
m_pvt = new TileBankPvt();
|
||||||
|
resetError();
|
||||||
}
|
}
|
||||||
|
|
||||||
TileBank::~TileBank()
|
TileBank::~TileBank()
|
||||||
|
@ -65,11 +194,51 @@ void TileBank::addTileSet( const QString &name )
|
||||||
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( 0 );
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TileBank::removeTileSet( int idx )
|
||||||
|
{
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( idx );
|
||||||
|
if( set == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
int c = m_pvt->m_bank.getLandCount();
|
||||||
|
for( int i = 0; i < c; i++ )
|
||||||
|
{
|
||||||
|
NL3D::CTileLand *land = m_pvt->m_bank.getLand( i );
|
||||||
|
land->removeTileSet( set->getName() );
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pvt->m_bank.removeTileSet( idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileBank::renameTileSet( int idx, const QString &newName )
|
||||||
|
{
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( idx );
|
||||||
|
if( set == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string oldName = set->getName();
|
||||||
|
set->setName( newName.toUtf8().constData() );
|
||||||
|
|
||||||
|
int c = m_pvt->m_bank.getLandCount();
|
||||||
|
for( int i = 0; i < c; i++ )
|
||||||
|
{
|
||||||
|
NL3D::CTileLand *land = m_pvt->m_bank.getLand( i );
|
||||||
|
land->removeTileSet( oldName );
|
||||||
|
land->addTileSet( newName.toUtf8().constData() );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void TileBank::addLand( const QString &name )
|
void TileBank::addLand( const QString &name )
|
||||||
{
|
{
|
||||||
m_pvt->m_bank.addLand( name.toUtf8().constData() );
|
m_pvt->m_bank.addLand( name.toUtf8().constData() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TileBank::removeLand( int idx )
|
||||||
|
{
|
||||||
|
m_pvt->m_bank.removeLand( idx );
|
||||||
|
}
|
||||||
|
|
||||||
void TileBank::setLandSets( int idx, const QStringList &l )
|
void TileBank::setLandSets( int idx, const QStringList &l )
|
||||||
{
|
{
|
||||||
NL3D::CTileLand *land = m_pvt->m_bank.getLand( idx );
|
NL3D::CTileLand *land = m_pvt->m_bank.getLand( idx );
|
||||||
|
@ -82,29 +251,145 @@ void TileBank::setLandSets( int idx, const QStringList &l )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TileBank::addTileToSet( int idx, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type )
|
void TileBank::getLandSets( int idx, QStringList &l )
|
||||||
{
|
{
|
||||||
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( idx );
|
NL3D::CTileLand *land = m_pvt->m_bank.getLand( idx );
|
||||||
|
if( land == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
l.clear();
|
||||||
|
|
||||||
|
std::set< std::string> sets = land->getTileSets();
|
||||||
|
std::set< std::string >::const_iterator itr = sets.begin();
|
||||||
|
while( itr != sets.end() )
|
||||||
|
{
|
||||||
|
l.push_back( itr->c_str() );
|
||||||
|
++itr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileBank::addTile( int setIdx, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type )
|
||||||
|
{
|
||||||
|
resetError();
|
||||||
|
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( setIdx );
|
||||||
|
|
||||||
|
int tile;
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128: set->addTile128( tile, m_pvt->m_bank ); break;
|
||||||
|
case TileConstants::Tile256: set->addTile256( tile, m_pvt->m_bank ); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool b = setTile( setIdx, tile, name, pixmap, channel, type );
|
||||||
|
if( b )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// There was an error, roll back
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128: set->removeTile128( tile, m_pvt->m_bank ); break;
|
||||||
|
case TileConstants::Tile256: set->removeTile128( tile, m_pvt->m_bank ); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileBank::removeTile( int ts, int type, int tile )
|
||||||
|
{
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( ts );
|
||||||
|
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128: set->removeTile128( tile, m_pvt->m_bank ); break;
|
||||||
|
case TileConstants::Tile256: set->removeTile256( tile, m_pvt->m_bank ); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileBank::setTile( int tileset, int tile, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type )
|
||||||
|
{
|
||||||
|
resetError();
|
||||||
|
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( tileset );
|
||||||
if( set == NULL )
|
if( set == NULL )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
QPixmap pm = pixmap.value< QPixmap >();
|
QPixmap pm = pixmap.value< QPixmap >();
|
||||||
if( pm.isNull() )
|
if( pm.isNull() )
|
||||||
|
{
|
||||||
|
m_hasError = true;
|
||||||
|
m_lastError = "Failed to load image.";
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if( pm.width() != pm.height() )
|
if( pm.width() != pm.height() )
|
||||||
|
{
|
||||||
|
m_hasError = true;
|
||||||
|
m_lastError = "Image isn't square.";
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector< NLMISC::CBGRA > pixels;
|
if( !m_pvt->checkSize( type, channel, pm.width(), pm.height() ) )
|
||||||
pixmapToCBGRA( pm, pixels );
|
{
|
||||||
|
m_hasError = true;
|
||||||
int tile;
|
m_lastError = "Invalid image size.";
|
||||||
set->addTile128( tile, m_pvt->m_bank );
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
NL3D::CTileBorder border;
|
NL3D::CTileBorder border;
|
||||||
border.set( pm.width(), pm.height(), pixels );
|
m_pvt->buildBorder( pm, border );
|
||||||
|
|
||||||
|
QString msg;
|
||||||
|
NL3D::CTileSet::TError error = m_pvt->checkTile( set, tile, type, border, channelToTBitmap( channel ), msg );
|
||||||
|
|
||||||
|
// Tile checks out fine, set it
|
||||||
|
if( ( error == NL3D::CTileSet::ok ) || ( error == NL3D::CTileSet::addFirstA128128 ) )
|
||||||
|
{
|
||||||
|
if( error == NL3D::CTileSet::addFirstA128128 )
|
||||||
|
set->setBorder( channelToTBitmap( channel ), border );
|
||||||
|
|
||||||
|
m_pvt->setTile( set, tile, 0 /* rotation */, name, channelToTBitmap( channel ), type, border );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
setError( msg );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileBank::replaceImage( int ts, int type, int tile, TileConstants::TTileChannel channel, const QString &name, const QVariant &pixmap )
|
||||||
|
{
|
||||||
|
setTile( ts, tile, name, pixmap, channel, TileConstants::TNodeTileType( type ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileBank::clearImage( int ts, int type, int tile, TileConstants::TTileChannel channel )
|
||||||
|
{
|
||||||
|
NL3D::CTileSet *set = m_pvt->m_bank.getTileSet( ts );
|
||||||
|
|
||||||
|
int tileId;
|
||||||
|
|
||||||
|
NL3D::CTile::TBitmap bm = channelToTBitmap( channel );
|
||||||
|
|
||||||
|
switch( type )
|
||||||
|
{
|
||||||
|
case TileConstants::Tile128:
|
||||||
|
set->clearTile128( tile, bm, m_pvt->m_bank );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::Tile256:
|
||||||
|
set->clearTile256( tile, bm, m_pvt->m_bank );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileTransition:
|
||||||
|
set->clearTransition( NL3D::CTileSet::TTransition( tile ), bm, m_pvt->m_bank );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TileConstants::TileDisplacement:
|
||||||
|
set->clearDisplacement( NL3D::CTileSet::TDisplacement( tile ), m_pvt->m_bank );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
|
@ -16,13 +16,37 @@ public:
|
||||||
~TileBank();
|
~TileBank();
|
||||||
|
|
||||||
void addTileSet( const QString &name );
|
void addTileSet( const QString &name );
|
||||||
void addLand( const QString &name );
|
void removeTileSet( int idx );
|
||||||
void setLandSets( int idx, const QStringList &l );
|
void renameTileSet( int idx, const QString &newName );
|
||||||
|
|
||||||
bool addTileToSet( int idx, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type );
|
void addLand( const QString &name );
|
||||||
|
void removeLand( int idx );
|
||||||
|
void setLandSets( int idx, const QStringList &l );
|
||||||
|
void getLandSets( int idx, QStringList &l );
|
||||||
|
|
||||||
|
bool addTile( int setIdx, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type );
|
||||||
|
void removeTile( int ts, int type, int tile );
|
||||||
|
bool setTile( int tileset, int tile, const QString &name, const QVariant &pixmap, TileConstants::TTileChannel channel, TileConstants::TNodeTileType type );
|
||||||
|
void replaceImage( int ts, int type, int tile, TileConstants::TTileChannel channel, const QString &name, const QVariant &pixmap );
|
||||||
|
void clearImage( int ts, int type, int tile, TileConstants::TTileChannel channel );
|
||||||
|
|
||||||
|
bool hasError() const{ return m_hasError; }
|
||||||
|
QString getLastError() const{ return m_lastError; }
|
||||||
|
void resetError(){
|
||||||
|
m_hasError = false;
|
||||||
|
m_lastError = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
void setError( const QString &msg )
|
||||||
|
{
|
||||||
|
m_hasError = true;
|
||||||
|
m_lastError = msg;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TileBankPvt *m_pvt;
|
TileBankPvt *m_pvt;
|
||||||
|
QString m_lastError;
|
||||||
|
bool m_hasError;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -110,8 +110,6 @@ TileEditorMainWindow::TileEditorMainWindow(QWidget *parent)
|
||||||
connect(m_ui->tileSetAddTB, SIGNAL(clicked()), this, SLOT(onTileSetAdd()));
|
connect(m_ui->tileSetAddTB, SIGNAL(clicked()), this, SLOT(onTileSetAdd()));
|
||||||
connect(m_ui->tileSetDeleteTB, SIGNAL(clicked()), this, SLOT(onTileSetDelete()));
|
connect(m_ui->tileSetDeleteTB, SIGNAL(clicked()), this, SLOT(onTileSetDelete()));
|
||||||
connect(m_ui->tileSetEditTB, SIGNAL(clicked()), this, SLOT(onTileSetEdit()));
|
connect(m_ui->tileSetEditTB, SIGNAL(clicked()), this, SLOT(onTileSetEdit()));
|
||||||
connect(m_ui->tileSetUpTB, SIGNAL(clicked()), this, SLOT(onTileSetUp()));
|
|
||||||
connect(m_ui->tileSetDownTB, SIGNAL(clicked()), this, SLOT(onTileSetDown()));
|
|
||||||
|
|
||||||
connect(m_ui->landAddTB, SIGNAL(clicked()), this, SLOT(onLandAdd()));
|
connect(m_ui->landAddTB, SIGNAL(clicked()), this, SLOT(onLandAdd()));
|
||||||
connect(m_ui->landRemoveTB, SIGNAL(clicked()), this, SLOT(onLandRemove()));
|
connect(m_ui->landRemoveTB, SIGNAL(clicked()), this, SLOT(onLandRemove()));
|
||||||
|
@ -251,7 +249,8 @@ void TileEditorMainWindow::saveAs( const QString &fn )
|
||||||
}
|
}
|
||||||
|
|
||||||
TileBankSaver saver;
|
TileBankSaver saver;
|
||||||
bool ok = saver.save( fn.toUtf8().constData(), m_tileModel, m_lands );
|
bool ok = true;
|
||||||
|
//saver.save( fn.toUtf8().constData(), m_tileModel, m_lands );
|
||||||
|
|
||||||
if( !ok )
|
if( !ok )
|
||||||
{
|
{
|
||||||
|
@ -272,7 +271,8 @@ void TileEditorMainWindow::open()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TileBankLoader loader;
|
TileBankLoader loader;
|
||||||
bool b = loader.load( fn.toUtf8().constData(), m_tileModel, m_lands );
|
bool b = true;
|
||||||
|
//loader.load( fn.toUtf8().constData(), m_tileModel, m_lands );
|
||||||
|
|
||||||
if( !b )
|
if( !b )
|
||||||
{
|
{
|
||||||
|
@ -398,10 +398,7 @@ void TileEditorMainWindow::onTileSetDelete()
|
||||||
|
|
||||||
QString set = reinterpret_cast< TileSetNode* >( idx.internalPointer() )->getTileSetName();
|
QString set = reinterpret_cast< TileSetNode* >( idx.internalPointer() )->getTileSetName();
|
||||||
|
|
||||||
TileModel *model = static_cast<TileModel*>(m_ui->tileSetLV->model());
|
m_tileModel->removeTileSet( idx.row() );
|
||||||
bool ok = model->removeRow( idx.row() );
|
|
||||||
|
|
||||||
onTileSetRemoved( set );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileSetEdit()
|
void TileEditorMainWindow::onTileSetEdit()
|
||||||
|
@ -438,46 +435,7 @@ void TileEditorMainWindow::onTileSetEdit()
|
||||||
node->setTileSetName( newName );
|
node->setTileSetName( newName );
|
||||||
m_ui->tileSetLV->reset();
|
m_ui->tileSetLV->reset();
|
||||||
|
|
||||||
onTileSetRenamed( oldName, newName );
|
m_tileModel->renameTileSet( idx.row(), newName );
|
||||||
}
|
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileSetUp()
|
|
||||||
{
|
|
||||||
QModelIndex idx = m_ui->tileSetLV->currentIndex();
|
|
||||||
if( !idx.isValid() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
if( idx.row() == 0 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
TileModel *model = static_cast<TileModel*>(m_ui->tileSetLV->model());
|
|
||||||
if( model->rowCount() < 2 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int r = idx.row();
|
|
||||||
model->swapRows( r, r - 1 );
|
|
||||||
|
|
||||||
m_ui->tileSetLV->reset();
|
|
||||||
m_ui->tileSetLV->setCurrentIndex( model->index( r - 1, 0 ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileSetDown()
|
|
||||||
{
|
|
||||||
QModelIndex idx = m_ui->tileSetLV->currentIndex();
|
|
||||||
if( !idx.isValid() )
|
|
||||||
return;
|
|
||||||
|
|
||||||
TileModel *model = static_cast<TileModel*>(m_ui->tileSetLV->model());
|
|
||||||
if( model->rowCount() < idx.row() )
|
|
||||||
return;
|
|
||||||
if( model->rowCount() < 2 )
|
|
||||||
return;
|
|
||||||
|
|
||||||
int r = idx.row();
|
|
||||||
model->swapRows( r, r + 1 );
|
|
||||||
|
|
||||||
m_ui->tileSetLV->reset();
|
|
||||||
m_ui->tileSetLV->setCurrentIndex( model->index( r + 1, 0 ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onLandAdd()
|
void TileEditorMainWindow::onLandAdd()
|
||||||
|
@ -503,9 +461,7 @@ void TileEditorMainWindow::onLandAdd()
|
||||||
|
|
||||||
m_ui->landLW->addItem( name );
|
m_ui->landLW->addItem( name );
|
||||||
|
|
||||||
Land l;
|
m_tileModel->addLand( name );
|
||||||
l.name = name;
|
|
||||||
m_lands.push_back( l );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onLandRemove()
|
void TileEditorMainWindow::onLandRemove()
|
||||||
|
@ -526,8 +482,7 @@ void TileEditorMainWindow::onLandRemove()
|
||||||
|
|
||||||
delete item;
|
delete item;
|
||||||
|
|
||||||
QList< Land >::iterator itr = m_lands.begin() + idx;
|
m_tileModel->removeLand( idx );
|
||||||
m_lands.erase( itr );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onLandEdit()
|
void TileEditorMainWindow::onLandEdit()
|
||||||
|
@ -549,10 +504,12 @@ void TileEditorMainWindow::onLandEdit()
|
||||||
}
|
}
|
||||||
|
|
||||||
int r = m_ui->landLW->currentRow();
|
int r = m_ui->landLW->currentRow();
|
||||||
Land &l = m_lands[ r ];
|
|
||||||
|
QStringList sts;
|
||||||
|
m_tileModel->getLandSets( r, sts );
|
||||||
|
|
||||||
LandEditDialog d;
|
LandEditDialog d;
|
||||||
d.setSelectedTileSets( l.tilesets );
|
d.setSelectedTileSets( sts );
|
||||||
d.setTileSets( ts );
|
d.setTileSets( ts );
|
||||||
int result = d.exec();
|
int result = d.exec();
|
||||||
|
|
||||||
|
@ -560,10 +517,10 @@ void TileEditorMainWindow::onLandEdit()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Update the tileset of the land
|
// Update the tileset of the land
|
||||||
ts.clear();
|
sts.clear();
|
||||||
d.getSelectedTileSets( ts );
|
d.getSelectedTileSets( sts );
|
||||||
l.tilesets.clear();
|
|
||||||
l.tilesets = ts;
|
m_tileModel->setLandSets( r, sts );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onChooseVegetation()
|
void TileEditorMainWindow::onChooseVegetation()
|
||||||
|
@ -720,37 +677,26 @@ void TileEditorMainWindow::onActionAddTile(int tabId)
|
||||||
TileConstants::TNodeTileType type = tabToType( tabId );
|
TileConstants::TNodeTileType type = tabToType( tabId );
|
||||||
|
|
||||||
QStringListIterator itr( fileNames );
|
QStringListIterator itr( fileNames );
|
||||||
|
QString error;
|
||||||
|
|
||||||
while( itr.hasNext() )
|
while( itr.hasNext() )
|
||||||
{
|
{
|
||||||
TileItemNode *newNode = m_tileModel->createItemNode( setId, type, c, TileConstants::TileDiffuse, itr.next() );
|
TileItemNode *newNode = m_tileModel->createItemNode( setId, type, c, TileConstants::TileDiffuse, itr.next() );
|
||||||
if( newNode == NULL )
|
if( newNode == NULL )
|
||||||
{
|
{
|
||||||
|
if( m_tileModel->hasError() )
|
||||||
|
error = m_tileModel->getLastError();
|
||||||
|
|
||||||
int reply = QMessageBox::question( this,
|
int reply = QMessageBox::question( this,
|
||||||
tr( "Error adding tile" ),
|
tr( "Error adding tile" ),
|
||||||
tr( "Failed to create tile!\nContinue?" ),
|
error + "\nContinue?",
|
||||||
QMessageBox::Yes, QMessageBox::No );
|
QMessageBox::Yes, QMessageBox::No );
|
||||||
if( reply != QMessageBox::Yes )
|
if( reply != QMessageBox::Yes )
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if( newNode->hasError() )
|
|
||||||
{
|
|
||||||
QString error = newNode->getLastError();
|
|
||||||
error += "\nContinue?";
|
|
||||||
|
|
||||||
int reply = QMessageBox::question( this,
|
|
||||||
tr( "Error adding tile" ),
|
|
||||||
error,
|
|
||||||
QMessageBox::Yes, QMessageBox::No );
|
|
||||||
if( reply != QMessageBox::Yes )
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
n->appendRow( newNode );
|
n->appendRow( newNode );
|
||||||
c++;
|
c++;
|
||||||
}
|
}
|
||||||
|
@ -777,12 +723,13 @@ void TileEditorMainWindow::onActionDeleteTile( int tabId )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int row = idx.row();
|
QModelIndex tsidx = m_ui->tileSetLV->currentIndex();
|
||||||
|
if( !tsidx.isValid() )
|
||||||
|
return;
|
||||||
|
int ts = tsidx.row();
|
||||||
|
int tile = idx.row();
|
||||||
|
|
||||||
QModelIndex parent = idx.parent();
|
m_tileModel->removeTile( ts, tabId, tile );
|
||||||
lv->model()->removeRow( row, parent );
|
|
||||||
|
|
||||||
//lv->reset();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onActionDeleteImage( int tabId )
|
void TileEditorMainWindow::onActionDeleteImage( int tabId )
|
||||||
|
@ -798,13 +745,25 @@ void TileEditorMainWindow::onActionDeleteImage( int tabId )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QModelIndex tsidx = m_ui->tileSetLV->currentIndex();
|
||||||
|
if( !tsidx.isValid() )
|
||||||
|
return;
|
||||||
|
int ts = tsidx.row();
|
||||||
|
|
||||||
TileItemNode *n = reinterpret_cast< TileItemNode* >( idx.internalPointer() );
|
TileItemNode *n = reinterpret_cast< TileItemNode* >( idx.internalPointer() );
|
||||||
n->setTileFilename( TileItemNode::displayChannel(), "" );
|
int tile = n->id();
|
||||||
|
|
||||||
|
m_tileModel->clearImage( ts, tabId, tile, TileItemNode::displayChannel() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onActionReplaceImage( int tabId )
|
void TileEditorMainWindow::onActionReplaceImage( int tabId )
|
||||||
{
|
{
|
||||||
QListView *lv = getListViewByTab( tabId );
|
QListView *lv = getListViewByTab( tabId );
|
||||||
|
|
||||||
|
QModelIndex tsidx = m_ui->tileSetLV->currentIndex();
|
||||||
|
if( !tsidx.isValid() )
|
||||||
|
return;
|
||||||
|
int set = tsidx.row();
|
||||||
|
|
||||||
QModelIndex idx = lv->currentIndex();
|
QModelIndex idx = lv->currentIndex();
|
||||||
if( !idx.isValid() )
|
if( !idx.isValid() )
|
||||||
|
@ -823,41 +782,22 @@ void TileEditorMainWindow::onActionReplaceImage( int tabId )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TileItemNode *n = reinterpret_cast< TileItemNode* >( idx.internalPointer() );
|
TileItemNode *n = reinterpret_cast< TileItemNode* >( idx.internalPointer() );
|
||||||
n->setTileFilename( TileItemNode::displayChannel(), fileName );
|
int tile = n->id();
|
||||||
}
|
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileSetRemoved( const QString &set )
|
m_tileModel->replaceImage( set, tabId, tile, TileItemNode::displayChannel(), fileName );
|
||||||
{
|
if( m_tileModel->hasError() )
|
||||||
int c = m_lands.count();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
{
|
||||||
Land &land = m_lands[ i ];
|
QString error = m_tileModel->getLastError();
|
||||||
land.tilesets.removeAll( set );
|
QMessageBox::information( this,
|
||||||
}
|
tr( "Error replacing tile image" ),
|
||||||
}
|
error );
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileSetRenamed( const QString &oldname, const QString &newname )
|
|
||||||
{
|
|
||||||
int c = m_lands.count();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
Land &land = m_lands[ i ];
|
|
||||||
int idx = land.tilesets.indexOf( oldname );
|
|
||||||
if( idx < 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
land.tilesets[ idx ] = newname;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileEditorMainWindow::onTileBankLoaded()
|
void TileEditorMainWindow::onTileBankLoaded()
|
||||||
{
|
{
|
||||||
m_ui->landLW->clear();
|
m_ui->landLW->clear();
|
||||||
QListIterator< Land > itr( m_lands );
|
// load lands
|
||||||
while( itr.hasNext() )
|
|
||||||
{
|
|
||||||
m_ui->landLW->addItem( itr.next().name );
|
|
||||||
}
|
|
||||||
|
|
||||||
m_ui->listView128->reset();
|
m_ui->listView128->reset();
|
||||||
m_ui->listView256->reset();
|
m_ui->listView256->reset();
|
||||||
|
|
|
@ -25,8 +25,6 @@
|
||||||
#include <QtGui/QUndoStack>
|
#include <QtGui/QUndoStack>
|
||||||
#include <QSignalMapper>
|
#include <QSignalMapper>
|
||||||
|
|
||||||
#include "land.h"
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class TileEditorMainWindow;
|
class TileEditorMainWindow;
|
||||||
}
|
}
|
||||||
|
@ -59,8 +57,6 @@ private Q_SLOTS:
|
||||||
void onTileSetAdd();
|
void onTileSetAdd();
|
||||||
void onTileSetDelete();
|
void onTileSetDelete();
|
||||||
void onTileSetEdit();
|
void onTileSetEdit();
|
||||||
void onTileSetUp();
|
|
||||||
void onTileSetDown();
|
|
||||||
|
|
||||||
void onLandAdd();
|
void onLandAdd();
|
||||||
void onLandRemove();
|
void onLandRemove();
|
||||||
|
@ -89,8 +85,6 @@ private:
|
||||||
void onActionDeleteImage(int tabId);
|
void onActionDeleteImage(int tabId);
|
||||||
void onActionReplaceImage(int tabId);
|
void onActionReplaceImage(int tabId);
|
||||||
|
|
||||||
void onTileSetRemoved( const QString &set );
|
|
||||||
void onTileSetRenamed( const QString &oldname, const QString &newname );
|
|
||||||
void onTileBankLoaded();
|
void onTileBankLoaded();
|
||||||
|
|
||||||
void updateTab();
|
void updateTab();
|
||||||
|
@ -127,7 +121,6 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
QString m_fileName;
|
QString m_fileName;
|
||||||
QList< Land > m_lands;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // TILE_EDITOR_MAIN_WINDOW_H
|
#endif // TILE_EDITOR_MAIN_WINDOW_H
|
||||||
|
|
|
@ -426,58 +426,6 @@
|
||||||
<string>Tile Sets</string>
|
<string>Tile Sets</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout_5">
|
<layout class="QGridLayout" name="gridLayout_5">
|
||||||
<item row="0" column="1">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="tileSetUpTB">
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="tile_editor.qrc">
|
|
||||||
<normaloff>:/movementIcons/images/up.png</normaloff>:/movementIcons/images/up.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="tileSetDownTB">
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="tile_editor.qrc">
|
|
||||||
<normaloff>:/movementIcons/images/down.png</normaloff>:/movementIcons/images/down.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0" colspan="2">
|
<item row="1" column="0" colspan="2">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
<item>
|
<item>
|
||||||
|
|
|
@ -18,12 +18,8 @@
|
||||||
|
|
||||||
#include "tile_item.h"
|
#include "tile_item.h"
|
||||||
|
|
||||||
//#include "tile_widget.h"
|
|
||||||
|
|
||||||
#include <nel/misc/debug.h>
|
#include <nel/misc/debug.h>
|
||||||
|
|
||||||
#include <nel/3d/tile_bank.h>
|
|
||||||
|
|
||||||
Node::Node() : m_parentItem(0)
|
Node::Node() : m_parentItem(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -266,210 +262,14 @@ void TileTypeNode::reindex()
|
||||||
|
|
||||||
///////////////////////////////////////////////////
|
///////////////////////////////////////////////////
|
||||||
|
|
||||||
NL3D::CTile::TBitmap channelToTBitmap( TileConstants::TTileChannel channel )
|
|
||||||
{
|
|
||||||
NL3D::CTile::TBitmap bm;
|
|
||||||
|
|
||||||
switch( channel )
|
|
||||||
{
|
|
||||||
case TileConstants::TileDiffuse: bm = NL3D::CTile::diffuse; break;
|
|
||||||
case TileConstants::TileAdditive: bm = NL3D::CTile::additive; break;
|
|
||||||
case TileConstants::TileAlpha: bm = NL3D::CTile::alpha; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
class TileItemNodePvt
|
class TileItemNodePvt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
TileItemNodePvt()
|
TileItemNodePvt()
|
||||||
{
|
{
|
||||||
for( int i = 0; i < TileConstants::TileChannelCount; i++ )
|
|
||||||
m_borderFirst[ i ] = false;
|
|
||||||
|
|
||||||
m_id = -1;
|
|
||||||
m_alphaRot = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool pixmapToCBGRA( QPixmap &pixmap, std::vector< NLMISC::CBGRA >& pixels )
|
|
||||||
{
|
|
||||||
QImage img = pixmap.toImage();
|
|
||||||
if( img.format() != QImage::Format_ARGB32 )
|
|
||||||
img = img.convertToFormat( QImage::Format_ARGB32 );
|
|
||||||
|
|
||||||
if( img.format() != QImage::Format_ARGB32 )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
int c = img.width() * img.height();
|
|
||||||
|
|
||||||
const unsigned char *data = img.bits();
|
|
||||||
const unsigned int *idata = reinterpret_cast< const unsigned int* >( data );
|
|
||||||
|
|
||||||
NLMISC::CBGRA bgra;
|
|
||||||
pixels.clear();
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
while( i < c )
|
|
||||||
{
|
|
||||||
bgra.A = ( idata[ i ] & 0xFF000000 ) >> 24;
|
|
||||||
bgra.R = ( idata[ i ] & 0x00FF0000 ) >> 16;
|
|
||||||
bgra.G = ( idata[ i ] & 0x0000FF00 ) >> 8;
|
|
||||||
bgra.B = ( idata[ i ] & 0x000000FF );
|
|
||||||
pixels.push_back( bgra );
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getWidthForType( TileConstants::TNodeTileType type, TileConstants::TTileChannel channel )
|
|
||||||
{
|
|
||||||
int width = -1;
|
|
||||||
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case TileConstants::Tile128: width = 128; break;
|
|
||||||
case TileConstants::Tile256: width = 256; break;
|
|
||||||
case TileConstants::TileTransition:
|
|
||||||
{
|
|
||||||
if( channel != TileConstants::TileAlpha )
|
|
||||||
width = 128;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TileConstants::TileDisplacement: width = 32; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
NL3D::CTileSet::TError checkTile( TileConstants::TTileChannel channel )
|
|
||||||
{
|
|
||||||
if( m_type == TileConstants::TileDisplacement )
|
|
||||||
return NL3D::CTileSet::ok;
|
|
||||||
|
|
||||||
if( channel == TileConstants::TileAdditive )
|
|
||||||
return NL3D::CTileSet::ok;
|
|
||||||
|
|
||||||
int pixel;
|
|
||||||
int component;
|
|
||||||
int index;
|
|
||||||
|
|
||||||
NL3D::CTileSet set;
|
|
||||||
NL3D::CTile::TBitmap bm = channelToTBitmap( channel );
|
|
||||||
|
|
||||||
NL3D::CTileSet::TError error = NL3D::CTileSet::ok;
|
|
||||||
|
|
||||||
switch( m_type )
|
|
||||||
{
|
|
||||||
case TileConstants::Tile128:
|
|
||||||
error = set.checkTile128( bm, m_border[ channel ], pixel, component );
|
|
||||||
break;
|
|
||||||
case TileConstants::Tile256:
|
|
||||||
error = set.checkTile256( bm, m_border[ channel ], pixel, component );
|
|
||||||
break;
|
|
||||||
case TileConstants::TileTransition:
|
|
||||||
if( channel != TileConstants::TileAlpha )
|
|
||||||
error = set.checkTile128( bm, m_border[ channel ], pixel, component );
|
|
||||||
else
|
|
||||||
error = set.checkTileTransition( NL3D::CTileSet::TTransition( m_id ), bm, m_border[ channel ], index, pixel, component );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( error == NL3D::CTileSet::ok )
|
|
||||||
return NL3D::CTileSet::ok;
|
|
||||||
if( error == NL3D::CTileSet::addFirstA128128 )
|
|
||||||
return NL3D::CTileSet::addFirstA128128;
|
|
||||||
|
|
||||||
static const char* comp[]={"Red", "Green", "Blue", "Alpha", ""};
|
|
||||||
|
|
||||||
if( error != NL3D::CTileSet::ok )
|
|
||||||
{
|
|
||||||
m_lastError = "ERROR: ";
|
|
||||||
m_lastError += NL3D::CTileSet::getErrorMessage( error );
|
|
||||||
m_lastError += "\n";
|
|
||||||
|
|
||||||
switch( m_type )
|
|
||||||
{
|
|
||||||
case TileConstants::Tile128:
|
|
||||||
case TileConstants::Tile256:
|
|
||||||
m_lastError += QString( "pixel: %1 component: %2" ).arg( pixel ).arg( comp[ component ] );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TileConstants::TileTransition:
|
|
||||||
if( channel != TileConstants::TileAlpha )
|
|
||||||
{
|
|
||||||
m_lastError += QString( "pixel: %1 component: %2" ).arg( pixel ).arg( comp[ component ] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((error==NL3D::CTileSet::topInterfaceProblem)||(error==NL3D::CTileSet::bottomInterfaceProblem)||
|
|
||||||
(error==NL3D::CTileSet::leftInterfaceProblem)||(error==NL3D::CTileSet::rightInterfaceProblem)||
|
|
||||||
(error==NL3D::CTileSet::topBottomNotTheSame)||(error==NL3D::CTileSet::rightLeftNotTheSame)
|
|
||||||
||(error==NL3D::CTileSet::topInterfaceProblem))
|
|
||||||
{
|
|
||||||
if( index != -1 )
|
|
||||||
{
|
|
||||||
m_lastError += QString( "tile: %1 pixel: %2 component: %3" ).arg( index ).arg( pixel ).arg( comp[ component ] );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_lastError += QString( "incompatible with a 128 tile, pixel: %1 component: %2" ).arg( pixel ).arg( comp[ component ] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool checkPixmap( TileConstants::TTileChannel channel, QPixmap &pixmap )
|
|
||||||
{
|
|
||||||
int w = pixmap.width();
|
|
||||||
int h = pixmap.height();
|
|
||||||
|
|
||||||
if( w != h )
|
|
||||||
{
|
|
||||||
m_lastError = QObject::tr( "Not a square texture." );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int width = getWidthForType( m_type, channel );
|
|
||||||
|
|
||||||
if( width != -1 )
|
|
||||||
{
|
|
||||||
if( width != w )
|
|
||||||
{
|
|
||||||
m_lastError = QObject::tr( "Not the proper size." );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector< NLMISC::CBGRA > pixels;
|
|
||||||
|
|
||||||
pixmapToCBGRA( pixmap, pixels );
|
|
||||||
|
|
||||||
m_border[ channel ].set( w, h, pixels );
|
|
||||||
|
|
||||||
NL3D::CTileSet::TError error = checkTile( channel );
|
|
||||||
if( error == NL3D::CTileSet::addFirstA128128 )
|
|
||||||
{
|
|
||||||
m_borderFirst[ channel ] = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( error != NL3D::CTileSet::ok )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool loadImage( TileConstants::TTileChannel channel, const QString &fn, bool empty = false )
|
bool loadImage( TileConstants::TTileChannel channel, const QString &fn, bool empty = false )
|
||||||
{
|
{
|
||||||
QPixmap temp;
|
QPixmap temp;
|
||||||
|
@ -477,20 +277,9 @@ public:
|
||||||
|
|
||||||
if( !b )
|
if( !b )
|
||||||
{
|
{
|
||||||
m_lastError = QObject::tr( "Cannot open file %1" ).arg( fn );
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_borderFirst[ channel ] = false;
|
|
||||||
|
|
||||||
/*
|
|
||||||
if( !empty )
|
|
||||||
{
|
|
||||||
if( !checkPixmap( channel, temp ) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
pixmaps[ channel ] = temp;
|
pixmaps[ channel ] = temp;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -505,26 +294,8 @@ public:
|
||||||
return pixmaps[ channel ];
|
return pixmaps[ channel ];
|
||||||
}
|
}
|
||||||
|
|
||||||
void setType( TileConstants::TNodeTileType type ){ m_type = type; }
|
|
||||||
void setId( int id ){ m_id = id; }
|
|
||||||
int id() const{ return m_id; }
|
|
||||||
|
|
||||||
QString getLastError() const{ return m_lastError; }
|
|
||||||
bool borderFirst( TileConstants::TTileChannel channel ) const{ return m_borderFirst[ channel ]; }
|
|
||||||
|
|
||||||
const NL3D::CTileBorder &border( TileConstants::TTileChannel channel ){ return m_border[ channel ]; }
|
|
||||||
|
|
||||||
int alphaRot() const{ return m_alphaRot; }
|
|
||||||
void setAlphaRot( int rot ){ m_alphaRot = rot; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPixmap pixmaps[ TileConstants::TileChannelCount ];
|
QPixmap pixmaps[ TileConstants::TileChannelCount ];
|
||||||
TileConstants::TNodeTileType m_type;
|
|
||||||
NL3D::CTileBorder m_border[ TileConstants::TileChannelCount ];
|
|
||||||
int m_id;
|
|
||||||
QString m_lastError;
|
|
||||||
bool m_borderFirst[ TileConstants::TileChannelCount ];
|
|
||||||
int m_alphaRot;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TileConstants::TTileChannel TileItemNode::s_displayChannel = TileConstants::TileDiffuse;
|
TileConstants::TTileChannel TileItemNode::s_displayChannel = TileConstants::TileDiffuse;
|
||||||
|
@ -532,13 +303,11 @@ int TileItemNode::s_alphaRot = 0;
|
||||||
|
|
||||||
TileItemNode::TileItemNode( TileConstants::TNodeTileType type, int tileId, TileConstants::TTileChannel channel, QString filename, Node *parent)
|
TileItemNode::TileItemNode( TileConstants::TNodeTileType type, int tileId, TileConstants::TTileChannel channel, QString filename, Node *parent)
|
||||||
{
|
{
|
||||||
|
m_id = tileId;
|
||||||
m_parentItem = parent;
|
m_parentItem = parent;
|
||||||
//nlinfo("dispalying tile %d - %s", m_tileId, m_tileFilename[TileModel::TileDiffuse].toAscii().data());
|
//nlinfo("dispalying tile %d - %s", m_tileId, m_tileFilename[TileModel::TileDiffuse].toAscii().data());
|
||||||
|
|
||||||
pvt = new TileItemNodePvt();
|
pvt = new TileItemNodePvt();
|
||||||
pvt->setType( type );
|
|
||||||
pvt->setId( tileId );
|
|
||||||
|
|
||||||
m_hasError = false;
|
m_hasError = false;
|
||||||
|
|
||||||
setTileFilename( channel, filename );
|
setTileFilename( channel, filename );
|
||||||
|
@ -563,7 +332,6 @@ bool TileItemNode::setTileFilename(TileConstants::TTileChannel channel, QString
|
||||||
empty = true;
|
empty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
pvt->setAlphaRot( s_alphaRot );
|
|
||||||
bool b = pvt->loadImage( channel, fn, empty );
|
bool b = pvt->loadImage( channel, fn, empty );
|
||||||
m_hasError = !b;
|
m_hasError = !b;
|
||||||
if( !b )
|
if( !b )
|
||||||
|
@ -583,36 +351,6 @@ QString TileItemNode::getTileFilename(TileConstants::TTileChannel channel)
|
||||||
return itr.value();
|
return itr.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TileItemNode::setId( int id )
|
|
||||||
{
|
|
||||||
pvt->setId( id );
|
|
||||||
}
|
|
||||||
|
|
||||||
int TileItemNode::id() const
|
|
||||||
{
|
|
||||||
return pvt->id();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString TileItemNode::getLastError() const
|
|
||||||
{
|
|
||||||
return pvt->getLastError();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TileItemNode::borderFirst( TileConstants::TTileChannel channel ) const
|
|
||||||
{
|
|
||||||
return pvt->borderFirst( channel );
|
|
||||||
}
|
|
||||||
|
|
||||||
const NL3D::CTileBorder& TileItemNode::border( TileConstants::TTileChannel channel ) const
|
|
||||||
{
|
|
||||||
return pvt->border( channel );
|
|
||||||
}
|
|
||||||
|
|
||||||
int TileItemNode::alphaRot() const
|
|
||||||
{
|
|
||||||
return pvt->alphaRot();
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant TileItemNode::data(int column, int role) const
|
QVariant TileItemNode::data(int column, int role) const
|
||||||
{
|
{
|
||||||
QString tileFilename = m_tileFilename[ TileItemNode::s_displayChannel ];
|
QString tileFilename = m_tileFilename[ TileItemNode::s_displayChannel ];
|
||||||
|
@ -647,11 +385,11 @@ QVariant TileItemNode::data(int column, int role) const
|
||||||
}
|
}
|
||||||
else if(role == TileModel::TileIndexRole)
|
else if(role == TileModel::TileIndexRole)
|
||||||
{
|
{
|
||||||
return QVariant("("+QString::number(pvt->id())+")");
|
return QVariant("("+QString::number(m_id)+")");
|
||||||
}
|
}
|
||||||
else if(role == TileModel::TileFilenameIndexRole)
|
else if(role == TileModel::TileFilenameIndexRole)
|
||||||
{
|
{
|
||||||
return QVariant(tileFilename + " ("+QString::number(pvt->id())+")");
|
return QVariant(tileFilename + " ("+QString::number(m_id)+")");
|
||||||
}
|
}
|
||||||
|
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
|
@ -120,19 +120,13 @@ public:
|
||||||
int columnCount() const;
|
int columnCount() const;
|
||||||
bool setTileFilename(TileConstants::TTileChannel channel, QString filename);
|
bool setTileFilename(TileConstants::TTileChannel channel, QString filename);
|
||||||
QString getTileFilename(TileConstants::TTileChannel channel);
|
QString getTileFilename(TileConstants::TTileChannel channel);
|
||||||
void setId( int id );
|
void setId( int id ){ m_id = id; }
|
||||||
int id() const;
|
int id() const{ return m_id; }
|
||||||
QString getLastError() const;
|
|
||||||
bool borderFirst( TileConstants::TTileChannel channel ) const;
|
|
||||||
const NL3D::CTileBorder& border( TileConstants::TTileChannel channel ) const;
|
|
||||||
int alphaRot() const;
|
|
||||||
|
|
||||||
static void setDisplayChannel( TileConstants::TTileChannel channel ){ s_displayChannel = channel; }
|
static void setDisplayChannel( TileConstants::TTileChannel channel ){ s_displayChannel = channel; }
|
||||||
static TileConstants::TTileChannel displayChannel(){ return s_displayChannel; }
|
static TileConstants::TTileChannel displayChannel(){ return s_displayChannel; }
|
||||||
static void setAlphaRot( int rot ){ s_alphaRot = rot; }
|
static void setAlphaRot( int rot ){ s_alphaRot = rot; }
|
||||||
|
|
||||||
bool hasError() const{ return m_hasError; }
|
|
||||||
|
|
||||||
QVariant pixmap( TileConstants::TTileChannel channel ) const;
|
QVariant pixmap( TileConstants::TTileChannel channel ) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -142,6 +136,8 @@ private:
|
||||||
static TileConstants::TTileChannel s_displayChannel;
|
static TileConstants::TTileChannel s_displayChannel;
|
||||||
static int s_alphaRot;
|
static int s_alphaRot;
|
||||||
|
|
||||||
|
int m_id;
|
||||||
|
|
||||||
TileItemNodePvt *pvt;
|
TileItemNodePvt *pvt;
|
||||||
|
|
||||||
bool m_hasError;
|
bool m_hasError;
|
||||||
|
|
|
@ -232,7 +232,7 @@ TileItemNode *TileModel::createItemNode( int idx, TileConstants::TNodeTileType t
|
||||||
{
|
{
|
||||||
TileItemNode *n = new TileItemNode( type, id, channel, fileName );
|
TileItemNode *n = new TileItemNode( type, id, channel, fileName );
|
||||||
|
|
||||||
bool b = m_tileBank->addTileToSet( idx, fileName, n->pixmap( channel ), channel, type );
|
bool b = m_tileBank->addTile( idx, fileName, n->pixmap( channel ), channel, type );
|
||||||
if( !b )
|
if( !b )
|
||||||
{
|
{
|
||||||
delete n;
|
delete n;
|
||||||
|
@ -310,11 +310,101 @@ void TileModel::addLand( const QString &name )
|
||||||
m_tileBank->addLand( name );
|
m_tileBank->addLand( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TileModel::removeLand( int idx )
|
||||||
|
{
|
||||||
|
m_tileBank->removeLand( idx );
|
||||||
|
}
|
||||||
|
|
||||||
void TileModel::setLandSets( int idx, const QStringList &l )
|
void TileModel::setLandSets( int idx, const QStringList &l )
|
||||||
{
|
{
|
||||||
m_tileBank->setLandSets( idx, l );
|
m_tileBank->setLandSets( idx, l );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TileModel::getLandSets( int idx, QStringList &l )
|
||||||
|
{
|
||||||
|
m_tileBank->getLandSets( idx, l );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileModel::removeTileSet( int idx )
|
||||||
|
{
|
||||||
|
TileSetNode *set = static_cast< TileSetNode* >( rootItem->child( idx ) );
|
||||||
|
if( set == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
removeRow( idx );
|
||||||
|
|
||||||
|
m_tileBank->removeTileSet( idx );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileModel::renameTileSet( int idx, const QString &newName )
|
||||||
|
{
|
||||||
|
m_tileBank->renameTileSet( idx, newName );
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileModel::removeTile( int ts, int type, int tile )
|
||||||
|
{
|
||||||
|
TileSetNode *set = static_cast< TileSetNode* >( rootItem->child( ts ) );
|
||||||
|
if( set == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
TileTypeNode *typeNode = static_cast< TileTypeNode* >( set->child( type ) );
|
||||||
|
if( typeNode == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
TileItemNode *tileNode = static_cast< TileItemNode* >( typeNode->child( tile ) );
|
||||||
|
if( tileNode == NULL )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QModelIndex tileIdx = createIndex( tile, 0, tileNode );
|
||||||
|
removeRow( tile, tileIdx.parent() );
|
||||||
|
|
||||||
|
m_tileBank->removeTile( ts, type, tile );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileModel::replaceImage( int ts, int type, int tile, TileConstants::TTileChannel channel, const QString &name )
|
||||||
|
{
|
||||||
|
Node *set = rootItem->child( ts );
|
||||||
|
Node *tn = set->child( type );
|
||||||
|
Node *n = tn->child( tile );
|
||||||
|
|
||||||
|
TileItemNode *tin = static_cast< TileItemNode* >( n );
|
||||||
|
QString old = tin->getTileFilename( channel );
|
||||||
|
|
||||||
|
bool b = tin->setTileFilename( channel, name );
|
||||||
|
if( !b )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_tileBank->replaceImage( ts, type, tile, channel, name, tin->pixmap( channel ) );
|
||||||
|
if( m_tileBank->hasError() )
|
||||||
|
{
|
||||||
|
tin->setTileFilename( channel, old );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TileModel::clearImage( int ts, int type, int tile, TileConstants::TTileChannel channel )
|
||||||
|
{
|
||||||
|
Node *set = rootItem->child( ts );
|
||||||
|
Node *tn = set->child( type );
|
||||||
|
Node *n = tn->child( tile );
|
||||||
|
|
||||||
|
TileItemNode *tin = static_cast< TileItemNode* >( n );
|
||||||
|
tin->setTileFilename( channel, "" );
|
||||||
|
|
||||||
|
m_tileBank->clearImage( ts, type, tile, channel );
|
||||||
|
}
|
||||||
|
|
||||||
|
QString TileModel::getLastError() const{
|
||||||
|
return m_tileBank->getLastError();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TileModel::hasError() const
|
||||||
|
{
|
||||||
|
return m_tileBank->hasError();
|
||||||
|
}
|
||||||
|
|
||||||
void TileModel::selectFilenameDisplay(bool selected)
|
void TileModel::selectFilenameDisplay(bool selected)
|
||||||
{
|
{
|
||||||
m_fileDisplay = selected;
|
m_fileDisplay = selected;
|
||||||
|
|
|
@ -89,7 +89,17 @@ public:
|
||||||
QString texturePath() const{ return m_texturePath; }
|
QString texturePath() const{ return m_texturePath; }
|
||||||
|
|
||||||
void addLand( const QString &name );
|
void addLand( const QString &name );
|
||||||
|
void removeLand( int idx );
|
||||||
|
void removeTileSet( int idx );
|
||||||
|
void renameTileSet( int idx, const QString &newName );
|
||||||
void setLandSets( int idx, const QStringList &l );
|
void setLandSets( int idx, const QStringList &l );
|
||||||
|
void getLandSets( int idx, QStringList &l );
|
||||||
|
void removeTile( int ts, int type, int tile );
|
||||||
|
bool replaceImage( int ts, int type, int tile, TileConstants::TTileChannel channel, const QString &name );
|
||||||
|
void clearImage( int ts, int type, int tile, TileConstants::TTileChannel channel );
|
||||||
|
|
||||||
|
QString getLastError() const;
|
||||||
|
bool hasError() const;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void selectFilenameDisplay(bool selected);
|
void selectFilenameDisplay(bool selected);
|
||||||
|
|
|
@ -26,138 +26,6 @@
|
||||||
class TileBankLoaderPvt
|
class TileBankLoaderPvt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NL3D::CTileBank bank;
|
|
||||||
|
|
||||||
static NL3D::CTile::TBitmap channelToTBitmap( TileConstants::TTileChannel channel )
|
|
||||||
{
|
|
||||||
NL3D::CTile::TBitmap b = NL3D::CTile::bitmapCount;
|
|
||||||
|
|
||||||
switch( channel )
|
|
||||||
{
|
|
||||||
case TileConstants::TileDiffuse: b = NL3D::CTile::diffuse; break;
|
|
||||||
case TileConstants::TileAdditive: b = NL3D::CTile::additive; break;
|
|
||||||
case TileConstants::TileAlpha: b = NL3D::CTile::alpha; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadLands( QList< Land > &lands )
|
|
||||||
{
|
|
||||||
lands.clear();
|
|
||||||
|
|
||||||
Land l;
|
|
||||||
|
|
||||||
int c = bank.getLandCount();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
NL3D::CTileLand *land = bank.getLand( i );
|
|
||||||
l.name = land->getName().c_str();
|
|
||||||
|
|
||||||
|
|
||||||
std::set< std::string > sets = land->getTileSets();
|
|
||||||
std::set< std::string >::const_iterator itr = sets.begin();
|
|
||||||
while( itr != sets.end() )
|
|
||||||
{
|
|
||||||
l.tilesets.push_back( itr->c_str() );
|
|
||||||
++itr;
|
|
||||||
}
|
|
||||||
|
|
||||||
lands.push_back( l );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTiles128( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
int c = set->getNumTile128();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
int idx = set->getTile128( i );
|
|
||||||
NL3D::CTile *tile = bank.getTile( idx );
|
|
||||||
|
|
||||||
TileItemNode *tin = new TileItemNode( TileConstants::Tile128, i, TileConstants::TileDiffuse, "" );
|
|
||||||
|
|
||||||
for( int i = TileConstants::TileDiffuse; i < TileConstants::TileAlpha; i++ )
|
|
||||||
{
|
|
||||||
tin->setTileFilename( TileConstants::TTileChannel( i ), tile->getRelativeFileName( channelToTBitmap( TileConstants::TTileChannel( i ) ) ).c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
node->appendChild( tin );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTiles256( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
int c = set->getNumTile256();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
int idx = set->getTile256( i );
|
|
||||||
NL3D::CTile *tile = bank.getTile( idx );
|
|
||||||
|
|
||||||
TileItemNode *tin = new TileItemNode( TileConstants::Tile256, i, TileConstants::TileDiffuse, "" );
|
|
||||||
|
|
||||||
for( int i = TileConstants::TileDiffuse; i < TileConstants::TileAlpha; i++ )
|
|
||||||
{
|
|
||||||
tin->setTileFilename( TileConstants::TTileChannel( i ), tile->getRelativeFileName( channelToTBitmap( TileConstants::TTileChannel( i ) ) ).c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
node->appendChild( tin );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTilesTransition( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < NL3D::CTileSet::count; i++ )
|
|
||||||
{
|
|
||||||
const NL3D::CTileSetTransition *tr = set->getTransition( i );
|
|
||||||
int idx = tr->getTile();
|
|
||||||
NL3D::CTile *tile = bank.getTile( idx );
|
|
||||||
|
|
||||||
TileItemNode *tin = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
|
|
||||||
for( int j = TileConstants::TileDiffuse; j <= TileConstants::TileAlpha; j++ )
|
|
||||||
{
|
|
||||||
tin->setTileFilename( TileConstants::TTileChannel( i ), tile->getRelativeFileName( channelToTBitmap( TileConstants::TTileChannel( i ) ) ).c_str() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTilesDisplacement( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < NL3D::CTileSet::CountDisplace; i++ )
|
|
||||||
{
|
|
||||||
uint did = set->getDisplacementTile( NL3D::CTileSet::TDisplacement( i ) );
|
|
||||||
const char *fn = bank.getDisplacementMap( did );
|
|
||||||
|
|
||||||
TileItemNode *tin = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
tin->setTileFilename( TileConstants::TileDiffuse, fn );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTileSet( NL3D::CTileSet *set, TileSetNode *node )
|
|
||||||
{
|
|
||||||
loadTiles128( set, static_cast< TileTypeNode* >( node->child( 0 ) ) );
|
|
||||||
loadTiles256( set, static_cast< TileTypeNode* >( node->child( 1 ) ) );
|
|
||||||
loadTilesTransition( set, static_cast< TileTypeNode* >( node->child( 2 ) ) );
|
|
||||||
loadTilesDisplacement( set, static_cast< TileTypeNode* >( node->child( 3 ) ) );
|
|
||||||
|
|
||||||
node->setOriented( set->getOriented() );
|
|
||||||
|
|
||||||
node->setVegetSet( set->getTileVegetableDescFileName().c_str() );
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadTileSets( TileModel *model )
|
|
||||||
{
|
|
||||||
model->clear();
|
|
||||||
|
|
||||||
int c = bank.getTileSetCount();
|
|
||||||
for( int i = 0; i < c; i++ )
|
|
||||||
{
|
|
||||||
NL3D::CTileSet *set = bank.getTileSet( i );
|
|
||||||
TileSetNode *node = model->createTileSetNode( set->getName().c_str() );
|
|
||||||
loadTileSet( set, node );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -178,12 +46,7 @@ bool TileBankLoader::load( const char *filename, TileModel *model, QList< Land >
|
||||||
if( !file.open( filename, false ) )
|
if( !file.open( filename, false ) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
p->bank.serial( file );
|
//p->bank.serial( file );
|
||||||
|
|
||||||
p->loadLands( lands );
|
|
||||||
p->loadTileSets( model );
|
|
||||||
|
|
||||||
model->setTexturePath( p->bank.getAbsPath().c_str() );
|
|
||||||
|
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
|
|
|
@ -25,251 +25,7 @@
|
||||||
class TileBankSaverPvt
|
class TileBankSaverPvt
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NL3D::CTileBank bank;
|
|
||||||
|
|
||||||
static NL3D::CTile::TBitmap channelToTBitmap( TileConstants::TTileChannel channel )
|
|
||||||
{
|
|
||||||
NL3D::CTile::TBitmap b = NL3D::CTile::bitmapCount;
|
|
||||||
|
|
||||||
switch( channel )
|
|
||||||
{
|
|
||||||
case TileConstants::TileDiffuse: b = NL3D::CTile::diffuse; break;
|
|
||||||
case TileConstants::TileAdditive: b = NL3D::CTile::additive; break;
|
|
||||||
case TileConstants::TileAlpha: b = NL3D::CTile::alpha; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
NL3D::CTile* addTileToSet( NL3D::CTileSet *set, TileConstants::TNodeTileType type )
|
|
||||||
{
|
|
||||||
int idx = -1;
|
|
||||||
int bidx = -1;
|
|
||||||
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case TileConstants::Tile128:
|
|
||||||
{
|
|
||||||
set->addTile128( idx, bank );
|
|
||||||
bidx = set->getTile128( idx );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case TileConstants::Tile256:
|
|
||||||
{
|
|
||||||
set->addTile256( idx, bank );
|
|
||||||
bidx = set->getTile256( idx );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( idx == -1 )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return bank.getTile( bidx );
|
|
||||||
}
|
|
||||||
|
|
||||||
void addTilesToSet( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
TileConstants::TNodeTileType type = node->getTileType();
|
|
||||||
|
|
||||||
for( int i = 0; i < node->childCount(); i++ )
|
|
||||||
{
|
|
||||||
TileItemNode *tin = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
NL3D::CTile *tile = addTileToSet( set, type );
|
|
||||||
|
|
||||||
for( int j = TileConstants::TileDiffuse; j < TileConstants::TileAlpha; j++ )
|
|
||||||
{
|
|
||||||
QString fn = tin->getTileFilename( TileConstants::TTileChannel( j ) );
|
|
||||||
tile->setFileName( channelToTBitmap( TileConstants::TTileChannel( j ) ) , fn.toUtf8().constData() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void addTilesToSet( NL3D::CTileSet *set, TileSetNode *node )
|
|
||||||
{
|
|
||||||
for( int i = TileConstants::Tile128; i <= TileConstants::Tile256; i++ )
|
|
||||||
{
|
|
||||||
TileTypeNode *tn = static_cast< TileTypeNode* >( node->child( i ) );
|
|
||||||
|
|
||||||
addTilesToSet( set, tn );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTiles128( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
TileItemNode *tileNode = NULL;
|
|
||||||
for( int i = 0; i < node->childCount(); i++ )
|
|
||||||
{
|
|
||||||
tileNode = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
|
|
||||||
for( int j = TileConstants::TileDiffuse; j < TileConstants::TileAlpha; j++ )
|
|
||||||
{
|
|
||||||
TileConstants::TTileChannel channel = TileConstants::TTileChannel( j );
|
|
||||||
NL3D::CTile::TBitmap bm = channelToTBitmap( channel );
|
|
||||||
const NL3D::CTileBorder &border = tileNode->border( channel );
|
|
||||||
|
|
||||||
if( tileNode->borderFirst( channel ) )
|
|
||||||
set->setBorder( bm, border );
|
|
||||||
|
|
||||||
set->setTile128( i, tileNode->getTileFilename( channel ).toUtf8().constData(), bm, bank );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTiles256( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
TileItemNode *tileNode = NULL;
|
|
||||||
for( int i = 0; i < node->childCount(); i++ )
|
|
||||||
{
|
|
||||||
tileNode = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
|
|
||||||
for( int j = TileConstants::TileDiffuse; j < TileConstants::TileAlpha; j++ )
|
|
||||||
{
|
|
||||||
TileConstants::TTileChannel channel = TileConstants::TTileChannel( j );
|
|
||||||
NL3D::CTile::TBitmap bm = channelToTBitmap( channel );
|
|
||||||
const NL3D::CTileBorder &border = tileNode->border( channel );
|
|
||||||
|
|
||||||
if( tileNode->borderFirst( channel ) )
|
|
||||||
set->setBorder( bm, border );
|
|
||||||
|
|
||||||
set->setTile256( i, tileNode->getTileFilename( channel ).toUtf8().constData(), bm, bank );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTransitionTile( NL3D::CTileSet *set, TileItemNode *node, int idx )
|
|
||||||
{
|
|
||||||
TileConstants::TTileChannel channel;
|
|
||||||
NL3D::CTile::TBitmap bm;
|
|
||||||
NL3D::CTileSet::TTransition tr;
|
|
||||||
|
|
||||||
// Diffuse, Additive
|
|
||||||
for( int i = TileConstants::TileDiffuse; i < TileConstants::TileAlpha; i++ )
|
|
||||||
{
|
|
||||||
channel =TileConstants::TTileChannel( i );
|
|
||||||
bm = channelToTBitmap( channel );
|
|
||||||
tr = NL3D::CTileSet::TTransition( idx );
|
|
||||||
const NL3D::CTileBorder &border = node->border( channel );
|
|
||||||
|
|
||||||
if( node->borderFirst( channel ) )
|
|
||||||
set->setBorder( bm, border );
|
|
||||||
set->setTileTransition( tr, node->getTileFilename( channel ).toUtf8().constData(), bm, bank, border );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Alpha
|
|
||||||
{
|
|
||||||
channel = TileConstants::TileAlpha;
|
|
||||||
bm = channelToTBitmap( channel );
|
|
||||||
tr = NL3D::CTileSet::TTransition( idx );
|
|
||||||
const NL3D::CTileBorder &border = node->border( channel );
|
|
||||||
int rot = node->alphaRot();
|
|
||||||
|
|
||||||
set->setTileTransitionAlpha( tr, node->getTileFilename( channel ).toUtf8().constData(), bank, border, rot );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTransitionTiles( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < node->childCount(); i++ )
|
|
||||||
{
|
|
||||||
TileItemNode *tin = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
setupTransitionTile( set, tin, i );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTransitionTiles( NL3D::CTileSet *set, TileSetNode *node )
|
|
||||||
{
|
|
||||||
TileTypeNode *tn = static_cast< TileTypeNode* >( node->child( 2 ) );
|
|
||||||
setupTransitionTiles( set, tn );
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupDisplacementTile( NL3D::CTileSet *set, TileItemNode *node, int idx )
|
|
||||||
{
|
|
||||||
set->setDisplacement( NL3D::CTileSet::TDisplacement( idx ),
|
|
||||||
node->getTileFilename( TileConstants::TileDiffuse ).toUtf8().constData(),
|
|
||||||
bank );
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupDisplacementTiles( NL3D::CTileSet *set, TileTypeNode *node )
|
|
||||||
{
|
|
||||||
for( int i = 0; i < node->childCount(); i++ )
|
|
||||||
{
|
|
||||||
TileItemNode *tin = static_cast< TileItemNode* >( node->child( i ) );
|
|
||||||
setupDisplacementTile( set, tin, i );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupDisplacementTiles( NL3D::CTileSet *set, TileSetNode *node )
|
|
||||||
{
|
|
||||||
TileTypeNode *tn = static_cast< TileTypeNode* >( node->child( 3 ) );
|
|
||||||
setupDisplacementTiles( set, tn );
|
|
||||||
}
|
|
||||||
|
|
||||||
void setupTiles( NL3D::CTileSet *set, TileSetNode *node )
|
|
||||||
{
|
|
||||||
TileTypeNode *tn128 = static_cast< TileTypeNode* >( node->child( 0 ) );
|
|
||||||
TileTypeNode *tn256 = static_cast< TileTypeNode* >( node->child( 1 ) );
|
|
||||||
|
|
||||||
setupTiles128( set, tn128 );
|
|
||||||
setupTiles256( set, tn256 );
|
|
||||||
setupTransitionTiles( set, node );
|
|
||||||
setupDisplacementTiles( set, node );
|
|
||||||
}
|
|
||||||
|
|
||||||
void addLands( const QList< Land > &lands )
|
|
||||||
{
|
|
||||||
QListIterator< Land > itr( lands );
|
|
||||||
while( itr.hasNext() )
|
|
||||||
{
|
|
||||||
bank.addLand( itr.next().name.toUtf8().constData() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void addTileSets( const TileModel* model, const QList< Land > &lands )
|
|
||||||
{
|
|
||||||
// Add the tilesets
|
|
||||||
for( int i = 0; i < model->rowCount(); i++ )
|
|
||||||
{
|
|
||||||
QModelIndex idx = model->index( i, 0 );
|
|
||||||
if( !idx.isValid() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
TileSetNode *n = reinterpret_cast< TileSetNode* >( idx.internalPointer() );
|
|
||||||
QString set = n->getTileSetName();
|
|
||||||
bank.addTileSet( set.toUtf8().constData() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the data to tilesets
|
|
||||||
for( int i = 0; i < bank.getTileSetCount(); i++ )
|
|
||||||
{
|
|
||||||
NL3D::CTileSet *set = bank.getTileSet( i );
|
|
||||||
|
|
||||||
QModelIndex idx = model->index( i, 0 );
|
|
||||||
if( !idx.isValid() )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
TileSetNode *n = reinterpret_cast< TileSetNode* >( idx.internalPointer() );
|
|
||||||
|
|
||||||
addTilesToSet( set, n );
|
|
||||||
setupTiles( set, n );
|
|
||||||
set->setOriented( n->isOriented() );
|
|
||||||
set->setTileVegetableDescFileName( n->vegetSet().toUtf8().constData() );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add tilesets to lands
|
|
||||||
for( int i = 0; i < bank.getLandCount(); i++ )
|
|
||||||
{
|
|
||||||
NL3D::CTileLand *land = bank.getLand( i );
|
|
||||||
const Land &l = lands[ i ];
|
|
||||||
|
|
||||||
for( int j = 0; j < l.tilesets.count(); j++ )
|
|
||||||
{
|
|
||||||
land->addTileSet( l.tilesets[ j ].toUtf8().constData() );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
TileBankSaver::TileBankSaver()
|
TileBankSaver::TileBankSaver()
|
||||||
|
@ -285,18 +41,13 @@ TileBankSaver::~TileBankSaver()
|
||||||
|
|
||||||
bool TileBankSaver::save( const char *fileName, const TileModel* model, const QList< Land > &lands )
|
bool TileBankSaver::save( const char *fileName, const TileModel* model, const QList< Land > &lands )
|
||||||
{
|
{
|
||||||
p->addLands( lands );
|
|
||||||
p->addTileSets( model, lands );
|
|
||||||
|
|
||||||
p->bank.setAbsPath( model->texturePath().toUtf8().constData() );
|
|
||||||
|
|
||||||
// Save to file
|
// Save to file
|
||||||
NLMISC::COFile f;
|
NLMISC::COFile f;
|
||||||
bool b = f.open( fileName, false, false, false );
|
bool b = f.open( fileName, false, false, false );
|
||||||
if( !b )
|
if( !b )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
p->bank.serial( f );
|
//p->bank.serial( f );
|
||||||
|
|
||||||
f.flush();
|
f.flush();
|
||||||
f.close();
|
f.close();
|
||||||
|
|
Loading…
Reference in a new issue