LightLut/LightEnv: generate/use proper LUTs for the [0,1] domain
This commit is contained in:
parent
07d380221e
commit
370e938520
@ -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
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user