mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2025-01-30 06:44:58 +01:00
Gone, but not forgotten
- Track the last visible AABB within EntityVisuals to prevent entities from freezing when the go offscreen.
This commit is contained in:
parent
ce6ce841d1
commit
d6535dc9cd
2 changed files with 56 additions and 8 deletions
|
@ -35,11 +35,13 @@ import net.minecraft.world.phys.Vec3;
|
||||||
public abstract class AbstractEntityVisual<T extends Entity> extends AbstractVisual implements EntityVisual<T>, TickingLightListener {
|
public abstract class AbstractEntityVisual<T extends Entity> extends AbstractVisual implements EntityVisual<T>, TickingLightListener {
|
||||||
protected final T entity;
|
protected final T entity;
|
||||||
protected final MutableBox bounds;
|
protected final MutableBox bounds;
|
||||||
|
protected final EntityVisibilityTester boxTracker;
|
||||||
|
|
||||||
public AbstractEntityVisual(VisualizationContext ctx, T entity) {
|
public AbstractEntityVisual(VisualizationContext ctx, T entity) {
|
||||||
super(ctx, entity.level);
|
super(ctx, entity.level);
|
||||||
this.entity = entity;
|
this.entity = entity;
|
||||||
bounds = MutableBox.from(entity.getBoundingBox());
|
bounds = MutableBox.from(entity.getBoundingBox());
|
||||||
|
boxTracker = new EntityVisibilityTester(entity, ctx.renderOrigin());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -99,13 +101,6 @@ public abstract class AbstractEntityVisual<T extends Entity> extends AbstractVis
|
||||||
if (entity.noCulling) {
|
if (entity.noCulling) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return boxTracker.isVisible(frustum);
|
||||||
AABB aabb = entity.getBoundingBoxForCulling();
|
|
||||||
return frustum.testAab((float) (aabb.minX - renderOrigin.getX()) - 0.5f,
|
|
||||||
(float) (aabb.minY - renderOrigin.getY()) - 0.5f,
|
|
||||||
(float) (aabb.minZ - renderOrigin.getZ()) - 0.5f,
|
|
||||||
(float) (aabb.maxX - renderOrigin.getX()) + 0.5f,
|
|
||||||
(float) (aabb.maxY - renderOrigin.getY()) + 0.5f,
|
|
||||||
(float) (aabb.maxZ - renderOrigin.getZ()) + 0.5f);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
package com.jozufozu.flywheel.lib.visual;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.joml.FrustumIntersection;
|
||||||
|
|
||||||
|
import net.minecraft.core.Vec3i;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.phys.AABB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A helper class for testing whether an Entity is visible.
|
||||||
|
* <p>
|
||||||
|
* The last visible AABB is also checked to prevent the Entity from freezing when it goes offscreen.
|
||||||
|
*/
|
||||||
|
public class EntityVisibilityTester {
|
||||||
|
private final Entity entity;
|
||||||
|
private final Vec3i renderOrigin;
|
||||||
|
@Nullable
|
||||||
|
private AABB lastVisibleAABB;
|
||||||
|
|
||||||
|
public EntityVisibilityTester(Entity entity, Vec3i renderOrigin) {
|
||||||
|
this.entity = entity;
|
||||||
|
|
||||||
|
this.renderOrigin = renderOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVisible(FrustumIntersection frustum) {
|
||||||
|
AABB aabb = entity.getBoundingBoxForCulling();
|
||||||
|
|
||||||
|
boolean visible = adjustAndTestAABB(frustum, aabb);
|
||||||
|
|
||||||
|
if (!visible && lastVisibleAABB != null && lastVisibleAABB != aabb) {
|
||||||
|
// If the entity isn't visible, check the last visible AABB as well.
|
||||||
|
// This is to avoid Entities freezing when the go offscreen.
|
||||||
|
visible = adjustAndTestAABB(frustum, lastVisibleAABB);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visible) {
|
||||||
|
lastVisibleAABB = aabb;
|
||||||
|
}
|
||||||
|
return visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean adjustAndTestAABB(FrustumIntersection frustum, AABB aabb) {
|
||||||
|
float minX = (float) (aabb.minX - renderOrigin.getX() - 0.5);
|
||||||
|
float minY = (float) (aabb.minY - renderOrigin.getY() - 0.5);
|
||||||
|
float minZ = (float) (aabb.minZ - renderOrigin.getZ() - 0.5);
|
||||||
|
float maxX = (float) (aabb.maxX - renderOrigin.getX() + 0.5);
|
||||||
|
float maxY = (float) (aabb.maxY - renderOrigin.getY() + 0.5);
|
||||||
|
float maxZ = (float) (aabb.maxZ - renderOrigin.getZ() + 0.5);
|
||||||
|
return frustum.testAab(minX, minY, minZ, maxX, maxY, maxZ);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue