Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prioritize vbo over display lists #74

Merged
merged 1 commit into from
Sep 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
import logisticspipes.proxy.SimpleServiceLocator;
import logisticspipes.proxy.buildcraft.subproxies.IBCRenderTESR;
import logisticspipes.renderer.CustomBlockRenderer.RenderInfo;
import logisticspipes.renderer.newpipe.GLRenderList;
import logisticspipes.renderer.newpipe.IRenderable;
import logisticspipes.renderer.newpipe.LogisticsNewPipeItemBoxRenderer;
import logisticspipes.renderer.newpipe.LogisticsNewRenderPipe;
import logisticspipes.transport.LPTravelingItem;
Expand All @@ -68,7 +68,7 @@ public class LogisticsRenderPipe extends TileEntitySpecialRenderer {
public static LogisticsNewPipeItemBoxRenderer boxRenderer = new LogisticsNewPipeItemBoxRenderer();
public static PlayerConfig config;
private static final TravelingItemRenderer travelingItemRenderer = new TravelingItemRenderer();
private static final Map<IPipeSignData, GLRenderList> pipeSignRenderListMap = new HashMap<>();
private static final Map<IPipeSignData, IRenderable> pipeSignRenderListMap = new HashMap<>();
private static int localItemTestRenderList = -1;

private final int[] angleY = { 0, 0, 270, 90, 0, 180 };
Expand Down Expand Up @@ -331,7 +331,7 @@ private void renderSign(CoreRoutedPipe pipe, IPipeSign type, float partialTickTi
GL11.glTranslatef(-0.32F, 0.5F * signScale + 0.08F, 0.07F * signScale);

IPipeSignData data = type.getRenderData(pipe);
GLRenderList renderList = pipeSignRenderListMap.get(data);
IRenderable renderList = pipeSignRenderListMap.get(data);
if (data.isListCompatible(this)) {
if (renderList == null || renderList.isInvalid() || !renderList.isFilled()) {
renderList = SimpleServiceLocator.renderListHandler.getNewRenderList();
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/logisticspipes/renderer/newpipe/GLRenderList.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,27 @@

import org.lwjgl.opengl.GL11;

public class GLRenderList {
public class GLRenderList implements IRenderable {

private final int listID = GLAllocation.generateDisplayLists(1);
public boolean isValid = true;
private long lastUsed = System.currentTimeMillis();
private boolean isFilled = false;

@Override
public int getID() {
return listID;
}

@Override
public void startListCompile() {
if (!isValid) {
throw new UnsupportedOperationException("Can't use a removed list");
}
GL11.glNewList(listID, GL11.GL_COMPILE);
}

@Override
public void stopCompile() {
if (!isValid) {
throw new UnsupportedOperationException("Can't use a removed list");
Expand All @@ -30,6 +33,7 @@ public void stopCompile() {
isFilled = true;
}

@Override
public void render() {
if (!isValid) {
throw new UnsupportedOperationException("Can't use a removed list");
Expand All @@ -38,6 +42,7 @@ public void render() {
lastUsed = System.currentTimeMillis();
}

@Override
public boolean check() {
if (!isValid) {
return true;
Expand All @@ -49,11 +54,19 @@ public boolean check() {
return true;
}

@Override
public boolean isInvalid() {
return !isValid;
}

@Override
public boolean isFilled() {
return isFilled;
}

@Override
public void close() {
GLAllocation.deleteDisplayLists(listID);
isValid = false;
}
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
package logisticspipes.renderer.newpipe;

import static logisticspipes.LogisticsPipes.enableVBO;

import java.util.ArrayList;
import java.util.List;

import net.minecraft.client.renderer.GLAllocation;

public class GLRenderListHandler {

private List<GLRenderList> collection = new ArrayList<>();
private List<IRenderable> collection = new ArrayList<>();

public GLRenderList getNewRenderList() {
GLRenderList list = new GLRenderList();
public IRenderable getNewRenderList() {
IRenderable list = enableVBO ? new VBOList() : new GLRenderList();
collection.add(list);
return list;
}

public void tick() {
List<GLRenderList> newCollection = new ArrayList<>(collection);
for (GLRenderList ref : collection) {
List<IRenderable> newCollection = new ArrayList<>(collection);
for (IRenderable ref : collection) {
if (!ref.check()) {
GLAllocation.deleteDisplayLists(ref.getID());
ref.close();
newCollection.remove(ref);
}
}
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/logisticspipes/renderer/newpipe/IRenderable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package logisticspipes.renderer.newpipe;

public interface IRenderable {

int getID();

void startListCompile();

void stopCompile();

void render();

boolean check();

boolean isInvalid();

boolean isFilled();

void close();
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package logisticspipes.renderer.newpipe;

import static logisticspipes.LogisticsPipes.enableVBO;

import java.util.HashMap;
import java.util.Map;

Expand All @@ -11,6 +13,13 @@

import org.lwjgl.opengl.GL11;

import com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator;
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VBOManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;

import logisticspipes.LogisticsPipes;
import logisticspipes.items.LogisticsFluidContainer;
import logisticspipes.proxy.SimpleServiceLocator;
import logisticspipes.renderer.CustomBlockRenderer;
Expand All @@ -32,18 +41,18 @@ public void doRenderItem(ItemIdentifierStack itemIdentifierStack, double x, doub
GL11.glPushMatrix();

if (renderList == -1) {
renderList = GLAllocation.generateDisplayLists(1);
GL11.glNewList(renderList, GL11.GL_COMPILE);
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();
LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);
tess.draw();
GL11.glEndList();
if (enableVBO) renderList = generateInnerBoxVBO();
else renderList = generateInnerBoxDisplayList();
}

Minecraft.getMinecraft().getTextureManager().bindTexture(LogisticsNewPipeItemBoxRenderer.BLOCKS);
GL11.glTranslated(x - 0.5, y - 0.5, z - 0.5);
GL11.glCallList(renderList);

if (LogisticsPipes.enableVBO) {
VBOManager.get(renderList).render();
} else {
GL11.glCallList(renderList);
}

if (itemIdentifierStack != null && itemIdentifierStack.getItem().item instanceof LogisticsFluidContainer) {
FluidStack f = SimpleServiceLocator.logisticsFluidManager.getFluidFromContainer(itemIdentifierStack);
Expand All @@ -56,7 +65,12 @@ public void doRenderItem(ItemIdentifierStack itemIdentifierStack, double x, doub
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

GL11.glCallList(list);
if (LogisticsPipes.enableVBO) {
VBOManager.get(list).render();
} else {
GL11.glCallList(list);
}

GL11.glPopAttrib();
}
}
Expand All @@ -73,18 +87,12 @@ private int getRenderListFor(FluidStack fluid) {
if (array[pos] != 0) {
return array[pos];
}
RenderInfo block = new RenderInfo();
float ratio = pos * 1.0F / (LogisticsNewPipeItemBoxRenderer.RENDER_SIZE - 1);

RenderInfo block = new RenderInfo();
block.baseBlock = fluid.getFluid().getBlock();
block.texture = fluid.getFluid().getStillIcon();

float ratio = pos * 1.0F / (LogisticsNewPipeItemBoxRenderer.RENDER_SIZE - 1);

// CENTER HORIZONTAL

array[pos] = GLAllocation.generateDisplayLists(1);
GL11.glNewList(array[pos], 4864 /* GL_COMPILE */);

block.minX = 0.32;
block.maxX = 0.68;

Expand All @@ -94,9 +102,57 @@ private int getRenderListFor(FluidStack fluid) {
block.minZ = 0.32;
block.maxZ = 0.68;

if (enableVBO) array[pos] = generateVBO(block);
else array[pos] = generateDisplayList(block);

return array[pos];
}

private int generateDisplayList(RenderInfo block) {
int id = GLAllocation.generateDisplayLists(1);
GL11.glNewList(id, GL11.GL_COMPILE);

CustomBlockRenderer.INSTANCE.renderBlock(block, Minecraft.getMinecraft().theWorld, 0, 0, 0, false, true);

GL11.glEndList();
return array[pos];
return id;
}

private int generateVBO(RenderInfo block) {
TessellatorManager.startCapturing();

CustomBlockRenderer.INSTANCE.renderBlock(block, Minecraft.getMinecraft().theWorld, 0, 0, 0, false, true);

VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
int vboID = VBOManager.generateDisplayLists(1);
VBOManager.registerVBO(vboID, vbo);
return vboID;
}

private int generateInnerBoxDisplayList() {
int id = GLAllocation.generateDisplayLists(1);
GL11.glNewList(id, GL11.GL_COMPILE);
Tessellator tess = Tessellator.instance;
tess.startDrawingQuads();

LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);

tess.draw();
GL11.glEndList();
return id;
}

private int generateInnerBoxVBO() {
TessellatorManager.startCapturing();
CapturingTessellator tess = (CapturingTessellator) TessellatorManager.get();
tess.startDrawingQuads();
LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);
tess.draw();

VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
int vboID = VBOManager.generateDisplayLists(1);
VBOManager.registerVBO(vboID, vbo);
return vboID;
}

}
69 changes: 69 additions & 0 deletions src/main/java/logisticspipes/renderer/newpipe/VBOList.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package logisticspipes.renderer.newpipe;

import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VBOManager;
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;

public class VBOList implements IRenderable {

private final int listID = VBOManager.generateDisplayLists(1);
private boolean isValid = true;
private long lastUsed = System.currentTimeMillis();
private boolean isFilled = false;

@Override
public int getID() {
return listID;
}

@Override
public void startListCompile() {
TessellatorManager.startCapturing();
}

@Override
public void stopCompile() {
VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
VBOManager.registerVBO(listID, vbo);
isFilled = true;
}

@Override
public void render() {
if (!isValid) {
throw new UnsupportedOperationException("Can't use a removed list");
}
VBOManager.get(listID).render();
lastUsed = System.currentTimeMillis();
}

@Override
public boolean check() {
if (!isValid) {
return true;
}
if (lastUsed + 1000 * 60 < System.currentTimeMillis()) {
isValid = false;
return false;
}
return true;
}

@Override
public boolean isInvalid() {
return !isValid;
}

@Override
public boolean isFilled() {
return isFilled;
}

@Override
public void close() {
VertexBuffer buffer = VBOManager.get(listID);
buffer.close();
isValid = false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import logisticspipes.proxy.buildcraft.subproxies.IBCTilePart;
import logisticspipes.proxy.object3d.interfaces.I3DOperation;
import logisticspipes.proxy.object3d.interfaces.IModel3D;
import logisticspipes.renderer.newpipe.GLRenderList;
import logisticspipes.renderer.newpipe.IRenderable;
import logisticspipes.utils.tuples.Pair;

public class PipeRenderState implements IClientState {
Expand All @@ -28,7 +28,7 @@ public class PipeRenderState implements IClientState {
public boolean[] solidSidesCache = new boolean[6];

public int[] buffer = null;
public GLRenderList renderList;
public IRenderable renderList;
/*
* This is a placeholder for the pipe renderer to set to a value that the BlockGenericPipe->TileGenericPipe will
* then return the the WorldRenderer
Expand Down
Loading