diff --git a/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java b/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java index 523c1c9..2e365f9 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/TerrainEditorState.java @@ -1891,12 +1891,15 @@ public class TerrainEditorState extends BaseAppState { } camPos.y = FastMath.clamp(camPos.y, -200f, MAX_CAM_Y); - // Kamera nicht unter das Terrain oder gebackenes Voxel-Terrain fallen lassen + // Kamera nicht unter Basis-Terrain oder gebackenes Voxel-Terrain fallen lassen. + // Raycast von Kameraposition nach unten: findet Bergoberfläche, Tunnelboden oder nichts. float baseFloor = getTerrainHeightFast(camPos.x, camPos.z); VoxelEditorState ves = getStateManager().getState(VoxelEditorState.class); - float floor = (ves != null) - ? Math.max(baseFloor, ves.columnTopWorldY(camPos.x, camPos.z)) - : baseFloor; + float floor = baseFloor; + if (ves != null) { + float vf = ves.voxelFloorBelow(camPos.x, camPos.y, camPos.z, 4f); + if (!Float.isNaN(vf)) floor = Math.max(baseFloor, vf); + } if (camPos.y < floor + 2f) camPos.y = floor + 2f; cam.setLocation(camPos); diff --git a/blight-editor/src/main/java/de/blight/editor/state/VoxelEditorState.java b/blight-editor/src/main/java/de/blight/editor/state/VoxelEditorState.java index f69f050..f97a725 100644 --- a/blight-editor/src/main/java/de/blight/editor/state/VoxelEditorState.java +++ b/blight-editor/src/main/java/de/blight/editor/state/VoxelEditorState.java @@ -1381,6 +1381,30 @@ public class VoxelEditorState extends BaseAppState { return terrainH(worldX, worldZ); // Kein Voxel → Terrain-Oberfläche als Basis } + /** Voxel-Dichte am Weltpunkt; >0 = solid, ≤0 = Luft/leer. */ + public float densityAt(float worldX, float worldY, float worldZ) { + int cx = VoxelChunk.worldXToCx(worldX); + int cy = VoxelChunk.worldYToCy(worldY); + int cz = VoxelChunk.worldZToCz(worldZ); + VoxelChunk chunk = chunks.get(chunkKey(cx, cy, cz)); + if (chunk == null || chunk.isEmpty()) return -1f; + int lx = Math.max(0, Math.min(VoxelChunk.SIZE - 1, Math.round(VoxelChunk.worldXToLocal(worldX, cx)))); + int ly = Math.max(0, Math.min(VoxelChunk.SIZE - 1, Math.round(VoxelChunk.worldYToLocal(worldY, cy)))); + int lz = Math.max(0, Math.min(VoxelChunk.SIZE - 1, Math.round(VoxelChunk.worldZToLocal(worldZ, cz)))); + return chunk.getDensity(lx, ly, lz); + } + + /** Erste gebackene Voxel-Fläche unterhalb (wx,wy,wz) innerhalb maxDist Metern. + * Gibt Float.NaN zurück wenn keine Fläche in Reichweite. */ + public float voxelFloorBelow(float wx, float wy, float wz, float maxDist) { + if (voxelRoot == null) return Float.NaN; + CollisionResults results = new CollisionResults(); + voxelRoot.collideWith(new Ray(new Vector3f(wx, wy, wz), new Vector3f(0f, -1f, 0f)), results); + if (results.size() == 0) return Float.NaN; + CollisionResult closest = results.getClosestCollision(); + return (closest.getDistance() <= maxDist) ? closest.getContactPoint().y : Float.NaN; + } + /** * Gemeinsamer Kern: iteriert über alle Spalten im Radius und bewegt sie * schrittweise auf die per Lambda berechnete Ziel-Welt-Y zu. @@ -2385,6 +2409,7 @@ public class VoxelEditorState extends BaseAppState { float[] next = Arrays.copyOf(cur, cur.length); int wiyBase = c.cy * C; + VoxelChunk origChunk = allOriginal.get(k); for (int bz = 0; bz < C; bz++) { int colZ = c.cz * C + bz; for (int bx = 0; bx < C; bx++) { @@ -2396,8 +2421,19 @@ public class VoxelEditorState extends BaseAppState { // Sub-voxel-genauen Dichte-Gradienten schreiben, damit MC die // Isofläche auf die exakte smoothH-Höhe interpoliert. + // Ausnahme: manuell ausgegrabene Voxel (Tunnel/Höhlen) behalten + // ihren MIN_VALUE – erkennbar daran dass Gradient solid will (d>0) + // aber die Original-Dichte bereits Luft ist (MIN_VALUE). for (int by = 0; by < blurN; by++) { float d = (smoothH - (wiyBase + by)) * 127f; + // Tunnel/Höhlen-Voxel schützen: Gradient will Solid (d>0), + // aber der Voxel wurde ausgegraben (Dichte negativ) → + // nicht mit Solid-Gradient überschreiben. + // Gilt sowohl für Byte.MIN_VALUE (setDensity) als auch für + // partiell-reduzierte Werte (reduceDensity im Cave-Modus). + if (d > 0f && origChunk.getDensity(bx, by, bz) < 0) { + continue; + } next[c.idx(bx, by, bz)] = Math.max(-128f, Math.min(127f, d)); } } diff --git a/blight-map/src/main/map/blight_grass_vertex.blgv b/blight-map/src/main/map/blight_grass_vertex.blgv index 55fcaa2..fcc159b 100644 Binary files a/blight-map/src/main/map/blight_grass_vertex.blgv and b/blight-map/src/main/map/blight_grass_vertex.blgv differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod0.j3o index f6300d5..2dc8ea1 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod1.j3o index 8807533..a983d38 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod2.j3o deleted file mode 100644 index 47ebf6b..0000000 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_08_baked_lod2.j3o and /dev/null differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod0.j3o index 975a477..441d935 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod1.j3o index bbfbf44..734e62f 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod2.j3o deleted file mode 100644 index fec19c0..0000000 Binary files a/blight-map/src/main/map/chunks/voxel_17_0_09_baked_lod2.j3o and /dev/null differ diff --git a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod0.j3o index df4e38c..ee5ed3f 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod1.j3o index d7e2880..bacb5dc 100644 Binary files a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod2.j3o deleted file mode 100644 index ddab243..0000000 Binary files a/blight-map/src/main/map/chunks/voxel_17_m1_09_baked_lod2.j3o and /dev/null differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_08.blvc.prebake b/blight-map/src/main/map/chunks/voxel_18_0_08.blvc.prebake index 02a2e7e..38066c9 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_08.blvc.prebake and b/blight-map/src/main/map/chunks/voxel_18_0_08.blvc.prebake differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod0.j3o index 80bc37e..3172c83 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod1.j3o index 6ca5a06..b471881 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod2.j3o index 902f6ba..110d6e6 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod2.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_08_baked_lod2.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod0.j3o index 02107eb..8238e65 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod1.j3o index 3f96177..f402135 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod2.j3o index 4f2b95b..dfa0c39 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod2.j3o and b/blight-map/src/main/map/chunks/voxel_18_0_09_baked_lod2.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_m1_08.blvc.prebake b/blight-map/src/main/map/chunks/voxel_18_m1_08.blvc.prebake index a1934ad..9c4d17b 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_m1_08.blvc.prebake and b/blight-map/src/main/map/chunks/voxel_18_m1_08.blvc.prebake differ diff --git a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod0.j3o b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod0.j3o index 287cd36..667e65d 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod0.j3o and b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod0.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod1.j3o b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod1.j3o index ce4af12..1f7094e 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod1.j3o and b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod1.j3o differ diff --git a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod2.j3o b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod2.j3o index bfaa14d..3959f2d 100644 Binary files a/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod2.j3o and b/blight-map/src/main/map/chunks/voxel_18_m1_08_baked_lod2.j3o differ