VulkanShader_1.21.10-0.0.4-alpha.jar

Download file
    package net.vulkanmod.render.vertex;

import com.mojang.blaze3d.vertex.VertexFormat;
import net.vulkanmod.render.util.SortUtil;
import org.joml.Vector3f;
import org.lwjgl.system.MemoryUtil;

public class QuadSorter {
   private Vector3f[] sortingPoints;
   private float sortX = Float.NaN;
   private float sortY = Float.NaN;
   private float sortZ = Float.NaN;
   private boolean indexOnly;
   private VertexFormat format;
   private int vertexCount;
   private int indexCount;
   private float[] distances;
   private int[] sortingPointsIndices;

   public void setQuadSortOrigin(float x, float y, float z) {
      this.sortX = x;
      this.sortY = y;
      this.sortZ = z;
   }

   public SortState getSortState() {
      return new SortState(this.vertexCount, this.sortingPoints, this.distances, this.sortingPointsIndices);
   }

   public void restoreSortState(SortState sortState) {
      this.vertexCount = sortState.vertexCount;
      this.sortingPoints = sortState.sortingPoints;
      this.distances = sortState.distances;
      this.sortingPointsIndices = sortState.sortingPointsIndices;
      this.indexOnly = true;
   }

   public void setupQuadSortingPoints(long bufferPtr, int vertexCount, VertexFormat format) {
      this.vertexCount = vertexCount;
      int pointCount = vertexCount / 4;
      Vector3f[] sortingPoints = new Vector3f[pointCount];
      int vertexSize = format.getVertexSize();
      int quadStride = vertexSize * 4;
      int offset = vertexSize * 2;
      if (format == CustomVertexFormat.COMPRESSED_TERRAIN) {
         float invConv = 4.8828125E-4F;
         float convOffset = 4.0F;

         for(int m = 0; m < pointCount; ++m) {
            long ptr = bufferPtr + (long)m * (long)quadStride;
            short x0 = MemoryUtil.memGetShort(ptr + 0L);
            short y0 = MemoryUtil.memGetShort(ptr + 2L);
            short z0 = MemoryUtil.memGetShort(ptr + 4L);
            short x2 = MemoryUtil.memGetShort(ptr + (long)offset + 0L);
            short y2 = MemoryUtil.memGetShort(ptr + (long)offset + 2L);
            short z2 = MemoryUtil.memGetShort(ptr + (long)offset + 4L);
            float xa = (float)(x0 + x2) * 4.8828125E-4F * 0.5F + 4.0F;
            float ya = (float)(y0 + y2) * 4.8828125E-4F * 0.5F + 4.0F;
            float za = (float)(z0 + z2) * 4.8828125E-4F * 0.5F + 4.0F;
            sortingPoints[m] = new Vector3f(xa, ya, za);
         }
      } else {
         for(int m = 0; m < pointCount; ++m) {
            long ptr = bufferPtr + (long)m * (long)quadStride;
            float x0 = MemoryUtil.memGetFloat(ptr + 0L);
            float y0 = MemoryUtil.memGetFloat(ptr + 4L);
            float z0 = MemoryUtil.memGetFloat(ptr + 8L);
            float x2 = MemoryUtil.memGetFloat(ptr + (long)offset + 0L);
            float y2 = MemoryUtil.memGetFloat(ptr + (long)offset + 4L);
            float z2 = MemoryUtil.memGetFloat(ptr + (long)offset + 8L);
            float q = (x0 + x2) * 0.5F;
            float r = (y0 + y2) * 0.5F;
            float s = (z0 + z2) * 0.5F;
            sortingPoints[m] = new Vector3f(q, r, s);
         }
      }

      this.sortingPoints = sortingPoints;
      this.distances = new float[pointCount];
      this.sortingPointsIndices = new int[pointCount];
   }

   public void putSortedQuadIndices(TerrainBufferBuilder bufferBuilder, VertexFormat.class_5595 indexType) {
      float[] distances = this.distances;
      int[] sortingPointsIndices = this.sortingPointsIndices;

      for(int i = 0; i < this.sortingPoints.length; sortingPointsIndices[i] = i++) {
         float dx = this.sortingPoints[i].x() - this.sortX;
         float dy = this.sortingPoints[i].y() - this.sortY;
         float dz = this.sortingPoints[i].z() - this.sortZ;
         distances[i] = dx * dx + dy * dy + dz * dz;
      }

      SortUtil.mergeSort(sortingPointsIndices, distances);
      long ptr = bufferBuilder.getPtr();
      int size = indexType.field_27375;
      int stride = 4;

      for(int i = 0; i < sortingPointsIndices.length; ++i) {
         int quadIndex = sortingPointsIndices[i];
         int baseVertex = quadIndex * 4;
         MemoryUtil.memPutInt(ptr + (long)size * 0L, baseVertex + 0);
         MemoryUtil.memPutInt(ptr + (long)size * 1L, baseVertex + 1);
         MemoryUtil.memPutInt(ptr + (long)size * 2L, baseVertex + 2);
         MemoryUtil.memPutInt(ptr + (long)size * 3L, baseVertex + 2);
         MemoryUtil.memPutInt(ptr + (long)size * 4L, baseVertex + 3);
         MemoryUtil.memPutInt(ptr + (long)size * 5L, baseVertex + 0);
         ptr += (long)size * 6L;
      }

   }

   public void putSortedQuadIndices(TerrainBuilder bufferBuilder, VertexFormat.class_5595 indexType) {
      float[] distances = new float[this.sortingPoints.length];
      int[] sortingPoints = new int[this.sortingPoints.length];

      for(int i = 0; i < this.sortingPoints.length; sortingPoints[i] = i++) {
         float dx = this.sortingPoints[i].x() - this.sortX;
         float dy = this.sortingPoints[i].y() - this.sortY;
         float dz = this.sortingPoints[i].z() - this.sortZ;
         distances[i] = dx * dx + dy * dy + dz * dz;
      }

      SortUtil.mergeSort(sortingPoints, distances);
      long ptr = bufferBuilder.indexBufferPtr;
      int size = indexType.field_27375;
      int stride = 4;

      for(int i = 0; i < sortingPoints.length; ++i) {
         int quadIndex = sortingPoints[i];
         int baseVertex = quadIndex * 4;
         MemoryUtil.memPutInt(ptr + (long)size * 0L, baseVertex + 0);
         MemoryUtil.memPutInt(ptr + (long)size * 1L, baseVertex + 1);
         MemoryUtil.memPutInt(ptr + (long)size * 2L, baseVertex + 2);
         MemoryUtil.memPutInt(ptr + (long)size * 3L, baseVertex + 2);
         MemoryUtil.memPutInt(ptr + (long)size * 4L, baseVertex + 3);
         MemoryUtil.memPutInt(ptr + (long)size * 5L, baseVertex + 0);
         ptr += (long)size * 6L;
      }

   }

   public void reset() {
      this.vertexCount = 0;
   }

   public int getVertexCount() {
      return this.vertexCount;
   }

   public int getIndexCount() {
      return this.indexCount;
   }

   public static class SortState {
      final int vertexCount;
      final Vector3f[] sortingPoints;
      final float[] distances;
      final int[] sortingPointsIndices;

      SortState(int vertexCount, Vector3f[] sortingPoints, float[] distances, int[] sortingPointsIndices) {
         this.vertexCount = vertexCount;
         this.sortingPoints = sortingPoints;
         this.distances = distances;
         this.sortingPointsIndices = sortingPointsIndices;
      }
   }
}
    
Download file