Move DiskDriveBakedModel away from TRSRBakedModel
This commit is contained in:
@@ -15,7 +15,10 @@ import net.minecraftforge.client.model.data.IModelData;
|
||||
|
||||
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 DiskDriveBakedModel extends DelegateBakedModel {
|
||||
private static class CacheKey {
|
||||
@@ -63,8 +66,11 @@ public class DiskDriveBakedModel extends DelegateBakedModel {
|
||||
}
|
||||
}
|
||||
|
||||
private final Map<Direction, IBakedModel> baseByFacing = new HashMap<>();
|
||||
private final Map<Direction, Map<DiskState, List<IBakedModel>>> disksByFacing = new HashMap<>();
|
||||
private final IBakedModel base;
|
||||
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
|
||||
@@ -72,11 +78,27 @@ public class DiskDriveBakedModel extends DelegateBakedModel {
|
||||
public List<BakedQuad> load(CacheKey key) {
|
||||
Direction facing = key.state.get(RSBlocks.DISK_DRIVE.getDirection().getProperty());
|
||||
|
||||
List<BakedQuad> quads = new ArrayList<>(baseByFacing.get(facing).getQuads(key.state, key.side, key.random));
|
||||
List<BakedQuad> quads = new ArrayList<>(QuadTransformer.getTransformedQuads(base, facing, null, key.state, key.random, key.side));
|
||||
|
||||
int x = 0, y = 0;
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
if (key.diskState[i] != DiskState.NONE) {
|
||||
quads.addAll(disksByFacing.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
|
||||
));
|
||||
}
|
||||
|
||||
x++;
|
||||
if ((i + 1) % 2 == 0) {
|
||||
y++;
|
||||
x = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,26 +113,27 @@ public class DiskDriveBakedModel extends DelegateBakedModel {
|
||||
IBakedModel diskDisconnected) {
|
||||
super(base);
|
||||
|
||||
for (Direction facing : Direction.values()) {
|
||||
if (facing.getHorizontalIndex() == -1) {
|
||||
continue;
|
||||
this.base = base;
|
||||
this.disk = disk;
|
||||
this.diskNearCapacity = diskNearCapacity;
|
||||
this.diskFull = diskFull;
|
||||
this.diskDisconnected = diskDisconnected;
|
||||
}
|
||||
|
||||
baseByFacing.put(facing, new TRSRBakedModel(base, facing, null));
|
||||
disksByFacing.put(facing, new HashMap<>());
|
||||
|
||||
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) {
|
||||
disksByFacing.get(facing).put(type, new ArrayList<>());
|
||||
|
||||
for (int y = 0; y < 4; ++y) {
|
||||
for (int x = 0; x < 2; ++x) {
|
||||
private Vector3f getDiskTranslation(Direction facing, int x, int y) {
|
||||
Vector3f trans = new Vector3f();
|
||||
|
||||
if (facing == Direction.NORTH || facing == Direction.SOUTH) {
|
||||
@@ -121,9 +144,7 @@ public class DiskDriveBakedModel extends DelegateBakedModel {
|
||||
|
||||
trans.add(0, -((2F / 16F) + ((float) y * 3F) / 16F), 0); // Remove from Y
|
||||
|
||||
disksByFacing.get(facing).get(type).add(new TRSRBakedModel(disk, facing, trans));
|
||||
}
|
||||
}
|
||||
return trans;
|
||||
}
|
||||
|
||||
@Nonnull
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package com.refinedmods.refinedstorage.render.model;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
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;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
|
||||
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
|
||||
import net.minecraftforge.common.model.TransformationHelper;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
public class QuadTransformer {
|
||||
private static final Map<Direction, TransformationMatrix> SIDE_TRANSFORMS = new EnumMap<>(Direction.class);
|
||||
|
||||
public static List<BakedQuad> getTransformedQuads(IBakedModel model, Direction facing, @Nullable Vector3f translation, BlockState state, Random rand, Direction side) {
|
||||
double r = Math.PI * (360 - facing.getOpposite().getHorizontalIndex() * 90) / 180d;
|
||||
|
||||
TransformationMatrix transformation = new TransformationMatrix(translation, TransformationHelper.quatFromXYZ(new Vector3f(0, (float) r, 0), false), null, null);
|
||||
|
||||
ImmutableList.Builder<BakedQuad> quads = ImmutableList.builder();
|
||||
|
||||
if (side != null && side.getHorizontalIndex() > -1) {
|
||||
int faceOffset = 4 + Direction.NORTH.getHorizontalIndex() - facing.getHorizontalIndex();
|
||||
|
||||
side = Direction.byHorizontalIndex((side.getHorizontalIndex() + faceOffset) % 4);
|
||||
}
|
||||
|
||||
for (BakedQuad quad : model.getQuads(state, side, rand, EmptyModelData.INSTANCE)) {
|
||||
BakedQuadBuilder builder = new BakedQuadBuilder(quad.func_187508_a());
|
||||
TRSRTransformer transformer = new TRSRTransformer(builder, transformation.blockCenterToCorner());
|
||||
|
||||
quad.pipe(transformer);
|
||||
|
||||
quads.add(builder.build());
|
||||
}
|
||||
|
||||
return quads.build();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user