#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; 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); void ply_free_elements(PlyElement* elements_head); #endif