void Interface::PlaceBlock() {
if (!aim_world) return;
- glm::vec3 next_pos = aim_world.BlockCoords() + aim_world.normal;
- BlockLookup next_block(&aim_world.GetChunk(), next_pos);
- if (next_block) {
+ BlockLookup next_block(aim_world.chunk, aim_world.BlockPos(), Block::NormalFace(aim_world.normal));
+ if (!next_block) {
+ return;
}
next_block.SetBlock(selection);
const Entity &player = ctrl.Controlled();
env.audio.Play(
place_sound,
- aim_world.GetChunk().ToSceneCoords(player.ChunkCoords(), next_pos)
+ next_block.GetChunk().ToSceneCoords(player.ChunkCoords(), next_block.GetBlockCoords())
);
}
// only valid if lookup was successful
Chunk &GetChunk() const noexcept { return *chunk; }
const Chunk::Pos &GetBlockPos() const noexcept { return pos; }
+ Block::Pos GetBlockCoords() const noexcept { return Chunk::ToCoords(pos); }
const Block &GetBlock() const noexcept { return GetChunk().BlockAt(GetBlockPos()); }
const BlockType &GetType() const noexcept { return GetChunk().Type(GetBlock()); }
int GetLight() const noexcept { return GetChunk().GetLight(GetBlockPos()); }
bool Blocks() const noexcept { return chunk->Type(block).collide_block; }
- glm::vec3 BlockPos() const noexcept { return Chunk::ToPos(block); }
+ glm::ivec3 BlockPos() const noexcept { return Chunk::ToPos(block); }
glm::vec3 BlockCoords() const noexcept { return Chunk::ToCoords(block); }
glm::mat4 BlockTransform() const noexcept { return GetChunk().ToTransform(BlockPos(), block); }