#ifndef PLY_H #define PLY_H #include #include #include typedef enum { PLY_FORMAT_INVALID = -1, PLY_FORMAT_ASCII, PLY_FORMAT_LE, PLY_FORMAT_BE, } PlyFormatType; typedef enum { PLY_HEADER_INVALID = -1, PLY_HEADER_COMMENT, PLY_HEADER_END, PLY_HEADER_ELEMENT, PLY_HEADER_PROPERTY, } PlyHeaderType; typedef enum { PLY_TYPE_INVALID = -1, PLY_TYPE_CHAR, PLY_TYPE_UCHAR, PLY_TYPE_SHORT, PLY_TYPE_USHORT, PLY_TYPE_INT, PLY_TYPE_UINT, PLY_TYPE_FLOAT, PLY_TYPE_DOUBLE, } PlyPropertyType; typedef struct PlyPropertyStruct { char* name; PlyPropertyType count; PlyPropertyType element; void* elements; void* counts; struct PlyPropertyStruct* next; } PlyProperty; typedef struct PlyElementStruct { char* name; int count; PlyProperty* properties; struct PlyElementStruct* next; } PlyElement; typedef struct PlyMeshStruct { uint32_t vertex_count; vec3* position; vec4* colour; vec3* normal; vec2* uv; uint32_t index_count; uint16_t* index; } PlyMesh; typedef struct PlyMappingsStruct { char* vertex_element; char* x; char* y; char* z; char* nx; char* ny; char* nz; char* r; char* g; char* b; char* a; char* u; char* v; char* face_element; char* index; } PlyMappings; extern PlyMappings default_ply_mappings; extern const char* const ply_formats[]; extern const char* const ply_header_items[]; extern const char* const ply_type_strings[]; extern const size_t ply_type_sizes[]; PlyMesh ply_load_mesh(char* filename, PlyMappings mappings); void ply_free_elements(PlyElement* elements_head); #endif