From d9dc42fab5a0869e51df3b60c408555e0ab69d0a Mon Sep 17 00:00:00 2001 From: Erik Biederstadt Date: Mon, 17 May 2021 15:45:15 -0600 Subject: [PATCH] GLTeapot: Adds additional error checking when loading files - If the 3D file contains no vertices then an error is raised - If the file is not an OBJ file then an error is raised --- Userland/Demos/GLTeapot/WavefrontOBJLoader.cpp | 5 +++++ Userland/Demos/GLTeapot/main.cpp | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) 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;