Skip to content

Commit 25508f7

Browse files
Yeet more display lists (#74)
1 parent db99ea2 commit 25508f7

7 files changed

+190
-32
lines changed

src/main/java/logisticspipes/renderer/LogisticsRenderPipe.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import logisticspipes.proxy.SimpleServiceLocator;
4949
import logisticspipes.proxy.buildcraft.subproxies.IBCRenderTESR;
5050
import logisticspipes.renderer.CustomBlockRenderer.RenderInfo;
51-
import logisticspipes.renderer.newpipe.GLRenderList;
51+
import logisticspipes.renderer.newpipe.IRenderable;
5252
import logisticspipes.renderer.newpipe.LogisticsNewPipeItemBoxRenderer;
5353
import logisticspipes.renderer.newpipe.LogisticsNewRenderPipe;
5454
import logisticspipes.transport.LPTravelingItem;
@@ -68,7 +68,7 @@ public class LogisticsRenderPipe extends TileEntitySpecialRenderer {
6868
public static LogisticsNewPipeItemBoxRenderer boxRenderer = new LogisticsNewPipeItemBoxRenderer();
6969
public static PlayerConfig config;
7070
private static final TravelingItemRenderer travelingItemRenderer = new TravelingItemRenderer();
71-
private static final Map<IPipeSignData, GLRenderList> pipeSignRenderListMap = new HashMap<>();
71+
private static final Map<IPipeSignData, IRenderable> pipeSignRenderListMap = new HashMap<>();
7272
private static int localItemTestRenderList = -1;
7373

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

333333
IPipeSignData data = type.getRenderData(pipe);
334-
GLRenderList renderList = pipeSignRenderListMap.get(data);
334+
IRenderable renderList = pipeSignRenderListMap.get(data);
335335
if (data.isListCompatible(this)) {
336336
if (renderList == null || renderList.isInvalid() || !renderList.isFilled()) {
337337
renderList = SimpleServiceLocator.renderListHandler.getNewRenderList();

src/main/java/logisticspipes/renderer/newpipe/GLRenderList.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,27 @@
44

55
import org.lwjgl.opengl.GL11;
66

7-
public class GLRenderList {
7+
public class GLRenderList implements IRenderable {
88

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

14+
@Override
1415
public int getID() {
1516
return listID;
1617
}
1718

19+
@Override
1820
public void startListCompile() {
1921
if (!isValid) {
2022
throw new UnsupportedOperationException("Can't use a removed list");
2123
}
2224
GL11.glNewList(listID, GL11.GL_COMPILE);
2325
}
2426

27+
@Override
2528
public void stopCompile() {
2629
if (!isValid) {
2730
throw new UnsupportedOperationException("Can't use a removed list");
@@ -30,6 +33,7 @@ public void stopCompile() {
3033
isFilled = true;
3134
}
3235

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

45+
@Override
4146
public boolean check() {
4247
if (!isValid) {
4348
return true;
@@ -49,11 +54,19 @@ public boolean check() {
4954
return true;
5055
}
5156

57+
@Override
5258
public boolean isInvalid() {
5359
return !isValid;
5460
}
5561

62+
@Override
5663
public boolean isFilled() {
5764
return isFilled;
5865
}
66+
67+
@Override
68+
public void close() {
69+
GLAllocation.deleteDisplayLists(listID);
70+
isValid = false;
71+
}
5972
}

src/main/java/logisticspipes/renderer/newpipe/GLRenderListHandler.java

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package logisticspipes.renderer.newpipe;
22

3+
import static logisticspipes.LogisticsPipes.enableVBO;
4+
35
import java.util.ArrayList;
46
import java.util.List;
57

6-
import net.minecraft.client.renderer.GLAllocation;
7-
88
public class GLRenderListHandler {
99

10-
private List<GLRenderList> collection = new ArrayList<>();
10+
private List<IRenderable> collection = new ArrayList<>();
1111

12-
public GLRenderList getNewRenderList() {
13-
GLRenderList list = new GLRenderList();
12+
public IRenderable getNewRenderList() {
13+
IRenderable list = enableVBO ? new VBOList() : new GLRenderList();
1414
collection.add(list);
1515
return list;
1616
}
1717

1818
public void tick() {
19-
List<GLRenderList> newCollection = new ArrayList<>(collection);
20-
for (GLRenderList ref : collection) {
19+
List<IRenderable> newCollection = new ArrayList<>(collection);
20+
for (IRenderable ref : collection) {
2121
if (!ref.check()) {
22-
GLAllocation.deleteDisplayLists(ref.getID());
22+
ref.close();
2323
newCollection.remove(ref);
2424
}
2525
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package logisticspipes.renderer.newpipe;
2+
3+
public interface IRenderable {
4+
5+
int getID();
6+
7+
void startListCompile();
8+
9+
void stopCompile();
10+
11+
void render();
12+
13+
boolean check();
14+
15+
boolean isInvalid();
16+
17+
boolean isFilled();
18+
19+
void close();
20+
}

src/main/java/logisticspipes/renderer/newpipe/LogisticsNewPipeItemBoxRenderer.java

+74-18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package logisticspipes.renderer.newpipe;
22

3+
import static logisticspipes.LogisticsPipes.enableVBO;
4+
35
import java.util.HashMap;
46
import java.util.Map;
57

@@ -11,6 +13,13 @@
1113

1214
import org.lwjgl.opengl.GL11;
1315

16+
import com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator;
17+
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
18+
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VBOManager;
19+
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
20+
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
21+
22+
import logisticspipes.LogisticsPipes;
1423
import logisticspipes.items.LogisticsFluidContainer;
1524
import logisticspipes.proxy.SimpleServiceLocator;
1625
import logisticspipes.renderer.CustomBlockRenderer;
@@ -32,18 +41,18 @@ public void doRenderItem(ItemIdentifierStack itemIdentifierStack, double x, doub
3241
GL11.glPushMatrix();
3342

3443
if (renderList == -1) {
35-
renderList = GLAllocation.generateDisplayLists(1);
36-
GL11.glNewList(renderList, GL11.GL_COMPILE);
37-
Tessellator tess = Tessellator.instance;
38-
tess.startDrawingQuads();
39-
LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);
40-
tess.draw();
41-
GL11.glEndList();
44+
if (enableVBO) renderList = generateInnerBoxVBO();
45+
else renderList = generateInnerBoxDisplayList();
4246
}
4347

4448
Minecraft.getMinecraft().getTextureManager().bindTexture(LogisticsNewPipeItemBoxRenderer.BLOCKS);
4549
GL11.glTranslated(x - 0.5, y - 0.5, z - 0.5);
46-
GL11.glCallList(renderList);
50+
51+
if (LogisticsPipes.enableVBO) {
52+
VBOManager.get(renderList).render();
53+
} else {
54+
GL11.glCallList(renderList);
55+
}
4756

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

59-
GL11.glCallList(list);
68+
if (LogisticsPipes.enableVBO) {
69+
VBOManager.get(list).render();
70+
} else {
71+
GL11.glCallList(list);
72+
}
73+
6074
GL11.glPopAttrib();
6175
}
6276
}
@@ -73,18 +87,12 @@ private int getRenderListFor(FluidStack fluid) {
7387
if (array[pos] != 0) {
7488
return array[pos];
7589
}
76-
RenderInfo block = new RenderInfo();
90+
float ratio = pos * 1.0F / (LogisticsNewPipeItemBoxRenderer.RENDER_SIZE - 1);
7791

92+
RenderInfo block = new RenderInfo();
7893
block.baseBlock = fluid.getFluid().getBlock();
7994
block.texture = fluid.getFluid().getStillIcon();
8095

81-
float ratio = pos * 1.0F / (LogisticsNewPipeItemBoxRenderer.RENDER_SIZE - 1);
82-
83-
// CENTER HORIZONTAL
84-
85-
array[pos] = GLAllocation.generateDisplayLists(1);
86-
GL11.glNewList(array[pos], 4864 /* GL_COMPILE */);
87-
8896
block.minX = 0.32;
8997
block.maxX = 0.68;
9098

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

105+
if (enableVBO) array[pos] = generateVBO(block);
106+
else array[pos] = generateDisplayList(block);
107+
108+
return array[pos];
109+
}
110+
111+
private int generateDisplayList(RenderInfo block) {
112+
int id = GLAllocation.generateDisplayLists(1);
113+
GL11.glNewList(id, GL11.GL_COMPILE);
114+
97115
CustomBlockRenderer.INSTANCE.renderBlock(block, Minecraft.getMinecraft().theWorld, 0, 0, 0, false, true);
98116

99117
GL11.glEndList();
100-
return array[pos];
118+
return id;
119+
}
120+
121+
private int generateVBO(RenderInfo block) {
122+
TessellatorManager.startCapturing();
123+
124+
CustomBlockRenderer.INSTANCE.renderBlock(block, Minecraft.getMinecraft().theWorld, 0, 0, 0, false, true);
125+
126+
VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
127+
int vboID = VBOManager.generateDisplayLists(1);
128+
VBOManager.registerVBO(vboID, vbo);
129+
return vboID;
101130
}
131+
132+
private int generateInnerBoxDisplayList() {
133+
int id = GLAllocation.generateDisplayLists(1);
134+
GL11.glNewList(id, GL11.GL_COMPILE);
135+
Tessellator tess = Tessellator.instance;
136+
tess.startDrawingQuads();
137+
138+
LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);
139+
140+
tess.draw();
141+
GL11.glEndList();
142+
return id;
143+
}
144+
145+
private int generateInnerBoxVBO() {
146+
TessellatorManager.startCapturing();
147+
CapturingTessellator tess = (CapturingTessellator) TessellatorManager.get();
148+
tess.startDrawingQuads();
149+
LogisticsNewRenderPipe.innerTransportBox.render(LogisticsNewRenderPipe.innerBoxTexture);
150+
tess.draw();
151+
152+
VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
153+
int vboID = VBOManager.generateDisplayLists(1);
154+
VBOManager.registerVBO(vboID, vbo);
155+
return vboID;
156+
}
157+
102158
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package logisticspipes.renderer.newpipe;
2+
3+
import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager;
4+
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VBOManager;
5+
import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer;
6+
import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat;
7+
8+
public class VBOList implements IRenderable {
9+
10+
private final int listID = VBOManager.generateDisplayLists(1);
11+
private boolean isValid = true;
12+
private long lastUsed = System.currentTimeMillis();
13+
private boolean isFilled = false;
14+
15+
@Override
16+
public int getID() {
17+
return listID;
18+
}
19+
20+
@Override
21+
public void startListCompile() {
22+
TessellatorManager.startCapturing();
23+
}
24+
25+
@Override
26+
public void stopCompile() {
27+
VertexBuffer vbo = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL);
28+
VBOManager.registerVBO(listID, vbo);
29+
isFilled = true;
30+
}
31+
32+
@Override
33+
public void render() {
34+
if (!isValid) {
35+
throw new UnsupportedOperationException("Can't use a removed list");
36+
}
37+
VBOManager.get(listID).render();
38+
lastUsed = System.currentTimeMillis();
39+
}
40+
41+
@Override
42+
public boolean check() {
43+
if (!isValid) {
44+
return true;
45+
}
46+
if (lastUsed + 1000 * 60 < System.currentTimeMillis()) {
47+
isValid = false;
48+
return false;
49+
}
50+
return true;
51+
}
52+
53+
@Override
54+
public boolean isInvalid() {
55+
return !isValid;
56+
}
57+
58+
@Override
59+
public boolean isFilled() {
60+
return isFilled;
61+
}
62+
63+
@Override
64+
public void close() {
65+
VertexBuffer buffer = VBOManager.get(listID);
66+
buffer.close();
67+
isValid = false;
68+
}
69+
}

src/main/java/logisticspipes/renderer/state/PipeRenderState.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import logisticspipes.proxy.buildcraft.subproxies.IBCTilePart;
1515
import logisticspipes.proxy.object3d.interfaces.I3DOperation;
1616
import logisticspipes.proxy.object3d.interfaces.IModel3D;
17-
import logisticspipes.renderer.newpipe.GLRenderList;
17+
import logisticspipes.renderer.newpipe.IRenderable;
1818
import logisticspipes.utils.tuples.Pair;
1919

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

3030
public int[] buffer = null;
31-
public GLRenderList renderList;
31+
public IRenderable renderList;
3232
/*
3333
* This is a placeholder for the pipe renderer to set to a value that the BlockGenericPipe->TileGenericPipe will
3434
* then return the the WorldRenderer

0 commit comments

Comments
 (0)