5 memset(pt, 0,
sizeof(*pt));
9 pt->unknown2 = 0xE0C080;
14 u16 f16_ampl = (s32)(amplitude*0x1000);
15 u16 f16_freq = f32tof16(frequency);
16 u16 f16_phase = f32tof16(phase);
17 pt->enableNoise =
true;
18 if (mode & C3D_ProcTex_U)
20 pt->uNoiseAmpl = f16_ampl;
21 pt->uNoiseFreq = f16_freq;
22 pt->uNoisePhase = f16_phase;
24 if (mode & C3D_ProcTex_V)
26 pt->vNoiseAmpl = f16_ampl;
27 pt->vNoiseFreq = f16_freq;
28 pt->vNoisePhase = f16_phase;
34 u32 f16_bias = f32tof16(bias);
35 pt->lodBiasLow = f16_bias;
36 pt->lodBiasHigh = f16_bias>>8;
52 ctx->
texConfig |= BIT(10) | ((texCoordId&3)<<8);
54 ctx->
flags &= ~C3DiF_ProcTex;
57static inline int lutid2idx(GPU_PROCTEX_LUTID
id)
61 case GPU_LUT_NOISE:
return 0;
62 case GPU_LUT_RGBMAP:
return 1;
63 case GPU_LUT_ALPHAMAP:
return 2;
75 int idx = lutid2idx(
id);
83 ctx->
flags &= ~C3DiF_ProcTexLut(idx);
86static inline float clampLut(
float val)
88 if (val < 0.0f)
return 0.0f;
89 if (val > 1.0f)
return 1.0f;
96 for (i = 0; i < 128; i ++)
98 u32 cur = 0xFFF*clampLut(in[i]);
99 u32 next = 0xFFF*clampLut(in[i+1]);
100 u32 diff = (next-cur)&0xFFF;
101 (*lut)[i] = cur | (diff<<12);
116 ctx->
flags &= ~C3DiF_ProcTexColorLut;
119static inline u32 calc_diff(u32 cur, u32 next,
int pos)
121 cur = (cur>>pos)&0xFF;
122 next = (next>>pos)&0xFF;
123 u32 diff = (((s32)next-(s32)cur)>>1)&0xFF;
130 memcpy(&out->color[offset], in, 4*width);
131 for (i = 0; i < (width-1); i ++)
135 out->diff[offset+i] =
136 calc_diff(cur,next,0) |
137 calc_diff(cur,next,8) |
138 calc_diff(cur,next,16) |
139 calc_diff(cur,next,24);
141 out->diff[offset+width-1] = 0;
151 ctx->
flags &= ~C3DiF_ProcTex;
153 GPUCMD_AddIncrementalWrites(GPUREG_TEXUNIT3_PROCTEX0, (u32*)ctx->
procTex, 6);
158 for (i = 0; i < 3; i ++)
160 int j = i ? (i+1) : 0;
164 GPUCMD_AddWrite(GPUREG_PROCTEX_LUT, j<<8);
165 GPUCMD_AddWrites(GPUREG_PROCTEX_LUT_DATA0, *ctx->
procTexLut[i], 128);
167 ctx->
flags &= ~C3DiF_ProcTexLutAll;
171 ctx->
flags &= ~C3DiF_ProcTexColorLut;
174 GPUCMD_AddWrite(GPUREG_PROCTEX_LUT, GPU_LUT_COLOR<<8);
175 GPUCMD_AddWrites(GPUREG_PROCTEX_LUT_DATA0, ctx->
procTexColorLut->color, 256);
176 GPUCMD_AddWrite(GPUREG_PROCTEX_LUT, GPU_LUT_COLORDIF<<8);
177 GPUCMD_AddWrites(GPUREG_PROCTEX_LUT_DATA0, ctx->
procTexColorLut->diff, 256);
191 for (i = 0; i < 3; i ++)
#define C3DiF_ProcTexLut(n)
void ProcTexColorLut_Write(C3D_ProcTexColorLut *out, const u32 *in, int offset, int width)
void C3D_ProcTexInit(C3D_ProcTex *pt, int offset, int width)
void C3D_ProcTexColorLutBind(C3D_ProcTexColorLut *lut)
void C3D_ProcTexLutBind(GPU_PROCTEX_LUTID id, C3D_ProcTexLut *lut)
void C3Di_ProcTexUpdate(C3D_Context *ctx)
void C3Di_ProcTexDirty(C3D_Context *ctx)
void ProcTexLut_FromArray(C3D_ProcTexLut *lut, const float in[129])
void C3D_ProcTexLodBias(C3D_ProcTex *pt, float bias)
void C3D_ProcTexBind(int texCoordId, C3D_ProcTex *pt)
void C3D_ProcTexNoiseCoefs(C3D_ProcTex *pt, int mode, float amplitude, float frequency, float phase)
C3D_ProcTexColorLut * procTexColorLut
C3D_ProcTexLut * procTexLut[3]