From 33c6a10be52e68ef31a6da20fa37efece519ad3c Mon Sep 17 00:00:00 2001 From: fincs Date: Wed, 15 Mar 2017 16:42:51 +0100 Subject: [PATCH] Correct LightLut_FromFunc/LightLutDA_Create input range --- source/lightlut.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/source/lightlut.c b/source/lightlut.c index 1b76be3..7b16746 100644 --- a/source/lightlut.c +++ b/source/lightlut.c @@ -35,11 +35,15 @@ 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 ? (-127) : 0; - for (i = start; i < 128; i ++) + int start = negative ? (-128) : 0; + for (i = start; i <= 128; i ++) { - data[i & 0xFF] = func((float)i / 127.0f, param); - if (i != start) data[(i & 0xFF) + 255] = data[i & 0xFF] - data[(i-1) & 0xFF]; + float x = i/128.0f; + float val = func(x, param); + if (i < 128) + data[i & 0xFF] = val; + if (i > start) + data[(i & 0xFF) + 255] = val - data[(i-1) & 0xFF]; } LightLut_FromArray(lut, data); } @@ -48,17 +52,19 @@ void LightLutDA_Create(C3D_LightLutDA* lut, C3D_LightLutFuncDA func, float from, { int i; float data[512]; - data[511] = 0; - lut->scale = 1.0f / (to-from); + float range = to-from; + lut->scale = 1.0f / range; lut->bias = -from*lut->scale; - for (i = 0; i < 256; i ++) + for (i = 0; i <= 256; i ++) { - float dist = ((float)i/255 - lut->bias) / lut->scale; - data[i] = func(dist, arg0, arg1); + float x = from + range*i/256.0f; + float val = func(x, arg0, arg1); + if (i < 256) + data[i] = val; if (i > 0) - data[i+255] = data[i]-data[i-1]; + data[i+255] = val-data[i-1]; } LightLut_FromArray(&lut->lut, data);