6
6
7
7
import org .jetbrains .annotations .Nullable ;
8
8
import org .joml .Matrix4f ;
9
- import org .joml .Matrix4fStack ;
9
+ import org .joml .Quaternionf ;
10
10
11
11
import com .google .common .cache .CacheBuilder ;
12
12
import com .google .common .cache .CacheLoader ;
24
24
import com .mojang .blaze3d .platform .GlConst ;
25
25
import com .mojang .blaze3d .platform .GlStateManager ;
26
26
import com .mojang .blaze3d .systems .RenderSystem ;
27
- import com .mojang .blaze3d .systems .VertexSorter ;
28
-
29
27
import net .minecraft .client .MinecraftClient ;
30
28
import net .minecraft .client .gl .SimpleFramebuffer ;
31
- import net .minecraft .client .option .Perspective ;
32
29
import net .minecraft .client .render .BackgroundRenderer ;
33
30
import net .minecraft .client .render .BufferBuilder ;
31
+ import net .minecraft .client .render .BufferRenderer ;
34
32
import net .minecraft .client .render .Camera ;
35
33
import net .minecraft .client .render .Frustum ;
36
34
import net .minecraft .client .render .Tessellator ;
49
47
50
48
class PortalFrameBuffer implements AutoCloseable {
51
49
private static final LoadingCache <UUID , PortalFrameBuffer > CACHE = CacheBuilder .newBuilder ()
52
- .expireAfterAccess (10 , TimeUnit .SECONDS )
50
+ .expireAfterAccess (1 , TimeUnit .HOURS )
53
51
.<UUID , PortalFrameBuffer >removalListener (n -> n .getValue ().close ())
54
52
.build (CacheLoader .from (PortalFrameBuffer ::new ));
55
53
@@ -67,12 +65,12 @@ public static PortalFrameBuffer unpool(UUID id) {
67
65
@ Nullable
68
66
private SimpleFramebuffer framebuffer ;
69
67
@ Nullable
70
- private SimpleFramebuffer backgroundBuffer ;
71
- @ Nullable
72
68
private WorldRenderer renderer ;
73
69
@ Nullable
74
70
private ClientWorld world ;
75
71
72
+ private final Camera camera = new Camera ();
73
+
76
74
private boolean closed ;
77
75
78
76
private final MinecraftClient client = MinecraftClient .getInstance ();
@@ -87,11 +85,12 @@ public static PortalFrameBuffer unpool(UUID id) {
87
85
public void draw (MatrixStack matrices , VertexConsumerProvider vertices ) {
88
86
matrices .translate (0 , -0.001 , 0 );
89
87
88
+ RenderSystem .assertOnRenderThread ();
89
+ GlStateManager ._colorMask (true , true , true , false );
90
+ GlStateManager ._enableDepthTest ();
91
+ GlStateManager ._disableCull ();
92
+
90
93
if (!(closed || framebuffer == null )) {
91
- RenderSystem .assertOnRenderThread ();
92
- GlStateManager ._colorMask (true , true , true , false );
93
- GlStateManager ._enableDepthTest ();
94
- GlStateManager ._disableCull ();
95
94
Tessellator tessellator = RenderSystem .renderThreadTesselator ();
96
95
float uScale = (float )framebuffer .viewportWidth / (float )framebuffer .textureWidth ;
97
96
float vScale = (float )framebuffer .viewportHeight / (float )framebuffer .textureHeight ;
@@ -102,16 +101,17 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
102
101
103
102
RenderSystem .setTextureMatrix (SphereModel .DISK .getTextureMatrix ());
104
103
SphereModel .DISK .render (matrices , buffer , 1 , 2F , Colors .WHITE );
105
- buffer .end ();
104
+ BufferRenderer . drawWithGlobalProgram ( buffer .end () );
106
105
107
106
client .getTextureManager ().bindTexture (PlayerScreenHandler .BLOCK_ATLAS_TEXTURE );
108
- GlStateManager ._enableCull ();
109
- GlStateManager ._colorMask (true , true , true , true );
110
- GlStateManager ._depthMask (true );
111
107
} else {
112
108
Vec3d skyColor = client .world .getSkyColor (client .gameRenderer .getCamera ().getPos (), client .getRenderTickCounter ().getTickDelta (false ));
113
109
SphereModel .DISK .render (matrices , vertices .getBuffer (RenderLayers .getMagicShield ()), 0 , 0 , 2 , Color .argbToHex (1 , (float )skyColor .x , (float )skyColor .y , (float )skyColor .z ));
114
110
}
111
+
112
+ GlStateManager ._enableCull ();
113
+ GlStateManager ._colorMask (true , true , true , true );
114
+ GlStateManager ._depthMask (true );
115
115
}
116
116
117
117
public void build (PortalSpell spell , Caster <?> caster , EntityReference .EntityValues <Entity > target ) {
@@ -152,52 +152,36 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
152
152
return ;
153
153
}
154
154
155
- var fov = client .options .getFov ();
156
- int originalFov = fov .getValue ();
157
- fov .setValue (110 );
158
-
159
155
Camera camera = client .gameRenderer .getCamera ();
160
156
161
157
Entity cameraEntity = UEntities .CAST_SPELL .create (caster .asWorld ());
162
- Vec3d offset = new Vec3d (0 , 0 , -0.1F ).rotateY (-spell .getTargetYaw () * MathHelper .RADIANS_PER_DEGREE );
158
+ Vec3d offset = new Vec3d (0 , 1 , -0.1F ).rotateY (-spell .getTargetYaw () * MathHelper .RADIANS_PER_DEGREE );
163
159
164
- float yaw = spell .getTargetYaw () + camera .getYaw () - spell .getYaw () + 180 ;
165
- float pitch = spell .getTargetPitch () + (camera .getPitch () - spell .getPitch ()) * 1 .65F ;
160
+ float yaw = spell .getTargetYaw () + camera .getYaw () - spell .getYaw ();
161
+ float pitch = spell .getTargetPitch (); //MathHelper.clamp(spell.getTargetPitch() + (camera.getPitch() - spell.getPitch()) * 0 .65F, -90, 90) + 90 ;
166
162
167
163
cameraEntity .setPosition (target .pos ().add (offset ));
168
- cameraEntity .setPitch (90 + pitch );
169
- cameraEntity .setYaw (yaw );
164
+ cameraEntity .setPitch (pitch % 180 );
165
+ cameraEntity .setYaw (( yaw + 180 ) % 360 );
170
166
171
167
drawWorld (cameraEntity , 400 , 400 );
172
-
173
- fov .setValue (originalFov );
174
168
} finally {
175
169
recursionCount --;
176
170
}
177
171
}
178
172
}
179
173
180
174
private void drawWorld (Entity cameraEntity , int width , int height ) {
181
- Entity oldCameraEntity = client .cameraEntity ;
182
175
Window window = client .getWindow ();
183
176
184
- int i = window .getFramebufferWidth ();
185
- int j = window .getFramebufferHeight ();
186
-
187
- width = i ;
188
- height = j ;
177
+ int globalFramebufferWidth = window .getFramebufferWidth ();
178
+ int globalFramebufferHeight = window .getFramebufferHeight ();
189
179
190
- Perspective perspective = client . options . getPerspective () ;
191
- Matrix4fStack view = RenderSystem . getModelViewStack () ;
180
+ width = globalFramebufferWidth ;
181
+ height = globalFramebufferHeight ;
192
182
193
183
Matrix4f proj = RenderSystem .getProjectionMatrix ();
194
-
195
- int fbo = client .getFramebuffer ().fbo ;
196
- Camera camera = client .gameRenderer .getCamera ();
197
-
198
- WorldRenderer globalRenderer = client .worldRenderer ;
199
184
try {
200
- client .cameraEntity = cameraEntity ;
201
185
client .getFramebuffer ().endWrite ();
202
186
203
187
if (framebuffer == null ) {
@@ -206,15 +190,8 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
206
190
framebuffer .clear (MinecraftClient .IS_SYSTEM_MAC );
207
191
}
208
192
209
- view .pushMatrix ();
210
- view .identity ();
211
- RenderSystem .applyModelViewMatrix ();
212
-
213
193
window .setFramebufferWidth (width );
214
194
window .setFramebufferHeight (height );
215
- client .getFramebuffer ().fbo = framebuffer .fbo ;
216
-
217
- client .options .setPerspective (Perspective .FIRST_PERSON );
218
195
219
196
RenderSystem .clear (GlConst .GL_DEPTH_BUFFER_BIT | GlConst .GL_COLOR_BUFFER_BIT , MinecraftClient .IS_SYSTEM_MAC );
220
197
framebuffer .beginWrite (true );
@@ -224,17 +201,40 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
224
201
if (renderer == null ) {
225
202
renderer = new WorldRenderer (client , client .getEntityRenderDispatcher (), client .getBlockEntityRenderDispatcher (), client .getBufferBuilders ());
226
203
}
227
- if (client .world != world ) {
228
- world = client .world ;
229
- renderer .setWorld (client .world );
204
+ if (cameraEntity .getWorld () != world ) {
205
+ world = (ClientWorld )cameraEntity .getWorld ();
206
+ renderer .setWorld (world );
207
+ }
208
+ //((MixinMinecraftClient)client).setWorldRenderer(renderer);
209
+
210
+ var tickCounter = client .getRenderTickCounter ();
211
+
212
+ camera .update (world , cameraEntity , false , false , 1 );
213
+
214
+ double fov = 110 ;
215
+ Matrix4f projectionMatrix = client .gameRenderer .getBasicProjectionMatrix (fov );
216
+ Matrix4f cameraTransform = new Matrix4f ().rotation (camera .getRotation ().conjugate (new Quaternionf ()));
217
+
218
+ client .gameRenderer .loadProjectionMatrix (projectionMatrix );
219
+ /*renderer.scheduleBlockRenders(
220
+ ChunkSectionPos.getSectionCoord((int)cameraEntity.getX()),
221
+ ChunkSectionPos.getSectionCoord((int)cameraEntity.getY()),
222
+ ChunkSectionPos.getSectionCoord((int)cameraEntity.getZ())
223
+ );*/
224
+ renderer .setupFrustum (
225
+ camera .getPos (),
226
+ cameraTransform ,
227
+ client .gameRenderer .getBasicProjectionMatrix (Math .max (fov , this .client .options .getFov ().getValue ().intValue ()))
228
+ );
229
+ try {
230
+ renderer .render (tickCounter , false , camera , client .gameRenderer ,
231
+ client .gameRenderer .getLightmapTextureManager (),
232
+ cameraTransform ,
233
+ projectionMatrix
234
+ );
235
+ } catch (Throwable t ) {
236
+ close ();
230
237
}
231
- ((MixinMinecraftClient )client ).setWorldRenderer (renderer );
232
-
233
- renderer .scheduleBlockRenders ((int )cameraEntity .getX () / 16 , (int )cameraEntity .getY () / 16 , (int )cameraEntity .getZ () / 16 );
234
-
235
- client .gameRenderer .setRenderHand (false );
236
-
237
- client .gameRenderer .renderWorld (client .getRenderTickCounter ());
238
238
239
239
// Strip transparency
240
240
RenderSystem .colorMask (false , false , false , true );
@@ -244,48 +244,27 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
244
244
245
245
framebuffer .endWrite ();
246
246
} finally {
247
- ((MixinMinecraftClient )client ).setWorldRenderer (globalRenderer );
248
-
249
- client .getFramebuffer ().fbo = fbo ;
250
247
client .getFramebuffer ().beginWrite (true );
248
+ client .gameRenderer .loadProjectionMatrix (proj );
251
249
252
- view .popMatrix ();
253
- RenderSystem .applyModelViewMatrix ();
254
- RenderSystem .setProjectionMatrix (proj , VertexSorter .BY_Z );
255
-
256
- window .setFramebufferWidth (i );
257
- window .setFramebufferHeight (j );
258
-
259
- client .options .setPerspective (perspective );
260
- client .cameraEntity = oldCameraEntity ;
261
-
262
- if (recursionCount <= 1 ) {
263
- client .gameRenderer .setRenderHand (true );
264
- camera .update (client .world ,
265
- client .getCameraEntity () == null ? client .player : client .getCameraEntity (),
266
- perspective .isFirstPerson (),
267
- perspective .isFrontView (),
268
- 1
269
- );
270
- }
250
+ window .setFramebufferWidth (globalFramebufferWidth );
251
+ window .setFramebufferHeight (globalFramebufferHeight );
271
252
}
272
253
}
273
254
274
255
@ Override
275
256
public void close () {
276
- closed = true ;
277
- if (framebuffer != null ) {
278
- SimpleFramebuffer fb = framebuffer ;
279
- framebuffer = null ;
280
- fb .delete ();
281
- }
282
- if (backgroundBuffer != null ) {
283
- SimpleFramebuffer fb = backgroundBuffer ;
284
- backgroundBuffer = null ;
285
- fb .delete ();
286
- }
287
- if (renderer != null ) {
288
- renderer .close ();
257
+ synchronized (client ) {
258
+ closed = true ;
259
+ if (framebuffer != null ) {
260
+ SimpleFramebuffer fb = framebuffer ;
261
+ framebuffer = null ;
262
+ fb .delete ();
263
+ }
264
+ if (renderer != null ) {
265
+ renderer .getChunkBuilder ().stop ();
266
+ renderer .close ();
267
+ }
289
268
}
290
269
}
291
270
}
0 commit comments