Skip to content

Commit 0609d32

Browse files
committed
Release version 1.2.1
1 parent 9237ded commit 0609d32

17 files changed

+270
-122
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353

5454
5. **Запуск**:
5555
- Запустите собранное приложение.
56-
- Так же можно передать параметры в комендной строке что бы указать размер игрового поля, по умолчанию 200x200 `life.exe -gridWidth 200 -gridHeight 150` смотрите пример в [run_life.bat](run_life.bat)
56+
- Так же можно передать параметры в комендной строке что бы указать размер игрового поля, по умолчанию 300x400. так же можно запустить в полноэкранном режиме передам параметр -fullscreen `life.exe -gridWidth 200 -gridHeight 150 -fullscreen` смотрите пример в [run_life.bat](run_life.bat)
5757

5858
## Возможности
5959

game/GameController.cpp

-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
#include "GameController.h"
22

3-
4-
53
GameController::GameController(int width, int height, float cellSize)
64
: grid(width, height), gameOfLife(grid), cellSize(cellSize), isRunning(false) {
75
currentPattern = glider;

game/GameController.h

-6
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ class GameController {
166166

167167
GameController(int width, int height, float cellSize = 0.5f);
168168
void initializeGrid();
169-
void placeGlider(int startX, int startY);
170169
void placePattern(int startX, int startY, const Pattern& pattern);
171170
void randomizeGrid(float density);
172171
void clearGrid();
@@ -185,11 +184,6 @@ class GameController {
185184
bool getCellState(int x, int y) const;
186185
const Grid& getGrid() const { return grid; }
187186

188-
//void saveGameState(const std::string& filename);
189-
//void loadGameState(const std::string& filename);
190-
//void saveGameStateCSV(const std::string& filename);
191-
//void loadGameStateCSV(const std::string& filename);
192-
193187
// ìåòîä äëÿ èçìåíåíèÿ ðàçìåðà ñåòêè
194188
void resizeGrid(int newWidth, int newHeight);
195189

game/GameOfLife.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "GameOfLife.h"
22

33
GameOfLife::GameOfLife(Grid& g) : grid(g), nextGrid(g.getWidth(), g.getHeight()),gpuAutomaton(g.getWidth(), g.getHeight()), isToroidal(true) {
4-
//std::srand(static_cast<unsigned int>(std::time(nullptr))); // Èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë
4+
std::srand(static_cast<unsigned int>(std::time(nullptr))); // Èíèöèàëèçàöèÿ ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë
55
}
66

77
int GameOfLife::countLiveNeighbors(int x, int y) const {

game/GameStateManager.h

-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@ class GameStateManager {
1313

1414
// Ðàñøèðåííîå ñîõðàíåíèå/çàãðóçêà (ñ äîïîëíèòåëüíûìè ïàðàìåòðàìè)
1515
static bool saveGameStateCSV(const Grid& grid, const std::string& filename);
16-
static bool loadGameStateCSV(Grid& grid, const std::string& filename);
1716

1817
private:
1918
// Âñïîìîãàòåëüíûå ìåòîäû
20-
static bool validateFile(const std::string& filename);
2119
static bool validateDimensions(const Grid& grid, int width, int height);
2220
};
2321

game/Grid.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
#include "Grid.h"
22

33
Grid::Grid(int w, int h) : width(w), height(h) {
4-
//for (auto y = 0; y < height; ++y) {
5-
// cells[y].resize(width);
6-
//}
74
cells.resize(height, std::vector<Cell>(width));
85
}
96

main.cpp

+34-10
Original file line numberDiff line numberDiff line change
@@ -22,27 +22,48 @@
2222

2323

2424
// Ôóíêöèÿ äëÿ ïàðñèíãà êîìàíäíîé ñòðîêè
25-
void ParseCommandLine(LPWSTR lpCmdLine, int& width, int& height) {
26-
std::wstring cmdLine(lpCmdLine);
25+
void ParseCommandLine(const std::wstring& cmdLine, int& width, int& height, bool& fullscreen) {
2726
std::wistringstream iss(cmdLine);
2827
std::wstring token;
2928

3029
// Óñòàíàâëèâàåì çíà÷åíèÿ ïî óìîë÷àíèþ
31-
width = 400; // Çíà÷åíèå ïî óìîë÷àíèþ äëÿ øèðèíû
32-
height = 300; // Çíà÷åíèå ïî óìîë÷àíèþ äëÿ âûñîòû
30+
width = 400; // Çíà÷åíèå ïî óìîë÷àíèþ äëÿ øèðèíû
31+
height = 300; // Çíà÷åíèå ïî óìîë÷àíèþ äëÿ âûñîòû
32+
fullscreen = false; // Çíà÷åíèå ïî óìîë÷àíèþ äëÿ ïîëíîýêðàííîãî ðåæèìà
3333

3434
// Ïàðñèì êîìàíäíóþ ñòðîêó
3535
while (iss >> token) {
3636
if (token == L"-gridWidth") {
3737
if (iss >> token) {
38-
width = std::stoi(token); // Ïðåîáðàçóåì ñòðîêó â öåëîå ÷èñëî
38+
try {
39+
width = std::stoi(token); // Ïðåîáðàçóåì ñòðîêó â öåëîå ÷èñëî
40+
if (width <= 0) {
41+
throw std::invalid_argument("Width must be positive.");
42+
}
43+
}
44+
catch (const std::exception& e) {
45+
std::wcerr << L"Invalid width value: " << token << L". Using default width." << std::endl;
46+
width = 400; // Âîçâðàùàåì çíà÷åíèå ïî óìîë÷àíèþ
47+
}
3948
}
4049
}
4150
else if (token == L"-gridHeight") {
4251
if (iss >> token) {
43-
height = std::stoi(token); // Ïðåîáðàçóåì ñòðîêó â öåëîå ÷èñëî
52+
try {
53+
height = std::stoi(token); // Ïðåîáðàçóåì ñòðîêó â öåëîå ÷èñëî
54+
if (height <= 0) {
55+
throw std::invalid_argument("Height must be positive.");
56+
}
57+
}
58+
catch (const std::exception& e) {
59+
std::wcerr << L"Invalid height value: " << token << L". Using default height." << std::endl;
60+
height = 300; // Âîçâðàùàåì çíà÷åíèå ïî óìîë÷àíèþ
61+
}
4462
}
4563
}
64+
else if (token == L"-fullscreen") {
65+
fullscreen = true; // Åñëè ïàðàìåòð óêàçàí, óñòàíàâëèâàåì fullscreen â true
66+
}
4667
}
4768
}
4869

@@ -98,20 +119,23 @@ int wWinMain(
98119

99120
// Ïåðåìåííûå äëÿ øèðèíû è âûñîòû
100121
int gridWidth, gridHeight;
101-
ParseCommandLine(lpCmdLine, gridWidth, gridHeight); // Ïîëó÷àåì çíà÷åíèÿ èç êîìàíäíîé ñòðîêè
122+
bool Full;
123+
ParseCommandLine(lpCmdLine, gridWidth, gridHeight, Full); // Ïîëó÷àåì çíà÷åíèÿ èç êîìàíäíîé ñòðîêè
102124

103125
MainWindow mainWindow(hInstance, 800, 600);
104126

105127

106128
if (mainWindow.Create()) {
107-
int width = mainWindow.GetWidth();
108-
int height = mainWindow.GetHeight();
109129
OpenGLInitializer glInit(mainWindow.GetHwnd());
110-
if (!glInit.Initialize()) {
130+
131+
if (!glInit.Initialize(Full)) {
111132
MessageBox(NULL, L"OpenGL Initialization Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);
112133
return 1;
113134
}
114135

136+
int width = mainWindow.GetWidth();
137+
int height = mainWindow.GetHeight();
138+
115139
GameController gameController(gridWidth, gridHeight); // Ñîçäàåì GameController
116140
gameController.randomizeGrid(0.1f);
117141

rendering/Renderer.cpp

+37-63
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,14 @@ void Renderer::InitializeVBOs() {
4242
int gridHeight = pGameController->getGridHeight();
4343
float cellSize = pGameController->getCellSize();
4444

45-
// Èíèöèàëèçàöèÿ VBO äëÿ êëåòîê
45+
// Èíèöèàëèçàöèÿ VAO äëÿ êëåòîê
46+
GL_CHECK(glGenVertexArrays(1, &cellsVAO));
47+
GL_CHECK(glBindVertexArray(cellsVAO)); // Ñíà÷àëà ïðèâÿçûâàåì VAO
48+
49+
// Èíèöèàëèçàöèÿ VBO äëÿ âåðøèí êëåòîê
4650
GL_CHECK(glGenBuffers(1, &cellsVBO));
4751
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellsVBO));
48-
//float vertices[] = {
49-
// 0.1f, 0.1f,
50-
// 0.9f, 0.1f,
51-
// 0.9f, 0.9f,
52-
// 0.1f, 0.9f
53-
//};
52+
5453
float scale_factor = 0.2f;
5554
float centerX = 0.5f;
5655
float centerY = 0.5f;
@@ -68,23 +67,42 @@ void Renderer::InitializeVBOs() {
6867

6968
GL_CHECK(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));
7069

70+
// Íàñòðîéêà àòðèáóòîâ äëÿ âåðøèí êâàäðàòà êëåòêè
71+
GL_CHECK(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr));
72+
GL_CHECK(glEnableVertexAttribArray(0));
73+
7174
// Èíèöèàëèçàöèÿ VBO äëÿ äàííûõ èíñòàíñà
7275
GL_CHECK(glGenBuffers(1, &cellInstanceVBO));
76+
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellInstanceVBO));
77+
7378
cellInstances.clear();
7479
cellInstances.reserve(gridWidth * gridHeight);
7580
for (int y = 0; y < gridHeight; ++y) {
7681
for (int x = 0; x < gridWidth; ++x) {
7782
Cell cell = pGameController->getGrid().getCell(x, y);
83+
// Ïðåäïîëàãàåì, ÷òî getColor() âîçâðàùàåò Vector3d
7884
cellInstances.push_back({
7985
x * cellSize, y * cellSize,
80-
cell.getColor()
86+
{cell.getColor().X(), cell.getColor().Y(), cell.getColor().Z()}
8187
});
8288
}
8389
}
8490

85-
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellInstanceVBO));
8691
GL_CHECK(glBufferData(GL_ARRAY_BUFFER, cellInstances.size() * sizeof(CellInstance), cellInstances.data(), GL_STATIC_DRAW));
8792

93+
// Íàñòðîéêà àòðèáóòîâ äëÿ èíñòàíñèíãà
94+
GL_CHECK(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(CellInstance), (void*)0));
95+
GL_CHECK(glVertexAttribDivisor(1, 1)); // Êàæäûé èíñòàíñ èìååò ñâîþ ïîçèöèþ
96+
GL_CHECK(glEnableVertexAttribArray(1));
97+
98+
GL_CHECK(glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(CellInstance), (void*)(offsetof(CellInstance, color))));
99+
GL_CHECK(glVertexAttribDivisor(3, 1)); // Öâåò äëÿ êàæäîãî èíñòàíñà
100+
GL_CHECK(glEnableVertexAttribArray(3));
101+
102+
// Îòâÿçûâàåì áóôåðû è VAO
103+
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0));
104+
GL_CHECK(glBindVertexArray(0));
105+
88106
InitializeGridVBOs();
89107
}
90108

