bool JRenderServer::CacheIB( int ibID, BYTE* pData, int size, int& iteration, int& firstByte ) { if (ibID < 0 || ibID >= m_IBuffers.size()) return -1; IBInstance& ib = m_IBuffers[ibID]; if (ib.m_CurIteration == iteration) return true; // data is not in buffer - try to add it there if (ib.m_Size < ib.m_CurLastByte + size) { // no place in buffer - discard it ClearIB( ibID ); ib.m_CurLastByte = 0; ib.m_CurIteration++; } if (ib.m_Size < size) { rlog.err( "Could not cache %d bytes in index buffer %s", size, ib.m_Name.c_str() ); return false; } firstByte = ib.m_CurLastByte; iteration = ib.m_CurIteration; BYTE* pBuf = LockIB( ibID, firstByte, size ); memcpy( pBuf, pData, size ); UnlockIB( ibID ); return true; } // JRenderServer::CacheIB
const DWORD* D3D9Mesh::Indices() const { if(_Indices == NULL) { LockIB(); } return _Indices; }
void JRenderServer::CreateQuadIB() { // create quad index buffer m_QuadIB = CreateIB( "QuadIndexBuffer", c_QuadIBSize, true ); WORD* pQuadIdx = (WORD*)LockIB( m_QuadIB, 0, c_QuadIBSize ); if (!pQuadIdx) { rlog.err( "JRenderServer: Could not create internal quad index buffer." ); return; } int curV = 0; for (int i = 0; i < c_QuadIBSize/2; i += 6) { pQuadIdx[i ] = curV; pQuadIdx[i + 1] = curV + 1; pQuadIdx[i + 2] = curV + 2; pQuadIdx[i + 3] = curV + 2; pQuadIdx[i + 4] = curV + 1; pQuadIdx[i + 5] = curV + 3; curV += 4; } UnlockIB( m_QuadIB ); } // JRenderServer::CreateQuadIB
void D3D9Mesh::Lock() const { LockVB(); LockIB(); }