Files
LayaNative2.0/Conch/source/webglPlus/Manager/JCArrayBufferManager.cpp
T
2020-11-11 16:17:13 +08:00

137 lines
3.7 KiB
C++

/**
@file JCArrayBufferManager.cpp
@brief
@author James
@version 1.0
@date 2017_11_29
*/
#include "JCArrayBufferManager.h"
#include "../Log.h"
namespace laya
{
JCArrayBufferManager::JCArrayBufferManager()
{
m_nGlobalID=1;
m_vPrepareDelIDs.reserve(1024);
}
JCArrayBufferManager::~JCArrayBufferManager()
{
clearAll();
}
void JCArrayBufferManager::clearAll()
{
for (int i = 0, n = m_vBuffers.size(); i < n; i++)
{
if (m_vBuffers[i])
{
delete m_vBuffers[i];
m_vBuffers[i] = NULL;
}
}
m_vBuffers.clear();
m_vPrepareDelIDs.clear();
m_nGlobalID = 1;
}
int JCArrayBufferManager::getID()
{
for (int i = 1, n = m_vBuffers.size(); i < n; i++)
{
if (m_vBuffers[i] == NULL)
{
return i;
}
}
return m_nGlobalID++;
}
void JCArrayBufferManager::removeArrayBuffer(int nID)
{
if ((size_t)nID < m_vBuffers.size())
{
if (m_vBuffers[nID])
{
delete m_vBuffers[nID];
m_vBuffers[nID] = NULL;
}
}
}
int JCArrayBufferManager::createArrayBuffer(char* pBuffer, int nLength,ARRAY_BUFFER_TYPE nType, ARRAY_BUFFER_REF_TYPE nRefType)
{
int nID = getID();
int nSize = m_vBuffers.size();
JCArrayBufferManager::ArrayBufferContent* pBufferContent = NULL;
if (nRefType == ARRAY_BUFFER_REF_TYPE_REFERENCE)
{
pBufferContent = new JCArrayBufferManager::ArrayBufferContent(pBuffer, nLength, nType, false);
}
else
{
pBufferContent = new JCArrayBufferManager::ArrayBufferContent(nType, true);
pBufferContent->mallocBuffer(pBuffer, nLength, nType);
}
if (nID == nSize)
{
m_vBuffers.push_back(pBufferContent);
}
else if (nID < nSize)
{
if (m_vBuffers[nID] != NULL)
{
LOGE("JCArrayBufferManager::createArrayBuffer error");
}
m_vBuffers[nID] = pBufferContent;
}
else
{
m_vBuffers.resize(nID + 1);
m_vBuffers[nID] = pBufferContent;
}
return nID;
}
bool JCArrayBufferManager::updateArrayBuffer(int nID, char* pBuffer, int nLength)
{
if ((size_t)nID >= m_vBuffers.size()) return false;
if (m_vBuffers[nID])
{
m_vBuffers[nID]->setBuffer(pBuffer, nLength);
return true;
}
else
{
LOGE("JCArrayBufferManager::updateArrayBuffer error");
return false;
}
return true;
}
bool JCArrayBufferManager::syncArrayBufferDataToRuntime(int nID, char* pBuffer, int nLength)
{
if ((size_t)nID >= m_vBuffers.size()) return false;
if (m_vBuffers[nID])
{
JCArrayBufferManager::ArrayBufferContent* pBufferContext = m_vBuffers[nID];
if (nLength == pBufferContext->m_nLength)
{
memcpy(pBufferContext->m_pBuffer, pBuffer, nLength);
}
else
{
LOGE("JCArrayBufferManager::syncArrayBufferDataToRuntime length error");
return false;
}
}
else
{
LOGE("JCArrayBufferManager::syncArrayBufferDataToRuntime error");
return false;
}
return true;
}
void JCArrayBufferManager::prepareRemoveArrayBuffer(int nID)
{
m_vPrepareDelIDs.push_back(nID);
}
}
//-----------------------------END FILE--------------------------------