Keeping up

- Contraptions always use ArrayModelRenderer
 - De-duplicate UI framebuffer swapping code
 - Unbind VAO between contraption structure drawing and engine drawing
 - Bump flywheel build
This commit is contained in:
Jozufozu 2021-12-07 23:15:09 -08:00
parent 5ad0d1d704
commit a3476fd54c
6 changed files with 32 additions and 60 deletions

View File

@ -19,7 +19,7 @@ parchment_version = 2021.10.31
# dependency versions
registrate_version = MC1.18-1.0.21
flywheel_version = 1.18-0.3.0.1
flywheel_version = 1.18-0.3.0.3
jei_version = 9.0.0.40
# curseforge information

View File

@ -5,6 +5,7 @@ import static org.lwjgl.opengl.GL12.GL_TEXTURE_3D;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.GlTextureUnit;
import com.jozufozu.flywheel.backend.gl.GlVertexArray;
import com.jozufozu.flywheel.backend.state.RenderLayer;
import com.jozufozu.flywheel.event.RenderLayerEvent;
import com.jozufozu.flywheel.util.TextureBinder;
@ -55,11 +56,13 @@ public class FlwContraptionManager extends ContraptionRenderManager<RenderedCont
renderedContraption.doRenderLayer(layer, structureShader);
}
GlVertexArray.unbind();
if (Backend.getInstance().canUseInstancing()) {
RenderLayer renderLayer = event.getLayer();
if (renderLayer != null) {
for (RenderedContraption renderer : visible) {
renderer.materialManager.render(event, event.buffers.bufferSource());
renderer.engine.render(event, event.buffers.bufferSource());
}
}
}

View File

@ -34,7 +34,7 @@ public class RenderedContraption extends ContraptionRenderInfo {
private final ContraptionLighter<?> lighter;
public final InstancingEngine<ContraptionProgram> materialManager;
public final InstancingEngine<ContraptionProgram> engine;
public final ContraptionInstanceManager kinetics;
private final Map<RenderType, ModelRenderer> renderLayers = new HashMap<>();
@ -47,12 +47,12 @@ public class RenderedContraption extends ContraptionRenderInfo {
public RenderedContraption(Contraption contraption, PlacementSimulationWorld renderWorld) {
super(contraption, renderWorld);
this.lighter = contraption.makeLighter();
this.materialManager = InstancingEngine.builder(CreateContexts.CWORLD)
this.engine = InstancingEngine.builder(CreateContexts.CWORLD)
.setGroupFactory(ContraptionGroup.forContraption(this))
.setIgnoreOriginCoordinate(true)
.build();
this.kinetics = new ContraptionInstanceManager(this, materialManager);
this.materialManager.addListener(this.kinetics);
this.kinetics = new ContraptionInstanceManager(this, engine);
this.engine.addListener(this.kinetics);
buildLayers();
if (Backend.getInstance().canUseInstancing()) {
@ -113,7 +113,7 @@ public class RenderedContraption extends ContraptionRenderInfo {
lighter.delete();
materialManager.delete();
engine.delete();
kinetics.invalidate();
}
@ -129,13 +129,7 @@ public class RenderedContraption extends ContraptionRenderInfo {
for (RenderType layer : blockLayers) {
Supplier<IModel> layerModel = () -> new WorldModel(renderWorld, layer, contraption.getBlocks().values(), layer + "_" + contraption.entity.getId());
ModelRenderer renderer;
if (Backend.getInstance().compat.vertexArrayObjectsSupported())
renderer = new ArrayModelRenderer(layerModel);
else
renderer = new ModelRenderer(layerModel);
renderLayers.put(layer, renderer);
renderLayers.put(layer, new ArrayModelRenderer(layerModel));
}
}

View File

@ -9,13 +9,8 @@ import javax.annotation.Nonnull;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.TriConsumer;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.versioned.GlCompat;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
@ -98,29 +93,13 @@ public abstract class ConfigScreen extends AbstractSimiScreen {
@Override
protected void prepareFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId);
functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.frameBufferId);
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId);
UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer);
RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX);
}
@Override
protected void endFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId);
functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.frameBufferId);
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, mainBuffer.frameBufferId);
UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget());
}
@Override

View File

@ -6,13 +6,8 @@ import java.util.function.Consumer;
import javax.annotation.Nonnull;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.gl.versioned.GlCompat;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.foundation.gui.element.BoxElement;
@ -214,31 +209,16 @@ public class ConfirmationScreen extends AbstractSimiScreen {
this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010);
}
@Override
protected void prepareFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, mainBuffer.frameBufferId);
functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, thisBuffer.frameBufferId);
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, thisBuffer.frameBufferId);
UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer);
RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX);
}
@Override
protected void endFrame() {
RenderTarget thisBuffer = UIRenderHelper.framebuffer;
RenderTarget mainBuffer = minecraft.getMainRenderTarget();
GlCompat functions = Backend.getInstance().compat;
functions.fbo.bindFramebuffer(GL30.GL_READ_FRAMEBUFFER, thisBuffer.frameBufferId);
functions.fbo.bindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, mainBuffer.frameBufferId);
functions.blit.blitFramebuffer(0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, 0, 0, mainBuffer.viewWidth, mainBuffer.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
functions.fbo.bindFramebuffer(GlConst.GL_FRAMEBUFFER, mainBuffer.frameBufferId);
UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget());
}
@Override

View File

@ -2,7 +2,12 @@ package com.simibubi.create.foundation.gui;
import javax.annotation.Nonnull;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.BufferBuilder;
@ -252,6 +257,17 @@ public class UIRenderHelper {
poseStack.mulPoseMatrix(Matrix4f.createScaleMatrix(1, -1, 1));
}
/**
* Switch from src to dst, after copying the contents of src to dst.
*/
public static void swapAndBlitColor(RenderTarget src, RenderTarget dst) {
GlStateManager._glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, src.frameBufferId);
GlStateManager._glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dst.frameBufferId);
GlStateManager._glBlitFrameBuffer(0, 0, src.viewWidth, src.viewHeight, 0, 0, dst.viewWidth, dst.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR);
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId);
}
public static class CustomRenderTarget extends RenderTarget {
public CustomRenderTarget(boolean pUseDepth) {