MaterialSpecs choose their model formats

This commit is contained in:
JozsefA 2021-05-16 20:37:26 -07:00
parent 6227e81066
commit 695fe98d28
3 changed files with 18 additions and 10 deletions

View file

@ -10,12 +10,14 @@ public class MaterialSpec<D extends InstanceData> {
public final ResourceLocation name; public final ResourceLocation name;
private final ProgramSpec programSpec; private final ProgramSpec programSpec;
private final VertexFormat modelFormat;
private final VertexFormat instanceFormat; private final VertexFormat instanceFormat;
private final InstanceFactory<D> instanceFactory; private final InstanceFactory<D> instanceFactory;
public MaterialSpec(ResourceLocation name, ProgramSpec programSpec, VertexFormat instanceFormat, InstanceFactory<D> instanceFactory) { public MaterialSpec(ResourceLocation name, ProgramSpec programSpec, VertexFormat modelFormat, VertexFormat instanceFormat, InstanceFactory<D> instanceFactory) {
this.name = name; this.name = name;
this.programSpec = programSpec; this.programSpec = programSpec;
this.modelFormat = modelFormat;
this.instanceFormat = instanceFormat; this.instanceFormat = instanceFormat;
this.instanceFactory = instanceFactory; this.instanceFactory = instanceFactory;
} }
@ -24,6 +26,10 @@ public class MaterialSpec<D extends InstanceData> {
return programSpec; return programSpec;
} }
public VertexFormat getModelFormat() {
return modelFormat;
}
public VertexFormat getInstanceFormat() { public VertexFormat getInstanceFormat() {
return instanceFormat; return instanceFormat;
} }

View file

