mirror of
https://github.com/zoriya/Gamacon.git
synced 2026-05-28 09:27:29 +00:00
merge
This commit is contained in:
+1
-4
@@ -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
@@ -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);
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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});
|
||||
}
|
||||
Reference in New Issue
Block a user