Spaces:
Build error
Build error
File size: 6,677 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
package com.mojang.blaze3d.vertex;
import com.mojang.blaze3d.platform.GlStateManager;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public record VertexFormatElement(int id, int index, VertexFormatElement.Type type, VertexFormatElement.Usage usage, int count) {
public static final int MAX_COUNT = 32;
private static final VertexFormatElement[] BY_ID = new VertexFormatElement[32];
private static final List<VertexFormatElement> ELEMENTS = new ArrayList<>(32);
public static final VertexFormatElement POSITION = register(0, 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, 3);
public static final VertexFormatElement COLOR = register(1, 0, VertexFormatElement.Type.UBYTE, VertexFormatElement.Usage.COLOR, 4);
public static final VertexFormatElement UV0 = register(2, 0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.UV, 2);
public static final VertexFormatElement UV = UV0;
public static final VertexFormatElement UV1 = register(3, 1, VertexFormatElement.Type.SHORT, VertexFormatElement.Usage.UV, 2);
public static final VertexFormatElement UV2 = register(4, 2, VertexFormatElement.Type.SHORT, VertexFormatElement.Usage.UV, 2);
public static final VertexFormatElement NORMAL = register(5, 0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.NORMAL, 3);
public VertexFormatElement(int id, int index, VertexFormatElement.Type type, VertexFormatElement.Usage usage, int count) {
if (id < 0 || id >= BY_ID.length) {
throw new IllegalArgumentException("Element ID must be in range [0; " + BY_ID.length + ")");
} else if (!this.supportsUsage(index, usage)) {
throw new IllegalStateException("Multiple vertex elements of the same type other than UVs are not supported");
} else {
this.id = id;
this.index = index;
this.type = type;
this.usage = usage;
this.count = count;
}
}
public static VertexFormatElement register(
int p_343820_, int p_343175_, VertexFormatElement.Type p_342455_, VertexFormatElement.Usage p_344304_, int p_343812_
) {
VertexFormatElement vertexformatelement = new VertexFormatElement(p_343820_, p_343175_, p_342455_, p_344304_, p_343812_);
if (BY_ID[p_343820_] != null) {
throw new IllegalArgumentException("Duplicate element registration for: " + p_343820_);
} else {
BY_ID[p_343820_] = vertexformatelement;
ELEMENTS.add(vertexformatelement);
return vertexformatelement;
}
}
private boolean supportsUsage(int p_86043_, VertexFormatElement.Usage p_86044_) {
return p_86043_ == 0 || p_86044_ == VertexFormatElement.Usage.UV;
}
@Override
public String toString() {
return this.count + "," + this.usage + "," + this.type + " (" + this.id + ")";
}
public int mask() {
return 1 << this.id;
}
public int byteSize() {
return this.type.size() * this.count;
}
public void setupBufferState(int p_166966_, long p_166967_, int p_166968_) {
this.usage.setupState.setupBufferState(this.count, this.type.glType(), p_166968_, p_166967_, p_166966_);
}
@Nullable
public static VertexFormatElement byId(int p_343405_) {
return BY_ID[p_343405_];
}
public static Stream<VertexFormatElement> elementsFromMask(int p_344546_) {
return ELEMENTS.stream().filter(p_345037_ -> p_345037_ != null && (p_344546_ & p_345037_.mask()) != 0);
}
@OnlyIn(Dist.CLIENT)
public static enum Type {
FLOAT(4, "Float", 5126),
UBYTE(1, "Unsigned Byte", 5121),
BYTE(1, "Byte", 5120),
USHORT(2, "Unsigned Short", 5123),
SHORT(2, "Short", 5122),
UINT(4, "Unsigned Int", 5125),
INT(4, "Int", 5124);
private final int size;
private final String name;
private final int glType;
private Type(final int p_86071_, final String p_86072_, final int p_86073_) {
this.size = p_86071_;
this.name = p_86072_;
this.glType = p_86073_;
}
public int size() {
return this.size;
}
public int glType() {
return this.glType;
}
@Override
public String toString() {
return this.name;
}
}
@OnlyIn(Dist.CLIENT)
public static enum Usage {
POSITION(
"Position",
(p_340646_, p_340647_, p_340648_, p_340649_, p_340650_) -> GlStateManager._vertexAttribPointer(
p_340650_, p_340646_, p_340647_, false, p_340648_, p_340649_
)
),
NORMAL(
"Normal",
(p_340656_, p_340657_, p_340658_, p_340659_, p_340660_) -> GlStateManager._vertexAttribPointer(
p_340660_, p_340656_, p_340657_, true, p_340658_, p_340659_
)
),
COLOR(
"Vertex Color",
(p_340661_, p_340662_, p_340663_, p_340664_, p_340665_) -> GlStateManager._vertexAttribPointer(
p_340665_, p_340661_, p_340662_, true, p_340663_, p_340664_
)
),
UV("UV", (p_340641_, p_340642_, p_340643_, p_340644_, p_340645_) -> {
if (p_340642_ == 5126) {
GlStateManager._vertexAttribPointer(p_340645_, p_340641_, p_340642_, false, p_340643_, p_340644_);
} else {
GlStateManager._vertexAttribIPointer(p_340645_, p_340641_, p_340642_, p_340643_, p_340644_);
}
}),
GENERIC(
"Generic",
(p_340651_, p_340652_, p_340653_, p_340654_, p_340655_) -> GlStateManager._vertexAttribPointer(
p_340655_, p_340651_, p_340652_, false, p_340653_, p_340654_
)
);
private final String name;
final VertexFormatElement.Usage.SetupState setupState;
private Usage(final String p_166975_, final VertexFormatElement.Usage.SetupState p_166976_) {
this.name = p_166975_;
this.setupState = p_166976_;
}
@Override
public String toString() {
return this.name;
}
@FunctionalInterface
@OnlyIn(Dist.CLIENT)
interface SetupState {
void setupBufferState(int p_167053_, int p_167054_, int p_167055_, long p_167056_, int p_167057_);
}
}
} |