diff --git a/Userland/Demos/GLTeapot/WavefrontOBJLoader.cpp b/Userland/Demos/GLTeapot/WavefrontOBJLoader.cpp index 08fa574447..891f13dc8f 100644 --- a/Userland/Demos/GLTeapot/WavefrontOBJLoader.cpp +++ b/Userland/Demos/GLTeapot/WavefrontOBJLoader.cpp @@ -66,6 +66,11 @@ RefPtr WavefrontOBJLoader::load(const String& fname) } } + if (vertices.is_empty()) { + dbgln("Wavefront: Failed to read any data from 3D file: {}", fname); + return nullptr; + } + dbgln("Wavefront: Done."); return adopt_ref(*new Mesh(vertices, triangles)); } diff --git a/Userland/Demos/GLTeapot/main.cpp b/Userland/Demos/GLTeapot/main.cpp index 9a29cd0060..0e8f6a163d 100644 --- a/Userland/Demos/GLTeapot/main.cpp +++ b/Userland/Demos/GLTeapot/main.cpp @@ -102,7 +102,8 @@ void GLContextWidget::timer_event(Core::TimerEvent&) glMatrixMode(GL_MODELVIEW); glLoadMatrixf((float*)matrix.elements()); - m_mesh->draw(); + if (!m_mesh.is_null()) + m_mesh->draw(); m_context->present(); update(); @@ -111,7 +112,12 @@ void GLContextWidget::timer_event(Core::TimerEvent&) bool GLContextWidget::load(const String& fname) { m_mesh = m_mesh_loader->load(fname); - return !m_mesh.is_null(); + if (!m_mesh.is_null()) { + dbgln("GLTeapot: mesh has {} triangles.", m_mesh->triangle_count()); + return true; + } + + return false; } int main(int argc, char** argv) @@ -159,6 +165,12 @@ int main(int argc, char** argv) return; auto file = Core::File::construct(open_path.value()); + + if (!file->filename().ends_with(".obj")) { + GUI::MessageBox::show(window, String::formatted("Opening \"{}\" failed: invalid file type", open_path.value()), "Error", GUI::MessageBox::Type::Error); + return; + } + if (!file->open(Core::OpenMode::ReadOnly) && file->error() != ENOENT) { GUI::MessageBox::show(window, String::formatted("Opening \"{}\" failed: {}", open_path.value(), strerror(errno)), "Error", GUI::MessageBox::Type::Error); return;