From 1cbc489081c1467abb5081904b8e46270007df46 Mon Sep 17 00:00:00 2001 From: "Matias N. Goldberg" Date: Sat, 28 Aug 2021 20:01:00 -0300 Subject: [PATCH] [Regression] Fix Terra crash if trying to assign a datablock more than once --- .../Tutorial_Terrain/src/Terra/Terra.cpp | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Samples/2.0/Tutorials/Tutorial_Terrain/src/Terra/Terra.cpp b/Samples/2.0/Tutorials/Tutorial_Terrain/src/Terra/Terra.cpp index 9b6ae56e66f..32ec504101d 100644 --- a/Samples/2.0/Tutorials/Tutorial_Terrain/src/Terra/Terra.cpp +++ b/Samples/2.0/Tutorials/Tutorial_Terrain/src/Terra/Terra.cpp @@ -669,14 +669,6 @@ namespace Ogre accumDim += maxPixelDimension * (1u << iteration); ++iteration; - if( !m_terrainCells[0].empty() && m_terrainCells[0].back().getDatablock() ) - { - HlmsDatablock *datablock = m_terrainCells[0].back().getDatablock(); - OGRE_ASSERT_HIGH( dynamic_cast( datablock->getCreator() ) ); - HlmsTerra *hlms = static_cast( datablock->getCreator() ); - hlms->_unlinkTerra( this ); - } - for( size_t i = 0u; i < 2u; ++i ) { m_terrainCells[i].clear(); @@ -755,6 +747,15 @@ namespace Ogre //----------------------------------------------------------------------------------- void Terra::setDatablock( HlmsDatablock *datablock ) { + if( !datablock && !m_terrainCells[0].empty() && m_terrainCells[0].back().getDatablock() ) + { + // Unsetting the datablock. We have no way of unlinking later on. Do it now + HlmsDatablock *datablock = m_terrainCells[0].back().getDatablock(); + OGRE_ASSERT_HIGH( dynamic_cast( datablock->getCreator() ) ); + HlmsTerra *hlms = static_cast( datablock->getCreator() ); + hlms->_unlinkTerra( this ); + } + for( size_t i = 0u; i < 2u; ++i ) { std::vector::iterator itor = m_terrainCells[i].begin(); @@ -767,9 +768,12 @@ namespace Ogre } } - OGRE_ASSERT_HIGH( dynamic_cast( datablock->getCreator() ) ); - HlmsTerra *hlms = static_cast( datablock->getCreator() ); - hlms->_linkTerra( this ); + if( mHlmsTerraIndex != std::numeric_limits::max() ) + { + OGRE_ASSERT_HIGH( dynamic_cast( datablock->getCreator() ) ); + HlmsTerra *hlms = static_cast( datablock->getCreator() ); + hlms->_linkTerra( this ); + } } //----------------------------------------------------------------------------------- Ogre::TextureGpu* Terra::_getShadowMapTex(void) const