Skip to content

Commit d2f32fe

Browse files
committed
Керекция турборежима
1 parent 15d3f27 commit d2f32fe

File tree

8 files changed

+62
-26
lines changed

8 files changed

+62
-26
lines changed

README.md

+10-5
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,22 @@
9898
- **ЛКМ**: Изменение состояния клетки под курсором.
9999
- **ЛКМ + SHIFT и перетаскивание**: Выделить поле, после чего клавишами **INSERT** вставить в выделеное место живые клетки, на **DELETE** удалить живые клетки, **ESCAPE** снять выделение.
100100
- **СКМ (клик колесиком мыши)**: Добавить фигуру из предустановленных петтернов(шаблонов) или из выбранных файлов.
101-
- **Клавиши от 1 до 6**: Выбор различных предустановленных паттернов для размещения на поле:
101+
- **Клавиши от 1 до 6 + CTRL**: Выбор различных предустановленных паттернов для размещения на поле:
102102
- **1**: Глайдер
103103
- **2**: Мигалка (Blinker)
104104
- **3**: Живок (Toad)
105105
- **4**: Баржа (Beacon)
106106
- **5**: Маятник (Pentadecathlon)
107107
- **6**: Ружьё Госпера (Gosper Glider Gun)
108-
- **Клавиши от 7 до 9**: Выбор цвета для размещения клеток:
109-
- **7**: Зелёный (тип 1).
110-
- **8**: Красный (тип 2).
111-
- **9**: Синий (тип 3).
108+
- **Клавиши от 1 до 7**: Выбор Цвета и типа клетки:
109+
- **1**: синий (type = 1)
110+
- **2**: зелёный (type = 2)
111+
- **3**: голубой (type = 3)
112+
- **4**: красный (type = 4)
113+
- **5**: фиолетовый (type = 5)
114+
- **6**: жёлтый(type = 6)
115+
- **7**: белый(type = 7)
116+
112117

113118
# Turbo Mode (Experimental Feature)
114119
![Game of Life 3D](.github/goltm1.jpg)

