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.