VertexFormat.java
com.mojang.blaze3d.vertex.VertexFormat
信息
- 全限定名:com.mojang.blaze3d.vertex.VertexFormat
- 类型:public class
- 包:com.mojang.blaze3d.vertex
- 源码路径:src/main/java/com/mojang/blaze3d/vertex/VertexFormat.java
- 起始行号:L22
- 职责:
TODO
字段/常量
-
UNKNOWN_ELEMENT- 类型:
int - 修饰符:
public static final - 源码定位:
L23 - 说明:
TODO
- 类型:
-
VERTEX_ALIGNMENT- 类型:
int - 修饰符:
private static final - 源码定位:
L24 - 说明:
TODO
- 类型:
-
elements- 类型:
List<VertexFormatElement> - 修饰符:
private final - 源码定位:
L25 - 说明:
TODO
- 类型:
-
names- 类型:
List<String> - 修饰符:
private final - 源码定位:
L26 - 说明:
TODO
- 类型:
-
vertexSize- 类型:
int - 修饰符:
private final - 源码定位:
L27 - 说明:
TODO
- 类型:
-
elementsMask- 类型:
int - 修饰符:
private final - 源码定位:
L28 - 说明:
TODO
- 类型:
-
offsetsByElement- 类型:
int[] - 修饰符:
private final - 源码定位:
L29 - 说明:
TODO
- 类型:
-
immediateDrawVertexBuffer- 类型:
GpuBuffer - 修饰符:
private - 源码定位:
L30 - 说明:
TODO
- 类型:
-
immediateDrawIndexBuffer- 类型:
GpuBuffer - 修饰符:
private - 源码定位:
L31 - 说明:
TODO
- 类型:
内部类/嵌套类型
-
com.mojang.blaze3d.vertex.VertexFormat.Builder- 类型:
class - 修饰符:
public static - 源码定位:
L144 - 说明:
TODO
- 类型:
-
com.mojang.blaze3d.vertex.VertexFormat.IndexType- 类型:
enum - 修饰符:
public static - 源码定位:
L178 - 说明:
TODO
- 类型:
-
com.mojang.blaze3d.vertex.VertexFormat.Mode- 类型:
enum - 修饰符:
public static - 源码定位:
L194 - 说明:
TODO
- 类型:
构造器
private VertexFormat(List<VertexFormatElement> elements, List<String> names, IntList offsets, int vertexSize) @ L33
- 构造器名:VertexFormat
- 源码定位:L33
- 修饰符:private
参数:
- elements: List
- names: List
- offsets: IntList
- vertexSize: int
说明:
TODO
方法
下面的方法块按源码顺序生成。
public static VertexFormat.Builder builder() @ L46
- 方法名:builder
- 源码定位:L46
- 返回类型:VertexFormat.Builder
- 修饰符:public static
参数:
- 无
说明:
TODO
public String toString() @ L50
- 方法名:toString
- 源码定位:L50
- 返回类型:String
- 修饰符:public
参数:
- 无
说明:
TODO
public int getVertexSize() @ L55
- 方法名:getVertexSize
- 源码定位:L55
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public List<VertexFormatElement> getElements() @ L59
- 方法名:getElements
- 源码定位:L59
- 返回类型:List
- 修饰符:public
参数:
- 无
说明:
TODO
public List<String> getElementAttributeNames() @ L63
- 方法名:getElementAttributeNames
- 源码定位:L63
- 返回类型:List
- 修饰符:public
参数:
- 无
说明:
TODO
public int[] getOffsetsByElement() @ L67
- 方法名:getOffsetsByElement
- 源码定位:L67
- 返回类型:int[]
- 修饰符:public
参数:
- 无
说明:
TODO
public int getOffset(VertexFormatElement element) @ L71
- 方法名:getOffset
- 源码定位:L71
- 返回类型:int
- 修饰符:public
参数:
- element: VertexFormatElement
说明:
TODO
public boolean contains(VertexFormatElement element) @ L75
- 方法名:contains
- 源码定位:L75
- 返回类型:boolean
- 修饰符:public
参数:
- element: VertexFormatElement
说明:
TODO
public int getElementsMask() @ L79
- 方法名:getElementsMask
- 源码定位:L79
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
public String getElementName(VertexFormatElement element) @ L83
- 方法名:getElementName
- 源码定位:L83
- 返回类型:String
- 修饰符:public
参数:
- element: VertexFormatElement
说明:
TODO
public boolean equals(Object o) @ L92
- 方法名:equals
- 源码定位:L92
- 返回类型:boolean
- 修饰符:public
参数:
- o: Object
说明:
TODO
public int hashCode() @ L103
- 方法名:hashCode
- 源码定位:L103
- 返回类型:int
- 修饰符:public
参数:
- 无
说明:
TODO
private static GpuBuffer uploadToBuffer(GpuBuffer target, ByteBuffer buffer, int usage, Supplier<String> label) @ L108
- 方法名:uploadToBuffer
- 源码定位:L108
- 返回类型:GpuBuffer
- 修饰符:private static
参数:
- target: GpuBuffer
- buffer: ByteBuffer
- usage: int
- label: Supplier
说明:
TODO
public GpuBuffer uploadImmediateVertexBuffer(ByteBuffer buffer) @ L133
- 方法名:uploadImmediateVertexBuffer
- 源码定位:L133
- 返回类型:GpuBuffer
- 修饰符:public
参数:
- buffer: ByteBuffer
说明:
TODO
public GpuBuffer uploadImmediateIndexBuffer(ByteBuffer buffer) @ L138
- 方法名:uploadImmediateIndexBuffer
- 源码定位:L138
- 返回类型:GpuBuffer
- 修饰符:public
参数:
- buffer: ByteBuffer
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public class VertexFormat {
public static final int UNKNOWN_ELEMENT = -1;
private static final int VERTEX_ALIGNMENT = 4;
private final List<VertexFormatElement> elements;
private final List<String> names;
private final int vertexSize;
private final int elementsMask;
private final int[] offsetsByElement = new int[32];
private @Nullable GpuBuffer immediateDrawVertexBuffer;
private @Nullable GpuBuffer immediateDrawIndexBuffer;
private VertexFormat(List<VertexFormatElement> elements, List<String> names, IntList offsets, int vertexSize) {
this.elements = elements;
this.names = names;
this.vertexSize = vertexSize;
this.elementsMask = elements.stream().mapToInt(VertexFormatElement::mask).reduce(0, (left, right) -> left | right);
for (int id = 0; id < this.offsetsByElement.length; id++) {
VertexFormatElement element = VertexFormatElement.byId(id);
int index = element != null ? elements.indexOf(element) : -1;
this.offsetsByElement[id] = index != -1 ? offsets.getInt(index) : -1;
}
}
public static VertexFormat.Builder builder() {
return new VertexFormat.Builder();
}
@Override
public String toString() {
return "VertexFormat" + this.names;
}
public int getVertexSize() {
return this.vertexSize;
}
public List<VertexFormatElement> getElements() {
return this.elements;
}
public List<String> getElementAttributeNames() {
return this.names;
}
public int[] getOffsetsByElement() {
return this.offsetsByElement;
}
public int getOffset(VertexFormatElement element) {
return this.offsetsByElement[element.id()];
}
public boolean contains(VertexFormatElement element) {
return (this.elementsMask & element.mask()) != 0;
}
public int getElementsMask() {
return this.elementsMask;
}
public String getElementName(VertexFormatElement element) {
int index = this.elements.indexOf(element);
if (index == -1) {
throw new IllegalArgumentException(element + " is not contained in format");
} else {
return this.names.get(index);
}
}
@Override
public boolean equals(Object o) {
return this == o
? true
: o instanceof VertexFormat format
&& this.elementsMask == format.elementsMask
&& this.vertexSize == format.vertexSize
&& this.names.equals(format.names)
&& Arrays.equals(this.offsetsByElement, format.offsetsByElement);
}
@Override
public int hashCode() {
return this.elementsMask * 31 + Arrays.hashCode(this.offsetsByElement);
}
private static GpuBuffer uploadToBuffer(@Nullable GpuBuffer target, ByteBuffer buffer, @GpuBuffer.Usage int usage, Supplier<String> label) {
GpuDevice device = RenderSystem.getDevice();
if (GraphicsWorkarounds.get(device).alwaysCreateFreshImmediateBuffer()) {
if (target != null) {
target.close();
}
return device.createBuffer(label, usage, buffer);
} else {
if (target == null) {
target = device.createBuffer(label, usage, buffer);
} else {
CommandEncoder encoder = device.createCommandEncoder();
if (target.size() < buffer.remaining()) {
target.close();
target = device.createBuffer(label, usage, buffer);
} else {
encoder.writeToBuffer(target.slice(), buffer);
}
}
return target;
}
}
public GpuBuffer uploadImmediateVertexBuffer(ByteBuffer buffer) {
this.immediateDrawVertexBuffer = uploadToBuffer(this.immediateDrawVertexBuffer, buffer, 40, () -> "Immediate vertex buffer for " + this);
return this.immediateDrawVertexBuffer;
}
public GpuBuffer uploadImmediateIndexBuffer(ByteBuffer buffer) {
this.immediateDrawIndexBuffer = uploadToBuffer(this.immediateDrawIndexBuffer, buffer, 72, () -> "Immediate index buffer for " + this);
return this.immediateDrawIndexBuffer;
}
@OnlyIn(Dist.CLIENT)
public static class Builder {
private final ImmutableMap.Builder<String, VertexFormatElement> elements = ImmutableMap.builder();
private final IntList offsets = new IntArrayList();
private int offset;
private Builder() {
}
public VertexFormat.Builder add(String name, VertexFormatElement element) {
this.elements.put(name, element);
this.offsets.add(this.offset);
this.offset = this.offset + element.byteSize();
return this;
}
public VertexFormat.Builder padding(int bytes) {
this.offset += bytes;
return this;
}
public VertexFormat build() {
ImmutableMap<String, VertexFormatElement> elementMap = this.elements.buildOrThrow();
ImmutableList<VertexFormatElement> elements = elementMap.values().asList();
ImmutableList<String> names = elementMap.keySet().asList();
int vertexSize = this.offset;
if (!Mth.isMultipleOf(vertexSize, 4)) {
throw new IllegalStateException("Vertex size must be a multiple of 4, was " + vertexSize);
} else {
return new VertexFormat(elements, names, this.offsets, vertexSize);
}
}
}
@OnlyIn(Dist.CLIENT)
public static enum IndexType {
SHORT(2),
INT(4);
public final int bytes;
private IndexType(int bytes) {
this.bytes = bytes;
}
public static VertexFormat.IndexType least(int length) {
return (length & -65536) != 0 ? INT : SHORT;
}
}
@OnlyIn(Dist.CLIENT)
public static enum Mode {
LINES(2, 2, false),
DEBUG_LINES(2, 2, false),
DEBUG_LINE_STRIP(2, 1, true),
POINTS(1, 1, false),
TRIANGLES(3, 3, false),
TRIANGLE_STRIP(3, 1, true),
TRIANGLE_FAN(3, 1, true),
QUADS(4, 4, false);
public final int primitiveLength;
public final int primitiveStride;
public final boolean connectedPrimitives;
private Mode(int primitiveLength, int primitiveStride, boolean connectedPrimitives) {
this.primitiveLength = primitiveLength;
this.primitiveStride = primitiveStride;
this.connectedPrimitives = connectedPrimitives;
}
public int indexCount(int vertexCount) {
return switch (this) {
case LINES, QUADS -> vertexCount / 4 * 6;
case DEBUG_LINES, DEBUG_LINE_STRIP, POINTS, TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN -> vertexCount;
default -> 0;
};
}
}
}引用的其他类
-
- 引用位置:
方法调用 - 关联成员:
GraphicsWorkarounds.get()
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
RenderSystem.getDevice()
- 引用位置:
-
- 引用位置:
参数/字段/方法调用/返回值 - 关联成员:
VertexFormatElement.byId()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Mth.isMultipleOf()
- 引用位置: