1
1
package fun .qu_an .minecraft .asyncparticles .client ;
2
2
3
3
import com .mojang .blaze3d .pipeline .RenderTarget ;
4
+ import com .mojang .blaze3d .systems .RenderSystem ;
4
5
import com .mojang .blaze3d .vertex .BufferBuilder ;
5
6
import com .mojang .blaze3d .vertex .PoseStack ;
7
+ import com .mojang .blaze3d .vertex .Tesselator ;
6
8
import com .mojang .blaze3d .vertex .VertexFormat ;
7
9
import com .mojang .logging .LogUtils ;
10
+ import fun .qu_an .minecraft .asyncparticles .client .addon .ParticleAddon ;
8
11
import fun .qu_an .minecraft .asyncparticles .client .util .FakeBufferBuilder ;
9
12
import fun .qu_an .minecraft .asyncparticles .client .util .FakeTesselator ;
10
13
import fun .qu_an .minecraft .asyncparticles .client .util .TryAndStoreFakeBufferBuilder ;
15
18
import net .irisshaders .iris .fantastic .PhasedParticleEngine ;
16
19
import net .irisshaders .iris .pipeline .WorldRenderingPipeline ;
17
20
import net .irisshaders .iris .shaderpack .properties .ParticleRenderingSettings ;
21
+ import net .minecraft .CrashReport ;
22
+ import net .minecraft .CrashReportCategory ;
23
+ import net .minecraft .ReportedException ;
18
24
import net .minecraft .Util ;
19
25
import net .minecraft .client .Camera ;
20
26
import net .minecraft .client .Minecraft ;
@@ -153,8 +159,39 @@ public static void start(PoseStack poseStack, float f, Camera camera, LightTextu
153
159
profiler .pop ();
154
160
}
155
161
162
+ public static void join (PoseStack poseStack , float f , Camera camera , LightTexture lightTexture ) {
163
+ if (isMixedRenderingSetting ()) {
164
+ return ;
165
+ }
166
+ Minecraft mc = Minecraft .getInstance ();
167
+ ProfilerFiller profiler = mc .getProfiler ();
168
+ profiler .popPush ("async_particles" );
169
+ LevelRenderer levelRenderer = mc .levelRenderer ;
170
+ if (levelRenderer .transparencyChain != null ) {
171
+ RenderTarget particlesTarget = levelRenderer .getParticlesTarget ();
172
+ particlesTarget .clear (Minecraft .ON_OSX );
173
+ particlesTarget .copyDepthFrom (mc .getMainRenderTarget ());
174
+ RenderStateShard .PARTICLES_TARGET .setupRenderState ();
175
+ }
176
+ profiler .push ("wait_for_async_tasks" );
177
+ asyncTask .join ();
178
+ profiler .pop ();
179
+ isStart = false ;
180
+
181
+ MultiBufferSource .BufferSource bufferSource = mc .levelRenderer .renderBuffers .bufferSource ();
182
+ ParticleEngine particleEngine = mc .particleEngine ;
183
+ if (ModListHelper .IRIS_LIKE_LOADED ) {
184
+ ((PhasedParticleEngine ) particleEngine ).setParticleRenderingPhase (ParticleRenderingPhase .EVERYTHING );
185
+ }
186
+ particleEngine .render (poseStack , bufferSource , lightTexture , camera , f );
187
+
188
+ if (levelRenderer .transparencyChain != null ) {
189
+ RenderStateShard .PARTICLES_TARGET .clearRenderState ();
190
+ }
191
+ }
192
+
156
193
public static void irisOpaque (PoseStack poseStack , float f , Camera camera , LightTexture lightTexture ) {
157
- if (!ModListHelper . IRIS_LIKE_LOADED || ! IrisApi . getInstance (). isShaderPackInUse () || getRenderingSettings () != ParticleRenderingSettings . MIXED ) {
194
+ if (!isMixedRenderingSetting () ) {
158
195
return ;
159
196
}
160
197
Minecraft mc = Minecraft .getInstance ();
@@ -171,10 +208,18 @@ public static void irisOpaque(PoseStack poseStack, float f, Camera camera, Light
171
208
ParticleEngine particleEngine = mc .particleEngine ;
172
209
((PhasedParticleEngine ) particleEngine ).setParticleRenderingPhase (ParticleRenderingPhase .OPAQUE );
173
210
particleEngine .render (poseStack , bufferSource , lightTexture , camera , f );
211
+
212
+ if (levelRenderer .getItemEntityTarget () != null ) {
213
+ levelRenderer .getItemEntityTarget ().clear (Minecraft .ON_OSX );
214
+ levelRenderer .getItemEntityTarget ().copyDepthFrom (mc .getMainRenderTarget ());
215
+ mc .getMainRenderTarget ().bindWrite (false );
216
+ }
217
+ // poseStack1.last().pose().set(pose);
218
+ // RenderSystem.applyModelViewMatrix();
174
219
}
175
220
176
221
public static void irisTranslucent (PoseStack poseStack , float f , Camera camera , LightTexture lightTexture ) {
177
- if (!ModListHelper . IRIS_LIKE_LOADED || ! IrisApi . getInstance (). isShaderPackInUse () || getRenderingSettings () != ParticleRenderingSettings . MIXED ) {
222
+ if (!isMixedRenderingSetting () ) {
178
223
return ;
179
224
}
180
225
Minecraft mc = Minecraft .getInstance ();
@@ -198,35 +243,69 @@ public static void irisTranslucent(PoseStack poseStack, float f, Camera camera,
198
243
}
199
244
}
200
245
201
- public static void join (PoseStack poseStack , float f , Camera camera , LightTexture lightTexture ) {
202
- if (ModListHelper .IRIS_LIKE_LOADED && IrisApi .getInstance ().isShaderPackInUse () && getRenderingSettings () == ParticleRenderingSettings .MIXED ) {
246
+ // FIXME: 这是个临时解决方案,最好找出 ModelMatrixStack 错乱的原因
247
+ public static void irisSync (PoseStack poseStack , float f , Camera camera , LightTexture lightTexture ) {
248
+ if (!isMixedRenderingSetting ()) {
203
249
return ;
204
250
}
251
+ PoseStack poseStack2 = null ;
205
252
Minecraft mc = Minecraft .getInstance ();
206
- ProfilerFiller profiler = mc .getProfiler ();
207
- profiler .popPush ("async_particles" );
208
- LevelRenderer levelRenderer = mc .levelRenderer ;
209
- if (levelRenderer .transparencyChain != null ) {
210
- RenderTarget particlesTarget = levelRenderer .getParticlesTarget ();
211
- particlesTarget .clear (Minecraft .ON_OSX );
212
- particlesTarget .copyDepthFrom (mc .getMainRenderTarget ());
213
- RenderStateShard .PARTICLES_TARGET .setupRenderState ();
214
- }
215
- profiler .push ("wait_for_async_tasks" );
216
- asyncTask .join ();
217
- profiler .pop ();
218
- isStart = false ;
219
-
220
- MultiBufferSource .BufferSource bufferSource = mc .levelRenderer .renderBuffers .bufferSource ();
221
253
ParticleEngine particleEngine = mc .particleEngine ;
222
- if (ModListHelper .IRIS_LIKE_LOADED ) {
223
- ((PhasedParticleEngine ) particleEngine ).setParticleRenderingPhase (ParticleRenderingPhase .EVERYTHING );
254
+ for (Map .Entry <ParticleRenderType , Queue <Particle >> entry : particleEngine .particles .entrySet ()) {
255
+ ParticleRenderType particleRenderType = entry .getKey ();
256
+ if (particleRenderType == ParticleRenderType .NO_RENDER ) {
257
+ continue ;
258
+ }
259
+ Queue <Particle > queue = entry .getValue ();
260
+ if (queue .isEmpty ()
261
+ || FORMATS .get (particleRenderType ) != EMPTY_FORMAT ) {
262
+ continue ;
263
+ }
264
+ if (poseStack2 == null ) {
265
+ lightTexture .turnOnLightLayer ();
266
+ RenderSystem .enableDepthTest ();
267
+ poseStack2 = RenderSystem .getModelViewStack ();
268
+ poseStack2 .pushPose ();
269
+ poseStack2 .mulPoseMatrix (poseStack .last ().pose ());
270
+ RenderSystem .applyModelViewMatrix ();
271
+ }
272
+ particleRenderType .begin (FakeBufferBuilder .INSTANCE , particleEngine .textureManager );
273
+ for (Particle particle : queue ) {
274
+ renderSync0 (f , camera , particle , FakeBufferBuilder .INSTANCE , particleRenderType );
275
+ }
224
276
}
225
- particleEngine .render (poseStack , bufferSource , lightTexture , camera , f );
277
+ if (poseStack2 != null ) {
278
+ poseStack2 .popPose ();
279
+ RenderSystem .applyModelViewMatrix ();
280
+ RenderSystem .depthMask (true );
281
+ RenderSystem .disableBlend ();
282
+ lightTexture .turnOffLightLayer ();
283
+ }
284
+ }
226
285
227
- if (levelRenderer .transparencyChain != null ) {
228
- RenderStateShard .PARTICLES_TARGET .clearRenderState ();
286
+ private static void renderSync0 (float f , Camera camera , Particle particle , BufferBuilder bufferBuilder , ParticleRenderType particleRenderType ) {
287
+ if (!particle .isAlive ()) {
288
+ return ;
289
+ }
290
+ if (((ParticleAddon ) particle ).shouldCull () && !frustum .isVisible (particle .getBoundingBox ())) {
291
+ return ;
229
292
}
293
+ float g = ((ParticleAddon ) particle ).asyncParticles$isTicked () ? f : f + 1f ;
294
+ try {
295
+ particle .render (bufferBuilder , camera , g );
296
+ } catch (Throwable throwable ) {
297
+ CrashReport crashReport = CrashReport .forThrowable (throwable , "Rendering Particle" );
298
+ CrashReportCategory crashReportCategory = crashReport .addCategory ("Particle being rendered" );
299
+ Objects .requireNonNull (particle );
300
+ crashReportCategory .setDetail ("Particle" , particle ::toString );
301
+ Objects .requireNonNull (particleRenderType );
302
+ crashReportCategory .setDetail ("Particle Type" , particleRenderType ::toString );
303
+ throw new ReportedException (crashReport );
304
+ }
305
+ }
306
+
307
+ public static boolean isMixedRenderingSetting () {
308
+ return ModListHelper .IRIS_LIKE_LOADED && IrisApi .getInstance ().isShaderPackInUse () && getRenderingSettings () == ParticleRenderingSettings .MIXED ;
230
309
}
231
310
232
311
private static ParticleRenderingSettings getRenderingSettings () {
@@ -302,7 +381,7 @@ public static void recordSync(ParticleRenderType particleRenderType, Particle pa
302
381
}
303
382
}
304
383
305
- public static List <? extends Particle > getSync (ParticleRenderType particleRenderType ) {
384
+ public static List <Particle > getSync (ParticleRenderType particleRenderType ) {
306
385
List <Particle > list = SYNC_PARTICLES .get (particleRenderType );
307
386
return list == null ? List .of () : list ;
308
387
}
0 commit comments