I'm attempting to create a textureArray(Type2DArray) to use with a v1 Renderable (entity) and legacy material.
When uploading an image with slices i.e. "image.uploadTo(texture,....." I encounter the following assert:
Code: Select all
scaling: /media/sdb5/Libraries/OGRE/src/v2-2/OgreMain/src/OgreStagingTexture.cpp:130: virtual void Ogre::StagingTexture::upload(const Ogre::TextureBox&, Ogre::TextureGpu*, Ogre::uint8, const Ogre::TextureBox*, const Ogre::TextureBox*, bool): Assertion `!dstBox || fullDstTextureBox.fullyContains( *dstBox )' failed.
Aborted (core dumped)
This is example code:
Code: Select all
void saveSlice(const Ogre::String& name, TextureBox& texBox, Ogre::PixelFormatGpu pixelFormat, uint32 slice, uint32 numSlices, TextureTypes::TextureTypes texType)
{
Image2 sliceImageTest;
sliceImageTest._setAutoDelete(false);
sliceImageTest.loadDynamicImage( texBox.at( 0, 0, slice ), texBox.width, texBox.height*numSlices,
1u, texType, pixelFormat, false, 1 );
sliceImageTest.save(name,0,0);
}
virtual void createScene(void) {
uint32 numSlices=4;
Ogre::Image2 baseImage;
baseImage.load("1d_debug.png",Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME);
baseImage.save("./Data.png",0,0);
Ogre::Image2 sliceImage;
sliceImage.loadDynamicImage( baseImage.getData(0).data, baseImage.getWidth(), baseImage.getHeight()/numSlices, numSlices,
Ogre::TextureTypes::Type2DArray, baseImage.getPixelFormat(),
false, 1 );
assert( sliceImage.getNumSlices()>1);
TextureBox texBox = sliceImage.getData(0);
// save slice2
saveSlice("./2DArray_Slice2.png", texBox, sliceImage.getPixelFormat(), 2 ,1,Ogre::TextureTypes::Type2D);
// save all image slices(vertical)
saveSlice("./2DArray_SliceAll.png", texBox, sliceImage.getPixelFormat(), 0 ,sliceImage.getNumSlices(),Ogre::TextureTypes::Type2D);
Ogre::TextureGpuManager *textureManager = Ogre::Root::getSingletonPtr()->getRenderSystem()->getTextureGpuManager();
Ogre::TextureGpu* texture = textureManager->createTexture("TestArray",
Ogre::GpuPageOutStrategy::Discard, //AlwaysKeepSystemRamCopy,
Ogre::TextureFlags::ManualTexture,
Ogre::TextureTypes::Type2DArray,
Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
texture->setPixelFormat( sliceImage.getPixelFormat() );
texture->setNumMipmaps( 1 );
texture->setResolution( sliceImage.getWidth(), sliceImage.getHeight(), sliceImage.getNumSlices());
if (texture->getResidencyStatus() != Ogre::GpuResidency::Resident) {
texture->_transitionTo( Ogre::GpuResidency::Resident, (Ogre::uint8*)0);
}
texture->_setNextResidencyStatus( Ogre::GpuResidency::Resident );
// crash
assert( sliceImage.getNumMipmaps()==1);
assert( sliceImage.getNumSlices()==4);
assert( sliceImage.getWidth()==128);
assert( sliceImage.getHeight()==32);
assert( sliceImage.getBytesPerRow(0)==4*128);
assert( sliceImage.getBytesPerImage(0)==4*128*32);
assert( sliceImage.getSizeBytes()==16384*4);
//sliceImage.uploadTo(texture,0,0,0,0);
//sliceImage.uploadTo(texture,0,0,0,numSlices);
// OK
Ogre::StagingTexture* stagingTexture = 0;
stagingTexture = textureManager->getStagingTexture( sliceImage.getWidth(), sliceImage.getHeight(),
1u, sliceImage.getNumSlices(),
sliceImage.getPixelFormat()); //, 100u );
stagingTexture->startMapRegion();
Ogre::TextureBox dstTexBox = stagingTexture->mapRegion( sliceImage.getWidth(), sliceImage.getHeight(),
1u, sliceImage.getNumSlices(),
sliceImage.getPixelFormat() );
TextureBox srcTexBox = sliceImage.getData(0);
for (int i=0;i<sliceImage.getNumSlices(); i++) {
void *dstData = dstTexBox.at( 0, 0, i );
void *srcData = srcTexBox.at( 0, 0, i );
memcpy( dstData, srcData, srcTexBox.bytesPerImage );
}
stagingTexture->stopMapRegion();
stagingTexture->upload( dstTexBox,texture, 0,0, 0, false );
textureManager->removeStagingTexture( stagingTexture );
stagingTexture = 0;
texture->notifyDataIsReady();
Image2 imgConvert;
imgConvert.convertFromTexture( texture, 0, 0, true );
TextureBox texBoxConvert = imgConvert.getData(0);
// save image slice 2
saveSlice("./2DArray_Slice2_C.png", texBoxConvert, imgConvert.getPixelFormat(), 2 ,1,Ogre::TextureTypes::Type2D);
// save all image slices(vertical)
saveSlice("./2DArray_SliceAll_C.png", texBoxConvert, imgConvert.getPixelFormat(), 0 ,imgConvert.getNumSlices(),Ogre::TextureTypes::Type2D);
}