mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-09-08 03:29:48 -04:00
parent
0b11301910
commit
f7cd5e4c9c
@ -746,21 +746,21 @@ pub const MeshSelection = struct {
|
|||||||
posBeforeBlock = voxelPos;
|
posBeforeBlock = voxelPos;
|
||||||
if(tMax[0] < tMax[1]) {
|
if(tMax[0] < tMax[1]) {
|
||||||
if(tMax[0] < tMax[2]) {
|
if(tMax[0] < tMax[2]) {
|
||||||
voxelPos[0] += step[0];
|
voxelPos[0] +%= step[0];
|
||||||
total_tMax = tMax[0];
|
total_tMax = tMax[0];
|
||||||
tMax[0] += tDelta[0];
|
tMax[0] += tDelta[0];
|
||||||
} else {
|
} else {
|
||||||
voxelPos[2] += step[2];
|
voxelPos[2] +%= step[2];
|
||||||
total_tMax = tMax[2];
|
total_tMax = tMax[2];
|
||||||
tMax[2] += tDelta[2];
|
tMax[2] += tDelta[2];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(tMax[1] < tMax[2]) {
|
if(tMax[1] < tMax[2]) {
|
||||||
voxelPos[1] += step[1];
|
voxelPos[1] +%= step[1];
|
||||||
total_tMax = tMax[1];
|
total_tMax = tMax[1];
|
||||||
tMax[1] += tDelta[1];
|
tMax[1] += tDelta[1];
|
||||||
} else {
|
} else {
|
||||||
voxelPos[2] += step[2];
|
voxelPos[2] +%= step[2];
|
||||||
total_tMax = tMax[2];
|
total_tMax = tMax[2];
|
||||||
tMax[2] += tDelta[2];
|
tMax[2] += tDelta[2];
|
||||||
}
|
}
|
||||||
|
@ -167,9 +167,9 @@ pub fn getMeshFromAnyLodFromRenderThread(wx: i32, wy: i32, wz: i32, voxelSize: u
|
|||||||
|
|
||||||
pub fn getNeighborFromRenderThread(_pos: chunk.ChunkPosition, resolution: u31, neighbor: u3) ?*chunk_meshing.ChunkMesh {
|
pub fn getNeighborFromRenderThread(_pos: chunk.ChunkPosition, resolution: u31, neighbor: u3) ?*chunk_meshing.ChunkMesh {
|
||||||
var pos = _pos;
|
var pos = _pos;
|
||||||
pos.wx += pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relX[neighbor];
|
pos.wx +%= pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relX[neighbor];
|
||||||
pos.wy += pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relY[neighbor];
|
pos.wy +%= pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relY[neighbor];
|
||||||
pos.wz += pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relZ[neighbor];
|
pos.wz +%= pos.voxelSize*chunk.chunkSize*chunk.Neighbors.relZ[neighbor];
|
||||||
pos.voxelSize = resolution;
|
pos.voxelSize = resolution;
|
||||||
const node = getNodeFromRenderThread(pos);
|
const node = getNodeFromRenderThread(pos);
|
||||||
return node.mesh.load(.acquire);
|
return node.mesh.load(.acquire);
|
||||||
@ -219,16 +219,16 @@ fn isInRenderDistance(pos: chunk.ChunkPosition) bool {
|
|||||||
|
|
||||||
const minX = lastPx-%maxRenderDistance & invMask;
|
const minX = lastPx-%maxRenderDistance & invMask;
|
||||||
const maxX = lastPx+%maxRenderDistance+%size & invMask;
|
const maxX = lastPx+%maxRenderDistance+%size & invMask;
|
||||||
if(pos.wx < minX) return false;
|
if(pos.wx -% minX < 0) return false;
|
||||||
if(pos.wx >= maxX) return false;
|
if(pos.wx -% maxX >= 0) return false;
|
||||||
var deltaX: i64 = @abs(pos.wx +% size/2 -% lastPx);
|
var deltaX: i64 = @abs(pos.wx +% size/2 -% lastPx);
|
||||||
deltaX = @max(0, deltaX - size/2);
|
deltaX = @max(0, deltaX - size/2);
|
||||||
|
|
||||||
const maxYRenderDistance: i32 = reduceRenderDistance(maxRenderDistance, deltaX);
|
const maxYRenderDistance: i32 = reduceRenderDistance(maxRenderDistance, deltaX);
|
||||||
const minY = lastPy-%maxYRenderDistance & invMask;
|
const minY = lastPy-%maxYRenderDistance & invMask;
|
||||||
const maxY = lastPy+%maxYRenderDistance+%size & invMask;
|
const maxY = lastPy+%maxYRenderDistance+%size & invMask;
|
||||||
if(pos.wy < minY) return false;
|
if(pos.wy -% minY < 0) return false;
|
||||||
if(pos.wy >= maxY) return false;
|
if(pos.wy -% maxY >= 0) return false;
|
||||||
var deltaY: i64 = @abs(pos.wy +% size/2 -% lastPy);
|
var deltaY: i64 = @abs(pos.wy +% size/2 -% lastPy);
|
||||||
deltaY = @max(0, deltaY - size/2);
|
deltaY = @max(0, deltaY - size/2);
|
||||||
|
|
||||||
@ -236,8 +236,8 @@ fn isInRenderDistance(pos: chunk.ChunkPosition) bool {
|
|||||||
if(maxZRenderDistance == 0) return false;
|
if(maxZRenderDistance == 0) return false;
|
||||||
const minZ = lastPz-%maxZRenderDistance & invMask;
|
const minZ = lastPz-%maxZRenderDistance & invMask;
|
||||||
const maxZ = lastPz+%maxZRenderDistance+%size & invMask;
|
const maxZ = lastPz+%maxZRenderDistance+%size & invMask;
|
||||||
if(pos.wz < minZ) return false;
|
if(pos.wz -% minZ < 0) return false;
|
||||||
if(pos.wz >= maxZ) return false;
|
if(pos.wz -% maxZ >= 0) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -249,8 +249,8 @@ fn isMapInRenderDistance(pos: LightMap.MapFragmentPosition) bool {
|
|||||||
|
|
||||||
const minX = lastPx-%maxRenderDistance & invMask;
|
const minX = lastPx-%maxRenderDistance & invMask;
|
||||||
const maxX = lastPx+%maxRenderDistance+%size & invMask;
|
const maxX = lastPx+%maxRenderDistance+%size & invMask;
|
||||||
if(pos.wx < minX) return false;
|
if(pos.wx -% minX < 0) return false;
|
||||||
if(pos.wx >= maxX) return false;
|
if(pos.wx -% maxX >= 0) return false;
|
||||||
var deltaX: i64 = @abs(pos.wx +% size/2 -% lastPx);
|
var deltaX: i64 = @abs(pos.wx +% size/2 -% lastPx);
|
||||||
deltaX = @max(0, deltaX - size/2);
|
deltaX = @max(0, deltaX - size/2);
|
||||||
|
|
||||||
@ -258,8 +258,8 @@ fn isMapInRenderDistance(pos: LightMap.MapFragmentPosition) bool {
|
|||||||
if(maxYRenderDistance == 0) return false;
|
if(maxYRenderDistance == 0) return false;
|
||||||
const minY = lastPy-%maxYRenderDistance & invMask;
|
const minY = lastPy-%maxYRenderDistance & invMask;
|
||||||
const maxY = lastPy+%maxYRenderDistance+%size & invMask;
|
const maxY = lastPy+%maxYRenderDistance+%size & invMask;
|
||||||
if(pos.wy < minY) return false;
|
if(pos.wy -% minY < 0) return false;
|
||||||
if(pos.wy >= maxY) return false;
|
if(pos.wy -% maxY >= 0) return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,9 +751,9 @@ pub noinline fn updateAndGetRenderChunks(conn: *network.Connection, playerPos: V
|
|||||||
const max = data.node.max;
|
const max = data.node.max;
|
||||||
if(@reduce(.Or, min >= max)) continue; // Nothing to render.
|
if(@reduce(.Or, min >= max)) continue; // Nothing to render.
|
||||||
var neighborPos = chunk.ChunkPosition{
|
var neighborPos = chunk.ChunkPosition{
|
||||||
.wx = mesh.pos.wx + chunk.Neighbors.relX[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
.wx = mesh.pos.wx +% chunk.Neighbors.relX[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
||||||
.wy = mesh.pos.wy + chunk.Neighbors.relY[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
.wy = mesh.pos.wy +% chunk.Neighbors.relY[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
||||||
.wz = mesh.pos.wz + chunk.Neighbors.relZ[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
.wz = mesh.pos.wz +% chunk.Neighbors.relZ[neighbor]*chunk.chunkSize*mesh.pos.voxelSize,
|
||||||
.voxelSize = mesh.pos.voxelSize,
|
.voxelSize = mesh.pos.voxelSize,
|
||||||
};
|
};
|
||||||
var lod: u3 = data.node.lod;
|
var lod: u3 = data.node.lod;
|
||||||
|
@ -375,9 +375,9 @@ pub const CaveBiomeMapView = struct {
|
|||||||
.super = InterpolatableCaveBiomeMapView.init(chunk.pos, chunk.width),
|
.super = InterpolatableCaveBiomeMapView.init(chunk.pos, chunk.width),
|
||||||
};
|
};
|
||||||
if(chunk.pos.voxelSize < 8) {
|
if(chunk.pos.voxelSize < 8) {
|
||||||
const startX = (chunk.pos.wx - 32) & ~@as(i32, 63);
|
const startX = (chunk.pos.wx -% 32) & ~@as(i32, 63);
|
||||||
const startY = (chunk.pos.wy - 32) & ~@as(i32, 63);
|
const startY = (chunk.pos.wy -% 32) & ~@as(i32, 63);
|
||||||
const startZ = (chunk.pos.wz - 32) & ~@as(i32, 63);
|
const startZ = (chunk.pos.wz -% 32) & ~@as(i32, 63);
|
||||||
self.noiseX = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x764923684396, 64);
|
self.noiseX = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x764923684396, 64);
|
||||||
self.noiseY = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x6547835649265429, 64);
|
self.noiseY = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x6547835649265429, 64);
|
||||||
self.noiseZ = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x56789365396783, 64);
|
self.noiseZ = CachedFractalNoise3D.init(startX, startY, startZ, chunk.pos.voxelSize*4, chunk.width + 128, main.server.world.?.seed ^ 0x56789365396783, 64);
|
||||||
|
@ -184,7 +184,7 @@ pub const CaveMapView = struct {
|
|||||||
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
||||||
index += 2;
|
index += 2;
|
||||||
}
|
}
|
||||||
var deltaZ = self.reference.pos.wz - self.fragments[0].pos.wz;
|
var deltaZ = self.reference.pos.wz -% self.fragments[0].pos.wz;
|
||||||
if(deltaZ >= CaveMapFragment.height*self.reference.pos.voxelSize) {
|
if(deltaZ >= CaveMapFragment.height*self.reference.pos.voxelSize) {
|
||||||
index += 1;
|
index += 1;
|
||||||
deltaZ -= CaveMapFragment.height*self.reference.pos.voxelSize;
|
deltaZ -= CaveMapFragment.height*self.reference.pos.voxelSize;
|
||||||
@ -209,7 +209,7 @@ pub const CaveMapView = struct {
|
|||||||
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
||||||
index += 2;
|
index += 2;
|
||||||
}
|
}
|
||||||
var relativeZ = @divFloor(z + self.reference.pos.wz - self.fragments[0].pos.wz, self.reference.pos.voxelSize);
|
var relativeZ = @divFloor(z +% self.reference.pos.wz -% self.fragments[0].pos.wz, self.reference.pos.voxelSize);
|
||||||
std.debug.assert(relativeZ >= 0 and relativeZ < 2*CaveMapFragment.height);
|
std.debug.assert(relativeZ >= 0 and relativeZ < 2*CaveMapFragment.height);
|
||||||
const fragmentRelX = wx - self.fragments[index].pos.wx;
|
const fragmentRelX = wx - self.fragments[index].pos.wx;
|
||||||
const fragmentRelY = wy - self.fragments[index].pos.wy;
|
const fragmentRelY = wy - self.fragments[index].pos.wy;
|
||||||
@ -237,7 +237,7 @@ pub const CaveMapView = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
result += @ctz(height);
|
result += @ctz(height);
|
||||||
return result*self.reference.pos.voxelSize + self.fragments[0].pos.wz - self.reference.pos.wz;
|
return result*self.reference.pos.voxelSize +% self.fragments[0].pos.wz -% self.reference.pos.wz;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn findTerrainChangeBelow(self: CaveMapView, relX: i32, relY: i32, z: i32) i32 {
|
pub fn findTerrainChangeBelow(self: CaveMapView, relX: i32, relY: i32, z: i32) i32 {
|
||||||
@ -250,7 +250,7 @@ pub const CaveMapView = struct {
|
|||||||
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
if(wy -% self.fragments[0].pos.wy >= CaveMapFragment.width*self.reference.pos.voxelSize) {
|
||||||
index += 2;
|
index += 2;
|
||||||
}
|
}
|
||||||
var relativeZ = @divFloor(z + self.reference.pos.wz - self.fragments[0].pos.wz, self.reference.pos.voxelSize);
|
var relativeZ = @divFloor(z +% self.reference.pos.wz -% self.fragments[0].pos.wz, self.reference.pos.voxelSize);
|
||||||
std.debug.assert(relativeZ >= 0 and relativeZ < 2*CaveMapFragment.height);
|
std.debug.assert(relativeZ >= 0 and relativeZ < 2*CaveMapFragment.height);
|
||||||
const fragmentRelX = wx - self.fragments[index].pos.wx;
|
const fragmentRelX = wx - self.fragments[index].pos.wx;
|
||||||
const fragmentRelY = wy - self.fragments[index].pos.wy;
|
const fragmentRelY = wy - self.fragments[index].pos.wy;
|
||||||
@ -278,7 +278,7 @@ pub const CaveMapView = struct {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
result -= @clz(height);
|
result -= @clz(height);
|
||||||
return result*self.reference.pos.voxelSize + self.fragments[0].pos.wz - self.reference.pos.wz;
|
return result*self.reference.pos.voxelSize +% self.fragments[0].pos.wz -% self.reference.pos.wz;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,9 +41,10 @@ pub const MapFragmentPosition = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn getMinDistanceSquared(self: MapFragmentPosition, playerPosition: Vec3d, comptime width: comptime_int) f64 {
|
pub fn getMinDistanceSquared(self: MapFragmentPosition, playerPosition: Vec3d, comptime width: comptime_int) f64 {
|
||||||
|
const adjustedPosition = @mod(playerPosition + @as(Vec3d, @splat(1 << 31)), @as(Vec3d, @splat(1 << 32))) - @as(Vec3d, @splat(1 << 31));
|
||||||
const halfWidth: f64 = @floatFromInt(self.voxelSize*@divExact(width, 2));
|
const halfWidth: f64 = @floatFromInt(self.voxelSize*@divExact(width, 2));
|
||||||
var dx = @abs(@as(f64, @floatFromInt(self.wx)) + halfWidth - playerPosition[0]);
|
var dx = @abs(@as(f64, @floatFromInt(self.wx)) + halfWidth - adjustedPosition[0]);
|
||||||
var dy = @abs(@as(f64, @floatFromInt(self.wy)) + halfWidth - playerPosition[1]);
|
var dy = @abs(@as(f64, @floatFromInt(self.wy)) + halfWidth - adjustedPosition[1]);
|
||||||
dx = @max(0, dx - halfWidth);
|
dx = @max(0, dx - halfWidth);
|
||||||
dy = @max(0, dy - halfWidth);
|
dy = @max(0, dy - halfWidth);
|
||||||
return dx*dx + dy*dy;
|
return dx*dx + dy*dy;
|
||||||
|
@ -48,7 +48,7 @@ pub fn generate(map: *CaveBiomeMapFragment, worldSeed: u64) void {
|
|||||||
var insertionIndex: usize = 0;
|
var insertionIndex: usize = 0;
|
||||||
var i: usize = 0;
|
var i: usize = 0;
|
||||||
while(i < validBiomes.items.len) : (i += 1) {
|
while(i < validBiomes.items.len) : (i += 1) {
|
||||||
if(validBiomes.items[i].minHeight < map.pos.wz +% z +% CaveBiomeMapFragment.caveBiomeSize and validBiomes.items[i].maxHeight > map.pos.wz +% z) {
|
if(validBiomes.items[i].minHeight < map.pos.wz + z + (CaveBiomeMapFragment.caveBiomeSize - 1) and validBiomes.items[i].maxHeight > map.pos.wz + z) {
|
||||||
if(insertionIndex != i) {
|
if(insertionIndex != i) {
|
||||||
const swap = validBiomes.items[i];
|
const swap = validBiomes.items[i];
|
||||||
validBiomes.items[i] = validBiomes.items[insertionIndex];
|
validBiomes.items[i] = validBiomes.items[insertionIndex];
|
||||||
|
@ -45,7 +45,7 @@ pub fn generate(map: *CaveMapFragment, worldSeed: u64) void {
|
|||||||
biomeMap.getSurfaceHeight(map.pos.wx +% x, map.pos.wy +% y -% 1),
|
biomeMap.getSurfaceHeight(map.pos.wx +% x, map.pos.wy +% y -% 1),
|
||||||
height,
|
height,
|
||||||
) - 0.5));
|
) - 0.5));
|
||||||
const relativeHeight: i32 = @as(i32, @intFromFloat(height)) - map.pos.wz;
|
const relativeHeight: i32 = @as(i32, @intFromFloat(height)) -% map.pos.wz;
|
||||||
map.removeRange(x, y, relativeHeight, CaveMapFragment.height*map.pos.voxelSize);
|
map.removeRange(x, y, relativeHeight, CaveMapFragment.height*map.pos.voxelSize);
|
||||||
if(smallestHeight < 1) { // Seal off caves that intersect the ocean floor.
|
if(smallestHeight < 1) { // Seal off caves that intersect the ocean floor.
|
||||||
map.addRange(x, y, smallestHeight -% 1 -% map.pos.wz, relativeHeight);
|
map.addRange(x, y, smallestHeight -% 1 -% map.pos.wz, relativeHeight);
|
||||||
|
@ -30,7 +30,7 @@ pub fn deinit() void {
|
|||||||
pub fn generate(worldSeed: u64, chunk: *main.chunk.Chunk, caveMap: CaveMap.CaveMapView, biomeMap: CaveBiomeMap.CaveBiomeMapView) void {
|
pub fn generate(worldSeed: u64, chunk: *main.chunk.Chunk, caveMap: CaveMap.CaveMapView, biomeMap: CaveBiomeMap.CaveBiomeMapView) void {
|
||||||
if(chunk.pos.voxelSize < 4) {
|
if(chunk.pos.voxelSize < 4) {
|
||||||
// Uses a blue noise pattern for all structure that shouldn't touch.
|
// Uses a blue noise pattern for all structure that shouldn't touch.
|
||||||
const blueNoise = noise.BlueNoise.getRegionData(main.stackAllocator, chunk.pos.wx - 8, chunk.pos.wy - 8, chunk.width + 16, chunk.width + 16);
|
const blueNoise = noise.BlueNoise.getRegionData(main.stackAllocator, chunk.pos.wx -% 8, chunk.pos.wy -% 8, chunk.width + 16, chunk.width + 16);
|
||||||
defer main.stackAllocator.free(blueNoise);
|
defer main.stackAllocator.free(blueNoise);
|
||||||
for(blueNoise) |coordinatePair| {
|
for(blueNoise) |coordinatePair| {
|
||||||
const px = @as(i32, @intCast(coordinatePair >> 16)) - 8; // TODO: Maybe add a blue-noise iterator or something like that?
|
const px = @as(i32, @intCast(coordinatePair >> 16)) - 8; // TODO: Maybe add a blue-noise iterator or something like that?
|
||||||
@ -71,7 +71,7 @@ pub fn generate(worldSeed: u64, chunk: *main.chunk.Chunk, caveMap: CaveMap.CaveM
|
|||||||
const wpx = px -% 8 +% chunk.pos.wx;
|
const wpx = px -% 8 +% chunk.pos.wx;
|
||||||
const wpy = py -% 8 +% chunk.pos.wy;
|
const wpy = py -% 8 +% chunk.pos.wy;
|
||||||
|
|
||||||
const relZ = @as(i32, @intFromFloat(biomeMap.getSurfaceHeight(wpx, wpy))) - chunk.pos.wz;
|
const relZ = @as(i32, @intFromFloat(biomeMap.getSurfaceHeight(wpx, wpy))) -% chunk.pos.wz;
|
||||||
if(relZ < -32 or relZ >= chunk.width + 32) continue;
|
if(relZ < -32 or relZ >= chunk.width + 32) continue;
|
||||||
|
|
||||||
var seed = random.initSeed3D(worldSeed, .{wpx, wpy, relZ});
|
var seed = random.initSeed3D(worldSeed, .{wpx, wpy, relZ});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user