Fix: Enhance OBJ parser to support variable face formats (v//vn, v/vt)#163
Open
TeAmo-Lemon wants to merge 1 commit intossloy:masterfrom
Open
Fix: Enhance OBJ parser to support variable face formats (v//vn, v/vt)#163TeAmo-Lemon wants to merge 1 commit intossloy:masterfrom
TeAmo-Lemon wants to merge 1 commit intossloy:masterfrom
Conversation
The original parsing logic for face lines ('f') relied on a fixed 'v/vt/vn' structure, which caused failures when loading OBJ files with missing attributes (e.g., 'v//vn' or 'v/vt'). This commit replaces the strict stream extraction with a token-based approach using sscanf.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description:
I encountered an issue where the model loader failed to parse OBJ files that use the
v//vnformat (vertex and normal, but no texture coordinates) or other variations. The original code strictly expected av/vt/vnstructure, causing read errors on models with different export settings.What this PR does:
The current OBJ face parser assumes every face vertex always has vertex/texcoord/normal indices in the format f v/t/n v/t/n v/t/n.
It crashes or fails silently on OBJ files that use the common optional format, such as:
(only vertex and normal, texture coordinate is missing → double slash //)
Changes
sscanfchecks to dynamically detect the format of each face vertex (v/vt/vn,v//vn,v/vt, or justv).Before:
After:
Correctly parses lines like:
Tested with:
Thanks for reviewing!