From 370e938520872f60e80e896058eaf89c5309f615 Mon Sep 17 00:00:00 2001 From: fincs Date: Thu, 30 Mar 2017 23:39:39 +0200 Subject: [PATCH] LightLut/LightEnv: generate/use proper LUTs for the [0,1] domain --- include/c3d/light.h | 2 +- source/lightenv.c | 4 ++-- source/lightlut.c | 16 +++++++++------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/include/c3d/light.h b/include/c3d/light.h index c2ec4e8..da13c04 100644 --- a/include/c3d/light.h +++ b/include/c3d/light.h @@ -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 { diff --git a/source/lightenv.c b/source/lightenv.c index 8ecf05f..20ccdde 100644 --- a/source/lightenv.c +++ b/source/lightenv.c @@ -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; diff --git a/source/lightlut.c b/source/lightlut.c index 7b16746..6c34a3a 100644 --- a/source/lightlut.c +++ b/source/lightlut.c @@ -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); }