Back Effekte hinzugefügt
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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). */
|
||||
|
||||
@@ -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),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user