From fbea90eaedc298a8b2ea9f51366f1270c026fd91 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Sat, 11 Jul 2020 17:05:07 +0200 Subject: [PATCH] Move DiskDriveBakedModel away from TRSRBakedModel --- .../render/model/DiskDriveBakedModel.java | 85 ++++++++++++------- .../render/model/QuadTransformer.java | 48 +++++++++++ 2 files changed, 101 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/refinedmods/refinedstorage/render/model/QuadTransformer.java diff --git a/src/main/java/com/refinedmods/refinedstorage/render/model/DiskDriveBakedModel.java b/src/main/java/com/refinedmods/refinedstorage/render/model/DiskDriveBakedModel.java index 7cb88c583..0f8d272fa 100644 --- a/src/main/java/com/refinedmods/refinedstorage/render/model/DiskDriveBakedModel.java +++ b/src/main/java/com/refinedmods/refinedstorage/render/model/DiskDriveBakedModel.java @@ -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 baseByFacing = new HashMap<>(); - private final Map>> 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> cache = CacheBuilder.newBuilder().build(new CacheLoader>() { @Override @@ -72,11 +78,27 @@ public class DiskDriveBakedModel extends DelegateBakedModel { public List load(CacheKey key) { Direction facing = key.state.get(RSBlocks.DISK_DRIVE.getDirection().getProperty()); - List quads = new ArrayList<>(baseByFacing.get(facing).getQuads(key.state, key.side, key.random)); + List 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,39 +113,38 @@ 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<>()); + private Vector3f getDiskTranslation(Direction facing, int x, int y) { + Vector3f trans = new Vector3f(); - for (int y = 0; y < 4; ++y) { - for (int x = 0; x < 2; ++x) { - Vector3f trans = 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 - } 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 - } - - trans.add(0, -((2F / 16F) + ((float) y * 3F) / 16F), 0); // Remove from Y - - disksByFacing.get(facing).get(type).add(new TRSRBakedModel(disk, facing, trans)); - } + 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 Y } + + trans.add(0, -((2F / 16F) + ((float) y * 3F) / 16F), 0); // Remove from Y + + return trans; } @Nonnull diff --git a/src/main/java/com/refinedmods/refinedstorage/render/model/QuadTransformer.java b/src/main/java/com/refinedmods/refinedstorage/render/model/QuadTransformer.java new file mode 100644 index 000000000..c19be3a14 --- /dev/null +++ b/src/main/java/com/refinedmods/refinedstorage/render/model/QuadTransformer.java @@ -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 SIDE_TRANSFORMS = new EnumMap<>(Direction.class); + + public static List 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 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(); + } +}