Skip to content
Draft
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
3640e52
Implemented CentrifugalConcentrator FluidRendering
BastianBoB Aug 14, 2025
c79a2ad
Implemented CentrifugalConcentrator FluidRendering
BastianBoB Aug 14, 2025
6d11ea1
CentrifugalConcentrator FluidRendering
BastianBoB Aug 14, 2025
7ada8e6
Merge remote-tracking branch 'origin/main' into main
BastianBoB Aug 14, 2025
79599d5
Merge branch 'main' into main
DaRealTurtyWurty Aug 14, 2025
34d52a8
Implemented RotaryKiln Animation
BastianBoB Aug 15, 2025
9915cc2
Merge remote-tracking branch 'origin/main' into main
BastianBoB Aug 15, 2025
e3e7c88
Merge fix idfk
BastianBoB Aug 15, 2025
14a6c4d
Removed BastiUtil
BastianBoB Aug 15, 2025
a4fe05d
Apply suggestion from @Copilot
DaRealTurtyWurty Aug 15, 2025
4a2cd4d
Update build.gradle
DaRealTurtyWurty Aug 15, 2025
5341465
Update src/client/java/dev/turtywurty/industria/renderer/block/Indust…
DaRealTurtyWurty Aug 15, 2025
9e06aa6
Removed unused import
DaRealTurtyWurty Aug 15, 2025
b8a512f
Fix possible IllegalArgumentException
DaRealTurtyWurty Aug 15, 2025
a1c22b2
Fix copilot error and clean-up whitespace
DaRealTurtyWurty Aug 15, 2025
96f57b5
Add some constants
DaRealTurtyWurty Aug 15, 2025
5c37d89
Update src/client/java/dev/turtywurty/industria/renderer/block/Rotary…
DaRealTurtyWurty Aug 15, 2025
d8e4f3b
Update src/client/java/dev/turtywurty/industria/renderer/block/Rotary…
DaRealTurtyWurty Aug 15, 2025
fad9acc
ShakingTable fixed water volume
BastianBoB Aug 16, 2025
e205915
Merge remote-tracking branch 'origin/main' into main
BastianBoB Aug 16, 2025
c8b3d7b
Merge branch 'main' into main
DaRealTurtyWurty Aug 17, 2025
8eded9c
Merge remote-tracking branch 'upstream/main' into main
BastianBoB Aug 17, 2025
a1061f6
Merge remote-tracking branch 'origin/main' into main
BastianBoB Aug 17, 2025
67d07e8
Merge remote-tracking branch 'upstream/main' into main
BastianBoB Aug 17, 2025
5fd6166
Added particles to RotaryKiln
BastianBoB Aug 17, 2025
d3fc8c0
removed debug println
BastianBoB Aug 17, 2025
35c0a6e
Reworked Fluid rendering to use 1 function for all directions
BastianBoB Aug 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
package dev.turtywurty.industria.renderer.block;

import com.mojang.blaze3d.vertex.VertexFormat;
import dev.turtywurty.industria.blockentity.CentrifugalConcentratorBlockEntity;
import dev.turtywurty.industria.blockentity.util.fluid.SyncingFluidStorage;
import dev.turtywurty.industria.model.CentrifugalConcentratorModel;
import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.ModelPart;
import net.minecraft.client.render.*;
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
import net.minecraft.client.texture.Sprite;
Expand All @@ -17,16 +13,9 @@
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.TriState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis;
import net.minecraft.util.math.Vec3d;
import org.jbox2d.common.Vec3;
import org.joml.Matrix4f;
import org.joml.Vector3d;
import org.joml.Vector3f;
import org.joml.Vector4f;

