hs

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | LICENSE

commit 9b6dc6f0f086c48131e4b90347cbfe02ccfebd6e
parent 8494f4bb4f0b775d3162e753481829a6498a5f25
Author: Samdal <samdal@protonmail.com>
Date:   Thu,  7 Oct 2021 23:22:50 +0200

collisions

Diffstat:
Mhs_graphics.h | 79+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Mhs_math.h | 9+++++++++
2 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/hs_graphics.h b/hs_graphics.h @@ -86,14 +86,14 @@ typedef struct { typedef struct { vec2 tr, bl; -} aabb2; +} hs_aabb2; typedef struct { vec2i tr, bl; -} aabb2i; +} hs_aabb2i; typedef struct { - vec2 pos, half_size, frame_vel; + vec2 pos, half_size; uint32_t flags; hs_tex tex; hs_shader_program sp; @@ -114,7 +114,7 @@ typedef struct { enum entity2_flags { AABB_STATIC = 1 << 0, AABB_RIGID = 1 << 1, - AABB_CHARACTHER = 1 << 2, + //AABB_CHARACTHER = 1 << 2, PLAYER = 1 << 3, PREBLINK = 1 << 4, INVISFRAME = 1 << 5, @@ -186,21 +186,21 @@ extern uint32_t hs_tex2d_create_size_info(const char *filename, const GLenum for int* width, int* height); #endif -/* aabb2 */ -extern vec2 hs_aabb2_center(const aabb2 rect); -extern vec2i hs_aabb2i_center(const aabb2i rect); -extern vec2 hs_aabb2_size(const aabb2 rect); -extern vec2 hs_aabb2_half_size(const aabb2 rect); -extern vec2i hs_aabb2i_size(const aabb2i rect); -extern vec2i hs_aabb2i_half_size(const aabb2i rect); +/* hs_aabb2 */ +extern vec2 hs_aabb2_center(const hs_aabb2 rect); +extern vec2 hs_aabb2_size(const hs_aabb2 rect); +extern vec2 hs_aabb2_half_size(const hs_aabb2 rect); +extern vec2i hs_aabb2i_center(const hs_aabb2i rect); +extern vec2i hs_aabb2i_size(const hs_aabb2i rect); +extern vec2i hs_aabb2i_half_size(const hs_aabb2i rect); +extern hs_aabb2 hs_aabb2_from_entity(const hs_entity2_hot e); /* Anders Tale Dungeon generation v3 (BSP) */ -extern uint32_t hs_bsp_recti_split_in_place_append(aabb2i* rects, const uint32_t new_rect_index, const vec2i min_rect_size); +extern uint32_t hs_bsp_recti_split_in_place_append(hs_aabb2i* rects, const uint32_t new_rect_index, const vec2i min_rect_size); /* Physics */ -extern uint32_t hs_aabb_check_collide(const aabb2 r1, const aabb2 r2); -extern void hs_aabb_check_and_do_collide(aabb2* r1, aabb2* r2); -extern void hs_aabb_check_and_do_collide_static(aabb2* r1, aabb2* r2); +extern uint32_t hs_aabb2_check_collide(const hs_aabb2 r1, const hs_aabb2 r2); +extern void hs_entity2_collide(hs_entity2_hot* e1, hs_entity2_hot* e2); /* Camera stuff */ extern hs_camera hs_init_fps_camera(); @@ -734,43 +734,52 @@ hs_init_fps_camera() } inline vec2 -hs_aabb2_center(const aabb2 rect) +hs_aabb2_center(const hs_aabb2 rect) { return vec2_add(rect.bl, hs_aabb2_half_size(rect)); } inline vec2i -hs_aabb2i_center(const aabb2i rect) +hs_aabb2i_center(const hs_aabb2i rect) { return vec2i_add(rect.bl, hs_aabb2i_half_size(rect)); } inline vec2 -hs_aabb2_size(const aabb2 rect) +hs_aabb2_size(const hs_aabb2 rect) { return vec2_sub(rect.tr, rect.bl); } inline vec2 -hs_aabb2_half_size(const aabb2 rect) +hs_aabb2_half_size(const hs_aabb2 rect) { return vec2_scale(vec2_sub(rect.tr, rect.bl), 0.5f); } inline vec2i -hs_aabb2i_size(const aabb2i rect) +hs_aabb2i_size(const hs_aabb2i rect) { return vec2i_sub(rect.tr, rect.bl); } inline vec2i -hs_aabb2i_half_size(const aabb2i rect) +hs_aabb2i_half_size(const hs_aabb2i rect) { return vec2i_div(vec2i_sub(rect.tr, rect.bl), 2); } +inline hs_aabb2 +hs_aabb2_from_entity(const hs_entity2_hot e) +{ + return(hs_aabb2){ + .bl = vec2_sub(e.pos, e.half_size), + .tr = vec2_add(e.pos, e.half_size), + }; +} + inline uint32_t -hs_bsp_recti_split_in_place_append(aabb2i* rects, const uint32_t new_rect_index, const vec2i min_rect_size) +hs_bsp_recti_split_in_place_append(hs_aabb2i* rects, const uint32_t new_rect_index, const vec2i min_rect_size) { // this way of checking if the room is too small does not respect very non-square rectangles // TOOD: maybe change this^ @@ -818,7 +827,7 @@ hs_bsp_recti_split_in_place_append(aabb2i* rects, const uint32_t new_rect_index, } inline uint32_t -hs_aabb_check_collide(const aabb2 r1, const aabb2 r2) +hs_aabb2_check_collide(const hs_aabb2 r1, const hs_aabb2 r2) { if (r1.tr.y <= r2.bl.y || r2.tr.y <= r1.bl.y || r1.tr.x <= r2.bl.x || r2.tr.x <= r1.bl.x) @@ -827,15 +836,25 @@ hs_aabb_check_collide(const aabb2 r1, const aabb2 r2) } inline void -hs_aabb_check_and_do_collide(aabb2* r1, aabb2* r2) +hs_entity2_collide(hs_entity2_hot* e1, hs_entity2_hot* e2) { - const aabb2 rect1 = *r1; - const aabb2 rect2 = *r2; - if (!hs_aabb_check_collide(rect1, rect1)) return; + const vec2 distance = vec2_add(e1->half_size, e2->half_size); + const vec2 diff = vec2_sub(e1->pos, e2->pos); + const vec2 diffabs = {fabs(diff.x), fabs(diff.y)}; - const vec2 r1_center = vec2_scale(vec2_sub(rect1.tr, rect1.bl), 2.0f); - const vec2 r2_center = vec2_scale(vec2_sub(rect2.tr, rect2.bl), 2.0f); - const vec2 diff = {fabs(r1_center.x - r2_center.x), fabs(r1_center.y - r2_center.y)}; + if (diffabs.x >= distance.x || diffabs.y >= distance.y) return; + + const float extra = 1.0001; + + if (diffabs.x > diffabs.y) { + const float mul = (diff.x / diffabs.x) * extra; + e1->pos = vec2_add(e2->pos, (vec2){distance.x * mul, diff.y}); + } else { + const float mul = (diff.y / diffabs.y) * extra; + e1->pos = vec2_add(e2->pos, (vec2){diff.x, distance.y * mul}); + } + //static uint32_t col = 0; + //printf("collisions %d\n", col++); } inline void diff --git a/hs_math.h b/hs_math.h @@ -131,6 +131,15 @@ vec2_cos(const vec2 v1, const vec2 v2) } inline static vec2 +vec2_mul(const vec2 v1, const vec2 v2) +{ + return (vec2){ + v1.x * v2.x, + v1.y * v2.y, + }; +} + +inline static vec2 vec2_scale(const vec2 vector, const float scalar) { return (vec2){