@@ -42,15 +42,14 @@ void Renderer::InitializeVBOs() {
42
42
int gridHeight = pGameController->getGridHeight ();
43
43
float cellSize = pGameController->getCellSize ();
44
44
45
- // Èíèöèàëèçàöèÿ VBO äëÿ êëåòîê
45
+ // Èíèöèàëèçàöèÿ VAO äëÿ êëåòîê
46
+ GL_CHECK (glGenVertexArrays (1 , &cellsVAO));
47
+ GL_CHECK (glBindVertexArray (cellsVAO)); // Ñíà÷àëà ïðèâÿçûâàåì VAO
48
+
49
+ // Èíèöèàëèçàöèÿ VBO äëÿ âåðøèí êëåòîê
46
50
GL_CHECK (glGenBuffers (1 , &cellsVBO));
47
51
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
+
54
53
float scale_factor = 0 .2f ;
55
54
float centerX = 0 .5f ;
56
55
float centerY = 0 .5f ;
@@ -68,23 +67,42 @@ void Renderer::InitializeVBOs() {
68
67
69
68
GL_CHECK (glBufferData (GL_ARRAY_BUFFER, sizeof (vertices), vertices, GL_STATIC_DRAW));
70
69
70
+ // Íàñòðîéêà àòðèáóòîâ äëÿ âåðøèí êâàäðàòà êëåòêè
71
+ GL_CHECK (glVertexAttribPointer (0 , 2 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
72
+ GL_CHECK (glEnableVertexAttribArray (0 ));
73
+
71
74
// Èíèöèàëèçàöèÿ VBO äëÿ äàííûõ èíñòàíñà
72
75
GL_CHECK (glGenBuffers (1 , &cellInstanceVBO));
76
+ GL_CHECK (glBindBuffer (GL_ARRAY_BUFFER, cellInstanceVBO));
77
+
73
78
cellInstances.clear ();
74
79
cellInstances.reserve (gridWidth * gridHeight);
75
80
for (int y = 0 ; y < gridHeight; ++y) {
76
81
for (int x = 0 ; x < gridWidth; ++x) {
77
82
Cell cell = pGameController->getGrid ().getCell (x, y);
83
+ // Ïðåäïîëàãàåì, ÷òî getColor() âîçâðàùàåò Vector3d
78
84
cellInstances.push_back ({
79
85
x * cellSize, y * cellSize,
80
- cell.getColor ()
86
+ { cell.getColor (). X (), cell. getColor (). Y (), cell. getColor (). Z ()}
81
87
});
82
88
}
83
89
}
84
90
85
- GL_CHECK (glBindBuffer (GL_ARRAY_BUFFER, cellInstanceVBO));
86
91
GL_CHECK (glBufferData (GL_ARRAY_BUFFER, cellInstances.size () * sizeof (CellInstance), cellInstances.data (), GL_STATIC_DRAW));
87
92
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
+
88
106
InitializeGridVBOs ();
89
107
}
90
108
@@ -153,52 +171,7 @@ void Renderer::Draw() {
153
171
uiController.DrawUI ();
154
172
155
173
// Îáíîâëåíèå ñîñòîÿíèÿ 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();
202
175
203
176
SwapBuffers (wglGetCurrentDC ());
204
177
}
@@ -234,12 +207,14 @@ void Renderer::DrawCells() {
234
207
Cell cell = pGameController->getGrid ().getCell (x, y);
235
208
cellInstances[i].color = cell.getColor (); // Îáíîâëÿåì òîëüêî öâåò
236
209
}
210
+ // Ïðèâÿçûâàåì VAO ïåðåä íàñòðîéêîé àòðèáóòîâ
211
+ GL_CHECK (glBindVertexArray (cellsVAO));
237
212
238
213
GL_CHECK (glBindBuffer (GL_ARRAY_BUFFER, cellInstanceVBO));
239
214
void * ptr = glMapBuffer (GL_ARRAY_BUFFER, GL_WRITE_ONLY);
240
215
if (ptr) {
241
216
memcpy (ptr, cellInstances.data (), cellInstances.size () * sizeof (CellInstance));
242
- glUnmapBuffer (GL_ARRAY_BUFFER);
217
+ GL_CHECK ( glUnmapBuffer (GL_ARRAY_BUFFER) );
243
218
}
244
219
245
220
GL_CHECK (glUseProgram (shaderProgram));
@@ -255,21 +230,20 @@ void Renderer::DrawCells() {
255
230
256
231
// Íàñòðàèâàåì àòðèáóòû äëÿ âåðøèí êâàäðàòà êëåòêè
257
232
GL_CHECK (glBindBuffer (GL_ARRAY_BUFFER, cellsVBO));
258
- GL_CHECK (glEnableVertexAttribArray (0 )); // Âåðøèíû êâàäðàòà (ïîçèöèÿ)
233
+ GL_CHECK (glEnableVertexAttribArray (0 )); // Âåðøèíû êâàäðàòà
259
234
GL_CHECK (glVertexAttribPointer (0 , 2 , GL_FLOAT, GL_FALSE, 0 , nullptr ));
260
235
261
- // Íàñòðàèâàåì àòðèáóòû äëÿ èíñòàíñèíãà
236
+ // Íàñòðàèâàåì àòðèáóòû äëÿ èíñòàíñèíãà (ïîçèöèÿ è öâåò)
262
237
GL_CHECK (glBindBuffer (GL_ARRAY_BUFFER, cellInstanceVBO));
263
- GL_CHECK (glEnableVertexAttribArray (1 )); // Ïîçèöèÿ èíñòàíñà
238
+ GL_CHECK (glEnableVertexAttribArray (1 )); // Ïîçèöèÿ èíñòàíñîâ
264
239
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 ));
266
241
267
- GL_CHECK (glEnableVertexAttribArray (3 )); // Öâåò êëåòêè
242
+ GL_CHECK (glEnableVertexAttribArray (3 )); // Öâåò èíñòàíñîâ
268
243
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 ));
270
245
271
246
// Îòðèñîâêà êëåòîê ñ èñïîëüçîâàíèåì èíñòàíñèíãà
272
- // GL_CHECK(glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, cellInstances.size()));
273
247
GL_CHECK (glDrawArraysInstanced (GL_TRIANGLE_FAN, 0 , 8 , cellInstances.size ()));
274
248
275
249
// Îòêëþ÷àåì èñïîëüçîâàíèå àòðèáóòîâ ïîñëå îòðèñîâêè
0 commit comments