Move DiskDriveBakedModel away from TRSRBakedModel

This commit is contained in:
raoulvdberge
2020-07-11 17:05:07 +02:00
parent a9bfe70587
commit fbea90eaed
2 changed files with 101 additions and 32 deletions

View File

@@ -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

View File

@@ -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();
}
}