//--------------------------------------------------------------------- void BorderPanelOverlayElement::initialise(void) { bool init = !mInitialised; // init mRenderOp2 before calling superclass, as virtual _restoreManualHardwareResources would be called within if (init) { // Setup render op in advance mRenderOp2.vertexData = OGRE_NEW VertexData(); mRenderOp2.vertexData->vertexCount = 4 * 8; // 8 cells, can't necessarily share vertices cos // texcoords may differ mRenderOp2.vertexData->vertexStart = 0; // Vertex declaration VertexDeclaration* decl = mRenderOp2.vertexData->vertexDeclaration; // Position and texture coords each have their own buffers to allow // each to be edited separately with the discard flag decl->addElement(POSITION_BINDING, 0, VET_FLOAT3, VES_POSITION); decl->addElement(TEXCOORD_BINDING, 0, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0); // Index data mRenderOp2.operationType = RenderOperation::OT_TRIANGLE_LIST; mRenderOp2.useIndexes = true; mRenderOp2.indexData = OGRE_NEW IndexData(); mRenderOp2.indexData->indexCount = 8 * 6; mRenderOp2.indexData->indexStart = 0; mRenderOp2.useGlobalInstancingVertexBufferIsAvailable = false; // Create sub-object for rendering border mBorderRenderable = OGRE_NEW BorderRenderable(this); } // superclass will handle the interior panel area and call _restoreManualHardwareResources PanelOverlayElement::initialise(); }
//--------------------------------------------------------------------- void BorderPanelOverlayElement::initialise(void) { bool init = !mInitialised; PanelOverlayElement::initialise(); // superclass will handle the interior panel area if (init) { // Setup render op in advance mRenderOp2.vertexData = OGRE_NEW VertexData(); mRenderOp2.vertexData->vertexCount = 4 * 8; // 8 cells, can't necessarily share vertices cos // texcoords may differ mRenderOp2.vertexData->vertexStart = 0; // Vertex declaration VertexDeclaration* decl = mRenderOp2.vertexData->vertexDeclaration; // Position and texture coords each have their own buffers to allow // each to be edited separately with the discard flag decl->addElement(POSITION_BINDING, 0, VET_FLOAT3, VES_POSITION); decl->addElement(TEXCOORD_BINDING, 0, VET_FLOAT2, VES_TEXTURE_COORDINATES, 0); // Vertex buffer #1, position HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager::getSingleton() .createVertexBuffer( decl->getVertexSize(POSITION_BINDING), mRenderOp2.vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); // bind position VertexBufferBinding* binding = mRenderOp2.vertexData->vertexBufferBinding; binding->setBinding(POSITION_BINDING, vbuf); // Vertex buffer #2, texcoords vbuf = HardwareBufferManager::getSingleton() .createVertexBuffer( decl->getVertexSize(TEXCOORD_BINDING), mRenderOp2.vertexData->vertexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY, true); // bind texcoord binding->setBinding(TEXCOORD_BINDING, vbuf); mRenderOp2.operationType = RenderOperation::OT_TRIANGLE_LIST; mRenderOp2.useIndexes = true; // Index data mRenderOp2.indexData = OGRE_NEW IndexData(); mRenderOp2.indexData->indexCount = 8 * 6; mRenderOp2.indexData->indexStart = 0; mRenderOp2.useGlobalInstancingVertexBufferIsAvailable = false; /* Each cell is 0-----2 | /| | / | |/ | 1-----3 */ mRenderOp2.indexData->indexBuffer = HardwareBufferManager::getSingleton(). createIndexBuffer( HardwareIndexBuffer::IT_16BIT, mRenderOp2.indexData->indexCount, HardwareBuffer::HBU_STATIC_WRITE_ONLY); ushort* pIdx = static_cast<ushort*>( mRenderOp2.indexData->indexBuffer->lock( 0, mRenderOp2.indexData->indexBuffer->getSizeInBytes(), HardwareBuffer::HBL_DISCARD) ); for (ushort cell = 0; cell < 8; ++cell) { ushort base = cell * 4; *pIdx++ = base; *pIdx++ = base + 1; *pIdx++ = base + 2; *pIdx++ = base + 2; *pIdx++ = base + 1; *pIdx++ = base + 3; } mRenderOp2.indexData->indexBuffer->unlock(); // Create sub-object for rendering border mBorderRenderable = OGRE_NEW BorderRenderable(this); mInitialised = true; } }