// TODO: Finish OBJLoader and use that for rendering
public class CentrifugalConcentratorBlockEntityRenderer extends IndustriaBlockEntityRenderer<CentrifugalConcentratorBlockEntity> {
Expand Down Expand Up @@ -65,7 +54,6 @@ private void renderInputFluid(CentrifugalConcentratorBlockEntity entity, float t
SyncingFluidStorage fluidTank = entity.getInputFluidTank();
if (fluidTank.isResourceBlank() || fluidTank.amount <= 0) return;


FluidVariant fluidVariant = fluidTank.variant;
Sprite fluidSprite = FluidVariantRendering.getSprite(fluidVariant);
if (fluidSprite == null)
Expand Down Expand Up @@ -122,7 +110,7 @@ private void renderInputFluid(CentrifugalConcentratorBlockEntity entity, float t
this.context.getItemRenderer().renderItem(stackInSlot, ItemDisplayContext.NONE, light, overlay, matrices, vertexConsumers, entity.getWorld(), 0);


Vector3f pos = localToWorldPosition(matrices);
Vector3f pos = matrixStackToWorldPosition(matrices);
entity.getWorld().addParticleClient(ParticleTypes.BUBBLE, pos.x, pos.y + 0.25, pos.z, 0, 0, 0);

matrices.pop();
Expand All @@ -131,13 +119,6 @@ private void renderInputFluid(CentrifugalConcentratorBlockEntity entity, float t
matrices.pop();
}

private Vector3f localToWorldPosition(MatrixStack matrices) {
Vector3f pos = matrices.peek().getPositionMatrix().transformPosition(0, 0, 0, new Vector3f());
Vec3d cameraPos = MinecraftClient.getInstance().gameRenderer.getCamera().getPos();

return new Vector3f((float) (pos.x() + cameraPos.x), (float) (pos.y() + cameraPos.y), (float) (pos.z() + cameraPos.z));
}

private void angledFluidVertex(VertexConsumer vc, MatrixStack matrixStack, Sprite sprite, int fluidColor, float angle, float radius, float uvSize, int light, int overlay) {
float x = radius * MathHelper.cos(angle);
float z = radius * MathHelper.sin(angle);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,19 @@ public final void render(T entity, float tickDelta, MatrixStack matrices, Vertex
postRender(entity, tickDelta, matrices, vertexConsumers, light, overlay);
}

/**
* Converts a MatrixStack to a world Position
*
* @param matrices The current MatrixStack
* @return The world Position stored in a {@link Vector3f}
*/
protected Vector3f matrixStackToWorldPosition(MatrixStack matrices) {
Vector3f pos = matrices.peek().getPositionMatrix().transformPosition(0, 0, 0, new Vector3f());
Vec3d cameraPos = MinecraftClient.getInstance().gameRenderer.getCamera().getPos();

return new Vector3f((float) (pos.x() + cameraPos.x), (float) (pos.y() + cameraPos.y), (float) (pos.z() + cameraPos.z));
}

private static boolean isHighContrast() {
return MinecraftClient.getInstance().options.getHighContrastBlockOutline().getValue();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,23 @@
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemDisplayContext;
import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleEffect;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RotationAxis;
import org.jbox2d.callbacks.ContactImpulse;
import org.jbox2d.callbacks.ContactListener;
import org.jbox2d.collision.Manifold;
import org.jbox2d.collision.shapes.ChainShape;
import org.jbox2d.collision.shapes.PolygonShape;
import org.jbox2d.common.Vec2;
import org.jbox2d.dynamics.*;
import org.jbox2d.dynamics.contacts.Contact;
import org.joml.Vector3f;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class RotaryKilnBlockEntityRenderer extends IndustriaBlockEntityRenderer<RotaryKilnControllerBlockEntity> {
Expand Down Expand Up @@ -77,6 +82,9 @@ private void renderItems(RendererData rendererData, RotaryKilnControllerBlockEnt

long now = System.nanoTime();
float deltaTime = (now - rendererData.lastRenderTime) / 1_000_000_000f; // seconds

deltaTime = MathHelper.clamp(deltaTime, 0.01f, 0.1f);

rendererData.lastRenderTime = now;
box2dWorld.step(deltaTime, 6, 2);

Expand All @@ -102,12 +110,16 @@ private void renderItems(RendererData rendererData, RotaryKilnControllerBlockEnt

matrices.push();
matrices.translate(body.getPosition().x, body.getPosition().y, z);

matrices.push();
matrices.scale(0.5f, 0.5f, 0.5f);
matrices.multiply(Direction.WEST.getRotationQuaternion());
matrices.multiply(RotationAxis.POSITIVE_X.rotation(body.getAngle()));
this.context.getItemRenderer().renderItem(itemStack, ItemDisplayContext.NONE, light, overlay, matrices, vertexConsumers, entity.getWorld(), 0);

if (rendererData.collidedBodies.remove(body)) {
Vector3f position = matrixStackToWorldPosition(matrices);
entity.getWorld().addParticleClient(ParticleTypes.SMOKE, position.x, position.y, position.z, 0, 0, 0);
}

matrices.pop();
}
}
Expand All @@ -122,6 +134,7 @@ private Body createNewItemBody(World box2dWorld, ItemStack itemStack) {
Body box = box2dWorld.createBody(squareDef);
box.setGravityScale(1f);
box.setLinearVelocity(new Vec2(((float) Math.random() - 0.5f) * 2f, ((float) Math.random() - 0.5f) * 2f));
box.setUserData("item");

var squareShape = new PolygonShape();
if (blockItem) {
Expand Down Expand Up @@ -154,9 +167,32 @@ public static final class RendererData {
private final Body barrelBody;

private long lastRenderTime = System.nanoTime();
private final Set<Body> collidedBodies = Collections.synchronizedSet(new HashSet<>());
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix memory leak: collidedBodies can retain destroyed Body references.

Bodies removed from recipeToBodyMap and destroyed are never pruned from collidedBodies, so those Body references leak. Ensure you remove the body from collidedBodies when destroying and periodically prune stale entries.

Proposed fixes (outside this hunk):

  • When destroying a body (in renderItems(), during map cleanup), also drop it from collidedBodies:
if (!entity.getRecipes().contains(entry.getKey())) {
    rendererData.collidedBodies.remove(entry.getValue()); // prune from signal set
    box2dWorld.destroyBody(entry.getValue());
    iterator.remove();
}
  • Additionally, add a safety prune early in renderItems() after you get recipeToBodyMap:
rendererData.collidedBodies.retainAll(recipeToBodyMap.values());

These two changes prevent unbounded growth in collidedBodies across recipe churn.

🤖 Prompt for AI Agents
In
src/client/java/dev/turtywurty/industria/renderer/block/RotaryKilnBlockEntityRenderer.java
around line 170, collidedBodies currently holds Body references that are
destroyed/removed from recipeToBodyMap causing a memory leak; when you destroy
or remove a body you must also remove it from collidedBodies (call
collidedBodies.remove(body) at the same point you destroy the body and remove it
from the map), and additionally prune stale entries at the start of
renderItems() after obtaining recipeToBodyMap by retaining only current bodies
(call collidedBodies.retainAll(recipeToBodyMap.values())) to prevent unbounded
growth.


public RendererData() {
box2dWorld = new World(new Vec2(0, GRAVITY));
box2dWorld.setContactListener(new ContactListener() {
@Override
public void beginContact(Contact contact) {
Body a = contact.getFixtureA().getBody();
Body b = contact.getFixtureB().getBody();

if (a.getUserData() != null && a.getUserData().equals("item"))
collidedBodies.add(a);

if (b.getUserData() != null && b.getUserData().equals("item"))
collidedBodies.add(b);
}

@Override
public void endContact(Contact contact) {}

@Override
public void preSolve(Contact contact, Manifold oldManifold) {}

@Override
public void postSolve(Contact contact, ContactImpulse impulse) {}
});

var barrelDef = new BodyDef();
barrelDef.type = BodyType.KINEMATIC;
Expand Down