This commit is contained in:
Clément Le Bihan
2020-03-12 20:32:33 +01:00
parent e998cf813e
commit 404c051d26
5 changed files with 73 additions and 58 deletions
+1 -4
View File
@@ -22,7 +22,4 @@ typedef struct gc_vector2i
float gcvector_magnitude(gc_vector2 vec);
gc_vector2 gcvector2_normilize(gc_vector2 vec);
static inline gc_vector2 gc_vector2_add(gc_vector2 first, gc_vector2 second)
{
return (gc_vector2){first.x + second.x, first.y + second.y};
}
gc_vector2 gc_vector2_add(gc_vector2 first, gc_vector2 second);
+18 -15
View File
@@ -13,18 +13,20 @@
gc_vector2 gc_vector2_from_coords(float x, float y, float z)
{
return ((gc_vector2){
cos(ANGLE_X) * y * 64 - cos(ANGLE_X) * x * 64,
(sin(ANGLE_Y) * x * 64 + sin(ANGLE_Y) * y * 64 - z)
});
return ((gc_vector2){
cos(ANGLE_X) * y * 64 - cos(ANGLE_X) * x * 64,
(sin(ANGLE_Y) * x * 64 + sin(ANGLE_Y) * y * 64 - z)
});
}
struct tile *get_tile_from_pos(struct vertex_component *map, gc_vector2 pos)
{
int end = INT32_MAX;
if (!map || !map->map)
return (NULL);
for (int i = 0; map->map[i].corners[0]; i++) {
if (map->map[i].corners[0]->z == INT32_MAX || !map->map[i].corners[2]->y)
if (map->map[i].corners[0]->z == end || !map->map[i].corners[2]->y)
continue;
if (is_pos_in_tile(pos, &map->map[i])) {
return (&map->map[i]);
@@ -40,14 +42,15 @@ int get_index_nearest_vertex(struct tile *sel, gc_vector2 pos)
double tmp;
int i_stock = 0;
pos.y *= -1;
for (int i = 0; i < 4; i++) {
coords = gc_vector2_from_coords(sel->corners[i]->x, sel->corners[i]->y, sel->corners[i]->z);
tmp = pow(coords.x - pos.x, 2) + pow(coords.y - pos.y, 2);
if (tmp < spacing) {
spacing = tmp;
i_stock = i;
}
}
return (i_stock);
pos.y *= -1;
for (int i = 0; i < 4; i++) {
coords = gc_vector2_from_coords(sel->corners[i]->x, \
sel->corners[i]->y, sel->corners[i]->z);
tmp = pow(coords.x - pos.x, 2) + pow(coords.y - pos.y, 2);
if (tmp < spacing) {
spacing = tmp;
i_stock = i;
}
}
return (i_stock);
}
+1 -1
View File
@@ -22,7 +22,7 @@ void sfml_handle_events(gc_engine *engine)
sfRenderWindow_close(rend->window);
break;
case sfEvtResized:
engine->on_resize(engine, (gc_vector2){event.size.width, event.size.height});
engine->on_resize(engine, *(gc_vector2 *)&event.size);
break;
case sfEvtMouseButtonReleased:
if (event.mouseButton.button == sfMouseLeft)
+48 -38
View File
@@ -12,73 +12,83 @@
#include "components/transform_component.h"
#include "systems/sfml_renderer_system.h"
#include "components/vertex_component.h"
#include "map_utils.h"
#include <math.h>
#include <stdint.h>
#include <SFML/Graphics.h>
sfVector2f sfvector2f(gc_vector2 vector)
{
return ((sfVector2f){
vector.x,
vector.y
});
return ((sfVector2f){
vector.x,
vector.y
});
}
static void tile_rotate(struct tile *tile, int **vertex_order)
static void tile_rotate(struct tile *tile, int *vertex_order)
{
for (int j = 0; j < (tile->data & ROTATION_INFO); j++) {
int tmp = vertex_order[0];
for (int i = 0; i < 3; i++)
vertex_order[i] = vertex_order[i + 1];
vertex_order[3] = tmp;
}
for (int j = 0; j < (tile->data & ROTATION_INFO); j++) {
int tmp = vertex_order[0];
for (int i = 0; i < 3; i++)
vertex_order[i] = vertex_order[i + 1];
vertex_order[3] = tmp;
}
}
void sfr_draw_tile(struct sfml_renderer_system *this, gc_vector2 offset, \
struct tile *tile, bool hovered)
static void tile_prepare_for_draw(struct sfml_renderer_system *this, \
struct tile *tile, gc_vector2 offset, sfVertex **v)
{
sfVertex *v[4];
int c[3];
int vertex_order[4] = {0, 1, 3, 2};
if (tile->corners[0]->z == INT32_MAX || !tile->corners[2]->y)
return;
//TODO re integrate tile rotate
for (int i = 0; i < 4; i++) {
v[i] = sfVertexArray_getVertex(this->vertices, vertex_order[i]);
c[0] = tile->corners[i]->x;
c[1] = tile->corners[i]->y;
c[2] = tile->corners[i]->z;
v[i]->position = sfvector2f(gc_vector2_from_coords(c[0], c[1], c[2]));
v[i]->position.x += offset.x;
v[i]->position.y += offset.y;
if (hovered)
v[i]->color = (sfColor) {180, 180, 180, 255};
}
this->states->texture = (sfTexture *) tile->texture;
sfRenderWindow_drawVertexArray(this->window, this->vertices, this->states);
if (hovered)
for (int i = 0; i < 4; i++)
v[i]->color = sfWhite;
this->states->texture = NULL;
tile_rotate(tile, vertex_order);
for (int i = 0; i < 4; i ++) {
v[i] = sfVertexArray_getVertex(this->vertices, vertex_order[i]);
c[0] = tile->corners[i]->x;
c[1] = tile->corners[i]->y;
c[2] = tile->corners[i]->z;
v[i]->position = sfvector2f(gc_vector2_from_coords(c[0], c[1], c[2]));
v[i]->position.x += offset.x;
v[i]->position.y += offset.y;
}
}
void sfmlrenderer_draw_tile(struct sfml_renderer_system *this, \
gc_vector2 offset, struct tile *tile, bool hovered)
{
sfVertex *v[4];
if (tile->corners[0]->z == INT32_MAX || !tile->corners[2]->y)
return;
tile_prepare_for_draw(this, tile, offset, v);
if (hovered)
for (int i = 0; i < 4; i++)
v[i]->color = (sfColor) {180, 180, 180, 255};
this->states->texture = (sfTexture *) tile->texture;
sfRenderWindow_drawVertexArray(this->window, this->vertices, this->states);
if (hovered)
for (int i = 0; i < 4; i++)
v[i]->color = sfWhite;
this->states->texture = NULL;
}
void sfmlrenderer_draw_tilemap(gc_engine *engine, gc_entity *entity, \
struct vertex_component *info, float dt)
{
struct sfml_renderer_system *this = GETSYS(engine, sfml_renderer_system);
struct transform_component *pos = GETCMP(entity, transform_component);
struct transform_component *tra = GETCMP(entity, transform_component);
sfVector2i v = sfMouse_getPosition((const sfWindow *) this->window);
sfVector2f w = sfRenderWindow_mapPixelToCoords(this->window, v, this->view);
w.y *= -1;
gc_vector2 pos = tra->position;
int i;
struct tile *tl;
w.y *= -1;
if (!info || !info->map)
return;
tl = get_tile_from_pos(info, (gc_vector2){w.x - pos->position.x, w.y + pos->position.y});
tl = get_tile_from_pos(info, gc_vector2_add(pos, *(gc_vector2 *)&w));
for (i = 0; info->map[i].corners[0]; i++);
for (i--; i >= 0; i--) {
sfr_draw_tile(this, pos->position, &info->map[i], &info->map[i] == tl);
sfmlrenderer_draw_tile(this, pos, &info->map[i], &info->map[i] == tl);
}
}
+5
View File
@@ -21,4 +21,9 @@ gc_vector2 gcvector2_normilize(gc_vector2 vec)
vec.x = vec.x / mag;
vec.y = vec.y / mag;
return (vec);
}
gc_vector2 gc_vector2_add(gc_vector2 first, gc_vector2 second)
{
return ((gc_vector2){first.x + second.x, first.y + second.y});
}