game/GPUAutomaton.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,14 @@ layout(std430, binding = 2) buffer Colors {
3838
};
3939
4040
uniform ivec2 gridSize;
41+
uniform int neighborhoodRadius;
4142
uniform bool isToroidal;
43+
4244
uniform int birth;
4345
uniform int survivalMin;
4446
uniform int survivalMax;
4547
uniform int overpopulation;
48+
4649
uniform int birthCounts[9];
4750
uniform int surviveCounts[9];
4851
uniform int useAdvancedRules; // 0 - стадартный режим, 1 - расширенный
@@ -62,9 +65,9 @@ bool isOverpopulated(int neighbors) {
6265
6366
int countLiveNeighbors(ivec2 pos, int targetType) {
6467
int count = 0;
65-
for(int dy = -1; dy <= 1; ++dy) {
66-
for(int dx = -1; dx <= 1; ++dx) {
67-
if(dx == 0 && dy == 0) continue;
68+
for (int dy = -neighborhoodRadius; dy <= neighborhoodRadius; ++dy) { // Изменили циклы
69+
for (int dx = -neighborhoodRadius; dx <= neighborhoodRadius; ++dx) { // Изменили циклы
70+
if (dx == 0 && dy == 0) continue;
6871
ivec2 neighbor = pos + ivec2(dx, dy);
6972
if (isToroidal) {
7073
neighbor = (neighbor + gridSize) % gridSize;
@@ -366,6 +369,7 @@ void GPUAutomaton::Update() {
366369
glUniform1i(glGetUniformLocation(computeProgram, "survivalMin"), survivalMin);
367370
glUniform1i(glGetUniformLocation(computeProgram, "survivalMax"), survivalMax);
368371
glUniform1i(glGetUniformLocation(computeProgram, "overpopulation"), overpopulation);
372+
glUniform1i(glGetUniformLocation(computeProgram, "neighborhoodRadius"), neighborhoodRadius);
369373
// переменные для расширенного режима правил
370374
glUniform1i(glGetUniformLocation(computeProgram, "useAdvancedRules"), useAdvancedRules);
371375
glUniform1iv(glGetUniformLocation(computeProgram, "birthCounts"), 9, birthRules);
@@ -585,9 +589,6 @@ void GPUAutomaton::CheckComputeLimits() {
585589
//101 - фиолетовый(type = 5)
586590
//110 - жёлтый(type = 6)
587591
//111 - белый(type = 7)
588-
//000 - черный(type = 8)
589-
//001 - синий(type = 9)
590-
//111 - белый(type > 9)
591592
void GPUAutomaton::SetCellType(int x, int y, int type) {
592593
if (x < 0 || x >= gridWidth || y < 0 || y >= gridHeight) {
593594
std::cerr << "SetCellType: Invalid coordinates (" << x << ", " << y << ")" << std::endl;

game/GPUAutomaton.h

+4
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@ class GPUAutomaton {
3434
int survivalMax = 3; // По умолчанию максимум 3 соседа для выживания
3535
int overpopulation = 4; // По умолчанию 4 или больше для смерти от перенаселения
3636
bool isToroidal = true;
37+
int neighborhoodRadius = 1; // радиус окрестности Мура по умолчанию 1
3738
void SetBirth(int b) { birth = b; }
3839
void SetSurvivalMin(int smin) { survivalMin = smin; }
3940
void SetSurvivalMax(int smax) { survivalMax = smax; }
4041
void SetOverpopulation(int o) { overpopulation = o; }
4142
void SetToroidal(bool toroidal);
43+
void SetNeighborhoodRadius(int radius) {
44+
neighborhoodRadius = radius;
45+
};
4246

4347
void SetNewGridSize(int width, int height);
4448

main.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ int wWinMain(
238238
simulationSteps = smoothedSimulationSteps;
239239

240240
// Жёсткий сброс при сильной просадке
241-
if (currentFPS < targetFPS * 0.5f) {
241+
if (currentFPS < targetFPS * 0.2f) {
242242
simulationSteps -= 1.0f;
243243
smoothedSimulationSteps -= 1.0f;
244244
}
@@ -248,12 +248,12 @@ int wWinMain(
248248
simulationSteps = 1.0f;
249249
smoothedSimulationSteps = 1.0f;
250250
}
251-
if (simulationSteps > 10.0f) {
252-
simulationSteps = 10.0f;
253-
smoothedSimulationSteps = 10.0f;
251+
if (simulationSteps > 25.0f) {
252+
simulationSteps = 25;
253+
smoothedSimulationSteps = 25.0f;
254254
}
255255
needSteps = static_cast<int>(simulationSteps + 0.5f);
256-
256+
//gameController.update();
257257
if (elapsedFrameMs >= frameIntervalMs) {
258258
for (int i = 0; i < needSteps; i++) {
259259
gameController.update();

rendering/UIRenderer.cpp

+21-2
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,23 @@ void UIRenderer::DrawGameSettingsWindow() {
199199

200200
// Чекбокс для расширенного режима
201201
static bool advancedRules = false;
202-
if (ImGui::Checkbox("Расширенные правила (B/S)", &advancedRules)) {
202+
if (ImGui::Checkbox("Расширенные правила (B/S/O)", &advancedRules)) {
203203
gpuAutomaton->setUseAdvancedRules(advancedRules);
204204
}
205205

206+
207+
206208
// Если расширенный режим включен, отключаем старые комбобоксы
207209
if (advancedRules) {
208210
ImGui::BeginDisabled();
209211
}
212+
ImGui::Text("Радиус окрестности Мура");
213+
int neighborhoodRadius = gpuAutomaton->neighborhoodRadius - 1;
214+
const char* neighborhoodRadiusOptions[] = { "1", "2", "3", "4", "5", "6", "7", "8" };
215+
ImGui::SetNextItemWidth(buttonSize.x);
216+
if (ImGui::Combo("##neighborhoodRadius", &neighborhoodRadius, neighborhoodRadiusOptions, IM_ARRAYSIZE(neighborhoodRadiusOptions))) {
217+
gpuAutomaton->neighborhoodRadius = neighborhoodRadius + 1;
218+
}
210219

211220
// Старые настройки
212221
ImGui::Text("Рождение");
@@ -216,16 +225,19 @@ void UIRenderer::DrawGameSettingsWindow() {
216225
if (ImGui::Combo("##birth", &selectedBirth, birthOptions, IM_ARRAYSIZE(birthOptions))) {
217226
gpuAutomaton->birth = selectedBirth + 1;
218227
}
228+
219229
ImGui::Separator();
220230
ImGui::Text("Выживание (мин)");
221231
const char* survivalMinOptions[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" };
222232
ImGui::SetNextItemWidth(buttonSize.x);
223233
ImGui::Combo("##survivalMin", &gpuAutomaton->survivalMin, survivalMinOptions, IM_ARRAYSIZE(survivalMinOptions));
234+
224235
ImGui::Separator();
225236
ImGui::Text("Выживание (макс)");
226237
const char* survivalMaxOptions[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" };
227238
ImGui::SetNextItemWidth(buttonSize.x);
228239
ImGui::Combo("##survivalMax", &gpuAutomaton->survivalMax, survivalMaxOptions, IM_ARRAYSIZE(survivalMaxOptions));
240+
229241
ImGui::Separator();
230242
ImGui::Text("Перенаселение");
231243
int selectedOverPopulation = gpuAutomaton->overpopulation - 1;
@@ -245,7 +257,14 @@ void UIRenderer::DrawGameSettingsWindow() {
245257
ImGui::SetWindowSize(ImVec2(250, 0), ImGuiCond_Once);
246258
static bool birthRules[9] = { false };
247259
static bool surviveRules[9] = { false };
248-
260+
ImGui::Text("Радиус окрестности Мура");
261+
int neighborhoodRadius = gpuAutomaton->neighborhoodRadius - 1;
262+
const char* neighborhoodRadiusOptions[] = { "1", "2", "3", "4", "5", "6", "7", "8" };
263+
ImGui::SetNextItemWidth(buttonSize.x);
264+
if (ImGui::Combo("##neighborhoodRadius", &neighborhoodRadius, neighborhoodRadiusOptions, IM_ARRAYSIZE(neighborhoodRadiusOptions))) {
265+
gpuAutomaton->neighborhoodRadius = neighborhoodRadius + 1;
266+
}
267+
ImGui::Separator();
249268
// Рождение
250269
ImGui::Text("Рождение (B):");
251270
ImGui::Separator();

res/about.txt

+9-5
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@
2828
- **ЛКМ**: Изменение состояния клетки под курсором.
2929
- **ЛКМ + SHIFT и перетаскивание**: Выделить поле, после чего клавишами **INSERT** вставить в выделеное место живые клетки, на **DELETE** удалить живые клетки, **ESCAPE** снять выделение.
3030
- **СКМ (клик колесиком мыши)**: Добавить фигуру из предустановленных петтернов(шаблонов) или из выбранных файлов.
31-
- **Клавиши от 1 до 6**: Выбор различных предустановленных паттернов для размещения на поле:
31+
- **Клавиши от 1 до 6 + CTRL**: Выбор различных предустановленных паттернов для размещения на поле:
3232
- **1**: Глайдер
3333
- **2**: Мигалка (Blinker)
3434
- **3**: Живок (Toad)
3535
- **4**: Баржа (Beacon)
3636
- **5**: Маятник (Pentadecathlon)
3737
- **6**: Ружьё Госпера (Gosper Glider Gun)
38-
- **Клавиши от 7 до 9**: Выбор цвета для размещения клеток:
39-
- **7**: Зелёный (тип 1).
40-
- **8**: Красный (тип 2).
41-
- **9**: Синий (тип 3).
38+
- **Клавиши от 1 до 7**: Выбор Цвета и типа клетки:
39+
- **1**: синий (type = 1)
40+
- **2**: зелёный (type = 2)
41+
- **3**: голубой (type = 3)
42+
- **4**: красный (type = 4)
43+
- **5**: фиолетовый (type = 5)
44+
- **6**: жёлтый(type = 6)
45+
- **7**: белый(type = 7)
4246

4347
Для выхода из программы нажмите 'Выход'.
4448

shader/ecosystemShader.hlsl

+5-2
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,14 @@ layout(std430, binding = 2) buffer Colors {
1414
};
1515

1616
uniform ivec2 gridSize;
17+
uniform int neighborhoodRadius;
1718
uniform bool isToroidal;
19+
1820
uniform int birth;
1921
uniform int survivalMin;
2022
uniform int survivalMax;
2123
uniform int overpopulation;
24+
2225
uniform int birthCounts[9];
2326
uniform int surviveCounts[9];
2427
uniform int useAdvancedRules; // 0 - стадартный режим, 1 - расширенный
@@ -38,8 +41,8 @@ bool isOverpopulated(int neighbors) {
3841

3942
int countLiveNeighbors(ivec2 pos, int targetType) {
4043
int count = 0;
41-
for(int dy = -1; dy <= 1; ++dy) {
42-
for(int dx = -1; dx <= 1; ++dx) {
44+
for(int dy = -2; dy <= 2; ++dy) {
45+
for(int dx = -2; dx <= 2; ++dx) {
4346
if(dx == 0 && dy == 0) continue;
4447
ivec2 neighbor = pos + ivec2(dx, dy);
4548
if (isToroidal) {

0 commit comments

Comments
 (0)