@ -14,7 +14,6 @@ import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.jozufozu.flywheel.backend.core.BasicProgram; import com.jozufozu.flywheel.backend.core.BasicProgram;
import com.jozufozu.flywheel.backend.core.PartialModel; import com.jozufozu.flywheel.backend.core.PartialModel;
import com.jozufozu.flywheel.backend.core.materials.ModelAttributes;
import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat; import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat;
import com.jozufozu.flywheel.backend.gl.shader.ShaderCallback; import com.jozufozu.flywheel.backend.gl.shader.ShaderCallback;
import com.jozufozu.flywheel.util.BufferBuilderReader; import com.jozufozu.flywheel.util.BufferBuilderReader;
@ -36,7 +35,6 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Matrix4f; import net.minecraft.util.math.vector.Matrix4f;
public class RenderMaterial<P extends BasicProgram, D extends InstanceData> { public class RenderMaterial<P extends BasicProgram, D extends InstanceData> {
public static final VertexFormat MODEL_FORMAT = VertexFormat.builder().addAttributes(ModelAttributes.class).build();
protected final InstancedTileRenderer<P> renderer; protected final InstancedTileRenderer<P> renderer;
protected final Cache<Object, InstancedModel<D>> models; protected final Cache<Object, InstancedModel<D>> models;
@ -121,7 +119,7 @@ public class RenderMaterial<P extends BasicProgram, D extends InstanceData> {
private InstancedModel<D> buildModel(IBakedModel model, BlockState referenceState, MatrixStack ms) { private InstancedModel<D> buildModel(IBakedModel model, BlockState referenceState, MatrixStack ms) {
BufferBuilderReader reader = new BufferBuilderReader(getBufferBuilder(model, referenceState, ms)); BufferBuilderReader reader = new BufferBuilderReader(getBufferBuilder(model, referenceState, ms));
VertexFormat format = MODEL_FORMAT; VertexFormat format = spec.getModelFormat();
int vertexCount = reader.getVertexCount(); int vertexCount = reader.getVertexCount();
ByteBuffer to = ByteBuffer.allocate(vertexCount * format.getStride()); ByteBuffer to = ByteBuffer.allocate(vertexCount * format.getStride());

View file

@ -2,8 +2,10 @@ package com.simibubi.create.foundation.render;
import static com.jozufozu.flywheel.backend.Backend.register; import static com.jozufozu.flywheel.backend.Backend.register;
import com.jozufozu.flywheel.backend.core.materials.ModelAttributes;
import com.jozufozu.flywheel.backend.core.materials.ModelData; import com.jozufozu.flywheel.backend.core.materials.ModelData;
import com.jozufozu.flywheel.backend.core.materials.OrientedData; import com.jozufozu.flywheel.backend.core.materials.OrientedData;
import com.jozufozu.flywheel.backend.gl.attrib.VertexFormat;
import com.jozufozu.flywheel.backend.instancing.MaterialSpec; import com.jozufozu.flywheel.backend.instancing.MaterialSpec;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.RotatingData;
@ -18,13 +20,15 @@ public class AllMaterialSpecs {
// noop, make sure the static field are loaded. // noop, make sure the static field are loaded.
} }
public static final MaterialSpec<ModelData> TRANSFORMED = register(new MaterialSpec<>(Locations.MODEL, AllProgramSpecs.MODEL, AllInstanceFormats.MODEL, ModelData::new)); public static final VertexFormat UNLIT_MODEL = VertexFormat.builder().addAttributes(ModelAttributes.class).build();
public static final MaterialSpec<OrientedData> ORIENTED = register(new MaterialSpec<>(Locations.ORIENTED, AllProgramSpecs.ORIENTED, AllInstanceFormats.ORIENTED, OrientedData::new));
public static final MaterialSpec<RotatingData> ROTATING = register(new MaterialSpec<>(Locations.ROTATING, AllProgramSpecs.ROTATING, AllInstanceFormats.ROTATING, RotatingData::new)); public static final MaterialSpec<ModelData> TRANSFORMED = register(new MaterialSpec<>(Locations.MODEL, AllProgramSpecs.MODEL, UNLIT_MODEL, AllInstanceFormats.MODEL, ModelData::new));
public static final MaterialSpec<BeltData> BELTS = register(new MaterialSpec<>(Locations.BELTS, AllProgramSpecs.BELT, AllInstanceFormats.BELT, BeltData::new)); public static final MaterialSpec<OrientedData> ORIENTED = register(new MaterialSpec<>(Locations.ORIENTED, AllProgramSpecs.ORIENTED, UNLIT_MODEL, AllInstanceFormats.ORIENTED, OrientedData::new));
public static final MaterialSpec<ActorData> ACTORS = register(new MaterialSpec<>(Locations.ACTORS, AllProgramSpecs.ACTOR, AllInstanceFormats.ACTOR, ActorData::new));
public static final MaterialSpec<FlapData> FLAPS = register(new MaterialSpec<>(Locations.FLAPS, AllProgramSpecs.FLAPS, AllInstanceFormats.FLAP, FlapData::new)); public static final MaterialSpec<RotatingData> ROTATING = register(new MaterialSpec<>(Locations.ROTATING, AllProgramSpecs.ROTATING, UNLIT_MODEL, AllInstanceFormats.ROTATING, RotatingData::new));
public static final MaterialSpec<BeltData> BELTS = register(new MaterialSpec<>(Locations.BELTS, AllProgramSpecs.BELT, UNLIT_MODEL, AllInstanceFormats.BELT, BeltData::new));
public static final MaterialSpec<ActorData> ACTORS = register(new MaterialSpec<>(Locations.ACTORS, AllProgramSpecs.ACTOR, UNLIT_MODEL, AllInstanceFormats.ACTOR, ActorData::new));
public static final MaterialSpec<FlapData> FLAPS = register(new MaterialSpec<>(Locations.FLAPS, AllProgramSpecs.FLAPS, UNLIT_MODEL, AllInstanceFormats.FLAP, FlapData::new));
public static class Locations { public static class Locations {
public static final ResourceLocation MODEL = new ResourceLocation("create", "model"); public static final ResourceLocation MODEL = new ResourceLocation("create", "model");