------------------------------------------------------------------------------
| 834 | |
| 835 | //------------------------------------------------------------------------------ |
| 836 | bool vtkGLTFDocumentLoader::LoadImageData() |
| 837 | { |
| 838 | if (!this->LoadImages) |
| 839 | { |
| 840 | // Skip loading model images |
| 841 | return true; |
| 842 | } |
| 843 | vtkNew<vtkImageReader2Factory> factory; |
| 844 | size_t numberOfMeshes = this->InternalModel->Meshes.size(); |
| 845 | size_t numberOfImages = this->InternalModel->Images.size(); |
| 846 | for (size_t i = 0; i < numberOfImages; i++) |
| 847 | { |
| 848 | auto& image = this->InternalModel->Images[i]; |
| 849 | vtkSmartPointer<vtkImageReader2> reader = nullptr; |
| 850 | image.ImageData = vtkSmartPointer<vtkImageData>::New(); |
| 851 | std::vector<std::uint8_t> buffer; |
| 852 | vtkNew<vtkMemoryResourceStream> imgStream; |
| 853 | |
| 854 | // If image is defined via bufferview index |
| 855 | if (image.BufferView >= 0 && |
| 856 | image.BufferView < static_cast<int>(this->InternalModel->BufferViews.size())) |
| 857 | { |
| 858 | // mime-type must be defined with BufferView to get appropriate reader here (only two possible |
| 859 | // values) |
| 860 | if (image.MimeType == "image/jpeg") |
| 861 | { |
| 862 | reader = vtkSmartPointer<vtkJPEGReader>::New(); |
| 863 | } |
| 864 | else if (image.MimeType == "image/png") |
| 865 | { |
| 866 | reader = vtkSmartPointer<vtkPNGReader>::New(); |
| 867 | } |
| 868 | else |
| 869 | { |
| 870 | // Extensions allow other image types. |
| 871 | // It is perfectly valid to declare other extension-supported image types |
| 872 | // so long as they are never required by the scene. Therefore, the possible |
| 873 | // error is deferred until later. |
| 874 | image.ImageData = nullptr; |
| 875 | continue; |
| 876 | } |
| 877 | |
| 878 | BufferView& bufferView = this->InternalModel->BufferViews[image.BufferView]; |
| 879 | int bufferId = bufferView.Buffer; |
| 880 | if (bufferId < 0 || bufferId >= static_cast<int>(this->InternalModel->Buffers.size())) |
| 881 | { |
| 882 | vtkErrorMacro("Invalid bufferView.buffer value for bufferView " << bufferView.Name); |
| 883 | return false; |
| 884 | } |
| 885 | imgStream->SetBuffer(this->InternalModel->Buffers[bufferId].data() + bufferView.ByteOffset, |
| 886 | this->InternalModel->Buffers[bufferId].size()); |
| 887 | } |
| 888 | else // If image is defined via uri |
| 889 | { |
| 890 | auto stream = this->InternalModel->URILoader->Load(image.Uri); |
| 891 | if (!stream) |
| 892 | { |
| 893 | vtkErrorMacro("Invalid Uri:" << image.Uri); |
no test coverage detected