added ability to scale noise

This commit is contained in:
grimsace
2026-05-19 11:39:09 -05:00
parent 57a1f7101a
commit f2aeac4da4
4 changed files with 36 additions and 15 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
+36 -15
View File
@@ -43,7 +43,7 @@ def _grad(h, x, y):
return -x - y return -x - y
def generate(width, height, octaves, scale, seed, invert, progress_cb): def generate(width, height, octaves, base_scale, zoom, seed, invert, progress_cb):
perms = [] perms = []
for i in range(octaves): for i in range(octaves):
rng = random.Random(seed + i) rng = random.Random(seed + i)
@@ -56,10 +56,14 @@ def generate(width, height, octaves, scale, seed, invert, progress_cb):
max_a = sum(amps) max_a = sum(amps)
acc = [0.0] * (width * height) acc = [0.0] * (width * height)
# Effective scale: less zoom = smaller fs = zoomed in (larger features)
# More zoom = larger fs = zoomed out (smaller features)
effective_scale = base_scale * zoom
for oi in range(octaves): for oi in range(octaves):
p = perms[oi] p = perms[oi]
amp = amps[oi] amp = amps[oi]
fs = scale * freqs[oi] fs = effective_scale * freqs[oi]
inv_h = fs / height inv_h = fs / height
inv_w = fs / width inv_w = fs / width
for y in range(height): for y in range(height):
@@ -122,12 +126,13 @@ class NoiseWorker(QObject):
finished = pyqtSignal(bytes, int, int) finished = pyqtSignal(bytes, int, int)
error = pyqtSignal(str) error = pyqtSignal(str)
def __init__(self, width, height, octaves, scale, seed, invert): def __init__(self, width, height, octaves, base_scale, zoom, seed, invert):
super().__init__() super().__init__()
self.width = width self.width = width
self.height = height self.height = height
self.octaves = octaves self.octaves = octaves
self.scale = scale self.base_scale = base_scale
self.zoom = zoom
self.seed = seed self.seed = seed
self.invert = invert self.invert = invert
@@ -137,7 +142,8 @@ class NoiseWorker(QObject):
self.width, self.width,
self.height, self.height,
self.octaves, self.octaves,
self.scale, self.base_scale,
self.zoom,
self.seed, self.seed,
self.invert, self.invert,
self.progress.emit, self.progress.emit,
@@ -190,15 +196,29 @@ class SolidNoiseDock(DockWidget):
ol.addWidget(hint) ol.addWidget(hint)
layout.addWidget(og) layout.addWidget(og)
# Scale # Zoom
sg = QGroupBox("Scale") sg = QGroupBox("Zoom")
sl = QHBoxLayout(sg) sl = QVBoxLayout(sg)
sl.addWidget(QLabel("Zoom:"))
self._scale_spin = QDoubleSpinBox() # Zoom Slider
self._scale_spin.setRange(0.1, 32.0) row = QHBoxLayout()
self._scale_spin.setSingleStep(0.5) row.addWidget(QLabel("Factor:"))
self._scale_spin.setValue(4.0) self._zoom_slider = QSlider(Qt.Horizontal)
sl.addWidget(self._scale_spin) self._zoom_slider.setRange(10, 1000) # 0.1 to 10.0
self._zoom_slider.setValue(100) # 1.0
self._zoom_lbl = QLabel("1.00x")
self._zoom_lbl.setMinimumWidth(40)
self._zoom_lbl.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
self._zoom_slider.valueChanged.connect(
lambda v: self._zoom_lbl.setText(f"{v / 100:.2f}x")
)
row.addWidget(self._zoom_slider)
row.addWidget(self._zoom_lbl)
sl.addLayout(row)
hint = QLabel("Zoom < 1.0 zooms in, > 1.0 zooms out")
hint.setStyleSheet("color: palette(mid); font-size: 10px;")
sl.addWidget(hint)
layout.addWidget(sg) layout.addWidget(sg)
# Seed # Seed
@@ -267,7 +287,8 @@ class SolidNoiseDock(DockWidget):
w, w,
h, h,
self._oct_slider.value(), self._oct_slider.value(),
self._scale_spin.value(), 4.0, # Default base scale
self._zoom_slider.value() / 100.0,
self._seed_spin.value(), self._seed_spin.value(),
self._invert_chk.isChecked(), self._invert_chk.isChecked(),
) )