@@ -153,52 +171,7 @@ void Renderer::Draw() {
153171
uiController.DrawUI();
154172

155173
// Îáíîâëåíèå ñîñòîÿíèÿ UI íà îñíîâå òåêóùåãî ñîñòîÿíèÿ èãðû
156-
uiController.UpdateUIState();
157-
158-
// Íà÷àëî íîâîãî êàäðà ImGui
159-
//ImGui_ImplOpenGL3_NewFrame();
160-
//ImGui_ImplWin32_NewFrame();
161-
//ImGui::NewFrame();
162-
163-
//// Îòðèñîâêà UI ñ êíîïêàìè
164-
//ImGui::Begin("Game of Life Control");
165-
166-
//// Êíîïêà äëÿ çàïóñêà ñèìóëÿöèè
167-
//if (ImGui::Button("Start Simulation")) {
168-
// pGameController->startSimulation();
169-
//}
170-
171-
//// Êíîïêà äëÿ îñòàíîâêè ñèìóëÿöèè
172-
//if (ImGui::Button("Stop Simulation")) {
173-
// pGameController->stopSimulation();
174-
//}
175-
176-
//// Êíîïêà äëÿ îäíîãî øàãà ñèìóëÿöèè
177-
//if (ImGui::Button("Step Simulation")) {
178-
// pGameController->stepSimulation();
179-
//}
180-
181-
//// Êíîïêà äëÿ îòêàòà íà ïðåäûäóùåå ïîêîëåíèå
182-
//if (ImGui::Button("Previous Generation")) {
183-
// pGameController->previousGeneration();
184-
//}
185-
186-
//// Êíîïêà äëÿ î÷èñòêè ñåòêè
187-
//if (ImGui::Button("Clear Grid")) {
188-
// pGameController->clearGrid();
189-
//}
190-
191-
//// Êíîïêà äëÿ ñëó÷àéíîãî çàïîëíåíèÿ ñåòêè
192-
//if (ImGui::Button("Randomize Grid")) {
193-
// pGameController->randomizeGrid(0.1f); // 10% âåðîÿòíîñòü äëÿ æèâîé êëåòêè
194-
//}
195-
196-
//// Çäåñü ìîæíî äîáàâèòü äðóãèå êíîïêè èëè ýëåìåíòû óïðàâëåíèÿ
197-
198-
//ImGui::End();
199-
//// Çàâåðøåíèå êàäðà ImGui è îòðèñîâêà
200-
//ImGui::Render();
201-
//ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
174+
//uiController.UpdateUIState();
202175

203176
SwapBuffers(wglGetCurrentDC());
204177
}
@@ -234,12 +207,14 @@ void Renderer::DrawCells() {
234207
Cell cell = pGameController->getGrid().getCell(x, y);
235208
cellInstances[i].color = cell.getColor(); // Îáíîâëÿåì òîëüêî öâåò
236209
}
210+
// Ïðèâÿçûâàåì VAO ïåðåä íàñòðîéêîé àòðèáóòîâ
211+
GL_CHECK(glBindVertexArray(cellsVAO));
237212

