Godot Version
4.6
Question
So, I’m trying to make a minecraft-like game but I’ve never really dabbled in voxel-based generation before, so I followed a tutorial series in order to get the generation working (https://www.youtube.com/watch?v=c3OfvX3LLjQ). The main problem I’m running into is that nothing works correctly in the negative chunks, since the tutorial was meant for finite worlds. I’ve managed to get block placing and breaking to work in the negative chunks using this script:
func SetBlockByWorldPosition(pos : Vector3i, block_type : Block.BlockType):
var chunk_pos = WorldPosToChunkPos(pos)
var local_pos = abs(pos - chunk_pos)
var p1 = local_pos
if pos.x < 0 or pos.z < 0:
local_pos = Vector3i.ONE * chunk_size - local_pos - Vector3i.ONE
if pos.x < 0 and pos.z < 0:
chunk_pos = WorldPosToChunkPos(pos) + Vector3i(-1, 0, -1) * chunk_size
if pos.x < 0 and not pos.z < 0:
chunk_pos = WorldPosToChunkPos(pos) + Vector3i(-1, 0, 0) * chunk_size
local_pos.z = chunk_size - local_pos.z - 1
elif pos.z < 0 and not pos.x < 0:
chunk_pos = WorldPosToChunkPos(pos) + Vector3i(0, 0, -1) * chunk_size
local_pos.x = chunk_size - local_pos.x - 1
local_pos.y = p1.y
#print("local: " + str(local_pos))
#print("chunk: " + str(chunk_pos))
#print("pos: " + str(pos))
if chunks.has(chunk_pos):
chunks[chunk_pos].SetBlock(local_pos, block_type)
chunks_tagged_for_regen.append(chunks[chunk_pos])
var adjacent_chunks = BlockIsOnEdgeOfChunk(local_pos)
for adjacent_chunk in adjacent_chunks:
var adjacent_chunk_pos = chunk_pos + adjacent_chunk * chunk_size
if chunks.has(adjacent_chunk_pos):
chunks_tagged_for_regen.append(chunks[adjacent_chunk_pos])
But inside the negative chunks the chunk meshes don’t render properly, as they remove the faces that border chunks. It all works in the positive chunks however.
This image shows the Y border between to chunks. What I’m wondering is if anyone knows any common causes to problems like this. I’m not sure which part of my code would be best to show since there’s quite a bit of it, but this is the cube mesh generation code:
func gen_cube_mesh(pos : Vector3):
var is_top_block = false
if blocks[pos.x][pos.y][pos.z] != Block.BlockType.air:
if block_is_air(pos + Vector3(0, 1, 0)):
# TOP
vertices.append(pos + Vector3(-0.5, 0.5, -0.5))
vertices.append(pos + Vector3( 0.5, 0.5, -0.5))
vertices.append(pos + Vector3( 0.5, 0.5, 0.5))
vertices.append(pos + Vector3(-0.5, 0.5, 0.5))
add_tris()
add_uvs(0,0)
is_top_block = true
if block_is_air(pos + Vector3(1, 0, 0)):
# EAST
vertices.append(pos + Vector3( 0.5, 0.5, 0.5))
vertices.append(pos + Vector3( 0.5, 0.5, -0.5))
vertices.append(pos + Vector3( 0.5, -0.5,-0.5))
vertices.append(pos + Vector3( 0.5, -0.5, 0.5))
add_tris()
if is_top_block:
add_uvs(3,0)
else:
add_uvs(1,0)
if block_is_air(pos + Vector3(0, 0, 1)):
# SOUTH
vertices.append(pos + Vector3(-0.5, 0.5, 0.5))
vertices.append(pos + Vector3( 0.5, 0.5, 0.5))
vertices.append(pos + Vector3( 0.5, -0.5,0.5))
vertices.append(pos + Vector3(-0.5, -0.5, 0.5))
add_tris()
if is_top_block:
add_uvs(0,1)
else:
add_uvs(1,0)
if block_is_air(pos + Vector3(-1, 0, 0)):
# WEST
vertices.append(pos + Vector3(-0.5, 0.5, -0.5))
vertices.append(pos + Vector3(-0.5, 0.5, 0.5))
vertices.append(pos + Vector3(-0.5, -0.5, 0.5))
vertices.append(pos + Vector3(-0.5, -0.5, -0.5))
add_tris()
if is_top_block:
add_uvs(1,1)
else:
add_uvs(1,0)
if block_is_air(pos + Vector3(0, 0, -1)):
# NORTH
vertices.append(pos + Vector3( 0.5, 0.5, -0.5))
vertices.append(pos + Vector3(-0.5, 0.5, -0.5))
vertices.append(pos + Vector3(-0.5, -0.5, -0.5))
vertices.append(pos + Vector3( 0.5, -0.5, -0.5))
add_tris()
if is_top_block:
add_uvs(2,0)
else:
add_uvs(1,0)
if block_is_air(pos + Vector3(0, -1, 0)):
# BOTTOM
vertices.append(pos + Vector3(-0.5, -0.5, 0.5))
vertices.append(pos + Vector3( 0.5, -0.5, 0.5))
vertices.append(pos + Vector3( 0.5, -0.5, -0.5))
vertices.append(pos + Vector3(-0.5, -0.5, -0.5))
add_tris()
add_uvs(1,0)
Any help would be greatly appreciated!
