Skip to content

Commit 6215252

Browse files
committed
Fix fancy portal rendering
1 parent 3603819 commit 6215252

File tree

1 file changed

+71
-92
lines changed

1 file changed

+71
-92
lines changed

src/main/java/com/minelittlepony/unicopia/client/render/spell/PortalFrameBuffer.java

+71-92
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import org.jetbrains.annotations.Nullable;
88
import org.joml.Matrix4f;
9-
import org.joml.Matrix4fStack;
9+
import org.joml.Quaternionf;
1010

1111
import com.google.common.cache.CacheBuilder;
1212
import com.google.common.cache.CacheLoader;
@@ -24,13 +24,11 @@
2424
import com.mojang.blaze3d.platform.GlConst;
2525
import com.mojang.blaze3d.platform.GlStateManager;
2626
import com.mojang.blaze3d.systems.RenderSystem;
27-
import com.mojang.blaze3d.systems.VertexSorter;
28-
2927
import net.minecraft.client.MinecraftClient;
3028
import net.minecraft.client.gl.SimpleFramebuffer;
31-
import net.minecraft.client.option.Perspective;
3229
import net.minecraft.client.render.BackgroundRenderer;
3330
import net.minecraft.client.render.BufferBuilder;
31+
import net.minecraft.client.render.BufferRenderer;
3432
import net.minecraft.client.render.Camera;
3533
import net.minecraft.client.render.Frustum;
3634
import net.minecraft.client.render.Tessellator;
@@ -49,7 +47,7 @@
4947

5048
class PortalFrameBuffer implements AutoCloseable {
5149
private static final LoadingCache<UUID, PortalFrameBuffer> CACHE = CacheBuilder.newBuilder()
52-
.expireAfterAccess(10, TimeUnit.SECONDS)
50+
.expireAfterAccess(1, TimeUnit.HOURS)
5351
.<UUID, PortalFrameBuffer>removalListener(n -> n.getValue().close())
5452
.build(CacheLoader.from(PortalFrameBuffer::new));
5553

@@ -67,12 +65,12 @@ public static PortalFrameBuffer unpool(UUID id) {
6765
@Nullable
6866
private SimpleFramebuffer framebuffer;
6967
@Nullable
70-
private SimpleFramebuffer backgroundBuffer;
71-
@Nullable
7268
private WorldRenderer renderer;
7369
@Nullable
7470
private ClientWorld world;
7571

72+
private final Camera camera = new Camera();
73+
7674
private boolean closed;
7775

7876
private final MinecraftClient client = MinecraftClient.getInstance();
@@ -87,11 +85,12 @@ public static PortalFrameBuffer unpool(UUID id) {
8785
public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
8886
matrices.translate(0, -0.001, 0);
8987

88+
RenderSystem.assertOnRenderThread();
89+
GlStateManager._colorMask(true, true, true, false);
90+
GlStateManager._enableDepthTest();
91+
GlStateManager._disableCull();
92+
9093
if (!(closed || framebuffer == null)) {
91-
RenderSystem.assertOnRenderThread();
92-
GlStateManager._colorMask(true, true, true, false);
93-
GlStateManager._enableDepthTest();
94-
GlStateManager._disableCull();
9594
Tessellator tessellator = RenderSystem.renderThreadTesselator();
9695
float uScale = (float)framebuffer.viewportWidth / (float)framebuffer.textureWidth;
9796
float vScale = (float)framebuffer.viewportHeight / (float)framebuffer.textureHeight;
@@ -102,16 +101,17 @@ public void draw(MatrixStack matrices, VertexConsumerProvider vertices) {
102101

103102
RenderSystem.setTextureMatrix(SphereModel.DISK.getTextureMatrix());
104103
SphereModel.DISK.render(matrices, buffer, 1, 2F, Colors.WHITE);
105-
buffer.end();
104+
BufferRenderer.drawWithGlobalProgram(buffer.end());
106105

107106
client.getTextureManager().bindTexture(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE);
108-
GlStateManager._enableCull();
109-
GlStateManager._colorMask(true, true, true, true);
110-
GlStateManager._depthMask(true);
111107
} else {
112108
Vec3d skyColor = client.world.getSkyColor(client.gameRenderer.getCamera().getPos(), client.getRenderTickCounter().getTickDelta(false));
113109
SphereModel.DISK.render(matrices, vertices.getBuffer(RenderLayers.getMagicShield()), 0, 0, 2, Color.argbToHex(1, (float)skyColor.x, (float)skyColor.y, (float)skyColor.z));
114110
}
111+
112+
GlStateManager._enableCull();
113+
GlStateManager._colorMask(true, true, true, true);
114+
GlStateManager._depthMask(true);
115115
}
116116

117117
public void build(PortalSpell spell, Caster<?> caster, EntityReference.EntityValues<Entity> target) {
@@ -152,52 +152,36 @@ private void innerBuild(PortalSpell spell, Caster<?> caster, EntityReference.Ent
152152
return;
153153
}
154154

155-
var fov = client.options.getFov();
156-
int originalFov = fov.getValue();
157-
fov.setValue(110);
158-
159155
Camera camera = client.gameRenderer.getCamera();
160156

161157
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);
163159

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;
166162

167163
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);
170166

171167
drawWorld(cameraEntity, 400, 400);
172-
173-
fov.setValue(originalFov);
174168
} finally {
175169
recursionCount--;
176170
}
177171
}
178172
}
179173

