Skip to content

Commit

Permalink
allow custom vertex buffer providers
Browse files Browse the repository at this point in the history
  • Loading branch information
Luke100000 committed Nov 24, 2024
1 parent e8f699a commit 3c7d005
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,19 @@
import java.util.List;

public class BBModelRenderer {
public interface VertexConsumerProvider {
VertexConsumer getBuffer(MultiBufferSource source, BBFaceContainer container, BBFace face);
}

public static final VertexConsumerProvider DEFAULT_VERTEX_CONSUMER_PROVIDER = (source, container, face) -> source.getBuffer(container.enableCulling() ? RenderType.entityCutout(face.texture.location) : RenderType.entityCutoutNoCull(face.texture.location));

public static <T extends VehicleEntity> void renderModel(BBModel model, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, float time, T entity, ModelPartRenderHandler<T> modelPartRenderer, float red, float green, float blue, float alpha) {
model.root.forEach(object -> renderObject(model, object, matrixStack, vertexConsumerProvider, light, time, entity, modelPartRenderer, red, green, blue, alpha));
}

/**
* Apply transformations, animations, and callbacks, and render the object.
*/
public static <T extends VehicleEntity> void renderObject(BBModel model, BBObject object, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, float time, T entity, ModelPartRenderHandler<T> modelPartRenderer, float red, float green, float blue, float alpha) {
matrixStack.pushPose();
matrixStack.translate(object.origin.x(), object.origin.y(), object.origin.z());
Expand Down Expand Up @@ -66,9 +75,12 @@ public static <T extends VehicleEntity> void renderObject(BBModel model, BBObjec
matrixStack.popPose();
}

/**
* Render the object without applying transformations, animations, or callbacks.
*/
public static <T extends VehicleEntity> void renderObjectInner(BBModel model, BBObject object, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, float time, T entity, ModelPartRenderHandler<T> modelPartRenderer, float red, float green, float blue, float alpha) {
if (object instanceof BBFaceContainer cube) {
renderFaces(cube, matrixStack, vertexConsumerProvider, light, red, green, blue, alpha, null);
renderFaces(cube, matrixStack, vertexConsumerProvider, light, red, green, blue, alpha, modelPartRenderer == null ? DEFAULT_VERTEX_CONSUMER_PROVIDER : modelPartRenderer.getVertexConsumerProvider());
} else if (object instanceof BBBone bone) {
boolean shouldRender = bone.visibility;
if (bone.name.equals("lod0")) {
Expand All @@ -83,12 +95,12 @@ public static <T extends VehicleEntity> void renderObjectInner(BBModel model, BB
}
}

public static void renderFaces(BBFaceContainer cube, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int light, float red, float green, float blue, float alpha, VertexConsumer overrideVertexConsumer) {
public static void renderFaces(BBFaceContainer cube, PoseStack matrixStack, MultiBufferSource source, int light, float red, float green, float blue, float alpha, VertexConsumerProvider provider) {
PoseStack.Pose last = matrixStack.last();
Matrix4f positionMatrix = last.pose();
Matrix3f normalMatrix = last.normal();
for (BBFace face : cube.getFaces()) {
VertexConsumer vertexConsumer = overrideVertexConsumer == null ? vertexConsumerProvider.getBuffer(cube.enableCulling() ? RenderType.entityCutout(face.texture.location) : RenderType.entityCutoutNoCull(face.texture.location)) : overrideVertexConsumer;
VertexConsumer vertexConsumer = provider.getBuffer(source, cube, face);
for (int i = 0; i < 4; i++) {
BBFace.BBVertex v = face.vertices[i];
vertexConsumer.vertex(positionMatrix, v.x, v.y, v.z);
Expand All @@ -115,11 +127,10 @@ public static void renderBanner(BBFaceContainer cube, PoseStack matrixStack, Mul
bannerPattern.unwrapKey()
.map(key -> isBanner ? Sheets.getBannerMaterial(key) : Sheets.getShieldMaterial(key))
.ifPresent(material -> {
VertexConsumer vertexConsumer = material.buffer(vertexConsumers, RenderType::entityNoOutline);
float[] fs = pair.getSecond().getTextureDiffuseColors();
renderFaces(cube, matrixStack, vertexConsumers, light,
fs[0], fs[1], fs[2], 1.0f,
vertexConsumer);
(source, container, face) -> material.buffer(vertexConsumers, RenderType::entityNoOutline));
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@
import java.util.HashMap;
import java.util.Map;

/**
* Provides a way to provide overrides for rendering and animating model parts.
*/
public class ModelPartRenderHandler<T extends Entity> {
private final Map<String, ModelPartRenderer<T>> objects = new HashMap<>();
private BBModelRenderer.VertexConsumerProvider vertexConsumerProvider = BBModelRenderer.DEFAULT_VERTEX_CONSUMER_PROVIDER;

public ModelPartRenderHandler<T> add(String id, ModelPartRenderer.AnimationConsumer<T> animationConsumer) {
return add(id, animationConsumer, null);
Expand Down Expand Up @@ -45,4 +49,17 @@ public boolean render(String name, BBModel model, BBObject object, MultiBufferSo
}
return false;
}

/**
* Set the vertex consumer provider for this model part renderer, allowing for custom render types.
* @param vertexConsumerProvider The mapping between renderable and vertex consumers.
*/
public ModelPartRenderHandler<T> vertexConsumerProvider(BBModelRenderer.VertexConsumerProvider vertexConsumerProvider) {
this.vertexConsumerProvider = vertexConsumerProvider;
return this;
}

public BBModelRenderer.VertexConsumerProvider getVertexConsumerProvider() {
return vertexConsumerProvider;
}
}

0 comments on commit 3c7d005

Please sign in to comment.