@@ -121,6 +121,72 @@ std::vector<float> Renderer::convert_coords_to_vertices(Tetromino t)
121
121
};
122
122
return vertices;
123
123
}
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
+ }
124
190
void Renderer::render_tetromino (Tetromino t)
125
191
{
126
192
GLuint vao;
@@ -154,7 +220,7 @@ void Renderer::render_tetromino(Tetromino t)
154
220
glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices, GL_DYNAMIC_DRAW);
155
221
156
222
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 } );
158
224
159
225
Renderer::create_program ();
160
226
@@ -198,11 +264,11 @@ void Renderer::render()
198
264
glClear (GL_COLOR_BUFFER_BIT);
199
265
glUseProgram (Renderer::current_program);
200
266
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 );
202
268
for (size_t idx = 0 ; idx < Renderer::vertex_array_objects.size (); ++idx) {
203
269
glUseProgram (Renderer::programs.at (idx));
204
270
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 );
206
272
}
207
273
SDL_GL_SwapWindow (Renderer::WINDOW);
208
274
}
0 commit comments