System info & network
This commit is contained in:
121
code/file_formats/wavefront.h
Normal file
121
code/file_formats/wavefront.h
Normal file
@@ -0,0 +1,121 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user