正确使用stride
This commit is contained in:
@@ -25,10 +25,11 @@ void DeviceBufferAccessor::walk(std::function<bool(const uint8_t*, size_t)> call
|
|||||||
|
|
||||||
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
||||||
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
||||||
|
const size_t step = m_bufferView->getStride() > 0 ? m_bufferView->getStride() : m_elementSize;
|
||||||
|
|
||||||
size_t startIndex = start;
|
size_t startIndex = start;
|
||||||
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
||||||
for (size_t index = startIndex; index < endIndex; index++, ptr+=m_elementSize)
|
for (size_t index = startIndex; index < endIndex; index++, ptr+=step)
|
||||||
{
|
{
|
||||||
if (callback(ptr, index))
|
if (callback(ptr, index))
|
||||||
{
|
{
|
||||||
@@ -44,12 +45,13 @@ void DeviceBufferAccessor::walk2(std::function<bool(const uint8_t*, const uint8_
|
|||||||
|
|
||||||
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
||||||
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
||||||
|
const size_t step = m_bufferView->getStride() > 0 ? m_bufferView->getStride() : m_elementSize;
|
||||||
|
|
||||||
size_t startIndex = start;
|
size_t startIndex = start;
|
||||||
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
||||||
for (size_t index = startIndex; index < endIndex; index+=2, ptr+=m_elementSize*2)
|
for (size_t index = startIndex; index < endIndex; index+=2, ptr+=step*2)
|
||||||
{
|
{
|
||||||
if (callback(ptr, ((index + 1) < endIndex) ? (ptr + m_elementSize) : nullptr, index))
|
if (callback(ptr, ((index + 1) < endIndex) ? (ptr + step) : nullptr, index))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -63,14 +65,15 @@ void DeviceBufferAccessor::walk3(std::function<bool(const uint8_t*, const uint8_
|
|||||||
|
|
||||||
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
||||||
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
|
||||||
|
const size_t step = m_bufferView->getStride() > 0 ? m_bufferView->getStride() : m_elementSize;
|
||||||
|
|
||||||
size_t startIndex = start;
|
size_t startIndex = start;
|
||||||
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
|
||||||
for (size_t index = startIndex; index < endIndex; index += 3, ptr += m_elementSize * 3)
|
for (size_t index = startIndex; index < endIndex; index += 3, ptr += step * 3)
|
||||||
{
|
{
|
||||||
if(callback(ptr,
|
if(callback(ptr,
|
||||||
((index + 1) < endIndex) ? (ptr + m_elementSize) : nullptr,
|
((index + 1) < endIndex) ? (ptr + step) : nullptr,
|
||||||
((index + 2) < endIndex) ? (ptr + m_elementSize*2) : nullptr,
|
((index + 2) < endIndex) ? (ptr + step*2) : nullptr,
|
||||||
index))
|
index))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -85,7 +88,9 @@ const uint8_t* DeviceBufferAccessor::getElement(size_t index) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
|
||||||
const uint8_t* pData = buffer->ptr(m_bufferView->getOffset()) + m_offset + index * m_elementSize;
|
const uint8_t* pData = buffer->ptr(m_bufferView->getOffset())
|
||||||
|
+ m_offset
|
||||||
|
+ index * (m_bufferView->getStride()>0 ? m_bufferView->getStride(): m_elementSize);
|
||||||
|
|
||||||
return pData;
|
return pData;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user