Back Effekte hinzugefügt

This commit is contained in:
2026-08-09 22:22:44 +02:00
parent 46be9ffe57
commit 0a657a5831
7 changed files with 220 additions and 7 deletions

View File

@@ -3582,6 +3582,27 @@ public class EditorApp extends Application {
bakeBarLabel.setVisible(false);
bakeBarLabel.setManaged(false);
// ── Bake-Parameter ────────────────────────────────────────────────
Label smoothLbl = new Label(String.format("Glättung: %.1f", input.bakeSmoothStrength));
smoothLbl.setStyle("-fx-font-size: 11;");
javafx.scene.control.Slider smoothSlider =
new javafx.scene.control.Slider(0, 1, input.bakeSmoothStrength);
smoothSlider.setShowTickMarks(false);
smoothSlider.valueProperty().addListener((obs, o, n) -> {
input.bakeSmoothStrength = n.floatValue();
smoothLbl.setText(String.format("Glättung: %.1f", n.floatValue()));
});
Label cliffLbl = new Label(String.format("Klippen-Noise: %.1f", input.bakeCliffNoiseStrength));
cliffLbl.setStyle("-fx-font-size: 11;");
javafx.scene.control.Slider cliffSlider =
new javafx.scene.control.Slider(0, 1, input.bakeCliffNoiseStrength);
cliffSlider.setShowTickMarks(false);
cliffSlider.valueProperty().addListener((obs, o, n) -> {
input.bakeCliffNoiseStrength = n.floatValue();
cliffLbl.setText(String.format("Klippen-Noise: %.1f", n.floatValue()));
});
Button bakeBtn = new Button("Voxels backen (J3O)");
bakeBtn.setMaxWidth(Double.MAX_VALUE);
bakeBtn.setStyle("-fx-background-color: #4a7eba; -fx-text-fill: white;");
@@ -3697,8 +3718,9 @@ public class EditorApp extends Application {
cleanupPoller.setCycleCount(javafx.animation.Animation.INDEFINITE);
cleanupPoller.play();
panel.getChildren().addAll(new Separator(), bakeBtn,
bakeBar, bakeBarLabel, bakeStatus,
panel.getChildren().addAll(new Separator(),
smoothLbl, smoothSlider, cliffLbl, cliffSlider,
bakeBtn, bakeBar, bakeBarLabel, bakeStatus,
new Separator(), cleanupBtn, cleanupStatus,
new Separator(), selInfoLabel, selHintLabel, deleteBtn, revertBtn);
}

View File

@@ -778,7 +778,11 @@ public class SharedInput {
public volatile boolean voxelRedoRequested = false;
/** JFX → JME: alle Voxel-Chunks als geglättete J3O-Meshes backen. */
public volatile boolean bakeVoxelsRequested = false;
public volatile boolean bakeVoxelsRequested = false;
/** JFX → JME: Stärke des Post-Bake-Laplacian-Smooth (0 = kein Extra-Pass, 1 = stark). */
public volatile float bakeSmoothStrength = 0.3f;
/** JFX → JME: Amplitude der horizontalen Klippen-Noise-Verschiebung (0 = kein, 1 = ~2 m). */
public volatile float bakeCliffNoiseStrength = 0.2f;
/** JME → JFX: Anzahl bereits gebackener Chunks (0 = nicht gestartet). */
public volatile int bakeDone = 0;
/** JME → JFX: Gesamtzahl der zu backenden Chunks (0 = nicht gestartet). */

View File

@@ -2522,8 +2522,10 @@ public class VoxelEditorState extends BaseAppState {
// Nur erfolgreich gebackene Chunks werden gelöscht
List<VoxelChunk> successfullyBaked = new java.util.ArrayList<>();
int baked = 0;
float bakeSmoothStr = input.bakeSmoothStrength;
float bakeCliffStr = input.bakeCliffNoiseStrength;
for (VoxelChunk chunk : nonEmpty) {
if (bakeChunk(chunk, blurredMap)) {
if (bakeChunk(chunk, blurredMap, bakeSmoothStr, bakeCliffStr)) {
successfullyBaked.add(chunk);
} else {
log.warn("Chunk ({},{},{}) nicht gebacken Voxel-Daten bleiben erhalten.",
@@ -2639,7 +2641,8 @@ public class VoxelEditorState extends BaseAppState {
}
/** Bäckt einen einzelnen Chunk. Gibt true zurück wenn erfolgreich, false bei Fehler. */
private boolean bakeChunk(VoxelChunk original, Map<Long, VoxelChunk> blurredMap) {
private boolean bakeChunk(VoxelChunk original, Map<Long, VoxelChunk> blurredMap,
float smoothStrength, float cliffNoiseStrength) {
try {
VoxelChunk blurred = blurredMap.get(chunkKey(original.cx, original.cy, original.cz));
if (blurred == null) return false;
@@ -2647,9 +2650,25 @@ public class VoxelEditorState extends BaseAppState {
// Geblurrte Nachbarn für nahtlose Chunk-Grenzen im MC
VoxelChunk[] nb = getNeighbors(original.cx, original.cy, original.cz, blurredMap);
float wx = (float)(original.cx * VoxelChunk.CELLS);
float wz = (float)(original.cz * VoxelChunk.CELLS);
Mesh lod0 = MarchingCubes.smooth(MarchingCubes.build(blurred, 1, nb), 1, 0.3f);
if (smoothStrength > 0.01f) {
lod0 = MarchingCubes.smooth(lod0, 1, smoothStrength);
}
if (cliffNoiseStrength > 0.01f) {
lod0 = MarchingCubes.perturb(lod0, cliffNoiseStrength, wx, wz);
}
Mesh lod1 = MarchingCubes.smooth(MarchingCubes.build(blurred, 4, nb), 3, 0.4f);
if (cliffNoiseStrength > 0.01f) {
lod1 = MarchingCubes.perturb(lod1, cliffNoiseStrength * 0.6f, wx, wz);
}
Mesh[] meshes = {
MarchingCubes.smooth(MarchingCubes.build(blurred, 1, nb), 1, 0.3f),
MarchingCubes.smooth(MarchingCubes.build(blurred, 4, nb), 3, 0.4f),
lod0,
lod1,
MarchingCubes.smooth(MarchingCubes.build(blurred, 16, nb), 2, 0.4f),
};