Skip to content

Commit

Permalink
Add configurable color scales for 3D rendering
Browse files Browse the repository at this point in the history
  • Loading branch information
booleanbyte committed Dec 21, 2023
1 parent 49adf43 commit b97f4d9
Show file tree
Hide file tree
Showing 3 changed files with 154 additions and 1 deletion.
80 changes: 80 additions & 0 deletions src/main/java/com/dfsek/noise/swing/ColorScale.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package com.dfsek.noise.swing;

public class ColorScale {
private final String name;
private final float[][] scale;


public static final ColorScale SOLID = new ColorScale("Solid", new float[][]{
{ 0.0f, 0.5f, 0.5f, 0.5f },
{ 1.0f, 0.5f, 0.5f, 0.5f }
});

public static final ColorScale GRAYSCALE_0_1 = new ColorScale("Grayscale 0 - 1", new float[][]{
{ 0.0f, 0.0f, 0.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, 1.0f }
});

public static final ColorScale GRAYSCALE_0_256 = new ColorScale("Grayscale 0 - 256", new float[][]{
{ 0.0f, 0.0f, 0.0f, 0.0f },
{ 100.0f, 1.0f, 1.0f, 1.0f }
});

public static final ColorScale GRAYSCALE_N64_320 = new ColorScale("Grayscale (-64) - 320", new float[][]{
{ 0.0f, 0.0f, 0.0f, 0.0f },
{ 320.0f, 1.0f, 1.0f, 1.0f }
});

public static final ColorScale COLORED_0_320 = new ColorScale("Colored 0 - 320", new float[][]{
{ 0.0f, 0.0f, 0.0f, 1.0f },
{ 64.0f, 1.0f, 1.0f, 0.0f },
{ 128.0f, 0.0f, 1.0f, 0.0f },
{ 192.0f, 0.75f, 0.56f, 0.2f },
{ 256.0f, 0.5f, 0.5f, 0.5f },
{ 320.0f, 1.0f, 1.0f, 1.0f }
});

public ColorScale(String name, float[][] scale) {
this.name = name;
this.scale = scale;
}

public ColorScale(String name, String scaleAsText) {
this.name = name;

String[] split = scaleAsText.split("\\n\\r*|,\\s*");
scale = new float[split.length / 4][4];
for(int i = 0; i < split.length / 4; i++) {
scale[i][0] = Float.parseFloat(split[i * 4]);
scale[i][1] = Float.parseFloat(split[i * 4 + 1]);
scale[i][2] = Float.parseFloat(split[i * 4 + 2]);
scale[i][3] = Float.parseFloat(split[i * 4 + 3]);
}
}

public String getName() {
return name;
}

public float[][] getScale() {
return scale;
}

public String getScaleAsText() {
StringBuilder text = new StringBuilder();
for(float[] stop : scale) {
text.append(stop[0]).append(", ");
text.append(stop[1]).append(", ");
text.append(stop[2]).append(", ");
text.append(stop[3]).append("\n\r");
}
text.setLength(text.length() - 2);

return text.toString();
}

@Override
public String toString() {
return getName();
}
}
1 change: 1 addition & 0 deletions src/main/java/com/dfsek/noise/swing/NoisePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ public void update() {
this.image.setIcon(new ImageIcon(this.render));

double[][] noiseVals = getNoiseVals(this.settingsPanel.getSeed());
this.noise3d.setColorscale(settingsPanel.getColorScale().getScale());
this.noise3d.setHeightmap(noiseVals);

this.error.set(false);
Expand Down
74 changes: 73 additions & 1 deletion src/main/java/com/dfsek/noise/swing/NoiseSettingsPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,32 @@
import com.dfsek.noise.utils.SwingUtils;

import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.util.concurrent.atomic.AtomicBoolean;


public class NoiseSettingsPanel extends JPanel {
private final JSpinner seedSpinner = new JSpinner(new SpinnerNumberModel(2403, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
private final JSpinner xOrigin = new JSpinner(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));
private final JSpinner zOrigin = new JSpinner(new SpinnerNumberModel(0, Integer.MIN_VALUE, Integer.MAX_VALUE, 1));

// Color scale presets
private final ColorScale customColorScalePreset = new ColorScale("Custom", (float[][]) null);
private final ColorScale[] presets = {
ColorScale.SOLID,
ColorScale.GRAYSCALE_0_1,
ColorScale.GRAYSCALE_0_256,
ColorScale.GRAYSCALE_N64_320,
ColorScale.COLORED_0_320,
customColorScalePreset
};
private ColorScale customColorScale;

// Render settings
private final JComboBox<ColorScale> colorScalePresets = new JComboBox<>(presets);
private final JTextArea colorScaleEditor = new JTextArea();

public NoiseSettingsPanel() {
super(new SpringLayout());
add(new JLabel("Seed: "));
Expand All @@ -18,7 +38,49 @@ public NoiseSettingsPanel() {
add(new JLabel("Z Origin: "));
add(zOrigin);

SwingUtils.makeCompactGrid(this, 3, 2, 10, 10, 10, 10);
add(new JLabel("Color scale preset: "));
colorScalePresets.setSelectedItem(ColorScale.SOLID);
add(colorScalePresets);

colorScaleEditor.setRows(10);
colorScaleEditor.setText(((ColorScale) colorScalePresets.getSelectedItem()).getScaleAsText());
add(new JLabel("Color scale: "));
add(new JScrollPane(colorScaleEditor));

AtomicBoolean ignoreTextChange = new AtomicBoolean(false);
colorScalePresets.addActionListener(e -> {
ColorScale selection = (ColorScale) colorScalePresets.getSelectedItem();
if (selection == customColorScalePreset) return;

ignoreTextChange.set(true);
colorScaleEditor.setText(selection.getScaleAsText());
ignoreTextChange.set(false);
});

colorScaleEditor.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
if (ignoreTextChange.get()) return;
colorScalePresets.setSelectedItem(customColorScalePreset);
customColorScale = new ColorScale("Custom", colorScaleEditor.getText());
}

@Override
public void removeUpdate(DocumentEvent e) {
if (ignoreTextChange.get()) return;
colorScalePresets.setSelectedItem(customColorScalePreset);
customColorScale = new ColorScale("Custom", colorScaleEditor.getText());
}

@Override
public void changedUpdate(DocumentEvent e) {
if (ignoreTextChange.get()) return;
colorScalePresets.setSelectedItem(customColorScalePreset);
customColorScale = new ColorScale("Custom", colorScaleEditor.getText());
}
});

SwingUtils.makeCompactGrid(this, 5, 2, 10, 10, 10, 10);
}

public int getSeed() {
Expand All @@ -40,4 +102,14 @@ public double getOriginZ() {
public void setOriginZ(double z) {
zOrigin.setValue(z);
}

public ColorScale getColorScale() {
ColorScale selection = (ColorScale) colorScalePresets.getSelectedItem();
if (selection == customColorScalePreset) {
return customColorScale;
}
else {
return selection;
}
}
}

0 comments on commit b97f4d9

Please sign in to comment.