1
1
package net .irisshaders .iris .compat .sodium .mixin ;
2
2
3
- import com .llamalad7 .mixinextras .sugar .Local ;
3
+ import com .llamalad7 .mixinextras .injector .wrapoperation .Operation ;
4
+ import com .llamalad7 .mixinextras .injector .wrapoperation .WrapOperation ;
4
5
import com .mojang .blaze3d .vertex .VertexFormat ;
5
6
import net .caffeinemc .mods .sodium .api .util .NormI8 ;
6
7
import net .caffeinemc .mods .sodium .api .vertex .buffer .VertexBufferWriter ;
20
21
import org .spongepowered .asm .mixin .injection .At ;
21
22
import org .spongepowered .asm .mixin .injection .Inject ;
22
23
import org .spongepowered .asm .mixin .injection .ModifyArg ;
23
- import org .spongepowered .asm .mixin .injection .Redirect ;
24
24
import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
25
25
import org .spongepowered .asm .mixin .injection .callback .CallbackInfoReturnable ;
26
26
@@ -41,10 +41,18 @@ public abstract class MixinCloudRenderer {
41
41
42
42
@ Shadow (remap = false )
43
43
@ Nullable
44
- private CloudRenderer .@ Nullable CloudGeometry cachedGeometry ;
44
+ private CloudRenderer .@ Nullable CloudGeometry builtGeometry ;
45
45
46
46
@ Unique
47
- private @ Nullable CloudRenderer .CloudGeometry cachedGeometryIris ;
47
+ private static boolean hadShadersOn = false ;
48
+
49
+ // Bitmasks for each cloud face
50
+ private static final int FACE_MASK_NEG_Y = 1 << 0 ;
51
+ private static final int FACE_MASK_POS_Y = 1 << 1 ;
52
+ private static final int FACE_MASK_NEG_X = 1 << 2 ;
53
+ private static final int FACE_MASK_POS_X = 1 << 3 ;
54
+ private static final int FACE_MASK_NEG_Z = 1 << 4 ;
55
+ private static final int FACE_MASK_POS_Z = 1 << 5 ;
48
56
49
57
@ Inject (method = "writeVertex" , at = @ At ("HEAD" ), cancellable = true , remap = false )
50
58
private static void writeIrisVertex (long buffer , float x , float y , float z , int color , CallbackInfoReturnable <Long > cir ) {
@@ -54,27 +62,57 @@ private static void writeIrisVertex(long buffer, float x, float y, float z, int
54
62
}
55
63
}
56
64
57
- @ Inject (method = "emitCellGeometry2D" , at = @ At ("HEAD" ), remap = false )
58
- private static void computeNormal2D (VertexBufferWriter writer , int faces , int color , float x , float z , CallbackInfo ci ) {
65
+ @ Inject (method = "emitCellGeometryFlat" , at = @ At ("HEAD" ), remap = false )
66
+ private static void computeNormal2D (VertexBufferWriter writer , int texel , int x , int z , CallbackInfo ci ) {
67
+ computedNormal = NORMALS [0 ];
68
+ }
69
+
70
+ @ Inject (method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/util/ColorABGR;mulRGB(II)I" , ordinal = 0 ), remap = false )
71
+ private static void computeNormal3D (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
59
72
computedNormal = NORMALS [0 ];
60
73
}
61
74
62
- @ Inject (method = "emitCellGeometry3D" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer$CloudFace;ordinal()I" ), remap = false )
63
- private static void computeNormal3D (VertexBufferWriter writer , int visibleFaces , int baseColor , float posX , float posZ , boolean interior , CallbackInfo ci , @ Local (ordinal = 4 ) int face ) {
64
- computedNormal = NORMALS [face ];
75
+ @ Inject (method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/util/ColorABGR;mulRGB(II)I" , ordinal = 1 ), remap = false )
76
+ private static void computeNormal3DUp (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
77
+ computedNormal = NORMALS [1 ];
78
+ }
79
+
80
+ @ Inject (method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;writeVertex(JFFFI)J" , ordinal = 8 , remap = false ), remap = false )
81
+ private static void computeNormal3DNegX (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
82
+ computedNormal = NORMALS [2 ];
83
+ }
84
+
85
+ @ Inject (remap = false , method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;writeVertex(JFFFI)J" , ordinal = 12 , remap = false ))
86
+ private static void computeNormal3DPosX (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
87
+ computedNormal = NORMALS [3 ];
65
88
}
66
89
67
- @ ModifyArg (remap = false , method = "emitCellGeometry3D" , at = @ At (value = "INVOKE" , target = "Lorg/lwjgl/system/MemoryStack;nmalloc(I)J" ))
90
+ @ Inject (method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;writeVertex(JFFFI)J" , ordinal = 16 ), remap = false )
91
+ private static void computeNormal3DNegZ (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
92
+ computedNormal = NORMALS [4 ];
93
+ }
94
+
95
+ @ Inject (method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;writeVertex(JFFFI)J" , ordinal = 20 ), remap = false )
96
+ private static void computeNormal3DPosZ (VertexBufferWriter writer , int cellFaces , int cellColor , int cellX , int cellZ , CallbackInfo ci ) {
97
+ computedNormal = NORMALS [5 ];
98
+ }
99
+
100
+ @ ModifyArg (remap = false , method = "emitCellGeometryExterior" , at = @ At (value = "INVOKE" , target = "Lorg/lwjgl/system/MemoryStack;nmalloc(I)J" ))
68
101
private static int allocateNewSize (int size ) {
69
102
return IrisApi .getInstance ().isShaderPackInUse () ? 480 : size ;
70
103
}
71
104
105
+ @ ModifyArg (remap = false , method = "emitCellGeometryInterior" , at = @ At (value = "INVOKE" , target = "Lorg/lwjgl/system/MemoryStack;nmalloc(I)J" ))
106
+ private static int allocateNewSizeInt (int size ) {
107
+ return IrisApi .getInstance ().isShaderPackInUse () ? 480 : size ;
108
+ }
109
+
72
110
@ ModifyArg (method = "rebuildGeometry" , at = @ At (value = "INVOKE" , target = "Lcom/mojang/blaze3d/vertex/Tesselator;begin(Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;Lcom/mojang/blaze3d/vertex/VertexFormat;)Lcom/mojang/blaze3d/vertex/BufferBuilder;" ), index = 1 )
73
111
private static VertexFormat rebuild (VertexFormat p_350837_ ) {
74
112
return IrisApi .getInstance ().isShaderPackInUse () ? IrisVertexFormats .CLOUDS : p_350837_ ;
75
113
}
76
114
77
- @ ModifyArg (method = "emitCellGeometry3D " , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter;push(Lorg/lwjgl/system/MemoryStack;JILcom/mojang/blaze3d/vertex/VertexFormat;)V" ), index = 3 )
115
+ @ ModifyArg (method = "emitCellGeometryExterior " , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter;push(Lorg/lwjgl/system/MemoryStack;JILcom/mojang/blaze3d/vertex/VertexFormat;)V" ), index = 3 )
78
116
private static VertexFormat modifyArgIris (VertexFormat vertexFormatDescription ) {
79
117
if (IrisApi .getInstance ().isShaderPackInUse ()) {
80
118
return IrisVertexFormats .CLOUDS ;
@@ -83,12 +121,21 @@ private static VertexFormat modifyArgIris(VertexFormat vertexFormatDescription)
83
121
}
84
122
}
85
123
86
- @ ModifyArg (remap = false , method = "emitCellGeometry2D" , at = @ At (value = "INVOKE" , target = "Lorg/lwjgl/system/MemoryStack;nmalloc(I)J" ))
124
+ @ ModifyArg (method = "emitCellGeometryInterior" , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter;push(Lorg/lwjgl/system/MemoryStack;JILcom/mojang/blaze3d/vertex/VertexFormat;)V" ), index = 3 )
125
+ private static VertexFormat modifyArgIrisInt (VertexFormat vertexFormatDescription ) {
126
+ if (IrisApi .getInstance ().isShaderPackInUse ()) {
127
+ return IrisVertexFormats .CLOUDS ;
128
+ } else {
129
+ return ColorVertex .FORMAT ;
130
+ }
131
+ }
132
+
133
+ @ ModifyArg (remap = false , method = "emitCellGeometryFlat" , at = @ At (value = "INVOKE" , target = "Lorg/lwjgl/system/MemoryStack;nmalloc(I)J" ))
87
134
private static int allocateNewSize2D (int size ) {
88
135
return IrisApi .getInstance ().isShaderPackInUse () ? 80 : size ;
89
136
}
90
137
91
- @ ModifyArg (method = "emitCellGeometry2D " , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter;push(Lorg/lwjgl/system/MemoryStack;JILcom/mojang/blaze3d/vertex/VertexFormat;)V" ), index = 3 )
138
+ @ ModifyArg (method = "emitCellGeometryFlat " , at = @ At (value = "INVOKE" , target = "Lnet/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter;push(Lorg/lwjgl/system/MemoryStack;JILcom/mojang/blaze3d/vertex/VertexFormat;)V" ), index = 3 )
92
139
private static VertexFormat modifyArgIris2D (VertexFormat vertexFormatDescription ) {
93
140
if (IrisApi .getInstance ().isShaderPackInUse ()) {
94
141
return IrisVertexFormats .CLOUDS ;
@@ -97,21 +144,15 @@ private static VertexFormat modifyArgIris2D(VertexFormat vertexFormatDescription
97
144
}
98
145
}
99
146
100
- @ Redirect (method = "render" , at = @ At (remap = false , value = "FIELD" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;cachedGeometry:Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer$CloudGeometry;" , ordinal = 0 ))
101
- private CloudRenderer .@ Nullable CloudGeometry changeGeometry (CloudRenderer instance ) {
102
- if (IrisApi .getInstance ().isShaderPackInUse ()) {
103
- return cachedGeometryIris ;
104
- } else {
105
- return cachedGeometry ;
106
- }
147
+ @ WrapOperation (method = "render" , at = @ At (remap = false , value = "INVOKE" , target = "Ljava/util/Objects;equals(Ljava/lang/Object;Ljava/lang/Object;)Z" ))
148
+ private boolean changeGeometry (Object a , Object b , Operation <Boolean > original ) {
149
+ return hadShadersOn == Iris .isPackInUseQuick () && original .call (a , b );
107
150
}
108
151
109
- @ Redirect (method = "render" , at = @ At (remap = false , value = "FIELD" , target = "Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer;cachedGeometry:Lnet/caffeinemc/mods/sodium/client/render/immediate/CloudRenderer$CloudGeometry;" , ordinal = 1 ))
110
- private void changeGeometry2 (CloudRenderer instance , CloudRenderer .CloudGeometry value ) {
111
- if (IrisApi .getInstance ().isShaderPackInUse ()) {
112
- cachedGeometryIris = value ;
113
- } else {
114
- cachedGeometry = value ;
115
- }
152
+ @ Inject (method = "rebuildGeometry" , at = @ At (remap = false , value = "HEAD" ), remap = false )
153
+ private static void changeGeometry2 (CallbackInfoReturnable <CloudRenderer .CloudGeometry > cir ) {
154
+ hadShadersOn = IrisApi .getInstance ().isShaderPackInUse ();
116
155
}
156
+
157
+ // TODO interiors
117
158
}
0 commit comments