Check if worlds support the flywheel backend.
This commit is contained in:
parent
2b37842259
commit
33d718d653
3 changed files with 28 additions and 8 deletions
|
@ -0,0 +1,13 @@
|
||||||
|
package com.simibubi.create.foundation.render.backend.instancing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A marker interface custom worlds can override to indicate
|
||||||
|
* that tiles inside the world should render with Flywheel.
|
||||||
|
*
|
||||||
|
* <code>Minecraft.getInstance().world</code> will always support Flywheel.
|
||||||
|
*/
|
||||||
|
public interface IFlywheelWorld {
|
||||||
|
default boolean supportsFlywheel() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,11 +4,13 @@ import java.util.*;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.ponder.PonderWorld;
|
||||||
import com.simibubi.create.foundation.render.backend.Backend;
|
import com.simibubi.create.foundation.render.backend.Backend;
|
||||||
import com.simibubi.create.foundation.render.backend.gl.BasicProgram;
|
import com.simibubi.create.foundation.render.backend.gl.BasicProgram;
|
||||||
import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback;
|
import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback;
|
||||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
|
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.Matrix4f;
|
import net.minecraft.client.renderer.Matrix4f;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
@ -69,7 +71,7 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Nullable
|
@Nullable
|
||||||
public <T extends TileEntity> TileEntityInstance<? super T> getInstance(T tile, boolean create) {
|
public <T extends TileEntity> TileEntityInstance<? super T> getInstance(T tile, boolean create) {
|
||||||
if (!Backend.canUseInstancing() || isTileUnloaded(tile)) return null;
|
if (!Backend.canUseInstancing() || !canCreateInstance(tile)) return null;
|
||||||
|
|
||||||
TileEntityInstance<?> instance = instances.get(tile);
|
TileEntityInstance<?> instance = instances.get(tile);
|
||||||
|
|
||||||
|
@ -147,17 +149,21 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
|
||||||
tickableInstances.clear();
|
tickableInstances.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isTileUnloaded(TileEntity tile) {
|
public boolean canCreateInstance(TileEntity tile) {
|
||||||
if (tile.isRemoved()) return true;
|
if (tile.isRemoved()) return false;
|
||||||
|
|
||||||
World world = tile.getWorld();
|
World world = tile.getWorld();
|
||||||
|
|
||||||
if (world == null) return true;
|
if (world == null) return false;
|
||||||
|
|
||||||
|
if (world == Minecraft.getInstance().world) {
|
||||||
BlockPos pos = tile.getPos();
|
BlockPos pos = tile.getPos();
|
||||||
|
|
||||||
IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4);
|
IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4);
|
||||||
|
|
||||||
return existingChunk == null;
|
return existingChunk != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld;
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.block.Blocks;
|
import net.minecraft.block.Blocks;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
@ -13,7 +14,7 @@ import net.minecraft.util.math.SectionPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.lighting.WorldLightManager;
|
import net.minecraft.world.lighting.WorldLightManager;
|
||||||
|
|
||||||
public class PlacementSimulationWorld extends WrappedWorld {
|
public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelWorld {
|
||||||
public HashMap<BlockPos, BlockState> blocksAdded;
|
public HashMap<BlockPos, BlockState> blocksAdded;
|
||||||
public HashMap<BlockPos, TileEntity> tesAdded;
|
public HashMap<BlockPos, TileEntity> tesAdded;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue