Skip to content

Commit

Permalink
Move DiskManipulatorBakedModel away from TRSRBakedModel
Browse files Browse the repository at this point in the history
  • Loading branch information
raoulvdberge committed Jul 11, 2020
1 parent fbea90e commit 4056d26
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -134,17 +134,17 @@ private IBakedModel getDiskModel(DiskState diskState) {
}

private Vector3f getDiskTranslation(Direction facing, int x, int y) {
Vector3f trans = new Vector3f();
Vector3f translation = new Vector3f();

if (facing == Direction.NORTH || facing == Direction.SOUTH) {
trans.add(((2F / 16F) + ((float) x * 7F) / 16F) * (facing == Direction.NORTH ? -1 : 1), 0, 0); // Add to X
translation.add(((2F / 16F) + ((float) x * 7F) / 16F) * (facing == Direction.NORTH ? -1 : 1), 0, 0); // Add to X
} else if (facing == Direction.EAST || facing == Direction.WEST) {
trans.add(0, 0, ((2F / 16F) + ((float) x * 7F) / 16F) * (facing == Direction.EAST ? -1 : 1)); // Add to Y
translation.add(0, 0, ((2F / 16F) + ((float) x * 7F) / 16F) * (facing == Direction.EAST ? -1 : 1)); // Add to Z
}

trans.add(0, -((2F / 16F) + ((float) y * 3F) / 16F), 0); // Remove from Y
translation.add(0, -((2F / 16F) + ((float) y * 3F) / 16F), 0); // Remove from Y

return trans;
return translation;
}

@Nonnull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import com.refinedmods.refinedstorage.block.DiskManipulatorBlock;
import com.refinedmods.refinedstorage.tile.DiskManipulatorTile;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel;
Expand All @@ -17,7 +16,10 @@

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

