Citro3d
Loading...
Searching...
No Matches
lightlut.c
Go to the documentation of this file.
1#include "internal.h"
2
3void LightLut_FromArray(C3D_LightLut* lut, float* data)
4{
5 int i;
6 for (i = 0; i < 256; i ++)
7 {
8 float in = data[i], diff = data[i+256];
9
10 u32 val = 0;
11 if (in > 0.0f)
12 {
13 in *= 0x1000;
14 val = (in < 0x1000) ? (u32)in : 0xFFF;
15 }
16
17 u32 val2 = 0;
18 if (diff != 0.0f)
19 {
20 if (diff < 0)
21 {
22 diff = -diff;
23 val2 = 0x800;
24 }
25 diff *= 0x800;
26 val2 |= (diff < 0x800) ? (u32)diff : 0x7FF;
27 }
28
29 lut->data[i] = val | (val2 << 12);
30 }
31}
32
33void LightLut_FromFunc(C3D_LightLut* lut, C3D_LightLutFunc func, float param, bool negative)
34{
35 int i;
36 float data[512];
37 memset(data, 0, sizeof(data));
38 int min = negative ? (-128) : 0;
39 int max = negative ? 128 : 256;
40 for (i = min; i <= max; i ++)
41 {
42 float x = (float)i/max;
43 float val = func(x, param);
44 int idx = negative ? (i & 0xFF) : i;
45 if (i < max)
46 data[idx] = val;
47 if (i > min)
48 data[idx+255] = val-data[idx-1];
49 }
51}
52
53void LightLutDA_Create(C3D_LightLutDA* lut, C3D_LightLutFuncDA func, float from, float to, float arg0, float arg1)
54{
55 int i;
56 float data[512];
57
58 float range = to-from;
59 lut->scale = 1.0f / range;
60 lut->bias = -from*lut->scale;
61
62 for (i = 0; i <= 256; i ++)
63 {
64 float x = from + range*i/256.0f;
65 float val = func(x, arg0, arg1);
66 if (i < 256)
67 data[i] = val;
68 if (i > 0)
69 data[i+255] = val-data[i-1];
70 }
71
72 LightLut_FromArray(&lut->lut, data);
73}
void LightLut_FromFunc(C3D_LightLut *lut, C3D_LightLutFunc func, float param, bool negative)
Definition: lightlut.c:33
void LightLut_FromArray(C3D_LightLut *lut, float *data)
Definition: lightlut.c:3
void LightLutDA_Create(C3D_LightLutDA *lut, C3D_LightLutFuncDA func, float from, float to, float arg0, float arg1)
Definition: lightlut.c:53
float24Uniform_s * data
Definition: uniforms.c:16