diff --git a/assets/Data/game/structure.json b/assets/Data/game/structure.json index 586573c0..2024a221 100644 --- a/assets/Data/game/structure.json +++ b/assets/Data/game/structure.json @@ -4,9 +4,9 @@ "id" : "test1", "fabPath" : "Data/fab/disjointedroom1.block", "dimensions" : { - "x" : 10, - "y" : 10, - "z" : 10 + "x" : 100, + "y" : 100, + "z" : 100 } } ], diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 9899731b..724a9357 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1587,6 +1587,7 @@ Reduce physics generation calls on GriddedDataCellManager Fab selection doesn't overflow anymore Cleaning up parts of Main class Spawn test structure in macro data on creation +Macro data structures block regular foliage generation diff --git a/src/main/java/electrosphere/server/entity/ServerContentGenerator.java b/src/main/java/electrosphere/server/entity/ServerContentGenerator.java index 3e81b7f7..7b5121bb 100644 --- a/src/main/java/electrosphere/server/entity/ServerContentGenerator.java +++ b/src/main/java/electrosphere/server/entity/ServerContentGenerator.java @@ -12,6 +12,7 @@ import electrosphere.game.data.biome.BiomeFoliageDescription; import electrosphere.server.datacell.Realm; import electrosphere.server.datacell.ServerDataCell; import electrosphere.server.macro.MacroData; +import electrosphere.server.macro.spatial.MacroAreaObject; import electrosphere.server.physics.terrain.manager.ServerTerrainChunk; import io.github.studiorailgun.NoiseUtils; @@ -53,6 +54,9 @@ public class ServerContentGenerator { //setup Random random = new Random(randomizer); + //fetches the list of macro data content blockers + List macroContentBlockers = macroData.getContentBlockers(); + //generate foliage BiomeData biome = null; @@ -72,6 +76,22 @@ public class ServerContentGenerator { double foundPriority = -1; double realX = realm.getServerWorldData().convertVoxelToRealSpace(x, worldPos.x); double realZ = realm.getServerWorldData().convertVoxelToRealSpace(z, worldPos.z); + + //check if a macro object is blocking content here + boolean macroBlockingContent = false; + if(macroContentBlockers != null){ + for(MacroAreaObject blocker : macroContentBlockers){ + if(blocker.getAABB().testPoint(realX, height, realZ)){ + macroBlockingContent = true; + break; + } + } + if(macroBlockingContent){ + continue; + } + } + + //figure out which foliage to place for(BiomeFoliageDescription foliageDescription : foliageDescriptions){ double scale = foliageDescription.getScale(); double regularity = foliageDescription.getRegularity(); diff --git a/src/main/java/electrosphere/server/macro/MacroData.java b/src/main/java/electrosphere/server/macro/MacroData.java index 0765ad1f..1e934929 100644 --- a/src/main/java/electrosphere/server/macro/MacroData.java +++ b/src/main/java/electrosphere/server/macro/MacroData.java @@ -13,6 +13,7 @@ import electrosphere.server.macro.character.diety.Diety; import electrosphere.server.macro.civilization.Civilization; import electrosphere.server.macro.race.Race; import electrosphere.server.macro.race.RaceMap; +import electrosphere.server.macro.spatial.MacroAreaObject; import electrosphere.server.macro.structure.Structure; import electrosphere.server.macro.symbolism.Symbol; import electrosphere.server.macro.town.Town; @@ -111,7 +112,7 @@ public class MacroData { //add a test character Structure struct = Structure.createStructure( Globals.gameConfigCurrent.getStructureData().getType("test1"), - new Vector3d(ServerWorldData.convertChunkToRealSpace(new Vector3i(32774, 1, 32770))) + new Vector3d(ServerWorldData.convertChunkToRealSpace(new Vector3i(32774, 1, 32770)).sub(0,10,0)) ); rVal.structures.add(struct); @@ -290,5 +291,15 @@ public class MacroData { } return rVal; } + + /** + * Gets the list of content-blocking macro objects + * @return The list + */ + public List getContentBlockers(){ + List blockers = new LinkedList(); + blockers.addAll(this.structures); + return blockers; + } } diff --git a/src/main/java/electrosphere/server/macro/spatial/MacroAreaObject.java b/src/main/java/electrosphere/server/macro/spatial/MacroAreaObject.java index 4161d7cd..565221a5 100644 --- a/src/main/java/electrosphere/server/macro/spatial/MacroAreaObject.java +++ b/src/main/java/electrosphere/server/macro/spatial/MacroAreaObject.java @@ -1,5 +1,6 @@ package electrosphere.server.macro.spatial; +import org.joml.AABBd; import org.joml.Vector3d; /** @@ -18,6 +19,12 @@ public interface MacroAreaObject extends MacroObject { * @return The end position */ public Vector3d getEndPos(); + + /** + * Gets the AABB for the object + * @return The AABB + */ + public AABBd getAABB(); } diff --git a/src/main/java/electrosphere/server/macro/structure/Structure.java b/src/main/java/electrosphere/server/macro/structure/Structure.java index 8882ea94..988a49a8 100644 --- a/src/main/java/electrosphere/server/macro/structure/Structure.java +++ b/src/main/java/electrosphere/server/macro/structure/Structure.java @@ -66,7 +66,7 @@ public class Structure extends CharacterData implements MacroAreaObject { rVal.fabPath = data.getFabPath(); rVal.type = data.getId(); rVal.position = position; - rVal.aabb = new AABBd(new Vector3d(0,0,0), data.getDimensions()); + rVal.aabb = new AABBd(new Vector3d(position), new Vector3d(position).add(data.getDimensions())); return rVal; } @@ -129,6 +129,11 @@ public class Structure extends CharacterData implements MacroAreaObject { public Vector3d getEndPos() { return new Vector3d(aabb.maxX,aabb.maxY,aabb.maxZ); } + + @Override + public AABBd getAABB() { + return this.aabb; + }