50 lines
2.1 KiB
GLSL
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]);
|
|
}
|
|
}
|