From 6b16c97c64a6ca7e4a5b4948d9dd681474bfbbef Mon Sep 17 00:00:00 2001 From: Dominic Masters Date: Thu, 19 Jun 2025 16:48:04 -0500 Subject: [PATCH] fixed rounding funcs --- src/dusk/entity/entity.c | 51 ++++++++++++++++++++++++++-------------- src/dusk/util/fixed.c | 32 +++++++++++++++++-------- src/dusk/util/fixed.h | 25 +++++++++++++++++--- 3 files changed, 77 insertions(+), 31 deletions(-) diff --git a/src/dusk/entity/entity.c b/src/dusk/entity/entity.c index 18ef933..dcc097e 100644 --- a/src/dusk/entity/entity.c +++ b/src/dusk/entity/entity.c @@ -52,29 +52,48 @@ void entityUpdate(entity_t *entity) { fixed248_t newX = entity->x + entity->vx; fixed248_t newY = entity->y + entity->vy; + fixed248_t halfTileWH = FIXED248(TILE_WIDTH_HEIGHT / 2, 0); + fixed248_t selfCircR = halfTileWH; // Check for collisions with the world boundaries - // Check for collisions with tiles + // Check for collisions with tile + fixed248_t tileStartX = fx248Floor(newX - halfTileWH); + fixed248_t tileStartY = fx248Floor(newY - halfTileWH); + fixed248_t tileEndX = fx248Ceil(newX + halfTileWH); + fixed248_t tileEndY = fx248Ceil(newY + halfTileWH); + + for(fixed248_t y = tileStartY; y <= tileEndY; y+= FIXED248_ONE) { + for(fixed248_t x = tileStartX; x <= tileEndX; x+= FIXED248_ONE) { + // + } + } + + // uint16_t tileStartX = fx248Tou16(fx248Floor(newX - halfTileWH)); + // uint16_t tileStartY = fx248Tou16(fx248Floor(newY - halfTileWH)); + // uint16_t tileEndX = fx248Tou16(fx248Ceil(newX + halfTileWH)) + 1; + // uint16_t tileEndY = fx248Tou16(fx248Ceil(newY + halfTileWH)) + 1; + + // printf("Checking tiles between (%u, %u) and (%u, %u)\n", + // tileStartX, tileStartY, tileEndX, tileEndY + // ); + // for(uint16_t tileY = tileStartY; tileY <= tileEndY; tileY++) { + // for(uint16_t tileX = tileStartX; tileX <= tileEndX; tileX++) { + // } + // } + // Check for collisions with other entities - fixed248_t halfTileW = FIXED248(TILE_WIDTH_HEIGHT / 2, 0); - fixed248_t halfTileH = FIXED248(TILE_WIDTH_HEIGHT / 2, 0); - fixed248_t selfCircR = halfTileW; - fixed248_t selfCircX = newX - halfTileW; - fixed248_t selfCircY = newY - halfTileH; - - for(entity_t *otherEntity = ENTITIES; otherEntity < ENTITIES + ENTITY_COUNT_MAX; ++otherEntity) { + entity_t *otherEntity = ENTITIES; + do { // Skip self and null entities if(otherEntity == entity || otherEntity->type == ENTITY_TYPE_NULL) continue; - fixed248_t otherCircX = otherEntity->x - halfTileW; - fixed248_t otherCircY = otherEntity->y - halfTileH; - fixed248_t otherCircR = halfTileW; + fixed248_t otherCircR = halfTileWH; collisionresult_t collision = physicsCheckCircleCircle( - selfCircX, selfCircY, selfCircR, - otherCircX, otherCircY, otherCircR + newX, newY, selfCircR, + otherEntity->x, otherEntity->y, otherCircR ); if(!collision.hit) continue; @@ -83,11 +102,7 @@ void entityUpdate(entity_t *entity) { fixed248_t slideY = fx248Mulf32(collision.normalY, fx248Tof32(collision.depth)); newX -= slideX; newY -= slideY; - - // Update selfCircX/Y for next collision check - selfCircX = newX - halfTileW; - selfCircY = newY - halfTileH; - } + } while(++otherEntity < ENTITIES + ENTITY_COUNT_MAX); entity->x = newX; entity->y = newY; diff --git a/src/dusk/util/fixed.c b/src/dusk/util/fixed.c index b8d3adf..7cdc02b 100644 --- a/src/dusk/util/fixed.c +++ b/src/dusk/util/fixed.c @@ -20,6 +20,11 @@ fixed248_t fx248Fromf32(const float_t b) { return (fixed248_t)(b * (1 << FIXED248_FRACTION_BITS)); } +fixed248_t fx248Fromu16(const uint16_t b) { + return (fixed248_t)((int32_t)b << FIXED248_FRACTION_BITS); +} + + int32_t fx248Toi32(const fixed248_t a) { return (int32_t)(a >> FIXED248_FRACTION_BITS); @@ -33,6 +38,9 @@ float_t fx248Tof32(const fixed248_t a) { return (float_t)(a / (float_t)(1 << FIXED248_FRACTION_BITS)); } +uint16_t fx248Tou16(const fixed248_t a) { + return (uint16_t)((a >> FIXED248_FRACTION_BITS) & 0xFFFF); +} fixed248_t fx248Addfx248(const fixed248_t a, const fixed248_t b) { return a + b; @@ -118,22 +126,26 @@ fixed248_t fx248Divf32(const fixed248_t a, const float_t b) { -int32_t fx248Floor(const fixed248_t a) { - return (int32_t)(a >> FIXED248_FRACTION_BITS); +fixed248_t fx248Floor(const fixed248_t a) { + return a & ~((1 << FIXED248_FRACTION_BITS) - 1); } -int32_t fx248Ceil(const fixed248_t a) { - return (int32_t)(( - a + ((1 << FIXED248_FRACTION_BITS) - 1) - ) >> FIXED248_FRACTION_BITS); +fixed248_t fx248Ceil(const fixed248_t a) { + if(a & ((1 << FIXED248_FRACTION_BITS) - 1)) { + return (a & ~((1 << FIXED248_FRACTION_BITS) - 1)) + (1 << FIXED248_FRACTION_BITS); + } + return a; } -int32_t fx248Round(const fixed248_t a) { - return (int32_t)( - (a + (1 << (FIXED248_FRACTION_BITS - 1)) - ) >> FIXED248_FRACTION_BITS); +fixed248_t fx248Round(const fixed248_t a) { + if(a & ((1 << (FIXED248_FRACTION_BITS - 1)) - 1)) { + return (a & ~((1 << FIXED248_FRACTION_BITS) - 1)) + (1 << FIXED248_FRACTION_BITS); + } + return a & ~((1 << FIXED248_FRACTION_BITS) - 1); } + + uint32_t fx248Flooru32(const fixed248_t a) { return (uint32_t)((a >> FIXED248_FRACTION_BITS) & 0xFFFFFFFF); } diff --git a/src/dusk/util/fixed.h b/src/dusk/util/fixed.h index d7cdfea..3ccfa1d 100644 --- a/src/dusk/util/fixed.h +++ b/src/dusk/util/fixed.h @@ -18,6 +18,7 @@ typedef int32_t fixed248_t; ((i) << FIXED248_FRACTION_BITS) + \ (((f) * FIXED248_HIGH_MULTIPLIER) / 100) \ )) +#define FIXED248_ONE (FIXED248(1, 0)) /** * Convert an int32_t value to a fixed248_t value. @@ -43,6 +44,14 @@ fixed248_t fx248Fromu32(const uint32_t b); */ fixed248_t fx248Fromf32(const float_t b); +/** + * Convert a uint16_t value to a fixed248_t value. + * + * @param b The uint16_t value to convert. + * @return The converted fixed248_t value. + */ +fixed248_t fx248Fromu16(const uint16_t b); + /** @@ -69,6 +78,14 @@ uint32_t fx248Tou32(const fixed248_t a); */ float_t fx248Tof32(const fixed248_t a); +/** + * Convert a fixed248_t value to a uint16_t value. + * + * @param a The fixed248_t value to convert. + * @return The converted uint16_t value. + */ +uint16_t fx248Tou16(const fixed248_t a); + /** @@ -229,7 +246,7 @@ fixed248_t fx248Divf32(const fixed248_t a, const float_t b); * @param a The fixed248_t value to convert. * @return The converted int32_t value. */ -int32_t fx248Floor(const fixed248_t a); +fixed248_t fx248Floor(const fixed248_t a); /** * Convert a fixed248_t value to an int32_t value, rounding towards positive @@ -238,7 +255,7 @@ int32_t fx248Floor(const fixed248_t a); * @param a The fixed248_t value to convert. * @return The converted int32_t value. */ -int32_t fx248Ceil(const fixed248_t a); +fixed248_t fx248Ceil(const fixed248_t a); /** * Convert a fixed248_t value to an int32_t value, rounding to the nearest @@ -247,7 +264,9 @@ int32_t fx248Ceil(const fixed248_t a); * @param a The fixed248_t value to convert. * @return The converted int32_t value. */ -int32_t fx248Round(const fixed248_t a); +fixed248_t fx248Round(const fixed248_t a); + + /** * Convert a fixed248_t value to a uint32_t value, rounding towards zero.