580e4ba1fd
mesh_obj_parse (pure) + mesh_obj_load (impure file helper). Soporta v / vn / f (tris y quads). Genera normales per-face si faltan (flat shading). Quads se parten en 2 tris; n-gons (>4) se descartan silenciosamente. Indices 1-based positivos y negativos. issue 0029
3.0 KiB
3.0 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path, framework, params, output
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | framework | params | output | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| mesh_obj_load | function | cpp | gfx | 1.0.0 | pure | Mesh mesh_obj_parse(const char* obj_text, size_t len); Mesh mesh_obj_load(const char* path) | Parser minimal de Wavefront .obj — soporta v, vn, f (tris y quads). Genera normales por face si faltan. mesh_obj_parse es puro; mesh_obj_load es helper impuro que lee fichero y delega. |
|
false |
|
false | cpp/functions/gfx/mesh_obj_load.cpp | opengl |
|
Mesh con positions/normals (stride 3, mismo length) y indices (tri-list, multiplo de 3). Si no hay vn, normales por face (flat shading) y vertices duplicados por face. Mesh vacio si parse falla. |
mesh_obj_load
Parser pequeno de Wavefront .obj para inspeccion de geometria. KISS: cubre el subconjunto que la mayoria de exporters genera (Blender default, MeshLab, etc).
Soporta
v x y z— vertice (xyz; w opcional ignorado)vn x y z— normalf a b cyf a b c d— tris y quads (los quads se dividen en 2 tris)- Indices
v,v/t,v//n,v/t/n(vt se ignora; t no afecta) - Indices 1-based positivos y negativos (relative-to-end, conforme spec)
- Lineas en blanco y comentarios con
#
NO soporta (en este issue)
- N-gons con mas de 4 vertices → silenciosamente descartados
vt(coordenadas de textura) — el indice se parsea pero el dato se ignoramtllib,usemtl,o,g,s— se saltan- Lineas de polilineas (
l) - Curvas, superficies,
vp
Generacion de normales
Si el .obj no tiene vn (o si alguna face no las referencia), se generan normales por face (flat shading). Esto duplica vertices entre faces que comparten posicion pero no normal — es el comportamiento esperado para inspeccion.
Cuando todas las faces tienen normales explicitas, se hace dedup (v_idx, n_idx) con un linear-scan simple. Para meshes inspeccion (<<100k verts unicos) es perf-OK; meshes mas grandes se beneficiarian de un hashmap.
Errores
Si el archivo no tiene vertices o no tiene faces, devuelve Mesh{} (positions/indices vacios). El caller puede chequear con mesh.positions.empty().
Test inline (cubo)
const char* obj =
"v -1 -1 -1\nv 1 -1 -1\nv 1 1 -1\nv -1 1 -1\n"
"v -1 -1 1\nv 1 -1 1\nv 1 1 1\nv -1 1 1\n"
"f 1 2 3 4\nf 5 6 7 8\nf 1 2 6 5\n"
"f 4 3 7 8\nf 1 4 8 5\nf 2 3 7 6\n";
Mesh m = mesh_obj_parse(obj, std::strlen(obj));
// 6 quads -> 12 tris -> 36 indices.
// Sin vn -> face normals -> 36 verts emitidos (duplicados por face).
assert(m.indices.size() == 36);