Skip to content

Commit 9481803

Browse files
committed
uwu2
1 parent 7592fc5 commit 9481803

98 files changed

Lines changed: 7344 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
6+
package net.neoforged.neoforge.client;
7+
8+
import com.google.common.collect.ImmutableList;
9+
import java.util.Arrays;
10+
import java.util.BitSet;
11+
import java.util.Collection;
12+
import java.util.Collections;
13+
import java.util.Iterator;
14+
import java.util.List;
15+
import net.minecraft.Util;
16+
import net.minecraft.client.renderer.RenderType;
17+
18+
/**
19+
* An immutable ordered set (not implementing {@link java.util.Set}) of chunk {@linkplain RenderType render types}.
20+
* <p>
21+
* Considerably speeds up lookups and merges of sets of chunk {@linkplain RenderType render types}.
22+
* Users should cache their instances of this class whenever possible, as instantiating it is cheap, but not free.
23+
*/
24+
public sealed class ChunkRenderTypeSet implements Iterable<RenderType> {
25+
private static final List<RenderType> CHUNK_RENDER_TYPES_LIST = RenderType.chunkBufferLayers();
26+
private static final RenderType[] CHUNK_RENDER_TYPES = CHUNK_RENDER_TYPES_LIST.toArray(new RenderType[0]);
27+
28+
private static final ChunkRenderTypeSet NONE = new None();
29+
private static final ChunkRenderTypeSet ALL = new All();
30+
31+
public static ChunkRenderTypeSet none() {
32+
return NONE;
33+
}
34+
35+
public static ChunkRenderTypeSet all() {
36+
return ALL;
37+
}
38+
39+
public static ChunkRenderTypeSet of(RenderType... renderTypes) {
40+
return of(Arrays.asList(renderTypes));
41+
}
42+
43+
public static ChunkRenderTypeSet of(Collection<RenderType> renderTypes) {
44+
if (renderTypes.isEmpty())
45+
return none();
46+
return of((Iterable<RenderType>) renderTypes);
47+
}
48+
49+
private static ChunkRenderTypeSet of(Iterable<RenderType> renderTypes) {
50+
var bits = new BitSet();
51+
for (RenderType renderType : renderTypes) {
52+
int index = renderType.getChunkLayerId();
53+
if (index < 0) {
54+
throw new IllegalArgumentException("Attempted to create chunk render type set with a non-chunk render type: " + renderType);
55+
}
56+
bits.set(index);
57+
}
58+
return new ChunkRenderTypeSet(bits);
59+
}
60+
61+
public static ChunkRenderTypeSet union(ChunkRenderTypeSet... sets) {
62+
return union(Arrays.asList(sets));
63+
}
64+
65+
public static ChunkRenderTypeSet union(Collection<ChunkRenderTypeSet> sets) {
66+
if (sets.isEmpty())
67+
return none();
68+
return union((Iterable<ChunkRenderTypeSet>) sets);
69+
}
70+
71+
public static ChunkRenderTypeSet union(Iterable<ChunkRenderTypeSet> sets) {
72+
var bits = new BitSet();
73+
for (var set : sets)
74+
bits.or(set.bits);
75+
return new ChunkRenderTypeSet(bits);
76+
}
77+
78+
public static ChunkRenderTypeSet intersection(ChunkRenderTypeSet... sets) {
79+
return intersection(Arrays.asList(sets));
80+
}
81+
82+
public static ChunkRenderTypeSet intersection(Collection<ChunkRenderTypeSet> sets) {
83+
if (sets.isEmpty())
84+
return all();
85+
return intersection((Iterable<ChunkRenderTypeSet>) sets);
86+
}
87+
88+
public static ChunkRenderTypeSet intersection(Iterable<ChunkRenderTypeSet> sets) {
89+
var bits = new BitSet();
90+
bits.set(0, CHUNK_RENDER_TYPES.length);
91+
for (var set : sets)
92+
bits.and(set.bits);
93+
return new ChunkRenderTypeSet(bits);
94+
}
95+
96+
private final BitSet bits;
97+
98+
private ChunkRenderTypeSet(BitSet bits) {
99+
this.bits = bits;
100+
}
101+
102+
public boolean isEmpty() {
103+
return bits.isEmpty();
104+
}
105+
106+
public boolean contains(RenderType renderType) {
107+
int id = renderType.getChunkLayerId();
108+
return id >= 0 && bits.get(id);
109+
}
110+
111+
@Override
112+
public Iterator<RenderType> iterator() {
113+
return new IteratorImpl();
114+
}
115+
116+
public List<RenderType> asList() {
117+
return ImmutableList.copyOf(this);
118+
}
119+
120+
private final class IteratorImpl implements Iterator<RenderType> {
121+
private int index = bits.nextSetBit(0);
122+
123+
@Override
124+
public boolean hasNext() {
125+
return index >= 0;
126+
}
127+
128+
@Override
129+
public RenderType next() {
130+
var renderType = CHUNK_RENDER_TYPES[index];
131+
index = bits.nextSetBit(index + 1);
132+
return renderType;
133+
}
134+
}
135+
136+
private static final class None extends ChunkRenderTypeSet {
137+
private None() {
138+
super(new BitSet());
139+
}
140+
141+
@Override
142+
public boolean isEmpty() {
143+
return true;
144+
}
145+
146+
@Override
147+
public boolean contains(RenderType renderType) {
148+
return false;
149+
}
150+
151+
@Override
152+
public Iterator<RenderType> iterator() {
153+
return Collections.emptyIterator();
154+
}
155+
156+
@Override
157+
public List<RenderType> asList() {
158+
return List.of();
159+
}
160+
}
161+
162+
private static final class All extends ChunkRenderTypeSet {
163+
private All() {
164+
super(Util.make(new BitSet(), bits -> bits.set(0, CHUNK_RENDER_TYPES.length)));
165+
}
166+
167+
@Override
168+
public boolean isEmpty() {
169+
return false;
170+
}
171+
172+
@Override
173+
public boolean contains(RenderType renderType) {
174+
return renderType.getChunkLayerId() >= 0; // Could just return true for efficiency purposes, but checking is near-free
175+
}
176+
177+
@Override
178+
public Iterator<RenderType> iterator() {
179+
return CHUNK_RENDER_TYPES_LIST.iterator();
180+
}
181+
182+
@Override
183+
public List<RenderType> asList() {
184+
return CHUNK_RENDER_TYPES_LIST;
185+
}
186+
}
187+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (c) Forge Development LLC and contributors
3+
* SPDX-License-Identifier: LGPL-2.1-only
4+
*/
5+
6+
package net.neoforged.neoforge.client;
7+
8+
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
9+
import net.minecraft.client.Minecraft;
10+
import net.minecraft.client.renderer.ItemBlockRenderTypes;
11+
import net.minecraft.client.renderer.RenderType;
12+
import net.minecraft.client.renderer.Sheets;
13+
import net.minecraft.client.resources.model.BakedModel;
14+
import net.minecraft.util.RandomSource;
15+
import net.minecraft.world.item.BlockItem;
16+
import net.minecraft.world.item.ItemStack;
17+
import net.minecraft.world.level.block.state.BlockState;
18+
import net.neoforged.neoforge.client.model.data.ModelData;
19+
20+
/**
21+
* Provides helper functions replacing those in {@link ItemBlockRenderTypes}.
22+
*/
23+
public final class RenderTypeHelper {
24+
/**
25+
* Provides a {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for the given {@link DefaultVertexFormat#BLOCK} format.
26+
* This should be called for each {@link RenderType} returned by {@link BakedModel#getRenderTypes(BlockState, RandomSource, ModelData)}.
27+
* <p>
28+
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getRenderType(BlockState, boolean)}.
29+
*/
30+
public static RenderType getEntityRenderType(RenderType chunkRenderType, boolean cull) {
31+
if (chunkRenderType != RenderType.translucent())
32+
return Sheets.cutoutBlockSheet();
33+
return cull || !Minecraft.useShaderTransparency() ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet();
34+
}
35+
36+
/**
37+
* Provides a {@link RenderType} fit for rendering moving blocks given the specified chunk render type.
38+
* This should be called for each {@link RenderType} returned by {@link BakedModel#getRenderTypes(BlockState, RandomSource, ModelData)}.
39+
* <p>
40+
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getMovingBlockRenderType(BlockState)}.
41+
*/
42+
public static RenderType getMovingBlockRenderType(RenderType renderType) {
43+
if (renderType == RenderType.translucent())
44+
return RenderType.translucentMovingBlock();
45+
return renderType;
46+
}
47+
48+
/**
49+
* Provides a fallback {@link RenderType} for the given {@link ItemStack} in the case that none is explicitly specified.
50+
* <p>
51+
* Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getRenderType(ItemStack, boolean)}
52+
* but removes the need to query the model again if the item is a {@link BlockItem}.
53+
*/
54+
public static RenderType getFallbackItemRenderType(ItemStack stack, BakedModel model, boolean cull) {
55+
if (stack.getItem() instanceof BlockItem blockItem) {
56+
var renderTypes = model.getRenderTypes(blockItem.getBlock().defaultBlockState(), RandomSource.create(42), ModelData.EMPTY);
57+
if (renderTypes.contains(RenderType.translucent()))
58+
return getEntityRenderType(RenderType.translucent(), cull);
59+
return Sheets.cutoutBlockSheet();
60+
}
61+
return cull ? Sheets.translucentCullBlockSheet() : Sheets.translucentItemSheet();
62+
}
63+
64+
private RenderTypeHelper() {}
65+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"variants": {
3+
"": {
4+
"model": "crazyae2addons:block/auto_builder"
5+
}
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"variants": {
3+
"": {
4+
"model": "crazyae2addons:block/auto_builder_creative_supply"
5+
}
6+
}
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"variants": {
3+
"": {
4+
"model": "crazyae2addons:block/crafting_scheduler"
5+
}
6+
}
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "minecraft:block/cube_all",
3+
"textures": {
4+
"all": "crazyae2addons:block/auto_builder"
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "minecraft:block/cube_all",
3+
"textures": {
4+
"all": "crazyae2addons:block/auto_builder_creative_supply"
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"parent": "minecraft:block/cube_all",
3+
"textures": {
4+
"all": "crazyae2addons:block/crafting_scheduler"
5+
}
6+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"parent": "crazyae2addons:block/auto_builder"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"parent": "crazyae2addons:block/auto_builder_creative_supply"
3+
}

0 commit comments

Comments
 (0)