From 2ed265ebfeec4f92316beb92e6ff7f8f2465e5fe Mon Sep 17 00:00:00 2001 From: luboslenco Date: Mon, 13 Apr 2026 18:09:26 +0200 Subject: [PATCH] base: obj parser fixes --- base/sources/iron_obj.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/base/sources/iron_obj.c b/base/sources/iron_obj.c index 735fa3dd..3e62db6a 100644 --- a/base/sources/iron_obj.c +++ b/base/sources/iron_obj.c @@ -2,8 +2,8 @@ #include "iron_array.h" #include "iron_gc.h" -#include "iron_string.h" #include "iron_math.h" +#include "iron_string.h" #include #include #include @@ -127,7 +127,9 @@ static float read_float() { } return exp > 0 ? (float)first * dec : (float)first / dec; } - buf[bi++] = c; + if (bi < 9) { + buf[bi++] = c; + } part->pos++; } float res = 0.0; // Parse buffer into float @@ -208,8 +210,8 @@ static bool pnpoly(float v0x, float v0y, float v1x, float v1y, float v2x, float static vec4_t calc_normal(vec4_t a, vec4_t b, vec4_t c) { vec4_t cb = vec4_sub(c, b); vec4_t ab = vec4_sub(a, b); - cb = vec4_cross(cb, ab); - cb = vec4_norm(cb); + cb = vec4_cross(cb, ab); + cb = vec4_norm(cb); return cb; } @@ -342,14 +344,14 @@ raw_mesh_t *obj_parse(buffer_t *file_bytes, char split_code, uint64_t start_pos, } else { vec4_t n = calc_normal((vec4_t){pos_temp.buffer[(va[0] - _vind_off) * 3], pos_temp.buffer[(va[0] - _vind_off) * 3 + 1], - pos_temp.buffer[(va[0] - _vind_off) * 3 + 2], 1.0f}, - (vec4_t){pos_temp.buffer[(va[1] - _vind_off) * 3], pos_temp.buffer[(va[1] - _vind_off) * 3 + 1], - pos_temp.buffer[(va[1] - _vind_off) * 3 + 2], 1.0f}, - (vec4_t){pos_temp.buffer[(va[2] - _vind_off) * 3], pos_temp.buffer[(va[2] - _vind_off) * 3 + 1], - pos_temp.buffer[(va[2] - _vind_off) * 3 + 2], 1.0f}); - nx = n.x; - ny = n.y; - nz = n.z; + pos_temp.buffer[(va[0] - _vind_off) * 3 + 2], 1.0f}, + (vec4_t){pos_temp.buffer[(va[1] - _vind_off) * 3], pos_temp.buffer[(va[1] - _vind_off) * 3 + 1], + pos_temp.buffer[(va[1] - _vind_off) * 3 + 2], 1.0f}, + (vec4_t){pos_temp.buffer[(va[2] - _vind_off) * 3], pos_temp.buffer[(va[2] - _vind_off) * 3 + 1], + pos_temp.buffer[(va[2] - _vind_off) * 3 + 2], 1.0f}); + nx = n.x; + ny = n.y; + nz = n.z; } float nxabs = (float)fabs(nx); float nyabs = (float)fabs(ny); @@ -522,13 +524,13 @@ raw_mesh_t *obj_parse(buffer_t *file_bytes, char split_code, uint64_t start_pos, part->nora->buffer = malloc(part->nora->capacity * sizeof(int16_t)); for (int i = 0; i < (int)(inda_length / 3); ++i) { - int i1 = part->inda->buffer[i * 3]; - int i2 = part->inda->buffer[i * 3 + 1]; - int i3 = part->inda->buffer[i * 3 + 2]; - vec4_t n = calc_normal((vec4_t){part->posa->buffer[i1 * 4], part->posa->buffer[i1 * 4 + 1], part->posa->buffer[i1 * 4 + 2], 1.0}, - (vec4_t){part->posa->buffer[i2 * 4], part->posa->buffer[i2 * 4 + 1], part->posa->buffer[i2 * 4 + 2], 1.0}, - (vec4_t){part->posa->buffer[i3 * 4], part->posa->buffer[i3 * 4 + 1], part->posa->buffer[i3 * 4 + 2], 1.0}); - part->nora->buffer[i1 * 2] = (int)(n.x * 32767); + int i1 = part->inda->buffer[i * 3]; + int i2 = part->inda->buffer[i * 3 + 1]; + int i3 = part->inda->buffer[i * 3 + 2]; + vec4_t n = calc_normal((vec4_t){part->posa->buffer[i1 * 4], part->posa->buffer[i1 * 4 + 1], part->posa->buffer[i1 * 4 + 2], 1.0}, + (vec4_t){part->posa->buffer[i2 * 4], part->posa->buffer[i2 * 4 + 1], part->posa->buffer[i2 * 4 + 2], 1.0}, + (vec4_t){part->posa->buffer[i3 * 4], part->posa->buffer[i3 * 4 + 1], part->posa->buffer[i3 * 4 + 2], 1.0}); + part->nora->buffer[i1 * 2] = (int)(n.x * 32767); part->nora->buffer[i1 * 2 + 1] = (int)(n.y * 32767); part->posa->buffer[i1 * 4 + 3] = (int)(n.z * 32767); part->nora->buffer[i2 * 2] = (int)(n.x * 32767);