Hi,
i have already such guards:
Code: Select all
uint32 HlmsOcean::fillBuffersFor(const HlmsCache* cache,
const QueuedRenderable& queuedRenderable,
bool casterPass, uint32 lastCacheHash,
CommandBuffer* commandBuffer, bool isV1)
{
if (mBufferSize == 0)
return 0;
if (mCurrentPassBuffer == 0)
{
// Return lastCacheHash to indicate we couldn't process this renderable
// It will be retried on the next frame when buffers are ready
return lastCacheHash;
}
const HlmsOceanDatablock* datablock =
static_cast<const HlmsOceanDatablock*>(queuedRenderable.renderable->getDatablock());
// Changed HLMS type? Rebind everything
if (OGRE_EXTRACT_HLMS_TYPE_FROM_CACHE_HASH(lastCacheHash) != mType)
{
// 1. Bind pass buffer (slot 0)
ConstBufferPacked* passBuffer = mPassBuffers[mCurrentPassBuffer - 1];
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
VertexShader, 0, passBuffer, 0, (uint32)passBuffer->getTotalSizeBytes());
*commandBuffer->addCommand<CbShaderBuffer>() =
CbShaderBuffer(PixelShader, 0, passBuffer, 0, (uint32)passBuffer->getTotalSizeBytes());
uint32 constBufferSlot = 3u;
// 2. Bind light buffers (slots 3,4,5)
if (mUseLightBuffers)
{
ConstBufferPacked* light0Buffer = mLight0Buffers[mCurrentPassBuffer - 1];
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
VertexShader, 3, light0Buffer, 0, (uint32)light0Buffer->getTotalSizeBytes());
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
PixelShader, 3, light0Buffer, 0, (uint32)light0Buffer->getTotalSizeBytes());
ConstBufferPacked* light1Buffer = mLight1Buffers[mCurrentPassBuffer - 1];
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
VertexShader, 4, light1Buffer, 0, (uint32)light1Buffer->getTotalSizeBytes());
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
PixelShader, 4, light1Buffer, 0, (uint32)light1Buffer->getTotalSizeBytes());
ConstBufferPacked* light2Buffer = mLight2Buffers[mCurrentPassBuffer - 1];
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
VertexShader, 5, light2Buffer, 0, (uint32)light2Buffer->getTotalSizeBytes());
*commandBuffer->addCommand<CbShaderBuffer>() = CbShaderBuffer(
PixelShader, 5, light2Buffer, 0, (uint32)light2Buffer->getTotalSizeBytes());
constBufferSlot = 6u;
}
...
But it does crash, before even that can be called. It has something todo with Terra and Ocean together. So if i at early stage in Ogre-Nextl, if this code is set:
Code: Select all
if( mCurrentPassBuffer == 0 )
return 0;
Then no crash and all can be created an loaded. Its the only way i see how to get it working and its the most dynamic way. I have NOWA-Design editor: So i add stuff at runtime, remove at runtime, so this:
Code: Select all
if( mCurrentPassBuffer == 0 )
return 0;
Which is also called at runtime is truly necessary!
Best Regards
Lax