mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-12-27 07:26:48 +01:00
Buffer building changes
- Remove ShadeSeparatedBufferBuilder and use Pair<RenderedBuffer, Integer> instead to properly support 1.19's buffer changes - Add ModelUtil#isVirtual to check if a ModelData is virtual
This commit is contained in:
parent
be78f92df6
commit
c4942ca29e
8 changed files with 44 additions and 66 deletions
|
@ -1,6 +1,5 @@
|
|||
package com.jozufozu.flywheel.core.model;
|
||||
|
||||
import java.lang.management.MemoryUsage;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
@ -8,18 +7,17 @@ import org.lwjgl.system.MemoryUtil;
|
|||
|
||||
import com.jozufozu.flywheel.api.vertex.VertexList;
|
||||
import com.jozufozu.flywheel.api.vertex.VertexType;
|
||||
import com.jozufozu.flywheel.backend.gl.GlNumericType;
|
||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBuffer;
|
||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBufferType;
|
||||
import com.jozufozu.flywheel.backend.gl.buffer.GlBufferUsage;
|
||||
import com.jozufozu.flywheel.backend.gl.buffer.MappedGlBuffer;
|
||||
import com.jozufozu.flywheel.backend.model.ElementBuffer;
|
||||
import com.jozufozu.flywheel.core.Formats;
|
||||
import com.jozufozu.flywheel.core.QuadConverter;
|
||||
import com.jozufozu.flywheel.util.Pair;
|
||||
import com.mojang.blaze3d.platform.MemoryTracker;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexBuffer;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.resources.model.BakedModel;
|
||||
|
@ -54,11 +52,10 @@ public class BlockModel implements Model {
|
|||
this(bufferable.build(), name);
|
||||
}
|
||||
|
||||
public BlockModel(ShadeSeparatedBufferBuilder buffer, String name) {
|
||||
public BlockModel(Pair<RenderedBuffer, Integer> pair, String name) {
|
||||
this.name = name;
|
||||
|
||||
BufferBuilder.RenderedBuffer renderedBuffer = buffer.endOrDiscardIfEmpty();
|
||||
|
||||
RenderedBuffer renderedBuffer = pair.first();
|
||||
if (renderedBuffer == null) {
|
||||
reader = null;
|
||||
eboSupplier = () -> null;
|
||||
|
@ -67,7 +64,7 @@ public class BlockModel implements Model {
|
|||
|
||||
BufferBuilder.DrawState drawState = renderedBuffer.drawState();
|
||||
|
||||
reader = Formats.BLOCK.createReader(renderedBuffer, buffer.getUnshadedStartVertex());
|
||||
reader = Formats.BLOCK.createReader(renderedBuffer, pair.second());
|
||||
|
||||
if (drawState.sequentialIndex()) {
|
||||
ByteBuffer src = renderedBuffer.indexBuffer();
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
|
||||
package com.jozufozu.flywheel.core.model;
|
||||
|
||||
import com.jozufozu.flywheel.util.Pair;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
||||
import com.mojang.blaze3d.vertex.VertexConsumer;
|
||||
|
||||
import net.minecraft.client.renderer.block.ModelBlockRenderer;
|
||||
|
@ -12,7 +14,7 @@ import net.minecraft.util.RandomSource;
|
|||
public interface Bufferable {
|
||||
void bufferInto(ModelBlockRenderer renderer, VertexConsumer consumer, RandomSource random);
|
||||
|
||||
default ShadeSeparatedBufferBuilder build() {
|
||||
return ModelUtil.getBufferBuilder(this);
|
||||
default Pair<RenderedBuffer, Integer> build() {
|
||||
return ModelUtil.getRenderedBuffer(this);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,8 +5,11 @@ import java.util.Collection;
|
|||
import java.util.function.Supplier;
|
||||
|
||||
import com.jozufozu.flywheel.Flywheel;
|
||||
import com.jozufozu.flywheel.backend.model.BufferBuilderExtension;
|
||||
import com.jozufozu.flywheel.util.Pair;
|
||||
import com.jozufozu.flywheel.util.transform.TransformStack;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.blaze3d.vertex.PoseStack;
|
||||
import com.mojang.blaze3d.vertex.VertexFormat;
|
||||
|
@ -53,7 +56,22 @@ public class ModelUtil {
|
|||
return dispatcher;
|
||||
}
|
||||
|
||||
public static ShadeSeparatedBufferBuilder getBufferBuilder(Bufferable bufferable) {
|
||||
public static boolean isVirtual(ModelData data) {
|
||||
return data.has(ModelUtil.VIRTUAL_PROPERTY) && data.get(ModelUtil.VIRTUAL_PROPERTY);
|
||||
}
|
||||
|
||||
public static Pair<RenderedBuffer, Integer> endShadeSeparated(BufferBuilder shadedBuilder, BufferBuilder unshadedBuilder) {
|
||||
int unshadedStartVertex = ((BufferBuilderExtension) shadedBuilder).flywheel$getVertices();
|
||||
RenderedBuffer unshadedBuffer = unshadedBuilder.endOrDiscardIfEmpty();
|
||||
if (unshadedBuffer != null) {
|
||||
// FIXME: Unshaded indices
|
||||
((BufferBuilderExtension) shadedBuilder).flywheel$appendBufferUnsafe(unshadedBuffer.vertexBuffer());
|
||||
}
|
||||
RenderedBuffer buffer = shadedBuilder.endOrDiscardIfEmpty();
|
||||
return Pair.of(buffer, unshadedStartVertex);
|
||||
}
|
||||
|
||||
public static Pair<RenderedBuffer, Integer> getRenderedBuffer(Bufferable bufferable) {
|
||||
ModelBlockRenderer blockRenderer = VANILLA_RENDERER.getModelRenderer();
|
||||
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
|
||||
|
||||
|
@ -61,31 +79,29 @@ public class ModelUtil {
|
|||
|
||||
bufferable.bufferInto(blockRenderer, objects.shadeSeparatingWrapper, objects.random);
|
||||
|
||||
objects.end();
|
||||
|
||||
return objects.separatedBufferBuilder;
|
||||
return objects.end();
|
||||
}
|
||||
|
||||
public static ShadeSeparatedBufferBuilder getBufferBuilder(BakedModel model, BlockState referenceState, PoseStack poseStack) {
|
||||
public static Pair<RenderedBuffer, Integer> getBufferBuilder(BakedModel model, BlockState referenceState, PoseStack poseStack) {
|
||||
return new BakedModelBuilder(model).withReferenceState(referenceState)
|
||||
.withPoseStack(poseStack)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static ShadeSeparatedBufferBuilder getBufferBuilder(BlockAndTintGetter renderWorld, BakedModel model, BlockState referenceState, PoseStack poseStack) {
|
||||
public static Pair<RenderedBuffer, Integer> getBufferBuilder(BlockAndTintGetter renderWorld, BakedModel model, BlockState referenceState, PoseStack poseStack) {
|
||||
return new BakedModelBuilder(model).withReferenceState(referenceState)
|
||||
.withPoseStack(poseStack)
|
||||
.withRenderWorld(renderWorld)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static ShadeSeparatedBufferBuilder getBufferBuilderFromTemplate(BlockAndTintGetter renderWorld, RenderType layer, Collection<StructureTemplate.StructureBlockInfo> blocks) {
|
||||
public static Pair<RenderedBuffer, Integer> getBufferBuilderFromTemplate(BlockAndTintGetter renderWorld, RenderType layer, Collection<StructureTemplate.StructureBlockInfo> blocks) {
|
||||
return new WorldModelBuilder(layer).withRenderWorld(renderWorld)
|
||||
.withBlocks(blocks)
|
||||
.build();
|
||||
}
|
||||
|
||||
public static ShadeSeparatedBufferBuilder getBufferBuilderFromTemplate(BlockAndTintGetter renderWorld, RenderType layer, Collection<StructureTemplate.StructureBlockInfo> blocks, PoseStack poseStack) {
|
||||
public static Pair<RenderedBuffer, Integer> getBufferBuilderFromTemplate(BlockAndTintGetter renderWorld, RenderType layer, Collection<StructureTemplate.StructureBlockInfo> blocks, PoseStack poseStack) {
|
||||
return new WorldModelBuilder(layer).withRenderWorld(renderWorld)
|
||||
.withBlocks(blocks)
|
||||
.withPoseStack(poseStack)
|
||||
|
@ -106,20 +122,18 @@ public class ModelUtil {
|
|||
private static class ThreadLocalObjects {
|
||||
public final RandomSource random = RandomSource.create();
|
||||
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
|
||||
public final ShadeSeparatedBufferBuilder separatedBufferBuilder = new ShadeSeparatedBufferBuilder(512);
|
||||
public final BufferBuilder shadedBuilder = new BufferBuilder(512);
|
||||
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
|
||||
|
||||
private void begin() {
|
||||
this.separatedBufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
|
||||
this.shadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
|
||||
this.unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
|
||||
this.shadeSeparatingWrapper.prepare(this.separatedBufferBuilder, this.unshadedBuilder);
|
||||
this.shadeSeparatingWrapper.prepare(this.shadedBuilder, this.unshadedBuilder);
|
||||
}
|
||||
|
||||
private void end() {
|
||||
private Pair<RenderedBuffer, Integer> end() {
|
||||
this.shadeSeparatingWrapper.clear();
|
||||
this.unshadedBuilder.end();
|
||||
this.separatedBufferBuilder.appendUnshadedVertices(this.unshadedBuilder);
|
||||
this.separatedBufferBuilder.end();
|
||||
return ModelUtil.endShadeSeparated(shadedBuilder, unshadedBuilder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
package com.jozufozu.flywheel.core.model;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.jozufozu.flywheel.backend.model.BufferBuilderExtension;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
|
||||
public class ShadeSeparatedBufferBuilder extends BufferBuilder {
|
||||
protected int unshadedStartVertex;
|
||||
|
||||
public ShadeSeparatedBufferBuilder(int capacity) {
|
||||
super(capacity);
|
||||
}
|
||||
|
||||
public void appendUnshadedVertices(BufferBuilder unshadedBuilder) {
|
||||
RenderedBuffer renderedBuffer = unshadedBuilder.endOrDiscardIfEmpty();
|
||||
|
||||
if (renderedBuffer == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// FIXME: Unshaded indices
|
||||
ByteBuffer buffer = renderedBuffer.vertexBuffer();
|
||||
unshadedStartVertex = ((BufferBuilderExtension) this).flywheel$getVertices();
|
||||
((BufferBuilderExtension) this).flywheel$appendBufferUnsafe(buffer);
|
||||
}
|
||||
|
||||
public int getUnshadedStartVertex() {
|
||||
return unshadedStartVertex;
|
||||
}
|
||||
}
|
|
@ -6,10 +6,8 @@ import com.jozufozu.flywheel.api.vertex.VertexList;
|
|||
import com.jozufozu.flywheel.api.vertex.VertexType;
|
||||
import com.jozufozu.flywheel.core.layout.BufferLayout;
|
||||
import com.jozufozu.flywheel.core.layout.CommonItems;
|
||||
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
|
||||
import com.mojang.datafixers.util.Pair;
|
||||
|
||||
public class BlockVertex implements VertexType {
|
||||
|
||||
|
@ -72,10 +70,11 @@ Vertex FLWCreateVertex() {
|
|||
}
|
||||
ByteBuffer vertexBuffer = renderedBuffer.vertexBuffer();
|
||||
|
||||
if (unshadedStartVertex > 0) {
|
||||
return createReader(vertexBuffer, drawState.vertexCount(), unshadedStartVertex);
|
||||
int vertexCount = drawState.vertexCount();
|
||||
if (unshadedStartVertex > 0 && unshadedStartVertex < vertexCount) {
|
||||
return createReader(vertexBuffer, vertexCount, unshadedStartVertex);
|
||||
} else {
|
||||
return createReader(vertexBuffer, drawState.vertexCount());
|
||||
return createReader(vertexBuffer, vertexCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,9 +3,7 @@ package com.jozufozu.flywheel.core.vertex;
|
|||
import java.nio.ByteBuffer;
|
||||
|
||||
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
|
||||
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
|
||||
import com.jozufozu.flywheel.util.RenderMath;
|
||||
import com.mojang.blaze3d.vertex.BufferBuilder;
|
||||
|
||||
public class BlockVertexList extends AbstractVertexList {
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
modLoader = "javafml"
|
||||
loaderVersion = "[40,)"
|
||||
loaderVersion = "[41,)"
|
||||
issueTrackerURL = "https://github.com/Jozufozu/Flywheel/issues"
|
||||
license = "MIT"
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"pack": {
|
||||
"description": "Flywheel resources",
|
||||
"pack_format": 8
|
||||
"pack_format": 9
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue