From c8ce149d847d9f011d16a654d5f232bdf34462f2 Mon Sep 17 00:00:00 2001 From: HYPER1208-max Date: Sat, 28 Feb 2026 13:16:48 +0000 Subject: [PATCH] Falling Animation visual for thicker trees --- .../util/BranchDestructionData.java | 109 ++++++++++-------- 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/ferreusveritas/dynamictrees/util/BranchDestructionData.java b/src/main/java/com/ferreusveritas/dynamictrees/util/BranchDestructionData.java index 98990de3f..a99495262 100644 --- a/src/main/java/com/ferreusveritas/dynamictrees/util/BranchDestructionData.java +++ b/src/main/java/com/ferreusveritas/dynamictrees/util/BranchDestructionData.java @@ -25,7 +25,7 @@ public class BranchDestructionData { public final Species species; // The species of the tree that was harvested public final int[] destroyedBranchesRadiusPosition; // Encoded branch radius and relative positions - public final int[] destroyedBranchesConnections; // Encoded branch shapes + public final long[] destroyedBranchesConnections; // Encoded branch shapes public final int[] destroyedBranchesBlockIndex; // Encoded valid branch block index for family public final int[] destroyedLeaves; // Encoded leaves relative positions public final int[] destroyedLeavesBlockIndex; // Encoded valid leaves block index for species @@ -42,7 +42,7 @@ public class BranchDestructionData { public BranchDestructionData() { this.species = Species.NULL_SPECIES; - this.destroyedBranchesConnections = new int[0]; + this.destroyedBranchesConnections = new long[0]; this.destroyedBranchesRadiusPosition = new int[0]; this.destroyedBranchesBlockIndex = new int[0]; this.destroyedLeaves = new int[0]; @@ -64,8 +64,8 @@ public BranchDestructionData(Species species, Map branchList) { int[] radPosData = new int[branchList.size()]; - int[] connectionData = new int[branchList.size()]; int[] blockIndexData = new int[branchList.size()]; int index = 0; @@ -172,11 +171,9 @@ private int[][] convertBranchesToIntArrays(Map b if (origConnData != null) { BlockState origState = origConnData.getBlockState(); radPosData[index] = encodeBranchesRadiusPos(BlockPos.ZERO, (BranchBlock) origState.getBlock(), origState); - connectionData[index] = encodeBranchesConnections(origConnData.getConnections()); blockIndexData[index++] = encodeBranchBlocks((BranchBlock) origState.getBlock()); } - //Encode the remaining blocks for (Entry set : branchList.entrySet()) { if (set.getKey().equals(BlockPos.ZERO)) continue; BlockPos relPos = set.getKey(); @@ -184,63 +181,61 @@ private int[][] convertBranchesToIntArrays(Map b BlockState state = connData.getBlockState(); Block block = state.getBlock(); - if (block instanceof BranchBlock && bounds.inBounds(relPos)) { //Place comfortable limits on the system + if (block instanceof BranchBlock && bounds.inBounds(relPos)) { radPosData[index] = encodeBranchesRadiusPos(relPos, (BranchBlock) block, state); - connectionData[index] = encodeBranchesConnections(connData.getConnections()); blockIndexData[index++] = encodeBranchBlocks((BranchBlock) block); } } - //Shrink down the arrays radPosData = Arrays.copyOf(radPosData, index); - connectionData = Arrays.copyOf(connectionData, index); blockIndexData = Arrays.copyOf(blockIndexData, index); - return new int[][]{radPosData, connectionData, blockIndexData}; + return new int[][]{radPosData, blockIndexData}; + } + + private long[] convertBranchConnectionsToLongArray(Map branchList) { + long[] connectionData = new long[branchList.size()]; + int index = 0; + + //Ensure the origin block is at the first index + BranchConnectionData origConnData = branchList.get(BlockPos.ZERO); + if (origConnData != null) { + connectionData[index++] = encodeBranchesConnections(origConnData.getConnections()); + } + + for (Entry set : branchList.entrySet()) { + if (set.getKey().equals(BlockPos.ZERO)) continue; + BlockPos relPos = set.getKey(); + BranchConnectionData connData = set.getValue(); + BlockState state = connData.getBlockState(); + Block block = state.getBlock(); + + if (block instanceof BranchBlock && bounds.inBounds(relPos)) { + connectionData[index++] = encodeBranchesConnections(connData.getConnections()); + } + } + + return Arrays.copyOf(connectionData, index); } private int encodeBranchesRadiusPos(BlockPos relPos, BranchBlock branchBlock, BlockState state) { - return ((branchBlock.getRadius(state) & 0x1F) << 24) | //Radius 0 - 31 + return ((branchBlock.getRadius(state) & 0xFF) << 24) | // Radius 0 - 255 encodeRelBlockPos(relPos); } - private int encodeBranchesConnections(Connections exState) { - int result = 0; + private long encodeBranchesConnections(Connections exState) { + long result = 0; int[] radii = exState.getAllRadii(); for (Direction face : Direction.values()) { int faceIndex = face.get3DDataValue(); int rad = radii[faceIndex]; - result |= (rad & 0x1F) << (faceIndex * 5);//5 bits per face * 6 faces = 30bits + result |= ((long)(rad & 0xFF)) << (faceIndex * 8); // 8 bits per face * 6 faces = 48 bits } return result; } - private int encodeBranchBlocks(BranchBlock branch) { - return branch.getFamily().getBranchBlockIndex(branch); - } - - public int getNumBranches() { - return destroyedBranchesRadiusPosition.length; - } - - public BlockPos getBranchRelPos(int index) { - BlockPos pos = decodeRelPos(destroyedBranchesRadiusPosition[index]); - if (basePos != cutPos){ //When a root system is involved, the relative positions are moved down - return pos.offset(getRelativeCutPos()); - } - return pos; - } - - public BlockPos getRelativeCutPos(){ - return cutPos.subtract(basePos); - } - - public int getBranchRadius(int index) { - return decodeBranchRadius(destroyedBranchesRadiusPosition[index]); - } - private int decodeBranchRadius(int encoded) { - return (encoded >> 24) & 0x1F; + return (encoded >> 24) & 0xFF; } @Nullable @@ -256,14 +251,34 @@ public BlockState getBranchBlockState(int index) { } public void getConnections(int index, int[] connections) { - int encodedConnections = destroyedBranchesConnections[index]; + long encodedConnections = destroyedBranchesConnections[index]; for (Direction face : Direction.values()) { - int rad = (encodedConnections >> (face.get3DDataValue() * 5) & 0x1F); + int rad = (int)((encodedConnections >> (face.get3DDataValue() * 8)) & 0xFF); connections[face.get3DDataValue()] = Math.max(0, rad); } } + private int encodeBranchBlocks(BranchBlock branch) { + return branch.getFamily().getBranchBlockIndex(branch); + } + + public int getNumBranches() { + return destroyedBranchesRadiusPosition.length; + } + + public BlockPos getBranchRelPos(int index) { + BlockPos pos = decodeRelPos(destroyedBranchesRadiusPosition[index]); + if (basePos != cutPos) { // When a root system is involved, the relative positions are moved down + return pos.offset(getRelativeCutPos()); + } + return pos; + } + + public int getBranchRadius(int index) { + return decodeBranchRadius(destroyedBranchesRadiusPosition[index]); + } + public static class BlockStateWithConnections { private final BlockState blockState; private final int[] connections; @@ -459,4 +474,8 @@ public static BlockPos decodeRelPos(int encoded) { ); } + public BlockPos getRelativeCutPos() { + return cutPos.subtract(basePos); + } + }