238213
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellInstanceVBO));
239214
void* ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
240215
if (ptr) {
241216
memcpy(ptr, cellInstances.data(), cellInstances.size() * sizeof(CellInstance));
242-
glUnmapBuffer(GL_ARRAY_BUFFER);
217+
GL_CHECK(glUnmapBuffer(GL_ARRAY_BUFFER));
243218
}
244219

245220
GL_CHECK(glUseProgram(shaderProgram));
@@ -255,21 +230,20 @@ void Renderer::DrawCells() {
255230

256231
// Íàñòðàèâàåì àòðèáóòû äëÿ âåðøèí êâàäðàòà êëåòêè
257232
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellsVBO));
258-
GL_CHECK(glEnableVertexAttribArray(0)); // Âåðøèíû êâàäðàòà (ïîçèöèÿ)
233+
GL_CHECK(glEnableVertexAttribArray(0)); // Âåðøèíû êâàäðàòà
259234
GL_CHECK(glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr));
260235

261-
// Íàñòðàèâàåì àòðèáóòû äëÿ èíñòàíñèíãà
236+
// Íàñòðàèâàåì àòðèáóòû äëÿ èíñòàíñèíãà (ïîçèöèÿ è öâåò)
262237
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, cellInstanceVBO));
263-
GL_CHECK(glEnableVertexAttribArray(1)); // Ïîçèöèÿ èíñòàíñà
238+
GL_CHECK(glEnableVertexAttribArray(1)); // Ïîçèöèÿ èíñòàíñîâ
264239
GL_CHECK(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(CellInstance), (void*)0));
265-
GL_CHECK(glVertexAttribDivisor(1, 1)); // Êàæäûé èíñòàíñ èìååò ñâîþ ïîçèöèþ
240+
GL_CHECK(glVertexAttribDivisor(1, 1));
266241

