55import com .mojang .blaze3d .vertex .VertexFormat ;
66import com .mojang .blaze3d .vertex .VertexFormatElement ;
77import com .xtracr .realcamera .util .VertexData .MutableVertex ;
8+ import net .minecraft .util .ARGB ;
89import net .minecraft .world .phys .Vec3 ;
910import org .jetbrains .annotations .NotNull ;
1011
1920
2021public class IterableVertexBuffer implements Iterable <VertexData > {
2122 private static final boolean IS_LITTLE_ENDIAN = ByteOrder .nativeOrder () == ByteOrder .LITTLE_ENDIAN ;
23+ public final int vertexCount , vertexSize ;
2224 private final MutableVertex reusableVertex = VertexData .mutable ();
2325 private final Iterable <VertexData []> primitives ;
2426 private final ByteBuffer buffer ;
25- private final int vertexCount , vertexSize ;
2627 private final int positionOffset , colorOffset , uvOffset , overlayOffset , lightOffset , normalOffset ;
2728 private final boolean hasPosition , hasColor , hasUV , hasOverlay , hasLight , hasNormal , fastFormat ;
2829
@@ -72,7 +73,7 @@ public MutableVertex readVertexAt(int index, MutableVertex mutable) {
7273 mutable .x = buffer .getFloat (vertexOffset );
7374 mutable .y = buffer .getFloat (vertexOffset + 4 );
7475 mutable .z = buffer .getFloat (vertexOffset + 8 );
75- mutable .argb = IS_LITTLE_ENDIAN ? buffer . getInt (vertexOffset + 12 ) : Integer . reverseBytes ( buffer . getInt ( vertexOffset + 12 ) );
76+ mutable .argb = readColor (vertexOffset + 12 );
7677 mutable .u = buffer .getFloat (vertexOffset + 16 );
7778 mutable .v = buffer .getFloat (vertexOffset + 20 );
7879 mutable .overlay = buffer .getInt (vertexOffset + 24 );
@@ -89,7 +90,7 @@ public MutableVertex readVertexAt(int index, MutableVertex mutable) {
8990 mutable .z = buffer .getFloat (offset + 8 );
9091 }
9192 if (hasColor ) {
92- mutable .argb = IS_LITTLE_ENDIAN ? buffer . getInt (vertexOffset + colorOffset ) : Integer . reverseBytes ( buffer . getInt ( vertexOffset + colorOffset ) );
93+ mutable .argb = readColor (vertexOffset + colorOffset );
9394 }
9495 if (hasUV ) {
9596 int offset = vertexOffset + uvOffset ;
@@ -121,6 +122,10 @@ public Spliterator<VertexData> spliterator() {
121122 return new VertexSpliterator (0 , vertexCount );
122123 }
123124
125+ private int readColor (int offset ) {
126+ return ARGB .fromABGR (IS_LITTLE_ENDIAN ? buffer .getInt (offset ) : Integer .reverseBytes (buffer .getInt (offset )));
127+ }
128+
124129 private class VertexPointer implements VertexData {
125130 protected int bytePointer = 0 ;
126131
@@ -150,7 +155,7 @@ public Vec3 position() {
150155
151156 @ Override
152157 public int argb () {
153- if (hasColor ) return IS_LITTLE_ENDIAN ? buffer . getInt (bytePointer + colorOffset ) : Integer . reverseBytes ( buffer . getInt ( bytePointer + colorOffset ) );
158+ if (hasColor ) return readColor (bytePointer + colorOffset );
154159 return 0 ;
155160 }
156161
@@ -214,7 +219,7 @@ public VertexData asImmutable() {
214219 return new ImmutableVertex (buffer .getFloat (bytePointer ),
215220 buffer .getFloat (bytePointer + 4 ),
216221 buffer .getFloat (bytePointer + 8 ),
217- IS_LITTLE_ENDIAN ? buffer . getInt (bytePointer + 12 ) : Integer . reverseBytes ( buffer . getInt ( bytePointer + 12 ) ),
222+ readColor (bytePointer + 12 ),
218223 buffer .getFloat (bytePointer + 16 ),
219224 buffer .getFloat (bytePointer + 20 ),
220225 buffer .getInt (bytePointer + 24 ),
@@ -321,7 +326,7 @@ public PrimitiveIterator() {
321326 for (int i = 0 ; i < primitiveLength ; i ++) {
322327 reusablePrimitive [i ] = VertexData .mutable ();
323328 }
324- readVertexAt (0 , reusablePrimitive [0 ]);
329+ if ( 0 < vertexCount ) readVertexAt (0 , reusablePrimitive [0 ]);
325330 }
326331
327332 @ Override
@@ -348,7 +353,7 @@ public PrimitiveSpliterator(int start, int end) {
348353 for (int i = 0 ; i < primitiveLength ; i ++) {
349354 reusablePrimitive [i ] = VertexData .mutable ();
350355 }
351- readVertexAt (0 , reusablePrimitive [0 ]);
356+ if ( 0 < vertexCount ) readVertexAt (0 , reusablePrimitive [0 ]);
352357 }
353358
354359 @ Override
@@ -407,7 +412,7 @@ private void fastReadQuadAt(int index, MutableVertex[] quad) {
407412 mutable .x = buffer .getFloat (vertexOffset );
408413 mutable .y = buffer .getFloat (vertexOffset + 4 );
409414 mutable .z = buffer .getFloat (vertexOffset + 8 );
410- mutable .argb = IS_LITTLE_ENDIAN ? buffer . getInt (vertexOffset + 12 ) : Integer . reverseBytes ( buffer . getInt ( vertexOffset + 12 ) );
415+ mutable .argb = readColor (vertexOffset + 12 );
411416 mutable .u = buffer .getFloat (vertexOffset + 16 );
412417 mutable .v = buffer .getFloat (vertexOffset + 20 );
413418 mutable .overlay = buffer .getInt (vertexOffset + 24 );
0 commit comments