@@ -39,15 +39,26 @@ void GasLut_FromArray(C3D_GasLut* lut, const u32 data[9])
3939 }
4040}
4141
42- void C3D_GasAttn (float value )
42+ void C3D_GasBeginAcc (void )
43+ {
44+ C3D_Context * ctx = C3Di_GetContext ();
45+
46+ if (!(ctx -> flags & C3DiF_Active ))
47+ return ;
48+
49+ ctx -> gasFlags |= C3DiG_BeginAcc ;
50+ }
51+
52+ void C3D_GasDeltaZ (float value )
4353{
4454 C3D_Context * ctx = C3Di_GetContext ();
4555
4656 if (!(ctx -> flags & C3DiF_Active ))
4757 return ;
4858
4959 ctx -> flags |= C3DiF_Gas ;
50- ctx -> gasAttn = f32tof16 (value );
60+ ctx -> gasDeltaZ = (u32 )(value * 0x100 );
61+ ctx -> gasFlags |= C3DiG_AccStage ;
5162}
5263
5364void C3D_GasAccMax (float value )
@@ -59,18 +70,19 @@ void C3D_GasAccMax(float value)
5970
6071 ctx -> flags |= C3DiF_Gas ;
6172 ctx -> gasAccMax = f32tof16 (1.0f / value );
73+ ctx -> gasFlags |= C3DiG_SetAccMax ;
6274}
6375
64- void C3D_GasDeltaZ (float value )
76+ void C3D_GasAttn (float value )
6577{
6678 C3D_Context * ctx = C3Di_GetContext ();
6779
6880 if (!(ctx -> flags & C3DiF_Active ))
6981 return ;
7082
7183 ctx -> flags |= C3DiF_Gas ;
72- ctx -> gasDeltaZ = ( u32 )( value * 0x100 ) & 0xFFFFFF ;
73- ctx -> gasDeltaZ |= 2 << 24 ;
84+ ctx -> gasAttn = f32tof16 ( value ) ;
85+ ctx -> gasFlags |= C3DiG_RenderStage ;
7486}
7587
7688void C3D_GasLightPlanar (float min , float max , float attn )
@@ -82,6 +94,7 @@ void C3D_GasLightPlanar(float min, float max, float attn)
8294
8395 ctx -> flags |= C3DiF_Gas ;
8496 ctx -> gasLightXY = conv_u8 (min ,0 ) | conv_u8 (max ,8 ) | conv_u8 (attn ,16 );
97+ ctx -> gasFlags |= C3DiG_RenderStage ;
8598}
8699
87100void C3D_GasLightView (float min , float max , float attn )
@@ -93,6 +106,7 @@ void C3D_GasLightView(float min, float max, float attn)
93106
94107 ctx -> flags |= C3DiF_Gas ;
95108 ctx -> gasLightZ = conv_u8 (min ,0 ) | conv_u8 (max ,8 ) | conv_u8 (attn ,16 );
109+ ctx -> gasFlags |= C3DiG_RenderStage ;
96110}
97111
98112void C3D_GasLightDirection (float dotp )
@@ -105,6 +119,7 @@ void C3D_GasLightDirection(float dotp)
105119 ctx -> flags |= C3DiF_Gas ;
106120 ctx -> gasLightZColor &= ~0xFF ;
107121 ctx -> gasLightZColor |= conv_u8 (dotp ,0 );
122+ ctx -> gasFlags |= C3DiG_RenderStage ;
108123}
109124
110125void C3D_GasLutInput (GPU_GASLUTINPUT input )
@@ -117,6 +132,7 @@ void C3D_GasLutInput(GPU_GASLUTINPUT input)
117132 ctx -> flags |= C3DiF_Gas ;
118133 ctx -> gasLightZColor &= ~0x100 ;
119134 ctx -> gasLightZColor |= (input & 1 )<<8 ;
135+ ctx -> gasFlags |= C3DiG_RenderStage ;
120136}
121137
122138void C3D_GasLutBind (C3D_GasLut * lut )
@@ -136,17 +152,25 @@ void C3D_GasLutBind(C3D_GasLut* lut)
136152
137153void C3Di_GasUpdate (C3D_Context * ctx )
138154{
139- //__builtin_printf("updgasstate %08lX\n", ctx->flags);
140- //for(;;);
141155 if (ctx -> flags & C3DiF_Gas )
142156 {
143157 ctx -> flags &= ~C3DiF_Gas ;
144- GPUCMD_AddWrite (GPUREG_GAS_ATTENUATION , ctx -> gasAttn );
145- //GPUCMD_AddWrite(GPUREG_GAS_ACCMAX, ctx->gasAccMax);
146- GPUCMD_AddWrite (GPUREG_GAS_LIGHT_XY , ctx -> gasLightXY );
147- GPUCMD_AddWrite (GPUREG_GAS_LIGHT_Z , ctx -> gasLightZ );
148- GPUCMD_AddWrite (GPUREG_GAS_LIGHT_Z_COLOR , ctx -> gasLightZColor );
149- GPUCMD_AddWrite (GPUREG_GAS_DELTAZ_DEPTH , ctx -> gasDeltaZ );
158+ u32 gasFlags = ctx -> gasFlags ;
159+ ctx -> gasFlags = 0 ;
160+
161+ if (gasFlags & C3DiG_BeginAcc )
162+ GPUCMD_AddMaskedWrite (GPUREG_GAS_ACCMAX_FEEDBACK , 0x3 , 0 );
163+ if (gasFlags & C3DiG_AccStage )
164+ GPUCMD_AddMaskedWrite (GPUREG_GAS_DELTAZ_DEPTH , 0x7 , ctx -> gasDeltaZ );
165+ if (gasFlags & C3DiG_SetAccMax )
166+ GPUCMD_AddWrite (GPUREG_GAS_ACCMAX , ctx -> gasAccMax );
167+ if (gasFlags & C3DiG_RenderStage )
168+ {
169+ GPUCMD_AddWrite (GPUREG_GAS_ATTENUATION , ctx -> gasAttn );
170+ GPUCMD_AddWrite (GPUREG_GAS_LIGHT_XY , ctx -> gasLightXY );
171+ GPUCMD_AddWrite (GPUREG_GAS_LIGHT_Z , ctx -> gasLightZ );
172+ GPUCMD_AddWrite (GPUREG_GAS_LIGHT_Z_COLOR , ctx -> gasLightZColor );
173+ }
150174 }
151175 if (ctx -> flags & C3DiF_GasLut )
152176 {
0 commit comments