2017-02-09 04:30:25 +01:00
|
|
|
#include "internal.h"
|
2015-09-15 23:02:35 +02:00
|
|
|
|
|
|
|
void LightLut_FromArray(C3D_LightLut* lut, float* data)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < 256; i ++)
|
|
|
|
{
|
|
|
|
float in = data[i], diff = data[i+256];
|
|
|
|
|
|
|
|
u32 val = 0;
|
2017-02-09 04:30:25 +01:00
|
|
|
if (in > 0.0f)
|
2015-09-15 23:02:35 +02:00
|
|
|
{
|
|
|
|
in *= 0x1000;
|
|
|
|
val = (in < 0x1000) ? (u32)in : 0xFFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
u32 val2 = 0;
|
2017-02-09 04:30:25 +01:00
|
|
|
if (diff != 0.0f)
|
2015-09-15 23:02:35 +02:00
|
|
|
{
|
|
|
|
if (diff < 0)
|
|
|
|
{
|
|
|
|
diff = -diff;
|
|
|
|
val2 = 0x800;
|
|
|
|
}
|
|
|
|
diff *= 0x800;
|
|
|
|
val2 |= (diff < 0x800) ? (u32)diff : 0x7FF;
|
|
|
|
}
|
|
|
|
|
|
|
|
lut->data[i] = val | (val2 << 12);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void LightLut_FromFunc(C3D_LightLut* lut, C3D_LightLutFunc func, float param, bool negative)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
float data[512];
|
|
|
|
memset(data, 0, sizeof(data));
|
2017-03-30 23:39:39 +02:00
|
|
|
int min = negative ? (-128) : 0;
|
|
|
|
int max = negative ? 128 : 256;
|
|
|
|
for (i = min; i <= max; i ++)
|
2015-09-15 23:02:35 +02:00
|
|
|
{
|
2017-03-30 23:39:39 +02:00
|
|
|
float x = (float)i/max;
|
2017-03-15 16:42:51 +01:00
|
|
|
float val = func(x, param);
|
2017-03-30 23:39:39 +02:00
|
|
|
int idx = negative ? (i & 0xFF) : i;
|
|
|
|
if (i < max)
|
|
|
|
data[idx] = val;
|
|
|
|
if (i > min)
|
|
|
|
data[idx+255] = val-data[idx-1];
|
2015-09-15 23:02:35 +02:00
|
|
|
}
|
|
|
|
LightLut_FromArray(lut, data);
|
|
|
|
}
|
2015-11-26 12:28:09 +01:00
|
|
|
|
|
|
|
void LightLutDA_Create(C3D_LightLutDA* lut, C3D_LightLutFuncDA func, float from, float to, float arg0, float arg1)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
float data[512];
|
|
|
|
|
2017-03-15 16:42:51 +01:00
|
|
|
float range = to-from;
|
|
|
|
lut->scale = 1.0f / range;
|
2015-11-26 12:28:09 +01:00
|
|
|
lut->bias = -from*lut->scale;
|
|
|
|
|
2017-03-15 16:42:51 +01:00
|
|
|
for (i = 0; i <= 256; i ++)
|
2015-11-26 12:28:09 +01:00
|
|
|
{
|
2017-03-15 16:42:51 +01:00
|
|
|
float x = from + range*i/256.0f;
|
|
|
|
float val = func(x, arg0, arg1);
|
|
|
|
if (i < 256)
|
|
|
|
data[i] = val;
|
2015-11-26 12:28:09 +01:00
|
|
|
if (i > 0)
|
2017-03-15 16:42:51 +01:00
|
|
|
data[i+255] = val-data[i-1];
|
2015-11-26 12:28:09 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
LightLut_FromArray(&lut->lut, data);
|
|
|
|
}
|