Skip to content

Commit b81a7fa

Browse files
committed
fix an issue [6](#6) - the image data is incorrect from .glb
1 parent 4fe5f00 commit b81a7fa

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

source/libgltf/gltf_loader.cpp

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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)

source/runtest/runtest.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,11 @@ int main(int _iArgc, char* _pcArgv[])
226226
std::shared_ptr<libgltf::TAccessorStream<libgltf::TDimensionVector<2, float> > > texcoord_0_stream = std::make_shared<libgltf::TAccessorStream<libgltf::TDimensionVector<2, float> > >(texcoord_0_data);
227227
gltf_loader->GetOrLoadMeshPrimitiveAttributeData(0, 0, GLTFTEXT("texcoord_0"), texcoord_0_stream);
228228

229+
std::vector<uint8_t> image0_data;
230+
libgltf::string_t image0_data_type;
231+
gltf_loader->GetOrLoadImageData(0, image0_data, image0_data_type);
232+
233+
229234
#if defined(LIBGLTF_BUILD_COVERAGE)
230235
const std::string obj_file_path =
231236
#if defined(LIBGLTF_CHARACTOR_ENCODING_IS_UNICODE) && defined(LIBGLTF_PLATFORM_WINDOWS)

0 commit comments

Comments
 (0)