#pragma once

#include "pxl8_types.h"

#ifdef __cplusplus
extern "C" {
#endif

#define PXL8_LIGHTMAP_MAX 16
#define PXL8_LIGHTMAP_NEUTRAL 128

typedef struct pxl8_lightmap {
    u8* data;
    u32 width;
    u32 height;
    u32 scale;
} pxl8_lightmap;

pxl8_lightmap* pxl8_lightmap_create(u32 width, u32 height, u32 scale);
void pxl8_lightmap_destroy(pxl8_lightmap* lm);
void pxl8_lightmap_clear(pxl8_lightmap* lm, u8 r, u8 g, u8 b);
void pxl8_lightmap_set(pxl8_lightmap* lm, u32 x, u32 y, u8 r, u8 g, u8 b);
void pxl8_lightmap_get(const pxl8_lightmap* lm, u32 x, u32 y, u8* r, u8* g, u8* b);

void pxl8_lightmap_add_point(
    pxl8_lightmap* lm,
    f32 lx, f32 ly,
    u8 r, u8 g, u8 b,
    f32 radius,
    f32 intensity
);

static inline void pxl8_lightmap_sample(
    const pxl8_lightmap* lm,
    f32 u, f32 v,
    u8* r, u8* g, u8* b
) {
    i32 x = (i32)(u * (f32)lm->width) & (i32)(lm->width - 1);
    i32 y = (i32)(v * (f32)lm->height) & (i32)(lm->height - 1);
    u32 idx = ((u32)y * lm->width + (u32)x) * 3;
    *r = lm->data[idx + 0];
    *g = lm->data[idx + 1];
    *b = lm->data[idx + 2];
}

#ifdef __cplusplus
}
#endif