180174
private void drawWorld(Entity cameraEntity, int width, int height) {
181-
Entity oldCameraEntity = client.cameraEntity;
182175
Window window = client.getWindow();
183176

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();
189179

190-
Perspective perspective = client.options.getPerspective();
191-
Matrix4fStack view = RenderSystem.getModelViewStack();
180+
width = globalFramebufferWidth;
181+
height = globalFramebufferHeight;
192182

193183
Matrix4f proj = RenderSystem.getProjectionMatrix();
194-
195-
int fbo = client.getFramebuffer().fbo;
196-
Camera camera = client.gameRenderer.getCamera();
197-
198-
WorldRenderer globalRenderer = client.worldRenderer;
199184
try {
200-
client.cameraEntity = cameraEntity;
201185
client.getFramebuffer().endWrite();
202186

203187
if (framebuffer == null) {
@@ -206,15 +190,8 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
206190
framebuffer.clear(MinecraftClient.IS_SYSTEM_MAC);
207191
}
208192

209-
view.pushMatrix();
210-
view.identity();
211-
RenderSystem.applyModelViewMatrix();
212-
213193
window.setFramebufferWidth(width);
214194
window.setFramebufferHeight(height);
215-
client.getFramebuffer().fbo = framebuffer.fbo;
216-
217-
client.options.setPerspective(Perspective.FIRST_PERSON);
218195

219196
RenderSystem.clear(GlConst.GL_DEPTH_BUFFER_BIT | GlConst.GL_COLOR_BUFFER_BIT, MinecraftClient.IS_SYSTEM_MAC);
220197
framebuffer.beginWrite(true);
@@ -224,17 +201,40 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
224201
if (renderer == null) {
225202
renderer = new WorldRenderer(client, client.getEntityRenderDispatcher(), client.getBlockEntityRenderDispatcher(), client.getBufferBuilders());
226203
}
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();
230237
}
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());
238238

239239
// Strip transparency
240240
RenderSystem.colorMask(false, false, false, true);
@@ -244,48 +244,27 @@ private void drawWorld(Entity cameraEntity, int width, int height) {
244244

245245
framebuffer.endWrite();
246246
} finally {
247-
((MixinMinecraftClient)client).setWorldRenderer(globalRenderer);
248-
249-
client.getFramebuffer().fbo = fbo;
250247
client.getFramebuffer().beginWrite(true);
248+
client.gameRenderer.loadProjectionMatrix(proj);
251249

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);
271252
}
272253
}
273254

274255
@Override
275256
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+
}
289268
}
290269
}
291270
}

0 commit comments

Comments
 (0)