better grid generator

This commit is contained in:
Dejvino 2026-02-28 19:49:27 +01:00
parent 0cecb05044
commit 11fabe1f29

View File

@ -398,6 +398,7 @@ void drawGridCell(SDL_Renderer* renderer, int x, int y, int size, SynthEngine::G
} else if (cell.type == SynthEngine::GridCell::GATE_INPUT) { } else if (cell.type == SynthEngine::GridCell::GATE_INPUT) {
SDL_Rect box = {cx - r, cy - r, r*2, r*2}; SDL_Rect box = {cx - r, cy - r, r*2, r*2};
SDL_RenderDrawRect(renderer, &box); SDL_RenderDrawRect(renderer, &box);
drawDirectionArrow(renderer, cx, cy, size, cell.rotation);
if (cell.value > 0.5f) SDL_RenderFillRect(renderer, &box); if (cell.value > 0.5f) SDL_RenderFillRect(renderer, &box);
drawString(renderer, cx - 8, cy - 5, 12, "G-IN"); drawString(renderer, cx - 8, cy - 5, 12, "G-IN");
drawTypeLabel(renderer, x, y, 'K'); drawTypeLabel(renderer, x, y, 'K');
@ -738,10 +739,10 @@ void randomizeGrid() {
} }
int attempts = 0; int attempts = 0;
bool inputOscillatorReachable = false; bool validGrid = false;
bool visited[SynthEngine::GRID_W][SynthEngine::GRID_H]; bool visited[SynthEngine::GRID_W][SynthEngine::GRID_H];
while (!inputOscillatorReachable && attempts < 1000) { while (!validGrid && attempts < 1000) {
attempts++; attempts++;
// 2. Randomize (without allocation) // 2. Randomize (without allocation)
@ -817,20 +818,27 @@ void randomizeGrid() {
} }
} }
// After BFS, check if an input oscillator is reachable // After BFS, check if requirements are met
bool hasSoundSource = false;
bool hasGate = false;
for (int x = 0; x < SynthEngine::GRID_W; ++x) { for (int x = 0; x < SynthEngine::GRID_W; ++x) {
for (int y = 0; y < SynthEngine::GRID_H; ++y) { for (int y = 0; y < SynthEngine::GRID_H; ++y) {
if (visited[x][y] && engine.grid[x][y].type == SynthEngine::GridCell::INPUT_OSCILLATOR) { if (visited[x][y]) {
inputOscillatorReachable = true; if (engine.grid[x][y].type == SynthEngine::GridCell::INPUT_OSCILLATOR ||
break; engine.grid[x][y].type == SynthEngine::GridCell::WAVETABLE) {
hasSoundSource = true;
}
if (engine.grid[x][y].type == SynthEngine::GridCell::GATE_INPUT) {
hasGate = true;
}
} }
} }
if (inputOscillatorReachable) break;
} }
validGrid = hasSoundSource && hasGate;
} }
// 4. Prune unreachable elements if a valid grid was found // 4. Prune unreachable elements if a valid grid was found
if (inputOscillatorReachable) { if (validGrid) {
for (int x = 0; x < SynthEngine::GRID_W; ++x) { for (int x = 0; x < SynthEngine::GRID_W; ++x) {
for (int y = 0; y < SynthEngine::GRID_H; ++y) { for (int y = 0; y < SynthEngine::GRID_H; ++y) {
if (!visited[x][y]) { if (!visited[x][y]) {
@ -854,7 +862,7 @@ void randomizeGrid() {
} }
} }
printf("Randomized in %d attempts. Input Osc reachable: %s\n", attempts, inputOscillatorReachable ? "YES" : "NO"); printf("Randomized in %d attempts. Valid: %s\n", attempts, validGrid ? "YES" : "NO");
} }
void loadPreset(int preset) { void loadPreset(int preset) {