summaryrefslogtreecommitdiff
path: root/src/world.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/world.cpp')
-rw-r--r--src/world.cpp111
1 files changed, 61 insertions, 50 deletions
diff --git a/src/world.cpp b/src/world.cpp
index d340cc1..06369f6 100644
--- a/src/world.cpp
+++ b/src/world.cpp
@@ -2,31 +2,10 @@
namespace world {
-sector_index_t::sector_index_t ()
+sector_index_t sector_index_at(v2f_t x)
{
-}
-
-sector_index_t::sector_index_t (int64_t x_, int64_t y_)
-{
- x = x_;
- y = y_;
-}
-
-sector_index_t::sector_index_t (float x_, float y_)
-{
- x = (int64_t)floor(x_ / SECTOR_SIZE);
- y = (int64_t)floor(y_ / SECTOR_SIZE);
-}
-
-bool sector_index_t::operator<(sector_index_t B) const
-{
- if (x < B.x)
- return true;
- if (x > B.x)
- return false;
- if (y < B.y)
- return true;
- return false;
+ return sector_index_t(floor(x[0] / SECTOR_SIZE),
+ floor(x[1] / SECTOR_SIZE));
}
world_t::world_t(void)
@@ -35,17 +14,17 @@ world_t::world_t(void)
perlin.generate(&prng, 32);
}
-void world_t::generate_tile(ssize_t x, ssize_t y, tile_t *tile)
+void world_t::generate_tile(tile_t *tile, tile_index_t x)
{
float waterlevel, height;
- waterlevel = perlin.get(x, y, 1000.0f) * 0.3f +
- perlin.get(x, y, 500.0f) * 0.1f;
+ waterlevel = perlin.get(x, 1000.0f) * 0.3f +
+ perlin.get(x, 500.0f) * 0.1f;
- height = perlin.get(x, y, 60.0f) * 0.6f +
- perlin.get(x, y, 30.0f) * 0.25f +
- perlin.get(x, y, 14.0f) * 0.1f +
- perlin.get(x, y, 6.0f) * 0.05f;
+ height = perlin.get(x, 60.0f) * 0.6f +
+ perlin.get(x, 30.0f) * 0.25f +
+ perlin.get(x, 14.0f) * 0.1f +
+ perlin.get(x, 6.0f) * 0.05f;
if (height < waterlevel - 0.2f)
tile->type = -1;
@@ -54,7 +33,7 @@ void world_t::generate_tile(ssize_t x, ssize_t y, tile_t *tile)
else if (height < waterlevel + 0.05f)
tile->type = 1;
else {
- if (perlin.get(x, y, 5.0f) > 0.0f)
+ if (perlin.get(x, 5.0f) > 0.0f)
tile->type = 3;
else
tile->type = 2;
@@ -64,18 +43,18 @@ void world_t::generate_tile(ssize_t x, ssize_t y, tile_t *tile)
void world_t::generate(sector_t *sector, sector_index_t index)
{
sector->index = index;
- sector->bounds.left = index.x * SECTOR_SIZE;
- sector->bounds.top = index.y * SECTOR_SIZE;
+ sector->bounds.left = index[0] * SECTOR_SIZE;
+ sector->bounds.top = index[1] * SECTOR_SIZE;
sector->bounds.width = SECTOR_SIZE;
sector->bounds.height = SECTOR_SIZE;
- std::cout << "generating (" << index.x << ", " << index.y << ")\n";
+ std::cout << "generating " << index << "\n";
for (ssize_t ly = 0; ly < SECTOR_SIZE; ly++)
for (ssize_t lx = 0; lx < SECTOR_SIZE; lx++)
- generate_tile(index.x * SECTOR_SIZE + lx,
- index.y * SECTOR_SIZE + ly,
- sector->tiles + ly * SECTOR_SIZE + lx);
+ generate_tile(sector->tiles + ly * SECTOR_SIZE + lx,
+ tile_index_t(index[0] * SECTOR_SIZE + lx,
+ index[1] * SECTOR_SIZE + ly));
sector->empty = false;
}
@@ -98,8 +77,8 @@ tile_t *world_t::get_tile(ssize_t x, ssize_t y)
sector_t *sector;
ssize_t tx, ty;
- index.x = divide_rmi(x, (ssize_t)SECTOR_SIZE, &tx);
- index.y = divide_rmi(y, (ssize_t)SECTOR_SIZE, &ty);
+ index[0] = divide_rmi(x, (ssize_t)SECTOR_SIZE, &tx);
+ index[1] = divide_rmi(y, (ssize_t)SECTOR_SIZE, &ty);
sector = get_sector(index);
return sector->tiles + ty * SECTOR_SIZE + tx;
@@ -107,12 +86,14 @@ tile_t *world_t::get_tile(ssize_t x, ssize_t y)
std::list<sector_t*> world_t::get_sectors(sf::FloatRect rect)
{
- sector_index_t base(rect.left, rect.top),
- upper(rect.left + rect.width, rect.top + rect.height);
+ sector_index_t base, upper;
std::list<sector_t*> list;
- for (int64_t y = base.y; y <= upper.y; y++)
- for (int64_t x = base.x; x <= upper.x; x++) {
+ base = sector_index_at(v2f_t(rect.left, rect.top));
+ upper = sector_index_at(v2f_t(rect.left + rect.width, rect.top + rect.height));
+
+ for (int64_t y = base[1]; y <= upper[1]; y++)
+ for (int64_t x = base[0]; x <= upper[0]; x++) {
sector_index_t index(x, y);
list.push_back(get_sector(index));
}
@@ -120,6 +101,29 @@ std::list<sector_t*> world_t::get_sectors(sf::FloatRect rect)
return list;
}
+std::list<entity_t*> world_t::get_render_entities(sf::FloatRect rect)
+{
+ static size_t cookie = 0;
+ std::list<entity_t*> list;
+
+ cookie++;
+
+ for (sector_t *sector : get_sectors(rect))
+ for (entity_t *ent : sector->ents) {
+ if (ent->cookie == cookie)
+ continue;
+
+ if (!rect.intersects(ent->render_bounds))
+ continue;
+
+ ent->cookie = cookie;
+
+ list.push_back(ent);
+ }
+
+ return list;
+}
+
std::list<entity_t*> world_t::get_entities(sf::FloatRect rect)
{
static size_t cookie = 0;
@@ -145,8 +149,8 @@ std::list<entity_t*> world_t::get_entities(sf::FloatRect rect)
void world_t::debug_point(sf::Vector2f point)
{
- sector_index_t index(point.x, point.y);
- printf("sector (%zd, %zd)\n", index.x, index.y);
+ sector_index_t index = sector_index_at(point);
+ printf("sector (%zd, %zd)\n", index[0], index[1]);
}
void entity_t::link_to_sector(sector_t *sector)
@@ -157,17 +161,24 @@ void entity_t::link_to_sector(sector_t *sector)
void entity_t::link(world_t *world)
{
+ //sf::FloatRect total_bounds;
float fx, fy;
sector_index_t base;
float xlip, ylip;
size_t xsecs, ysecs;
+ // TODO
+ //total.bounds.left = std::min(bounds.left, render_bounds.left);
+ //total.bounds.top = std::min(bounds.top, render_bounds.top);
+ //total.bounds.width = std::max(bounds.width, render_bounds.width);
+ //total.bounds.height = std::max(bounds.height, render_bounds.height);
+
fx = floor(bounds.left);
fy = floor(bounds.top);
- base = sector_index_t(fx, fy);
- xlip = bounds.left + bounds.width - (base.x + 1) * SECTOR_SIZE;
- ylip = bounds.top + bounds.height - (base.y + 1) * SECTOR_SIZE;
+ base = sector_index_at(v2f_t(fx, fy));
+ xlip = bounds.left + bounds.width - (base[0] + 1) * SECTOR_SIZE;
+ ylip = bounds.top + bounds.height - (base[1] + 1) * SECTOR_SIZE;
if (xlip > 0.0f)
xsecs = ceil(xlip / SECTOR_SIZE) + 1;
@@ -181,7 +192,7 @@ void entity_t::link(world_t *world)
for (int64_t y = 0; y < (int64_t)ysecs; y++)
for (int64_t x = 0; x < (int64_t)xsecs; x++) {
- sector_index_t index(base.x + x, base.y + y);
+ sector_index_t index = sector_index_at(v2f_t(base[0] + x, base[1] + y));
sector_t *sector;
sector = world->get_sector(index);