#ifndef prototype1_src_l2_alice_assets_h
#define prototype1_src_l2_alice_assets_h

#include "../marie/graphics_geom.h"
#include "../../../gen/l1/VecAndSpan_U32.h"
#include "../../../gen/l1/VecAndSpan_U8.h"

typedef struct {
    vec3 pos;
    vec2 tex;
} GenericMeshVertexInc;

#include "../../../gen/l1/eve/alice/VecAndSpan_GenericMeshVertexInc.h"

typedef struct {
    GenericMeshVertexInc base;
    vec3 norm;
    vec3 tang_U;
    vec3 tang_V;
} GenericMeshVertex;

typedef struct {
    VecGenericMeshVertexInc vertices;
    VecU32 indexes;
} GenericMeshTopology;

void GenericMeshTopology_drop(GenericMeshTopology self) {
    VecGenericMeshVertexInc_drop(self.vertices);
    VecU32_drop(self.indexes);
}

GenericMeshTopology GenericMeshTopology_clone(const GenericMeshTopology* self) {
    return (GenericMeshTopology){.vertices = VecGenericMeshVertexInc_clone(&self->vertices), .indexes = VecU32_clone(&self->indexes)};
}

typedef struct {
    VecU8 topology_path;
    VecU8 diffuse_texture_path;
    VecU8 normal_texture_path;
    VecU8 specular_texture_path;
} AliceGenericMeshPath;

void AliceGenericMeshPath_drop(AliceGenericMeshPath self) {
    VecU8_drop(self.topology_path);
    VecU8_drop(self.diffuse_texture_path);
    VecU8_drop(self.normal_texture_path);
    VecU8_drop(self.specular_texture_path);
}

typedef struct {
    mat4 model_t;
} GenericMeshInstanceInc;

typedef struct {
    GenericMeshInstanceInc base;
    mat3 normal_t;
} GenericMeshInstance;


typedef struct {
    vec3 pos;
} ShinyMeshVertexInc;

typedef struct {
    ShinyMeshVertexInc base;
    vec3 normal;
} ShinyMeshVertex;
#include "../../../gen/l1/eve/alice/VecAndSpan_ShinyMeshVertexInc.h"

typedef struct {
    VecShinyMeshVertexInc vertices;
    VecU32 indexes;
} ShinyMeshTopology;

void ShinyMeshTopology_drop(ShinyMeshTopology self) {
    VecShinyMeshVertexInc_drop(self.vertices);
    VecU32_drop(self.indexes);
}

ShinyMeshTopology ShinyMeshTopology_clone(const ShinyMeshTopology* self) {
    return (ShinyMeshTopology){.vertices = VecShinyMeshVertexInc_clone(&self->vertices),
        VecU32_clone(&self->indexes)};
}


typedef struct{
    mat4 model_t;
    vec3 color_off;
    vec3 color_on;
} ShinyMeshInstanceInc;

typedef struct {
    ShinyMeshInstanceInc base;
    mat3 normal_t;
} ShinyMeshInstance;

typedef struct {
    vec2 win_scale;
} Pipeline1PushRangeVertex;

typedef struct {
    float gamma_correction_factor;
    float hdr_factor;
    float lsd_factor;
    float anim_time;
} Pipeline1PushRangeFragment;

typedef struct {
    vec3 pos;
    char _padding_0[4];
    vec3 dir;
    char _padding_1[4];
    vec3 color;
    char _padding_2[4];
    float d;
    char _padding_3[12];
} Pipeline0Spotlight;

typedef struct {
    vec3 pos;
    char _padding_0[4];
    vec3 color;
    char _padding_1[4];
} Pipeline0PointLight;

#define pipeline_0_ubo_point_light_max_count 120
#define pipeline_0_ubo_spotlight_max_count 20

typedef struct {
    int point_light_count;
    int spotlight_count;
    char _padding_1[8];
    Pipeline0PointLight point_light_arr[pipeline_0_ubo_point_light_max_count];
    Pipeline0Spotlight spotlight_arr[pipeline_0_ubo_spotlight_max_count];
} Pipeline0UBO;


#endif