mirror of
https://github.com/thisistherk/fast_obj.git
synced 2025-04-04 21:15:04 +00:00
Add support for object names
This commit is contained in:
parent
49c810ae1c
commit
9f4b38eb1b
1 changed files with 112 additions and 5 deletions
117
fast_obj.h
117
fast_obj.h
|
@ -94,6 +94,23 @@ typedef struct
|
||||||
} fastObjIndex;
|
} fastObjIndex;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* Object name */
|
||||||
|
char* name;
|
||||||
|
|
||||||
|
/* Number of faces */
|
||||||
|
unsigned int face_count;
|
||||||
|
|
||||||
|
/* First face in fastObjMesh face_* arrays */
|
||||||
|
unsigned int face_offset;
|
||||||
|
|
||||||
|
/* First index in fastObjMesh indices array */
|
||||||
|
unsigned int index_offset;
|
||||||
|
|
||||||
|
} fastObjObject;
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* Group name */
|
/* Group name */
|
||||||
|
@ -135,6 +152,10 @@ typedef struct
|
||||||
unsigned int material_count;
|
unsigned int material_count;
|
||||||
fastObjMaterial* materials;
|
fastObjMaterial* materials;
|
||||||
|
|
||||||
|
/* Mesh objects */
|
||||||
|
unsigned int object_count;
|
||||||
|
fastObjObject* objects;
|
||||||
|
|
||||||
/* Mesh groups */
|
/* Mesh groups */
|
||||||
unsigned int group_count;
|
unsigned int group_count;
|
||||||
fastObjGroup* groups;
|
fastObjGroup* groups;
|
||||||
|
@ -197,7 +218,8 @@ typedef struct
|
||||||
/* Final mesh */
|
/* Final mesh */
|
||||||
fastObjMesh* mesh;
|
fastObjMesh* mesh;
|
||||||
|
|
||||||
/* Current group */
|
/* Current object/group */
|
||||||
|
fastObjObject object;
|
||||||
fastObjGroup group;
|
fastObjGroup group;
|
||||||
|
|
||||||
/* Current material index */
|
/* Current material index */
|
||||||
|
@ -452,6 +474,44 @@ const char* skip_line(const char* ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
fastObjObject object_default(void)
|
||||||
|
{
|
||||||
|
fastObjObject object;
|
||||||
|
|
||||||
|
object.name = 0;
|
||||||
|
object.face_count = 0;
|
||||||
|
object.face_offset = 0;
|
||||||
|
object.index_offset = 0;
|
||||||
|
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void object_clean(fastObjObject* object)
|
||||||
|
{
|
||||||
|
memory_dealloc(object->name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void flush_object(fastObjData* data)
|
||||||
|
{
|
||||||
|
/* Add object if not empty */
|
||||||
|
if (data->object.face_count > 0)
|
||||||
|
array_push(data->mesh->objects, data->object);
|
||||||
|
else
|
||||||
|
object_clean(&data->object);
|
||||||
|
|
||||||
|
/* Reset for more data */
|
||||||
|
data->object = object_default();
|
||||||
|
data->object.face_offset = array_size(data->mesh->face_vertices);
|
||||||
|
data->object.index_offset = array_size(data->mesh->indices);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
fastObjGroup group_default(void)
|
fastObjGroup group_default(void)
|
||||||
{
|
{
|
||||||
|
@ -474,7 +534,7 @@ void group_clean(fastObjGroup* group)
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
void flush_output(fastObjData* data)
|
void flush_group(fastObjData* data)
|
||||||
{
|
{
|
||||||
/* Add group if not empty */
|
/* Add group if not empty */
|
||||||
if (data->group.face_count > 0)
|
if (data->group.face_count > 0)
|
||||||
|
@ -717,6 +777,28 @@ const char* parse_face(fastObjData* data, const char* ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
const char* parse_object(fastObjData* data, const char* ptr)
|
||||||
|
{
|
||||||
|
const char* s;
|
||||||
|
const char* e;
|
||||||
|
|
||||||
|
|
||||||
|
ptr = skip_whitespace(ptr);
|
||||||
|
|
||||||
|
s = ptr;
|
||||||
|
while (!is_end_of_name(*ptr))
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
e = ptr;
|
||||||
|
|
||||||
|
flush_object(data);
|
||||||
|
data->object.name = string_copy(s, e);
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
const char* parse_group(fastObjData* data, const char* ptr)
|
const char* parse_group(fastObjData* data, const char* ptr)
|
||||||
{
|
{
|
||||||
|
@ -732,7 +814,7 @@ const char* parse_group(fastObjData* data, const char* ptr)
|
||||||
|
|
||||||
e = ptr;
|
e = ptr;
|
||||||
|
|
||||||
flush_output(data);
|
flush_group(data);
|
||||||
data->group.name = string_copy(s, e);
|
data->group.name = string_copy(s, e);
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
|
@ -1200,6 +1282,21 @@ void parse_buffer(fastObjData* data, const char* ptr, const char* end, const fas
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
p++;
|
||||||
|
|
||||||
|
switch (*p++)
|
||||||
|
{
|
||||||
|
case ' ':
|
||||||
|
case '\t':
|
||||||
|
p = parse_object(data, p);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
p--; /* roll p++ back in case *p was a newline */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 'g':
|
case 'g':
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
|
@ -1253,6 +1350,9 @@ void fast_obj_destroy(fastObjMesh* m)
|
||||||
unsigned int ii;
|
unsigned int ii;
|
||||||
|
|
||||||
|
|
||||||
|
for (ii = 0; ii < array_size(m->objects); ii++)
|
||||||
|
object_clean(&m->objects[ii]);
|
||||||
|
|
||||||
for (ii = 0; ii < array_size(m->groups); ii++)
|
for (ii = 0; ii < array_size(m->groups); ii++)
|
||||||
group_clean(&m->groups[ii]);
|
group_clean(&m->groups[ii]);
|
||||||
|
|
||||||
|
@ -1265,6 +1365,7 @@ void fast_obj_destroy(fastObjMesh* m)
|
||||||
array_clean(m->face_vertices);
|
array_clean(m->face_vertices);
|
||||||
array_clean(m->face_materials);
|
array_clean(m->face_materials);
|
||||||
array_clean(m->indices);
|
array_clean(m->indices);
|
||||||
|
array_clean(m->objects);
|
||||||
array_clean(m->groups);
|
array_clean(m->groups);
|
||||||
array_clean(m->materials);
|
array_clean(m->materials);
|
||||||
|
|
||||||
|
@ -1319,6 +1420,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac
|
||||||
m->face_materials = 0;
|
m->face_materials = 0;
|
||||||
m->indices = 0;
|
m->indices = 0;
|
||||||
m->materials = 0;
|
m->materials = 0;
|
||||||
|
m->objects = 0;
|
||||||
m->groups = 0;
|
m->groups = 0;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1337,6 +1439,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac
|
||||||
|
|
||||||
/* Data needed during parsing */
|
/* Data needed during parsing */
|
||||||
data.mesh = m;
|
data.mesh = m;
|
||||||
|
data.object = object_default();
|
||||||
data.group = group_default();
|
data.group = group_default();
|
||||||
data.material = 0;
|
data.material = 0;
|
||||||
data.line = 1;
|
data.line = 1;
|
||||||
|
@ -1410,8 +1513,11 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Flush final group */
|
/* Flush final object/group */
|
||||||
flush_output(&data);
|
flush_object(&data);
|
||||||
|
object_clean(&data.object);
|
||||||
|
|
||||||
|
flush_group(&data);
|
||||||
group_clean(&data.group);
|
group_clean(&data.group);
|
||||||
|
|
||||||
m->position_count = array_size(m->positions) / 3;
|
m->position_count = array_size(m->positions) / 3;
|
||||||
|
@ -1419,6 +1525,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac
|
||||||
m->normal_count = array_size(m->normals) / 3;
|
m->normal_count = array_size(m->normals) / 3;
|
||||||
m->face_count = array_size(m->face_vertices);
|
m->face_count = array_size(m->face_vertices);
|
||||||
m->material_count = array_size(m->materials);
|
m->material_count = array_size(m->materials);
|
||||||
|
m->object_count = array_size(m->objects);
|
||||||
m->group_count = array_size(m->groups);
|
m->group_count = array_size(m->groups);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue