added ability to scale noise
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
+36
-15
@@ -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(),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user