正确使用stride

This commit is contained in:
2025-10-09 21:40:05 +08:00
parent f47fde76c0
commit 698c1a1099
@@ -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;
} }