#ifndef OBJ_H
#define OBJ_H

#include "aliases.h"
#include "constants.h"
#include "img.h"
#include "mem_arena.h"
#include "typed_list.h"
#include "vec.h"

#define INVALID_MODEL ((Model){0})
#define IS_INVALID_MODEL(m) (m.vertices == NULL || m.triangles == NULL)

typedef struct triangle Triangle;
struct triangle {
  union {
    u64 positions[TRIANGLE_VERTICES];
    struct {
      u64 p0;
      u64 p1;
      u64 p2;
    };
  };
  union {
    u64 normals[TRIANGLE_VERTICES];
    struct {
      u64 n0;
      u64 n1;
      u64 n2;
    };
  };
  union {
    u64 coordinates[TRIANGLE_VERTICES];
    struct {
      u64 tx0;
      u64 tx1;
      u64 tx2;
    };
  };
};

MAKE_LIST_TYPE(Triangle);

typedef struct point_light PointLight;
struct point_light {
  V3f diffuse_intensity;
  V3f specular_intensity;
  V3f position;
};

typedef struct model Model;
struct model {
  LIST_TYPE(V3f) * vertices;
  LIST_TYPE(V3f) * normals;
  LIST_TYPE(V2f) * texture_coordinates;
  LIST_TYPE(Triangle) * triangles;
  Image *texture;
  Image *normal;
};

Model load_obj_file(Arena *arena, const char *filename, const char *texture,
                    const char *normal_map);

#endif // OBJ_H
