#ifndef RVL_SDK_GX_LIGHT_H
#define RVL_SDK_GX_LIGHT_H
#include "common.h"
#include "rvl/GX/GXInternal.h"
#include "rvl/GX/GXTypes.h"

#ifdef __cplusplus
extern "C" {
#endif

GX_DECL_PUBLIC_STRUCT(GXLightObj, 64);

void GXInitLightAttn(GXLightObj *light, f32 aa, f32 ab, f32 ac, f32 ka, f32 kb, f32 kc);
void GXInitLightAttnA(GXLightObj *light, f32 a, f32 b, f32 c);
void GXInitLightAttnK(GXLightObj *light, f32 a, f32 b, f32 c);
void GXInitLightSpot(GXLightObj *light, f32 angle, GXSpotFn fn);
void GXInitLightDistAttn(GXLightObj *light, f32 distance, f32 brightness, GXDistAttnFn fn);
void GXInitLightPos(GXLightObj *light, f32 x, f32 y, f32 z);
void GXGetLightPos(const GXLightObj *light, f32 *x, f32 *y, f32 *z);
void GXInitLightDir(GXLightObj *light, f32 x, f32 y, f32 z);
void GXGetLightDir(const GXLightObj *light, f32 *x, f32 *y, f32 *z);
void GXInitSpecularDir(GXLightObj *light, f32 x, f32 y, f32 z);
void GXInitLightColor(GXLightObj *light, GXColor color);
void GXLoadLightObjImm(const GXLightObj *light, GXLightID id);
void GXLoadLightObjIndx(u16 index, GXLightID id);
void GXSetChanAmbColor(GXChannelID chan, GXColor color);
void GXSetChanMatColor(GXChannelID chan, GXColor color);
void GXSetNumChans(u8 num);
void GXSetChanCtrl(
    GXChannelID chan, GXBool enable, GXColorSrc ambSrc, GXColorSrc matSrc, GXLightID lightMask, GXDiffuseFn diffFn,
    GXAttnFn attnFn
);

#ifdef __cplusplus
}
#endif
#endif
