Fixed performance issue where shapes of cable blocks were constantly being recalculated. Fixes #2599
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
- Fixed bug where autocrafting tasks started on the same tick make the wrong assumption about available items and fluids (Darkere)
|
- Fixed bug where autocrafting tasks started on the same tick make the wrong assumption about available items and fluids (Darkere)
|
||||||
- Fixed bug where the "To craft" amount in the Crafting Preview window is wrong (raoulvdberge)
|
- Fixed bug where the "To craft" amount in the Crafting Preview window is wrong (raoulvdberge)
|
||||||
- Fixed bug where non-pattern items are able to be inserted into the Crafter Manager (Darkere)
|
- Fixed bug where non-pattern items are able to be inserted into the Crafter Manager (Darkere)
|
||||||
|
- Fixed performance issue where shapes of cable blocks were constantly being recalculated (raoulvdberge)
|
||||||
- Drastically improved shift clicking performance in Crafting Grid (Darkere)
|
- Drastically improved shift clicking performance in Crafting Grid (Darkere)
|
||||||
- Removed autocrafting engine version from crafting preview screen (raoulvdberge)
|
- Removed autocrafting engine version from crafting preview screen (raoulvdberge)
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.refinedmods.refinedstorage.block;
|
package com.refinedmods.refinedstorage.block;
|
||||||
|
|
||||||
import com.refinedmods.refinedstorage.RS;
|
import com.refinedmods.refinedstorage.RS;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability;
|
import com.refinedmods.refinedstorage.capability.NetworkNodeProxyCapability;
|
||||||
import com.refinedmods.refinedstorage.tile.CableTile;
|
import com.refinedmods.refinedstorage.tile.CableTile;
|
||||||
import com.refinedmods.refinedstorage.util.BlockUtils;
|
import com.refinedmods.refinedstorage.util.BlockUtils;
|
||||||
@@ -70,6 +71,10 @@ public class CableBlock extends NetworkNodeBlock implements IWaterLoggable {
|
|||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
|
return ShapeCache.getOrCreate(state, CableBlock::getCableShape);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static VoxelShape getCableShape(BlockState state) {
|
||||||
VoxelShape shape = SHAPE_CORE;
|
VoxelShape shape = SHAPE_CORE;
|
||||||
|
|
||||||
if (state.get(NORTH)) {
|
if (state.get(NORTH)) {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.refinedmods.refinedstorage.block;
|
package com.refinedmods.refinedstorage.block;
|
||||||
|
|
||||||
import com.refinedmods.refinedstorage.RS;
|
import com.refinedmods.refinedstorage.RS;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.container.ConstructorContainer;
|
import com.refinedmods.refinedstorage.container.ConstructorContainer;
|
||||||
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
||||||
import com.refinedmods.refinedstorage.tile.ConstructorTile;
|
import com.refinedmods.refinedstorage.tile.ConstructorTile;
|
||||||
@@ -53,11 +54,13 @@ public class ConstructorBlock extends CableBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
VoxelShape shape = super.getShape(state, world, pos, ctx);
|
return ShapeCache.getOrCreate(state, s -> {
|
||||||
|
VoxelShape shape = getCableShape(s);
|
||||||
|
|
||||||
shape = VoxelShapes.or(shape, getHeadShape(state));
|
shape = VoxelShapes.or(shape, getHeadShape(s));
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getHeadShape(BlockState state) {
|
private VoxelShape getHeadShape(BlockState state) {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.refinedmods.refinedstorage.block;
|
package com.refinedmods.refinedstorage.block;
|
||||||
|
|
||||||
import com.refinedmods.refinedstorage.RS;
|
import com.refinedmods.refinedstorage.RS;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.container.DestructorContainer;
|
import com.refinedmods.refinedstorage.container.DestructorContainer;
|
||||||
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
||||||
import com.refinedmods.refinedstorage.tile.DestructorTile;
|
import com.refinedmods.refinedstorage.tile.DestructorTile;
|
||||||
@@ -53,11 +54,13 @@ public class DestructorBlock extends CableBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
VoxelShape shape = super.getShape(state, world, pos, ctx);
|
return ShapeCache.getOrCreate(state, s -> {
|
||||||
|
VoxelShape shape = getCableShape(s);
|
||||||
|
|
||||||
shape = VoxelShapes.or(shape, getHeadShape(state));
|
shape = VoxelShapes.or(shape, getHeadShape(s));
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getHeadShape(BlockState state) {
|
private VoxelShape getHeadShape(BlockState state) {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.refinedmods.refinedstorage.block;
|
package com.refinedmods.refinedstorage.block;
|
||||||
|
|
||||||
import com.refinedmods.refinedstorage.RS;
|
import com.refinedmods.refinedstorage.RS;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.container.ExporterContainer;
|
import com.refinedmods.refinedstorage.container.ExporterContainer;
|
||||||
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
||||||
import com.refinedmods.refinedstorage.tile.ExporterTile;
|
import com.refinedmods.refinedstorage.tile.ExporterTile;
|
||||||
@@ -70,11 +71,13 @@ public class ExporterBlock extends CableBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
VoxelShape shape = super.getShape(state, world, pos, ctx);
|
return ShapeCache.getOrCreate(state, s -> {
|
||||||
|
VoxelShape shape = getCableShape(s);
|
||||||
|
|
||||||
shape = VoxelShapes.or(shape, getLineShape(state));
|
shape = VoxelShapes.or(shape, getLineShape(s));
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getLineShape(BlockState state) {
|
private VoxelShape getLineShape(BlockState state) {
|
||||||
|
@@ -4,6 +4,7 @@ import com.refinedmods.refinedstorage.RS;
|
|||||||
import com.refinedmods.refinedstorage.api.network.node.INetworkNode;
|
import com.refinedmods.refinedstorage.api.network.node.INetworkNode;
|
||||||
import com.refinedmods.refinedstorage.api.storage.cache.InvalidateCause;
|
import com.refinedmods.refinedstorage.api.storage.cache.InvalidateCause;
|
||||||
import com.refinedmods.refinedstorage.apiimpl.network.node.ExternalStorageNetworkNode;
|
import com.refinedmods.refinedstorage.apiimpl.network.node.ExternalStorageNetworkNode;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.container.ExternalStorageContainer;
|
import com.refinedmods.refinedstorage.container.ExternalStorageContainer;
|
||||||
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
||||||
import com.refinedmods.refinedstorage.tile.ExternalStorageTile;
|
import com.refinedmods.refinedstorage.tile.ExternalStorageTile;
|
||||||
@@ -51,11 +52,13 @@ public class ExternalStorageBlock extends CableBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
VoxelShape shape = super.getShape(state, world, pos, ctx);
|
return ShapeCache.getOrCreate(state, s -> {
|
||||||
|
VoxelShape shape = getCableShape(s);
|
||||||
|
|
||||||
shape = VoxelShapes.or(shape, getHeadShape(state));
|
shape = VoxelShapes.or(shape, getHeadShape(s));
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getHeadShape(BlockState state) {
|
private VoxelShape getHeadShape(BlockState state) {
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
package com.refinedmods.refinedstorage.block;
|
package com.refinedmods.refinedstorage.block;
|
||||||
|
|
||||||
import com.refinedmods.refinedstorage.RS;
|
import com.refinedmods.refinedstorage.RS;
|
||||||
|
import com.refinedmods.refinedstorage.block.shape.ShapeCache;
|
||||||
import com.refinedmods.refinedstorage.container.ImporterContainer;
|
import com.refinedmods.refinedstorage.container.ImporterContainer;
|
||||||
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
import com.refinedmods.refinedstorage.container.factory.PositionalTileContainerProvider;
|
||||||
import com.refinedmods.refinedstorage.tile.ImporterTile;
|
import com.refinedmods.refinedstorage.tile.ImporterTile;
|
||||||
@@ -70,11 +71,13 @@ public class ImporterBlock extends CableBlock {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext ctx) {
|
||||||
VoxelShape shape = super.getShape(state, world, pos, ctx);
|
return ShapeCache.getOrCreate(state, s -> {
|
||||||
|
VoxelShape shape = getCableShape(s);
|
||||||
|
|
||||||
shape = VoxelShapes.or(shape, getLineShape(state));
|
shape = VoxelShapes.or(shape, getLineShape(s));
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private VoxelShape getLineShape(BlockState state) {
|
private VoxelShape getLineShape(BlockState state) {
|
||||||
|
@@ -0,0 +1,16 @@
|
|||||||
|
package com.refinedmods.refinedstorage.block.shape;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class ShapeCache {
|
||||||
|
private static final Map<BlockState, VoxelShape> CACHE = new HashMap<>();
|
||||||
|
|
||||||
|
public static VoxelShape getOrCreate(BlockState state, Function<BlockState, VoxelShape> shapeFactory) {
|
||||||
|
return CACHE.computeIfAbsent(state, shapeFactory);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user