Files

122 lines
2.9 KiB
C
Raw Permalink Normal View History

2023-09-26 19:40:16 +02:00
#ifndef _PIUMA_WAVEFRONT_H_
#define _PIUMA_WAVEFRONT_H_
#include "../lib/types.h"
#include "../lib/math.h"
typedef void *(*wf_alloc_t)(u64 size);
typedef void *(*wf_realloc_t)(void *ptr, u64 size);
typedef void (*wf_free_t)(void *ptr);
/* Reassing wf_alloc and wf_free with your own alloc/free functions if you don't
* want to use malloc and free.
*/
extern wf_alloc_t wf_alloc;
extern wf_realloc_t wf_realloc;
extern wf_free_t wf_free;
typedef u32 wf_index;
typedef u32 wf_size;
// Indices are 1-based in Wavefront. 0 is used to signal the index was omitted.
struct wf_face_index
{
wf_index vertex;
wf_index texture;
wf_index normal;
};
struct wf_face
{
wf_face_index indices[3];
};
struct wf_object
{
char *name;
// @Feature: groups are not supported yet
char *material_name;
// Vertices
v4 *vertices;
wf_size vertices_count;
// Texture coordinates
v3 *texture_coords;
wf_size texture_coords_count;
// Vertex normals
v3 *normals;
wf_size normals_count;
// Faces
wf_face *faces;
wf_size faces_count;
};
struct wf_obj_file
{
char *name;
char **mtllib_names;
wf_size mtllib_names_count;
wf_object *objects;
wf_size objects_count;
};
struct wf_material
{
char *name;
v3 Ka; // ambient color
v3 Kd; // diffuse color
v3 Ke; // emissive color
v3 Ks; // specular color
f32 Ns; // specular exposure
f32 d; // dissolved - transparency where 0.0 is fully transparent and 1.0 is opaque
f32 Ni; // optical density - refractive index
int illum; // illumination model
/* illum is described at https://en.wikipedia.org/wiki/Wavefront_.obj_file#Basic_materials as follows:
* 0. Color on and Ambient off
* 1. Color on and Ambient on
* 2. Highlight on
* 3. Reflection on and Ray trace on
* 4. Transparency: Glass on, Reflection: Ray trace on
* 5. Reflection: Fresnel on and Ray trace on
* 6. Transparency: Refraction on, Reflection: Fresnel off and Ray trace on
* 7. Transparency: Refraction on, Reflection: Fresnel on and Ray trace on
* 8. Reflection on and Ray trace off
* 9. Transparency: Glass on, Reflection: Ray trace off
* 10. Casts shadows onto invisible surfaces
*/
char *map_Ka; // ambient texture map name
char *map_Kd; // diffuse texture map name
char *map_Ke; // emissive texture map name
char *map_Ks; // specular color texture map name
char *map_Ns; // specular highlight texture map name
char *map_d; // alpha texture map name
char *bump; // bump map name
char *disp; // displacement map name
char *decal; // stencil decal texture map name
// @Feature: Texture options are not supported yet
};
struct wf_mtl_file
{
char *name;
wf_material *materials;
wf_size materials_count;
};
bool wf_parse_obj(char *data, u64 size, const char *name, wf_obj_file *return_obj);
bool wf_parse_mtl(char *data, u64 size, const char *name, wf_mtl_file *return_mtl);
void wf_cleanup_obj(wf_obj_file *obj_file);
void wf_cleanup_mtl(wf_mtl_file *mtl_file);
#endif