diff --git a/src/main/java/com/jozufozu/flywheel/backend/core/BufferedArrayModel.java b/src/main/java/com/jozufozu/flywheel/backend/core/BufferedArrayModel.java new file mode 100644 index 000000000..ef8fddee2 --- /dev/null +++ b/src/main/java/com/jozufozu/flywheel/backend/core/BufferedArrayModel.java @@ -0,0 +1,48 @@ +package com.jozufozu.flywheel.backend.core; + +import java.nio.ByteBuffer; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + +import com.jozufozu.flywheel.backend.gl.GlVertexArray; +import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; +import com.jozufozu.flywheel.util.AttribUtil; + +public class BufferedArrayModel extends BufferedModel { + + protected GlVertexArray vao; + + public BufferedArrayModel(VertexFormat format, ByteBuffer data, int vertices) { + super(format, data, vertices); + + vao = new GlVertexArray(); + + vao.bind(); + + // bind the model's vbo to our vao + vbo.bind(); + getFormat().vertexAttribPointers(0); + vbo.unbind(); + + // enable all the attribute arrays in our vao. we only need to do this once + AttribUtil.enableArrays(getAttributeCount()); + vao.unbind(); + } + + public void render() { + if (vertexCount <= 0 || deleted) return; + + vao.bind(); + + GL20.glDrawArrays(GL11.GL_QUADS, 0, vertexCount); + + vao.unbind(); + } + + @Override + public void delete() { + super.delete(); + vao.delete(); + } +} diff --git a/src/main/java/com/jozufozu/flywheel/backend/core/BufferedModel.java b/src/main/java/com/jozufozu/flywheel/backend/core/BufferedModel.java index 74c187d76..ab79726f8 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/core/BufferedModel.java +++ b/src/main/java/com/jozufozu/flywheel/backend/core/BufferedModel.java @@ -22,7 +22,7 @@ public class BufferedModel { protected final VertexFormat format; protected final int vertexCount; protected GlBuffer vbo; - private boolean removed; + protected boolean deleted; public BufferedModel(VertexFormat format, ByteBuffer data, int vertices) { this.data = data; @@ -62,7 +62,7 @@ public class BufferedModel { * Renders this model, checking first if there is anything to render. */ public void render() { - if (vertexCount <= 0 || removed) return; + if (vertexCount <= 0 || deleted) return; // TODO: minecraft sometimes leaves its state dirty on launch. this is a hack glDisableClientState(GL_VERTEX_ARRAY); @@ -84,9 +84,9 @@ public class BufferedModel { } public void delete() { - if (removed) return; + if (deleted) return; - removed = true; + deleted = true; vbo.delete(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index d8a4aae08..40dce589a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -10,6 +10,7 @@ import java.util.Map; import javax.annotation.Nullable; import com.jozufozu.flywheel.backend.Backend; +import com.jozufozu.flywheel.backend.core.BufferedArrayModel; import com.jozufozu.flywheel.backend.core.BufferedModel; import com.jozufozu.flywheel.backend.gl.attrib.CommonAttributes; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; @@ -192,6 +193,9 @@ public class RenderedContraption extends ContraptionWorldHolder { to.rewind(); - return new BufferedModel(format, to, vertexCount); + if (Backend.compat.vertexArrayObjectsSupported()) + return new BufferedArrayModel(format, to, vertexCount); + else + return new BufferedModel(format, to, vertexCount); } }