267-
GL_CHECK(glEnableVertexAttribArray(3)); // Öâåò êëåòêè
242+
GL_CHECK(glEnableVertexAttribArray(3)); // Öâåò èíñòàíñîâ
268243
GL_CHECK(glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, sizeof(CellInstance), (void*)(offsetof(CellInstance, color))));
269-
GL_CHECK(glVertexAttribDivisor(3, 1)); // Öâåò äëÿ êàæäîãî èíñòàíñà
244+
GL_CHECK(glVertexAttribDivisor(3, 1));
270245

271246
// Îòðèñîâêà êëåòîê ñ èñïîëüçîâàíèåì èíñòàíñèíãà
272-
//GL_CHECK(glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, cellInstances.size()));
273247
GL_CHECK(glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 8, cellInstances.size()));
274248

275249
// Îòêëþ÷àåì èñïîëüçîâàíèå àòðèáóòîâ ïîñëå îòðèñîâêè

rendering/Renderer.h

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
#include "../system/GLFunctions.h"
66
#include "Camera.h"
7-
#include "UIController.h" // Äîáàâëÿåì çàãîëîâî÷íûé ôàéë UIController
7+
#include "UIController.h"
88
#include "../game/GameController.h"
99
#include <vector>
1010
#include <memory>
@@ -19,7 +19,7 @@ class Renderer {
1919
~Renderer();
2020

2121
void SetCamera(const Camera& camera);
22-
Camera& GetCamera() { return camera; } // Óäàëèòü const
22+
Camera& GetCamera() { return camera; }
2323

2424
void SetGameController(GameController* gameController);
2525

@@ -48,9 +48,15 @@ class Renderer {
4848
bool showGrid = true;
4949
ShaderManager shaderManager; // Äîáàâëÿåì ShaderManager
5050

51-
void InitializeVBOs();
51+
52+
void InitializeGridVBOs();
5253
GLuint gridVBO;
54+
GLuint gridVAO;
55+
56+
void InitializeVBOs();
5357
GLuint cellsVBO;
58+
GLuint cellsVAO;
59+
5460
std::vector<GLfloat> gridVertices;
5561
std::vector<GLfloat> cellVertices;
5662

@@ -63,7 +69,6 @@ class Renderer {
6369
GLuint shaderProgram;
6470
// äëÿ øåéäåðîâ ñåòêè
6571
GLuint gridShaderProgram;
66-
GLuint gridVAO;
6772

6873
GLuint debugOverlayShaderProgram, debugOverlayVAO, debugOverlayVBO, debugOverlayTexture;
6974

@@ -75,8 +80,6 @@ class Renderer {
7580
void LoadShaders();
7681
void LoadCellShaders();
7782
void LoadGridShaders();
78-
79-
void InitializeGridVBOs();
8083

8184
};
8285
#endif // RENDERER_H_

run_life.bat

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
@echo off
2-
start "" "life.exe" -gridWidth 200 -gridHeight 150
2+
start "" "life.exe" -gridWidth 200 -gridHeight 150 -fullscreen
33
exit

0 commit comments

Comments
 (0)