Files
Reimagined/shaderpacks/Reimagined - Low/shaders/lib/voxelization/endCrystalVoxelization.glsl
T
2026-05-07 21:38:27 +03:00

50 lines
2.1 KiB
GLSL

layout(r32i) uniform iimage2D endcrystal_img;
void UpdateEndCrystalMap(vec3 pos) {
int packedPos = int(pos.x + 512.5) + (int(pos.y + 512.5) << 10) + (int(pos.z + 512.5) << 20);
for (int k = 0; k < 20; k++) {
int registeredPos = imageAtomicCompSwap(endcrystal_img, ivec2(k, 0), 0, packedPos);
vec3 otherPos = vec3(ivec3(registeredPos) >> ivec3(0, 10, 20) & 1023) - 512.0;
if (registeredPos == 0 || length((otherPos - pos) * vec3(1, 0.3, 1)) < 2.3) {
ivec4 addData = ivec4(10 * pos.x + 5120.5, 10 * pos.y + 5120.5, 10 * pos.z + 5120.5, 5130) - 5120;
for (int i = 0; i < 4; i++) {
imageAtomicAdd(endcrystal_img, ivec2(k, i+1), addData[i]);
}
break;
}
}
}
void UpdateBeamMap(vec3 pos) {
int packedPos = int(pos.x + 512.5) + (int(pos.y + 512.5) << 10) + (int(pos.z + 512.5) << 20);
for (int k = 20; k < 35; k++) {
int registeredPos = imageAtomicCompSwap(endcrystal_img, ivec2(k, 0), 0, packedPos);
vec3 otherPos = vec3(ivec3(registeredPos) >> ivec3(0, 10, 20) & 1023) - 512.0;
if (registeredPos == 0 || length((otherPos - pos)) < 10.0) {
ivec4 addData = ivec4(10 * pos.x + 5120.5, 10 * pos.y + 5120.5, 10 * pos.z + 5120.5, 5130) - 5120;
for (int i = 0; i < 4; i++) {
imageAtomicAdd(endcrystal_img, ivec2(k, i+1), addData[i]);
}
break;
}
}
}
void UpdateDragonPos(vec3 pos) {
ivec4 addData = ivec4(10 * pos.x + 5120.5, 10 * pos.y + 5120.5, 10 * pos.z + 5120.5, 5130) - 5120;
for (int i = 0; i < 4; i++) {
imageAtomicAdd(endcrystal_img, ivec2(35, i+1), addData[i]);
}
}
void SetEndDragonDeath() {
imageAtomicExchange(endcrystal_img, ivec2(35, 0), 10000 + int(3000 * frameTime));
}
void SetEndPortalLoc(vec3 pos) {
ivec4 coords = ivec4(pos + at_midBlock.xyz / 64.0 + cameraPositionFract + 1000, 1001) - 1000;
for (int k = 0; k < 4; k++) {
imageAtomicAdd(endcrystal_img, ivec2(35, k), coords[k]);
}
}