public class DiskManipulatorBakedModel extends DelegateBakedModel {
private static class CacheKey {
Expand Down Expand Up @@ -65,78 +67,91 @@ public int hashCode() {
}
}

private final Map<Direction, IBakedModel> modelsConnected = new HashMap<>();
private final Map<Direction, IBakedModel> modelsDisconnected = new HashMap<>();
private final Map<Direction, Map<DiskState, List<IBakedModel>>> disks = new HashMap<>();
private final IBakedModel baseConnected;
private final IBakedModel baseDisconnected;
private final IBakedModel disk;
private final IBakedModel diskNearCapacity;
private final IBakedModel diskFull;
private final IBakedModel diskDisconnected;

private final LoadingCache<CacheKey, List<BakedQuad>> cache = CacheBuilder.newBuilder().build(new CacheLoader<CacheKey, List<BakedQuad>>() {
@Override
@SuppressWarnings("deprecation")
public List<BakedQuad> load(CacheKey key) {
Direction facing = key.state.get(RSBlocks.DISK_MANIPULATOR.getDirection().getProperty());

List<BakedQuad> quads = new ArrayList<>((key.state.get(DiskManipulatorBlock.CONNECTED) ? modelsConnected : modelsDisconnected).get(facing).getQuads(key.state, key.side, key.random));

boolean connected = key.state.get(DiskManipulatorBlock.CONNECTED);

List<BakedQuad> quads = new ArrayList<>(QuadTransformer.getTransformedQuads(
connected ? baseConnected : baseDisconnected,
facing,
null,
key.state,
key.random,
key.side
));

int x = 0, y = 0;
for (int i = 0; i < 6; ++i) {
if (key.diskState[i] != DiskState.NONE) {
quads.addAll(disks.get(facing).get(key.diskState[i]).get(i).getQuads(key.state, key.side, key.random));
IBakedModel diskModel = getDiskModel(key.diskState[i]);

quads.addAll(QuadTransformer.getTransformedQuads(
diskModel,
facing,
getDiskTranslation(facing, x, y),
key.state,
key.random,
key.side
));
}

y++;
if ((i + 1) % 3 == 0) {
x++;
y = 0;
}
}

return quads;
}
});

public DiskManipulatorBakedModel(IBakedModel baseConnected,
IBakedModel baseDisconnected,
IBakedModel disk,
IBakedModel diskNearCapacity,
IBakedModel diskFull,
IBakedModel diskDisconnected) {
public DiskManipulatorBakedModel(IBakedModel baseConnected, IBakedModel baseDisconnected, IBakedModel disk, IBakedModel diskNearCapacity, IBakedModel diskFull, IBakedModel diskDisconnected) {
super(baseDisconnected);

for (Direction facing : Direction.values()) {
if (facing.getHorizontalIndex() == -1) {
continue;
}

modelsConnected.put(facing, new TRSRBakedModel(baseConnected, facing));
modelsDisconnected.put(facing, new TRSRBakedModel(baseDisconnected, facing));

disks.put(facing, new HashMap<>());

disks.get(facing).put(DiskState.NORMAL, new ArrayList<>());
disks.get(facing).put(DiskState.NEAR_CAPACITY, new ArrayList<>());
disks.get(facing).put(DiskState.FULL, new ArrayList<>());
disks.get(facing).put(DiskState.DISCONNECTED, new ArrayList<>());
this.baseConnected = baseConnected;
this.baseDisconnected = baseDisconnected;
this.disk = disk;
this.diskNearCapacity = diskNearCapacity;
this.diskFull = diskFull;
this.diskDisconnected = diskDisconnected;
}

addDiskModels(disk, DiskState.NORMAL, facing);
addDiskModels(diskNearCapacity, DiskState.NEAR_CAPACITY, facing);
addDiskModels(diskFull, DiskState.FULL, facing);
addDiskModels(diskDisconnected, DiskState.DISCONNECTED, facing);
private IBakedModel getDiskModel(DiskState diskState) {
switch (diskState) {
case DISCONNECTED:
return diskDisconnected;
case NEAR_CAPACITY:
return diskNearCapacity;
case FULL:
return diskFull;
default:
return disk;
}
}

private void addDiskModels(IBakedModel disk, DiskState type, Direction facing) {
for (int x = 0; x < 2; ++x) {
for (int y = 0; y < 3; ++y) {
TRSRBakedModel model = new TRSRBakedModel(disk, facing);
private Vector3f getDiskTranslation(Direction facing, int x, int y) {
Vector3f translation = new Vector3f();

Vector3f trans = model.transformation.getTranslation();

if (facing == Direction.NORTH || facing == Direction.SOUTH) {
trans.add((2F / 16F + ((float) x * 7F) / 16F) * (facing == Direction.NORTH ? -1 : 1), 0, 0); // Add to X
} else if (facing == Direction.EAST || facing == Direction.WEST) {
trans.add(0, 0, (2F / 16F + ((float) x * 7F) / 16F) * (facing == Direction.EAST ? -1 : 1)); // Add to Z
}
if (facing == Direction.NORTH || facing == Direction.SOUTH) {
translation.add((2F / 16F + ((float) x * 7F) / 16F) * (facing == Direction.NORTH ? -1 : 1), 0, 0); // Add to X
} else if (facing == Direction.EAST || facing == Direction.WEST) {
translation.add(0, 0, (2F / 16F + ((float) x * 7F) / 16F) * (facing == Direction.EAST ? -1 : 1)); // Add to Z
}

trans.add(0, -((6F / 16F) + (3F * y) / 16F), 0); // Remove from Y

model.transformation = new TransformationMatrix(trans, model.transformation.getRotationLeft(), model.transformation.getScale(), model.transformation.getRightRot());
translation.add(0, -((6F / 16F) + (3F * y) / 16F), 0); // Remove from Y

disks.get(facing).get(type).add(model);
}
}
return translation;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class DiskManipulatorTile extends NetworkNodeTile<DiskManipulatorNetworkN

private final LazyOptional<IItemHandler> diskCapability = LazyOptional.of(() -> getNode().getDisks());

private final DiskState[] diskState = new DiskState[8];
private final DiskState[] diskState = new DiskState[6];

public DiskManipulatorTile() {
super(RSTiles.DISK_MANIPULATOR);
Expand Down

0 comments on commit 4056d26

Please sign in to comment.