diff --git a/Engine/source/terrain/terrData.cpp b/Engine/source/terrain/terrData.cpp index 9db97f28a..1dd89d7b3 100644 --- a/Engine/source/terrain/terrData.cpp +++ b/Engine/source/terrain/terrData.cpp @@ -186,6 +186,7 @@ TerrainBlock::TerrainBlock() mCell( NULL ), mCRC( 0 ), mBaseTexSize( 1024 ), + mBaseTexFormat( TerrainBlock::JPG ), mBaseMaterial( NULL ), mDefaultMatInst( NULL ), mBaseTexScaleConst( NULL ), @@ -961,7 +962,7 @@ String TerrainBlock::_getBaseTexCacheFileName() const { Torque::Path basePath( mTerrFileName ); basePath.setFileName( basePath.getFileName() + "_basetex" ); - basePath.setExtension( "dds" ); + basePath.setExtension( formatToExtension(mBaseTexFormat) ); return basePath.getFullPath(); } @@ -1200,7 +1201,7 @@ void TerrainBlock::unpackUpdate(NetConnection* con, BitStream *stream) { mBaseTexSize = baseTexSize; if ( isProperlyAdded() ) - _updateBaseTexture( false ); + _updateBaseTexture( NONE ); } U32 lightMapSize; diff --git a/Engine/source/terrain/terrData.h b/Engine/source/terrain/terrData.h index 967bfa0d1..b3433dfb1 100644 --- a/Engine/source/terrain/terrData.h +++ b/Engine/source/terrain/terrData.h @@ -74,6 +74,26 @@ protected: NextFreeMask = Parent::NextFreeMask << 6, }; + enum BaseTexFormat + { + NONE, DDS, PNG, JPG + }; + + static const char* formatToExtension(BaseTexFormat format) + { + switch (format) + { + case DDS: + return "dds"; + case PNG: + return "png"; + case JPG: + return "jpg"; + default: + return ""; + } + }; + Box3F mBounds; /// @@ -132,6 +152,8 @@ protected: /// The desired size for the base texture. U32 mBaseTexSize; + BaseTexFormat mBaseTexFormat; + /// TerrCell *mCell; diff --git a/Engine/source/terrain/terrRender.cpp b/Engine/source/terrain/terrRender.cpp index 4b03ac812..61b844380 100644 --- a/Engine/source/terrain/terrRender.cpp +++ b/Engine/source/terrain/terrRender.cpp @@ -178,7 +178,7 @@ bool TerrainBlock::_initBaseShader() return true; } -void TerrainBlock::_updateBaseTexture( bool writeToCache ) +void TerrainBlock::_updateBaseTexture(bool writeToCache) { if ( !mBaseShader && !_initBaseShader() ) return; @@ -290,7 +290,14 @@ void TerrainBlock::_updateBaseTexture( bool writeToCache ) GFX->endScene(); /// Do we cache this sucker? - if ( writeToCache ) + if (mBaseTexFormat == NONE || !writeToCache) + { + // We didn't cache the result, so set the base texture + // to the render target we updated. This should be good + // for realtime painting cases. + mBaseTex = blendTex; + } + else if (mBaseTexFormat == DDS) { String cachePath = _getBaseTexCacheFileName(); @@ -327,10 +334,16 @@ void TerrainBlock::_updateBaseTexture( bool writeToCache ) } else { - // We didn't cache the result, so set the base texture - // to the render target we updated. This should be good - // for realtime painting cases. - mBaseTex = blendTex; + FileStream stream; + if (!stream.open(_getBaseTexCacheFileName(), Torque::FS::File::Write)) + { + mBaseTex = blendTex; + return; + } + + GBitmap bitmap(blendTex->getWidth(), blendTex->getHeight(), false, GFXFormatR8G8B8); + blendTex->copyToBmp(&bitmap); + bitmap.writeBitmap(formatToExtension(mBaseTexFormat), stream); } }