summaryrefslogtreecommitdiff
path: root/frontends
diff options
context:
space:
mode:
Diffstat (limited to 'frontends')
-rw-r--r--frontends/gl/drawable.c2
-rw-r--r--frontends/gl/main.c11
-rw-r--r--frontends/gl/ui.c255
-rw-r--r--frontends/gl/ui.h14
4 files changed, 128 insertions, 154 deletions
diff --git a/frontends/gl/drawable.c b/frontends/gl/drawable.c
index 28bb3d3..b6ba6c4 100644
--- a/frontends/gl/drawable.c
+++ b/frontends/gl/drawable.c
@@ -62,7 +62,7 @@ void update_rect(drawable_t *drawable, GLfloat x, GLfloat y,
}
void new_rectangle(drawable_t* drawable) {
- drawable->vertices = malloc(sizeof(vertices));
+ drawable->vertices = (GLfloat *)malloc(sizeof(vertices));
memcpy(drawable->vertices, &vertices[0], sizeof(vertices));
glGenVertexArrays(1, &drawable->vao);
diff --git a/frontends/gl/main.c b/frontends/gl/main.c
index 7490a90..f2b2104 100644
--- a/frontends/gl/main.c
+++ b/frontends/gl/main.c
@@ -215,9 +215,12 @@ int main(void) {
load_tetris_board(&ui, &ui.board, 325.0f * ui.res_scale,
110.0f * ui.res_scale, 250.0f * ui.res_scale, 500.0f * ui.res_scale);
- load_piece_queue(&ui.board, 610.0f * ui.res_scale,
+
+ load_scene(&ui);
+
+ load_piece_queue(&ui, 610.0f * ui.res_scale,
100.0f * ui.res_scale, 100.0f * ui.res_scale, 400.0f * ui.res_scale);
- load_held_piece( &ui.board, 242.0f * ui.res_scale,
+ load_held_piece(&ui, 242.0f * ui.res_scale,
110.0f * ui.res_scale, 88.0f * ui.res_scale, 88.0f * ui.res_scale);
start_event_thread(&ui);
@@ -231,8 +234,8 @@ int main(void) {
}
draw_tetris_board(&ui);
- draw_held_piece(&ui);
- draw_piece_queue(&ui);
+ //draw_held_piece(&ui);
+ //draw_piece_queue(&ui);
SDL_GL_SwapWindow(window);
}
diff --git a/frontends/gl/ui.c b/frontends/gl/ui.c
index 398cb15..b639e3f 100644
--- a/frontends/gl/ui.c
+++ b/frontends/gl/ui.c
@@ -37,34 +37,118 @@ void load_tetris_board(cetris_ui *ui, tetris_board_t *board, GLfloat x, GLfloat
}
refresh_current(ui);
+}
+
+void load_scene(cetris_ui *ui) {
+ ui->scene_count = 0;
+
+ ui->scene = (drawable_t *)malloc(sizeof(drawable_t) * 100);
+
+ new_rectangle(&ui->scene[ui->scene_count]);
+ ui->scene[ui->scene_count++].texture = ui->board.skin.background.texture;
- update_rect(&board->skin.playboard, board->x_offset, board->y_offset - 10 * ui->res_scale,
- board->game.config.board_x * board->block_width,
- (board->game.config.board_visible * board->block_height) + 10 * ui->res_scale,
+ new_rectangle(&ui->scene[ui->scene_count]);
+ update_rect(&ui->scene[ui->scene_count], ui->board.x_offset, ui->board.y_offset - 10 * ui->res_scale,
+ ui->board.game.config.board_x * ui->board.block_width,
+ (ui->board.game.config.board_visible * ui->board.block_height) + 10 * ui->res_scale,
ui->window_width, ui->window_height);
+ ui->scene[ui->scene_count++].texture = ui->board.skin.playboard.texture;
+
+ for (int y = 0; y < ui->board.game.config.board_visible + 1; y++) {
+ new_rectangle(&ui->scene[ui->scene_count]);
+
+ GLfloat y_pos = (ui->board.y_offset - ui->board.block_height) + (y * ui->board.block_height);
+
+ if (y == 0) {
+ y_pos += 15 * ui->res_scale;
+ ui->scene[ui->scene_count].vertices[4] = ui->scene[ui->scene_count].vertices[9] = 0.6f;
+ }
+
+ update_rect(&ui->scene[ui->scene_count], ui->board.x_offset,
+ y_pos, ui->board.block_width * ui->board.game.config.board_x,
+ y == 0 ? 10 * ui->res_scale : ui->board.block_height,
+ ui->window_width, ui->window_height);
+
+ ui->scene[ui->scene_count].texture = ui->board.skin.overlay.texture;
- update_rect(&board->skin.border, board->x_offset - (110 * ui->res_scale),
- board->y_offset - (45 * ui->res_scale), 380 * ui->res_scale, 600 * ui->res_scale,
+ //set_shine(&ui->board.skin.overlay, ui->board.skin.overlay_shine);
+ ui->scene_count++;
+ }
+
+ new_rectangle(&ui->scene[ui->scene_count]);
+ update_rect(&ui->scene[ui->scene_count], ui->board.x_offset - (110 * ui->res_scale),
+ ui->board.y_offset - (45 * ui->res_scale), 380 * ui->res_scale, 600 * ui->res_scale,
ui->window_width, ui->window_height);
+ ui->scene[ui->scene_count++].texture = ui->board.skin.border.texture;
}
-void load_held_piece(tetris_board_t *board, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
- board->held.block_width = w / 4.0f;
- board->held.block_height = h / 4.0f;
+void load_held_piece(cetris_ui *ui, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
+ if (!ui->board.game.piece_held) return;
+
+ GLfloat block_width = w / 4.0f;
+ GLfloat block_height = h / 4.0f;
+
+ for (int s = 0; s < 4; s++) {
+ for (int j = 0; j < 4; j++) {
+ if ((ui->board.game.held.m[s]>>(3 - j))&1) {
+ new_rectangle(&ui->scene[ui->scene_count]);
+
+ GLfloat block_x = x + (j * block_width);
+ GLfloat block_y = y + (s * block_height);
+
+ if (ui->board.game.held.t == MINO_O)
+ block_x -= block_width / 1.5f;
+
+ if (ui->board.game.held.t == MINO_I)
+ block_x -= block_width / 1.5f;
- board->held.x_offset = x;
- board->held.y_offset = y;
+ set_block_texture(&ui->scene[ui->scene_count], ui->board.game.held.t);
+ update_rect(&ui->scene[ui->scene_count], block_x, block_y,
+ block_width, block_height, ui->window_width, ui->window_height);
+
+ ui->scene[ui->scene_count++].texture = ui->board.skin.block.texture;
+ }
+ }
+ }
}
-void load_piece_queue(tetris_board_t *board, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
- board->queue.block_width = w / 4.0f;
- board->queue.block_height = w / 4.0f;
+void load_piece_queue(cetris_ui *ui, GLfloat x, GLfloat y, GLfloat w, GLfloat h) {
+ GLfloat block_width = w / 4.0f;
+ GLfloat block_height = w / 4.0f;
+
+ for (int i = 0; i < 5; i++) {
+ int mino, index = (ui->board.game.current_index + i);
+
+ if (index <= 6) {
+ mino = ui->board.game.piece_queue[index];
+ } else {
+ index = index % 7;
+ mino = ui->board.game.next_queue[index];
+ }
+
+ for (int s = 0; s < 4; s++) {
+ for (int j = 0; j < 4; j++) {
+ if ((default_matrices[mino][s]>>(3 - j))&1) {
+ new_rectangle(&ui->scene[ui->scene_count]);
+
+ GLfloat block_x = x + (j * block_width);
+ GLfloat block_y = y + (h * (i / 5.0)) + (s * block_height);
- board->queue.h = h;
- board->queue.w = w;
-
- board->queue.x_offset = x;
- board->queue.y_offset = y;
+ if (ui->board.game.held.t == MINO_O)
+ block_x -= block_width / 1.5f;
+
+ if (ui->board.game.held.t == MINO_I)
+ block_x -= block_width / 1.5f;
+
+ set_block_texture(&ui->scene[ui->scene_count], mino);
+ update_rect(&ui->scene[ui->scene_count], block_x, block_y,
+ block_width, block_height, ui->window_width, ui->window_height);
+
+ ui->scene[ui->scene_count++].texture = ui->board.skin.block.texture;
+ }
+ }
+ }
+ }
}
// TODO: make this better
@@ -135,12 +219,12 @@ void lock_current_drawable(cetris_ui *ui) {
void refresh_board(cetris_ui *ui) {
ui->board.board_count = 0;
+
for (int s = 0; s < ui->board.game.config.board_x; s++) {
for (int j = 0; j < ui->board.game.config.board_y; j++) {
if (ui->board.game.board[s][j] & SLOT_OCCUPIED) {
set_block_texture(&ui->board.board[ui->board.board_count], ui->board.game.board[s][j] >> 5);
- update_rect(&ui->board.board[ui->board.board_count++],
- ui->board.x_offset + (s * ui->board.block_width),
+ update_rect(&ui->board.board[ui->board.board_count++], ui->board.x_offset + (s * ui->board.block_width),
ui->board.y_offset + ((j - ui->board.block_offset) * ui->board.block_height),
ui->board.block_width, ui->board.block_height,
ui->window_width, ui->window_height);
@@ -167,43 +251,12 @@ void draw_tetris_board(cetris_ui *ui) {
glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.background.texture);
- glBindVertexArray(ui->board.skin.background.vao);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
-
- glBindTexture(GL_TEXTURE_2D, 0);
-
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.playboard.texture);
- glBindVertexArray(ui->board.skin.playboard.vao);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
-
- glBindTexture(GL_TEXTURE_2D, 0);
-
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.overlay.texture);
- glBindVertexArray(ui->board.skin.overlay.vao);
-
- for (int y = 0; y < ui->board.game.config.board_visible + 1; y++) {
- GLfloat height = ui->board.block_height;
- GLfloat y_pos = (ui->board.y_offset - ui->board.block_height) + (y * ui->board.block_height);
- if (y == 0) {
- ui->board.skin.overlay.vertices[4] = ui->board.skin.overlay.vertices[9] = 0.6f;
- height = 10 * ui->res_scale;
- y_pos += 15 * ui->res_scale;
- }
- set_shine(&ui->board.skin.overlay, ui->board.skin.overlay_shine);
- update_rect(&ui->board.skin.overlay, ui->board.x_offset,
- y_pos, ui->board.block_width * ui->board.game.config.board_x,
- height, ui->window_width,
- ui->window_height);
- if (ui->board.skin.overlay_shine > 0)
- ui->board.skin.overlay_shine -= 0.00025f;
- if (y == 0)
- ui->board.skin.overlay.vertices[4] = ui->board.skin.overlay.vertices[9] = 0.0f;
+ for (int i = 0; i < ui->scene_count; i++) {
+ glBindTexture(GL_TEXTURE_2D, ui->scene[i].texture);
+ glBindVertexArray(ui->scene[i].vao);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
- glBindTexture(GL_TEXTURE_2D, 0);
-
glBindTexture(GL_TEXTURE_2D, ui->board.skin.block.texture);
for (int i = 0; i < ui->board.board_count; i++) {
glBindVertexArray(ui->board.board[i].vao);
@@ -211,103 +264,15 @@ void draw_tetris_board(cetris_ui *ui) {
}
for (int i = 0; i < 4; i++) {
- if (ui->board.current[i].visable) {
- glBindVertexArray(ui->board.current[i].vao);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- }
if (ui->board.ghost[i].visable) {
glBindVertexArray(ui->board.ghost[i].vao);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
- }
-
- glBindTexture(GL_TEXTURE_2D, 0);
-
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.border.texture);
- glBindVertexArray(ui->board.skin.border.vao);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
-
- glBindTexture(GL_TEXTURE_2D, 0);
-}
-
-void draw_held_piece(cetris_ui *ui) {
- if (!ui->board.game.piece_held) return;
-
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, 0);
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.block.texture);
- glBindVertexArray(ui->board.skin.block.vao);
-
- for (int s = 0; s < 4; s++) {
- for (int j = 0; j < 4; j++) {
- if ((ui->board.game.held.m[s]>>(3 - j))&1) {
- GLfloat block_x =
- ui->board.held.x_offset + (j * ui->board.held.block_width);
- GLfloat block_y =
- ui->board.held.y_offset + (s * ui->board.held.block_height);
-
- if (ui->board.game.held.t == MINO_O) {
- block_x -= ui->board.held.block_width / 1.5f;
- }
- if (ui->board.game.held.t == MINO_I) {
- block_x -= ui->board.held.block_width / 1.5f;
- }
-
- set_block_texture(&ui->board.skin.block, ui->board.game.held.t);
- update_rect(&ui->board.skin.block, block_x, block_y,
- ui->board.held.block_width, ui->board.held.block_height,
- ui->window_width, ui->window_height);
-
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- }
+ if (ui->board.current[i].visable) {
+ glBindVertexArray(ui->board.current[i].vao);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
}
- glBindTexture(GL_TEXTURE_2D, 0);
-}
-
-
-void draw_piece_queue(cetris_ui *ui) {
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, 0);
- glBindTexture(GL_TEXTURE_2D, ui->board.skin.block.texture);
- glBindVertexArray(ui->board.skin.block.vao);
-
- for (int i = 0; i < 5; i++) {
- int index = (ui->board.game.current_index + i);
- int mino;
-
- if (index <= 6) {
- mino = ui->board.game.piece_queue[index];
- } else {
- index = index % 7;
- mino = ui->board.game.next_queue[index];
- }
-
- for (int s = 0; s < 4; s++) {
- for (int j = 0; j < 4; j++) {
-
- if ((default_matrices[mino][s]>>(3 - j))&1) {
- GLfloat block_x =
- ui->board.queue.x_offset + (j * ui->board.queue.block_width);
- GLfloat block_y =
- ui->board.queue.y_offset + (ui->board.queue.h * (i / 5.0)) + (s * ui->board.queue.block_height);
-
- if (ui->board.game.held.t == MINO_O) {
- block_x -= ui->board.queue.block_width / 1.5f;
- }
- if (ui->board.game.held.t == MINO_I) {
- block_x -= ui->board.queue.block_width / 1.5f;
- }
-
- set_block_texture(&ui->board.skin.block, mino);
- update_rect(&ui->board.skin.block, block_x, block_y,
- ui->board.queue.block_width, ui->board.queue.block_height,
- ui->window_width, ui->window_height);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- }
- }
- }
- }
glBindTexture(GL_TEXTURE_2D, 0);
}
diff --git a/frontends/gl/ui.h b/frontends/gl/ui.h
index 1bb70fa..5914d9a 100644
--- a/frontends/gl/ui.h
+++ b/frontends/gl/ui.h
@@ -5,6 +5,7 @@
#include "skin.h"
#include "audio.h"
+/*
typedef struct {
GLfloat block_width;
GLfloat block_height;
@@ -23,6 +24,7 @@ typedef struct {
GLfloat x_offset;
GLfloat y_offset;
} piece_queue_t;
+*/
typedef struct {
GLfloat block_width;
@@ -44,8 +46,8 @@ typedef struct {
drawable_t current[4];
drawable_t ghost[4];
- held_piece_t held;
- piece_queue_t queue;
+ //held_piece_t held;
+ //piece_queue_t queue;
cetris_skin_t skin;
} tetris_board_t;
@@ -73,6 +75,9 @@ typedef struct {
tetris_board_t board;
+ drawable_t *scene;
+ int scene_count;
+
GLuint shader_program;
} cetris_ui;
@@ -81,6 +86,7 @@ void draw_held_piece(cetris_ui *ui);
void draw_piece_queue(cetris_ui *ui);
void draw_current(cetris_ui *ui);
void update_board_drawables(cetris_ui *ui);
+void load_scene(cetris_ui *ui);
void load_tetris_board(cetris_ui *ui, tetris_board_t *board, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
-void load_held_piece(tetris_board_t *board, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
-void load_piece_queue(tetris_board_t *board, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+void load_held_piece(cetris_ui *ui, GLfloat x, GLfloat y, GLfloat w, GLfloat h);
+void load_piece_queue(cetris_ui *ui, GLfloat x, GLfloat y, GLfloat w, GLfloat h);