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

    • 引用位置: 方法调用
    • 关联成员: GraphicsWorkarounds.get()
  • GpuBuffer

    • 引用位置: 参数/字段/返回值
  • RenderSystem

    • 引用位置: 方法调用
    • 关联成员: RenderSystem.getDevice()
  • VertexFormatElement

    • 引用位置: 参数/字段/方法调用/返回值
    • 关联成员: VertexFormatElement.byId()
  • Mth

    • 引用位置: 方法调用
    • 关联成员: Mth.isMultipleOf()