From a4d2f7d72adf1fcee79b97a35a4928bfb7de04d3 Mon Sep 17 00:00:00 2001 From: austin Date: Tue, 20 May 2025 14:51:14 -0400 Subject: [PATCH] structure voxel foundation --- docs/src/progress/renderertodo.md | 1 + .../server/macro/town/TownLayout.java | 3 ++- .../generation/ProceduralChunkGenerator.java | 15 +++++++++++++++ .../terrain/manager/ChunkGenerationThread.java | 9 +++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index ef1ab8b8..4068defa 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1921,6 +1921,7 @@ Content generation blocks for macro data generation Roads block content generation Properly layout roads along town points in TownLayout Town generates a structure -- scaffolding for doing it across roads +Structures create foundations in terrain voxels diff --git a/src/main/java/electrosphere/server/macro/town/TownLayout.java b/src/main/java/electrosphere/server/macro/town/TownLayout.java index a757fa7f..e5994b85 100644 --- a/src/main/java/electrosphere/server/macro/town/TownLayout.java +++ b/src/main/java/electrosphere/server/macro/town/TownLayout.java @@ -98,7 +98,8 @@ public class TownLayout { aabb.setMin(pos); aabb.setMax(new Vector3d(pos).add(structureData.getDimensions())); if(!macroData.intersectsStruct(aabb)){ - VirtualStructure.createStructure(macroData, structureData, pos); + VirtualStructure struct = VirtualStructure.createStructure(macroData, structureData, pos); + town.addStructure(struct); } //right-facing road diff --git a/src/main/java/electrosphere/server/physics/terrain/generation/ProceduralChunkGenerator.java b/src/main/java/electrosphere/server/physics/terrain/generation/ProceduralChunkGenerator.java index 59e41d42..1d2222f9 100644 --- a/src/main/java/electrosphere/server/physics/terrain/generation/ProceduralChunkGenerator.java +++ b/src/main/java/electrosphere/server/physics/terrain/generation/ProceduralChunkGenerator.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.joml.AABBd; import org.joml.Vector3d; import electrosphere.client.terrain.cache.ChunkData; @@ -14,6 +15,7 @@ import electrosphere.engine.Globals; import electrosphere.server.datacell.ServerWorldData; import electrosphere.server.macro.civilization.road.Road; import electrosphere.server.macro.spatial.MacroObject; +import electrosphere.server.macro.structure.VirtualStructure; import electrosphere.server.macro.town.Town; import electrosphere.server.physics.terrain.generation.heightmap.EmptySkyGen; import electrosphere.server.physics.terrain.generation.heightmap.HeightmapGenerator; @@ -282,6 +284,19 @@ public class ProceduralChunkGenerator implements ChunkGenerator { } } } + } else if(object instanceof VirtualStructure){ + VirtualStructure struct = (VirtualStructure)object; + AABBd aabb = struct.getAABB(); + //create a foundation underneath the structure + if(realX >= aabb.minX && realX <= aabb.maxX && realZ >= aabb.minZ && realZ <= aabb.maxZ){ + //check if within foundation range + double vertDist = aabb.minY - realY; + if(vertDist > 0 && vertDist < 2){ + voxel.type = 1; + voxel.weight = 1; + rVal = true; + } + } } else if(object instanceof Town){ } else { throw new Error("Unsupported object type " + object); diff --git a/src/main/java/electrosphere/server/physics/terrain/manager/ChunkGenerationThread.java b/src/main/java/electrosphere/server/physics/terrain/manager/ChunkGenerationThread.java index 635c48ec..09aef7f8 100644 --- a/src/main/java/electrosphere/server/physics/terrain/manager/ChunkGenerationThread.java +++ b/src/main/java/electrosphere/server/physics/terrain/manager/ChunkGenerationThread.java @@ -3,6 +3,7 @@ package electrosphere.server.physics.terrain.manager; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import java.util.stream.Collectors; import electrosphere.engine.Globals; import electrosphere.logger.LoggerInterface; @@ -10,6 +11,8 @@ import electrosphere.server.datacell.ServerWorldData; import electrosphere.server.macro.MacroData; import electrosphere.server.macro.spatial.MacroLODObject; import electrosphere.server.macro.spatial.MacroObject; +import electrosphere.server.macro.structure.VirtualStructure; +import electrosphere.server.macro.town.Town; import electrosphere.server.physics.terrain.diskmap.ChunkDiskMap; import electrosphere.server.physics.terrain.generation.interfaces.ChunkGenerator; @@ -163,6 +166,12 @@ public class ChunkGenerationThread implements Runnable { if(notFullResCount > 0){ return null; } + List towns = objects.stream().filter((MacroObject obj) -> obj instanceof Town).collect(Collectors.toList()); + for(MacroObject currObj : towns){ + Town town = (Town)currObj; + List structs = town.getStructures(macroData); + objects.addAll(structs); + } if(chunkCache.containsChunk(worldX, worldY, worldZ, stride)){ rVal = chunkCache.get(worldX, worldY, worldZ, stride);