@@ -54,6 +54,10 @@ namespace libgltf
5454 buffer_data_temp = buffer_data;
5555 buffer_data_temp.buffer += m_pBufferView->byteOffset ;
5656 buffer_data_temp.bufferSize -= m_pBufferView->byteOffset ;
57+ if (m_pBufferView->byteLength < static_cast <size_t >(buffer_data_temp.bufferSize ))
58+ {
59+ buffer_data_temp.bufferSize = m_pBufferView->byteLength ;
60+ }
5761 buffer_data_temp.bufferStride = static_cast <size_t >(m_pBufferView->byteStride );
5862 return (*m_pBufferViewStream << buffer_data_temp);
5963 }
@@ -63,6 +67,27 @@ namespace libgltf
6367 std::shared_ptr<IBufferViewStream> m_pBufferViewStream;
6468 };
6569
70+ class CBufferViewStream : public IBufferViewStream
71+ {
72+ public:
73+ explicit CBufferViewStream (std::vector<uint8_t >& data)
74+ : m_Data(data)
75+ {
76+ //
77+ }
78+
79+ public:
80+ virtual bool operator <<(const SBufferData& buffer_data)
81+ {
82+ m_Data.resize (buffer_data.bufferSize );
83+ ::memcpy (&m_Data[0 ], buffer_data.buffer, m_Data.size());
84+ return true ;
85+ }
86+
87+ private:
88+ std::vector<uint8_t >& m_Data;
89+ };
90+
6691 class CAccessorBufferViewStream : public IBufferViewStream
6792 {
6893 public:
@@ -271,7 +296,16 @@ namespace libgltf
271296 {
272297 if (!image) return false ;
273298 data_type = image->mimeType ;
274- return LoadByUri (image->uri , data, data_type);
299+ if (!image->uri .empty ())
300+ {
301+ return LoadByUri (image->uri , data, data_type);
302+ }
303+ if (image->bufferView )
304+ {
305+ std::shared_ptr<CBufferViewStream> image_stream = std::make_shared<CBufferViewStream>(data);
306+ return GetOrLoadBufferViewData (static_cast <size_t >(int32_t (*image->bufferView )), image_stream);
307+ }
308+ return false ;
275309 }
276310
277311 bool CGlTFLoader::GetOrLoadBufferData (size_t index, std::shared_ptr<IBufferStream>& buffer_stream)
0 commit comments