minecraft-src/net/minecraft/client/resources/model/QuadCollection.java
2025-07-04 03:45:38 +03:00

128 lines
4.3 KiB
Java

package net.minecraft.client.resources.model;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Multimap;
import java.util.Collection;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.core.Direction;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class QuadCollection {
public static final QuadCollection EMPTY = new QuadCollection(List.of(), List.of(), List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
private final List<BakedQuad> all;
private final List<BakedQuad> unculled;
private final List<BakedQuad> north;
private final List<BakedQuad> south;
private final List<BakedQuad> east;
private final List<BakedQuad> west;
private final List<BakedQuad> up;
private final List<BakedQuad> down;
QuadCollection(
List<BakedQuad> all,
List<BakedQuad> unculled,
List<BakedQuad> north,
List<BakedQuad> south,
List<BakedQuad> east,
List<BakedQuad> west,
List<BakedQuad> up,
List<BakedQuad> down
) {
this.all = all;
this.unculled = unculled;
this.north = north;
this.south = south;
this.east = east;
this.west = west;
this.up = up;
this.down = down;
}
public List<BakedQuad> getQuads(@Nullable Direction direction) {
return switch (direction) {
case null -> this.unculled;
case NORTH -> this.north;
case SOUTH -> this.south;
case EAST -> this.east;
case WEST -> this.west;
case UP -> this.up;
case DOWN -> this.down;
};
}
public List<BakedQuad> getAll() {
return this.all;
}
@Environment(EnvType.CLIENT)
public static class Builder {
private final ImmutableList.Builder<BakedQuad> unculledFaces = ImmutableList.builder();
private final Multimap<Direction, BakedQuad> culledFaces = ArrayListMultimap.create();
public QuadCollection.Builder addCulledFace(Direction direction, BakedQuad quad) {
this.culledFaces.put(direction, quad);
return this;
}
public QuadCollection.Builder addUnculledFace(BakedQuad quad) {
this.unculledFaces.add(quad);
return this;
}
private static QuadCollection createFromSublists(
List<BakedQuad> quads, int unculledSize, int northSize, int southSize, int eastSize, int westSize, int upSize, int downSize
) {
int i = 0;
int var16;
List<BakedQuad> list = quads.subList(i, var16 = i + unculledSize);
List<BakedQuad> list2 = quads.subList(var16, i = var16 + northSize);
int var18;
List<BakedQuad> list3 = quads.subList(i, var18 = i + southSize);
List<BakedQuad> list4 = quads.subList(var18, i = var18 + eastSize);
int var20;
List<BakedQuad> list5 = quads.subList(i, var20 = i + westSize);
List<BakedQuad> list6 = quads.subList(var20, i = var20 + upSize);
List<BakedQuad> list7 = quads.subList(i, i + downSize);
return new QuadCollection(quads, list, list2, list3, list4, list5, list6, list7);
}
public QuadCollection build() {
ImmutableList<BakedQuad> immutableList = this.unculledFaces.build();
if (this.culledFaces.isEmpty()) {
return immutableList.isEmpty()
? QuadCollection.EMPTY
: new QuadCollection(immutableList, immutableList, List.of(), List.of(), List.of(), List.of(), List.of(), List.of());
} else {
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
builder.addAll(immutableList);
Collection<BakedQuad> collection = this.culledFaces.get(Direction.NORTH);
builder.addAll(collection);
Collection<BakedQuad> collection2 = this.culledFaces.get(Direction.SOUTH);
builder.addAll(collection2);
Collection<BakedQuad> collection3 = this.culledFaces.get(Direction.EAST);
builder.addAll(collection3);
Collection<BakedQuad> collection4 = this.culledFaces.get(Direction.WEST);
builder.addAll(collection4);
Collection<BakedQuad> collection5 = this.culledFaces.get(Direction.UP);
builder.addAll(collection5);
Collection<BakedQuad> collection6 = this.culledFaces.get(Direction.DOWN);
builder.addAll(collection6);
return createFromSublists(
builder.build(),
immutableList.size(),
collection.size(),
collection2.size(),
collection3.size(),
collection4.size(),
collection5.size(),
collection6.size()
);
}
}
}
}