//---------------------------------------------------------------------
    void RenderSystem::setGlobalInstanceVertexBuffer( const HardwareVertexBufferSharedPtr val )
    {
        if ( !val.isNull() && !val->getIsInstanceData() )
        {
            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, 
                        "A none instance data vertex buffer was set to be the global instance vertex buffer.",
                        "RenderSystem::setGlobalInstanceVertexBuffer");
        }
        mGlobalInstanceVertexBuffer = val;
    }
Example #2
0
 //------------------------------------------------------------------------
 void TerrainBatch::destroyGpuVertexBackupData()
 {
     if (mGpuVertexData)
     {
         HardwareVertexBufferSharedPtr destPosbuf = mGpuVertexData->vertexBufferBinding->getBuffer(TerrainTileRender::POSITION_BUFFER);
         
         if ( destPosbuf.isNull() == false )
         {
             destPosbuf->freeSystemMemoryBuffer();
         }
     }  
 }
Example #3
0
    //------------------------------------------------------------------------
    void TerrainBatch::checkAndUpdateGpuVertexBackupData()
    {
        if ( mGpuVertexData )
        {
            HardwareVertexBufferSharedPtr destPosbuf = mGpuVertexData->vertexBufferBinding->getBuffer(TerrainTileRender::POSITION_BUFFER);
            if ( destPosbuf.isNull() == false )
            {
                destPosbuf->createSystemMemoryBuffer();

                {
                    updateVertexData( mVertexRectInTile );
                }

                destPosbuf->freeSystemMemoryBuffer();
            }
        }
    }
Example #4
0
    //------------------------------------------------------------------------
    void TerrainBatch::updateVertexData( const Ogre::Rect& vertexRectInTile )
    {
        
        Vector3 center = mBoundingBox.getCenter();

        Ogre::Rect dirtyRect = mVertexRectInTile.intersect( vertexRectInTile );

        if ( mGpuVertexData && (dirtyRect.isNull() == false) )
        {
            mOneVertexSize  = mTileRender->getOneVertexSize();

            ////////////////////////////////////////////////////////////////////////////////

            Ogre::VertexData* tileVertexData    = mTileRender->getCpuVertexData();
            uint16 srcPosRowSkip                = 0;
            unsigned char * srcRootPosBuf       = 0;
            unsigned char * srcRowPosBuf        = 0;
            HardwareVertexBufferSharedPtr srcPosbuf = tileVertexData->vertexBufferBinding->getBuffer(TerrainTileRender::POSITION_BUFFER);

            long destOffsetX        = dirtyRect.left <= mVertexRectInTile.left ? 0 : (dirtyRect.left - mVertexRectInTile.left) ;
            long destOffsetY        = dirtyRect.top  <= mVertexRectInTile.top ? 0 : (dirtyRect.top - mVertexRectInTile.top) ;
            uint16 destPosRowSkip   = 0;
            size_t destRowPos       = 0;
            HardwareVertexBufferSharedPtr destPosbuf = mGpuVertexData->vertexBufferBinding->getBuffer(TerrainTileRender::POSITION_BUFFER);

            if (!srcPosbuf.isNull() && !destPosbuf.isNull())
            {
                srcPosRowSkip   =  mTileRender->getVertexSideSize() * mOneVertexSize;
                srcRootPosBuf   =  static_cast<unsigned char*>(srcPosbuf->lock(HardwareBuffer::HBL_READ_ONLY));
                // skip src buffer in by left/top
                srcRowPosBuf    =  srcRootPosBuf;
                srcRowPosBuf    += dirtyRect.top * srcPosRowSkip + dirtyRect.left * mOneVertexSize;

                destPosRowSkip  = mVertexSideNum * mOneVertexSize;
                // skip dest pos in by left/top
                destRowPos      = destOffsetY * destPosRowSkip + destOffsetX * mOneVertexSize;


                ///////////////////////////////////////////////////////////////////////////////////////

                {
                    size_t destRowHeadPos   = destRowPos;
                    size_t rowCopyLen = (dirtyRect.width() + 1) * mOneVertexSize;
                    for (uint16 y = dirtyRect.top; y <= dirtyRect.bottom; y ++)
                    {
                        destPosbuf->writeData( destRowHeadPos, rowCopyLen, srcRowPosBuf );
                        srcRowPosBuf    += srcPosRowSkip;
                        destRowHeadPos  += destPosRowSkip;
                    }
                }

                ///////////////////////////////////////////////////////////////////////////////////////

                //{
                //    unsigned char * pRootPosBuf = static_cast<unsigned char*>(destPosbuf->lock(  HardwareBuffer::HBL_NORMAL ));
                //    {
                //        pRootPosBuf += destRowPos;
                //        unsigned char * destRowHeadPos   = pRootPosBuf;
                //        unsigned char * destRowPixelPos  = pRootPosBuf;
                //        for (uint16 y = dirtyRect.top; y <= dirtyRect.bottom; y ++)
                //        {
                //            destRowPixelPos = destRowHeadPos;
                //            for (uint16 x = dirtyRect.left; x <= dirtyRect.right; x ++)
                //            {
                //                float* pPosBuf = static_cast<float*>(static_cast<void*>(destRowPixelPos));
                //                if (pPosBuf)
                //                {
                //                    //position
                //                    *pPosBuf++ = *pPosBuf - center.x;
                //                    *pPosBuf++;
                //                    *pPosBuf++ = *pPosBuf - center.z;
                //                }

                //                destRowPixelPos += mOneVertexSize;
                //            }

                //            destRowHeadPos  += destPosRowSkip;
                //        }
                //    }
                //    destPosbuf->unlock();
                //}

                ///////////////////////////////////////////////////////////////////////////////////////

                srcPosbuf->unlock();
                //destPosbuf->unlock();
            }
        }

    }