Skip to content

Commit 593bd5d

Browse files
committed
Got line clearing to work with proper render updates. opengl is hard to debug. made check_line_clear smaller by putting things into a loop
1 parent c2e721e commit 593bd5d

File tree

3 files changed

+93
-329
lines changed

3 files changed

+93
-329
lines changed

Renderer.cpp

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,72 @@ std::vector<float> Renderer::convert_coords_to_vertices(Tetromino t)
121121
};
122122
return vertices;
123123
}
124+
void Renderer::update_playfield(int32_t row)
125+
{
126+
for (size_t vbo_index = 0; vbo_index < this->vertex_buffer_objects.size() - 1; ++vbo_index) {
127+
128+
glBindBuffer(GL_ARRAY_BUFFER, this->vertex_buffer_objects.at(vbo_index));
129+
GLint buffer_length;
130+
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_length);
131+
buffer_length /= sizeof(float);
132+
std::vector<float> data(buffer_length);
133+
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * data.size(), data.data());
134+
for (size_t data_index = 0; data_index < data.size(); data_index += 8) {
135+
if (data[data_index + 1] >= -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1)) {
136+
data[data_index + 1] -= this->BLOCKSIZE * 2 / (float)this->PLAYFIELD_HEIGHT;
137+
}
138+
if (data[data_index + 3] >= -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1)) {
139+
data[data_index + 3] -= this->BLOCKSIZE * 2 / (float)this->PLAYFIELD_HEIGHT;
140+
}
141+
if (data[data_index + 5] >= -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1)) {
142+
data[data_index + 5] -= this->BLOCKSIZE * 2 / (float)this->PLAYFIELD_HEIGHT;
143+
}
144+
if (data[data_index + 7] >= -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1)) {
145+
data[data_index + 7] -= this->BLOCKSIZE * 2 / (float)this->PLAYFIELD_HEIGHT;
146+
}
147+
}
148+
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * buffer_length, data.data());
149+
}
150+
}
151+
void Renderer::delete_row(int32_t row)
152+
{
153+
float row_converted_1 = -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1);
154+
float row_converted_2 = -(row * this->BLOCKSIZE * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1);
155+
float row_converted_3 = -((row * this->BLOCKSIZE + this->BLOCKSIZE) * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1);
156+
float row_converted_4 = -((row * this->BLOCKSIZE + this->BLOCKSIZE) * 2 / (float)Renderer::PLAYFIELD_HEIGHT - 1);
157+
158+
for (size_t i = 0; i < this->vertex_buffer_objects.size() - 1; ++i) {
159+
glBindVertexArray(this->vertex_array_objects.at(i));
160+
glBindBuffer(GL_ARRAY_BUFFER, this->vertex_buffer_objects.at(i));
161+
GLint buffer_length;
162+
glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_length);
163+
buffer_length /= sizeof(float);
164+
std::vector<float> data(buffer_length);
165+
glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float) * data.size(), data.data());
166+
std::vector<float> new_data;
167+
for (size_t data_index = 0; data_index < data.size(); data_index += 8) {
168+
if (data[data_index + 1] == row_converted_1
169+
&& data[data_index + 3] == row_converted_2
170+
&& data[data_index + 5] == row_converted_3
171+
&& data[data_index + 7] == row_converted_4) {
172+
continue;
173+
}
174+
new_data.insert(new_data.end(), data.begin() + data_index, data.begin() + data_index + 8);
175+
}
176+
if (new_data.size() < data.size()) {
177+
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * new_data.size(), new_data.data(), GL_DYNAMIC_DRAW);
178+
179+
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->element_buffer_objects.at(i).first);
180+
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &buffer_length);
181+
buffer_length /= sizeof(int32_t);
182+
std::vector<int32_t> indices(buffer_length);
183+
glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int32_t) * indices.size(), indices.data());
184+
indices.erase(indices.end() - (data.size() - new_data.size()) / 8 * 6, indices.end());
185+
this->element_buffer_objects.at(i).second = indices.size();
186+
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int32_t) * indices.size(), indices.data(), GL_DYNAMIC_DRAW);
187+
}
188+
}
189+
}
124190
void Renderer::render_tetromino(Tetromino t)
125191
{
126192
GLuint vao;
@@ -154,7 +220,7 @@ void Renderer::render_tetromino(Tetromino t)
154220
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW);
155221

156222
Renderer::vertex_buffer_objects.push_back(vbo);
157-
Renderer::element_buffer_objects.push_back(ebo);
223+
Renderer::element_buffer_objects.push_back(std::pair<GLuint, size_t>{ebo, 24});
158224

159225
Renderer::create_program();
160226

@@ -198,11 +264,11 @@ void Renderer::render()
198264
glClear(GL_COLOR_BUFFER_BIT);
199265
glUseProgram(Renderer::current_program);
200266
glBindVertexArray(Renderer::current_vao);
201-
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
267+
glDrawElements(GL_TRIANGLES, this->element_buffer_objects.back().second, GL_UNSIGNED_INT, 0);
202268
for (size_t idx = 0; idx < Renderer::vertex_array_objects.size(); ++idx) {
203269
glUseProgram(Renderer::programs.at(idx));
204270
glBindVertexArray(Renderer::vertex_array_objects.at(idx));
205-
glDrawElements(GL_TRIANGLES, 24, GL_UNSIGNED_INT, 0);
271+
glDrawElements(GL_TRIANGLES, this->element_buffer_objects.back().second, GL_UNSIGNED_INT, 0);
206272
}
207273
SDL_GL_SwapWindow(Renderer::WINDOW);
208274
}

Renderer.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <SDL2/SDL.h>
22
#include <GL/glew.h>
33
#include <vector>
4+
#include <array>
45
#ifndef _RENDERER_H
56
#define _RENDERER_H
67
struct Renderer {
@@ -17,9 +18,11 @@ struct Renderer {
1718
std::vector<GLuint> programs;
1819
std::vector<GLuint> vertex_buffer_objects;
1920
std::vector<GLuint> vertex_array_objects;
20-
std::vector<GLuint> element_buffer_objects;
21+
std::vector<std::pair<GLuint, size_t>> element_buffer_objects;
2122
void render_tetromino(Tetromino);
2223
void update_tetromino(Tetromino);
24+
void update_playfield(int32_t);
25+
void delete_row(int32_t);
2326
void render();
2427
void create_program();
2528
std::vector<float> convert_coords_to_vertices(Tetromino);

0 commit comments

Comments
 (0)