summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorday <day@national.shitposting.agency>2026-03-27 16:43:39 +0100
committerday <day@national.shitposting.agency>2026-03-27 16:43:39 +0100
commit45a590c8419d9720a8acdfa6f81e5a8c571b095c (patch)
treea318b332026e668966733d4a47700620ce9749c9
parentc9ded365fd8eac90fbdc2e11f9221fef736c2223 (diff)
make parser more legibleobj
-rw-r--r--src/render/model.h121
1 files changed, 62 insertions, 59 deletions
diff --git a/src/render/model.h b/src/render/model.h
index da3213a..3683efa 100644
--- a/src/render/model.h
+++ b/src/render/model.h
@@ -17,25 +17,26 @@ struct MODEL {
};
enum LINE_TYPES : I32 {
- comment = ( '#' | ( ' ' << 8 ) ),
- d = ( 'd' | ( ' ' << 8 ) ),
- f = ( 'f' | ( ' ' << 8 ) ),
- illum = ( 'i' | ( 'l' << 8 ) ),
- Ka = ( 'K' | ( 'a' << 8 ) ),
- Kd = ( 'K' | ( 'd' << 8 ) ),
- Ke = ( 'K' | ( 'e' << 8 ) ),
- Ks = ( 'K' | ( 's' << 8 ) ),
- map_Kd = ( 'm' | ( 'a' << 8 ) ),
- mtllib = ( 'm' | ( 't' << 8 ) ),
- newmtl = ( 'n' | ( 'e' << 8 ) ),
- Ni = ( 'N' | ( 'i' << 8 ) ),
- Ns = ( 'N' | ( 's' << 8 ) ),
- o = ( 'o' | ( ' ' << 8 ) ),
- s = ( 's' | ( ' ' << 8 ) ),
- v = ( 'v' | ( ' ' << 8 ) ),
- vn = ( 'v' | ( 'n' << 8 ) ),
- vt = ( 'v' | ( 't' << 8 ) ),
- usemtl = ( 'u' | ( 's' << 8 ) )
+ comment = ( '#' | ( ' ' << 8 ) ),
+ transparency = ( 'd' | ( ' ' << 8 ) ),
+ face = ( 'f' | ( ' ' << 8 ) ),
+ group = ( 'g' | ( ' ' << 8 ) ),
+ illum = ( 'i' | ( 'l' << 8 ) ),
+ ambient_clr = ( 'K' | ( 'a' << 8 ) ),
+ diffuse_clr = ( 'K' | ( 'd' << 8 ) ),
+ emissive_clr = ( 'K' | ( 'e' << 8 ) ),
+ specular_clr = ( 'K' | ( 's' << 8 ) ),
+ texname = ( 'm' | ( 'a' << 8 ) ),
+ mtlname = ( 'm' | ( 't' << 8 ) ),
+ newmtl = ( 'n' | ( 'e' << 8 ) ),
+ opticdensity = ( 'N' | ( 'i' << 8 ) ),
+ specular_exp = ( 'N' | ( 's' << 8 ) ),
+ object = ( 'o' | ( ' ' << 8 ) ),
+ shading = ( 's' | ( ' ' << 8 ) ),
+ vert = ( 'v' | ( ' ' << 8 ) ),
+ vertnorm = ( 'v' | ( 'n' << 8 ) ),
+ vertuv = ( 'v' | ( 't' << 8 ) ),
+ usemtl = ( 'u' | ( 's' << 8 ) )
};
static inline char* skip_space( char* s ) {
@@ -62,13 +63,13 @@ static inline LINE_TYPES get_first_two( char* s ) {
struct MTLDATA {
STR name;
- F32 Ns;
- VEC3 Ka;
- VEC3 Kd;
- VEC3 Ks;
- VEC3 Ke;
- F32 Ni;
- F32 d;
+ F32 specular_exp;
+ VEC3 ambient_clr;
+ VEC3 diffuse_clr;
+ VEC3 specular_clr;
+ VEC3 emissive_clr;
+ F32 opticdensity;
+ F32 transparency;
I32 illum;
STR map_Kd;
};
@@ -80,24 +81,25 @@ struct MTLLIB {
inline I32 line_type_offset( LINE_TYPES first_two ) {
switch( first_two ) {
- case d:
- case f:
- case o:
- case s:
- case v: return 2;
- case Ka:
- case Kd:
- case Ke:
- case Ks:
- case Ni:
- case Ns:
- case vn:
- case vt: return 3;
+ case face:
+ case vert:
+ case group:
+ case object:
+ case shading:
+ case transparency: return 2;
+ case ambient_clr:
+ case diffuse_clr:
+ case emissive_clr:
+ case specular_clr:
+ case opticdensity:
+ case specular_exp:
+ case vertuv:
+ case vertnorm: return 3;
case illum: return 6;
- case map_Kd:
- case mtllib:
+ case mtlname:
case newmtl:
- case usemtl: return 7;
+ case usemtl:
+ case texname: return 7;
case comment: return 2;
}
}
@@ -119,15 +121,15 @@ inline void mtl_parse_line( char* file, U64 idx, MTLLIB* mtl ) {
mtl->data.resize( mtl->data.size + 1 );
mtl->data[mtl->data.size - 1].name = temp.data;
} break;
- case d: mtl->data[mtl_idx].d = strtof( p, &p ); break;
- case Ni: mtl->data[mtl_idx].Ni = strtof( p, &p ); break;
- case Ns: mtl->data[mtl_idx].Ns = strtof( p, &p ); break;
+ case transparency: mtl->data[mtl_idx].transparency = strtof( p, &p ); break;
+ case opticdensity: mtl->data[mtl_idx].opticdensity = strtof( p, &p ); break;
+ case specular_exp: mtl->data[mtl_idx].specular_exp = strtof( p, &p ); break;
case illum: mtl->data[mtl_idx].illum = (I32)strtol( p, &p, 10 ); break;
- case Ka: mtl->data[mtl_idx].Ka = read_vec3( p ); break;
- case Kd: mtl->data[mtl_idx].Kd = read_vec3( p ); break;
- case Ke: mtl->data[mtl_idx].Ke = read_vec3( p ); break;
- case Ks: mtl->data[mtl_idx].Ks = read_vec3( p ); break;
- case map_Kd: {
+ case ambient_clr: mtl->data[mtl_idx].ambient_clr = read_vec3( p ); break;
+ case diffuse_clr: mtl->data[mtl_idx].diffuse_clr = read_vec3( p ); break;
+ case emissive_clr: mtl->data[mtl_idx].emissive_clr = read_vec3( p ); break;
+ case specular_clr: mtl->data[mtl_idx].specular_clr = read_vec3( p ); break;
+ case texname: {
char* end = p;
while( *end && *end != '\n' ) ++end;
U32 len = end - p;
@@ -267,13 +269,13 @@ inline void obj_parse_line( const char* path, char* file, U64 idx, OBJDATA* obj
char* p = file + idx + line_type_offset( first_two );
switch( first_two ) {
- case f: obj_parse_f_line( obj, p ); break;
- case v:
- case vn: {
- if( first_two == v ) obj->vertices.push( read_vec3( p ) );
+ case face: obj_parse_f_line( obj, p ); break;
+ case vert:
+ case vertnorm: {
+ if( first_two == vert ) obj->vertices.push( read_vec3( p ) );
else obj->normals.push( read_vec3( p ) );
} break;
- case vt: {
+ case vertuv: {
VEC2 temp{};
p = skip_space( p );
temp.x = strtof( p, &p );
@@ -281,9 +283,9 @@ inline void obj_parse_line( const char* path, char* file, U64 idx, OBJDATA* obj
temp.y = strtof( p, &p );
obj->uvs.push( temp );
} break;
- case mtllib:
+ case mtlname:
case usemtl: {
- bool is_mtllib = first_two == mtllib;
+ bool is_mtllib = first_two == mtlname;
char* end = p;
while( *end && *end != '\n' ) ++end;
U32 len = end - p;
@@ -299,8 +301,9 @@ inline void obj_parse_line( const char* path, char* file, U64 idx, OBJDATA* obj
obj->mtllib.push( mtl_from_file( path, temp.data ) );
} break;
case comment:
- case o:
- case s: break;
+ case group:
+ case object:
+ case shading: break;
default: {
dlog(
"obj_from_file() : unhandled char combo %c%c\n",