LightLut/LightEnv: generate/use proper LUTs for the [0,1] domain

This commit is contained in:
fincs 2017-03-30 23:39:39 +02:00
parent 07d380221e
commit 370e938520
3 changed files with 12 additions and 10 deletions

View File

@ -62,7 +62,7 @@ void C3D_LightEnvBind(C3D_LightEnv* env);
void C3D_LightEnvMaterial(C3D_LightEnv* env, const C3D_Material* mtl);
void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b);
void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_LightLut* lut);
void C3D_LightEnvLut(C3D_LightEnv* env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut* lut);
enum
{

View File

@ -192,7 +192,7 @@ void C3D_LightEnvAmbient(C3D_LightEnv* env, float r, float g, float b)
env->flags |= C3DF_LightEnv_MtlDirty;
}
void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_LightLut* lut)
void C3D_LightEnvLut(C3D_LightEnv* env, GPU_LIGHTLUTID lutId, GPU_LIGHTLUTINPUT input, bool negative, C3D_LightLut* lut)
{
static const s8 ids[] = { 0, 1, -1, 2, 3, 4, 5, -1 };
int id = ids[lutId];
@ -215,7 +215,7 @@ void C3D_LightEnvLut(C3D_LightEnv* env, int lutId, int input, bool abs, C3D_Ligh
u32 absbit = 1 << (lutId*4 + 1);
env->conf.lutInput.abs &= ~absbit;
if (!abs)
if (negative)
env->conf.lutInput.abs |= absbit;
env->flags |= C3DF_LightEnv_Dirty;

View File

@ -35,15 +35,17 @@ void LightLut_FromFunc(C3D_LightLut* lut, C3D_LightLutFunc func, float param, bo
int i;
float data[512];
memset(data, 0, sizeof(data));
int start = negative ? (-128) : 0;
for (i = start; i <= 128; i ++)
int min = negative ? (-128) : 0;
int max = negative ? 128 : 256;
for (i = min; i <= max; i ++)
{
float x = i/128.0f;
float x = (float)i/max;
float val = func(x, param);
if (i < 128)
data[i & 0xFF] = val;
if (i > start)
data[(i & 0xFF) + 255] = val - data[(i-1) & 0xFF];
int idx = negative ? (i & 0xFF) : i;
if (i < max)
data[idx] = val;
if (i > min)
data[idx+255] = val-data[idx-1];
}
LightLut_FromArray(lut, data);
}