City generation works now

This commit is contained in:
2025-03-13 18:11:51 +03:00
parent 0f21cce741
commit 5f1fdddc5d
4 changed files with 1397 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
/* ~/godot-projects/streaming_world/src/modules/stream/road_lot.h */
#ifndef ROAD_LOT_H_
#define ROAD_LOT_H_
#include <vector>
#include <core/math/vector3.h>
#include <core/math/aabb.h>
#include "base_data.h"
#include "road_lines_data.h"
struct Lot {
struct polygon {
std::vector<Vector3> points;
AABB aabb;
std::pair<struct polygon, struct polygon> split() const;
float area_cache;
float area() const;
int longest_edge() const;
void update_aabb();
mutable Vector<Vector<Vector2> > intersections;
bool intersects(const struct polygon *other) const;
void dump() const;
bool is_inside(const Vector3 &point) const;
bool is_inside(const Vector2 &point) const;
bool is_inside(const AABB &aabb) const;
bool is_inside(const Rect2 &rect) const;
};
struct polygon polygon;
static void pack();
static void get_lot_data(flecs::entity e,
List<Pair<AABB, String> > *lot_data);
static void get_lot_rotations(flecs::entity e,
List<Transform> *lot_xform);
static void
get_lot_buildings(flecs::entity e,
Vector<Pair<Rect2, String> > *lot_buildings);
static Vector<Vector<Vector2> > get_lot_polygons(flecs::entity e);
};
#endif // ROAD_LOT_H_

View File

@@ -0,0 +1 @@
#include "growth_regions.h"

View File

@@ -0,0 +1,50 @@
#ifndef GROWTH_REGIONS_H
#define GROWTH_REGIONS_H
#include <core/vector.h>
#include <core/list.h>
#include <core/pair.h>
#include <core/math/vector2.h>
#include "base_data.h"
#include "region_rect2.h"
struct region {
flecs::entity_t parent;
flecs::entity_t seed_et;
flecs::entity_t region_et;
RegionRect2i rect;
int remains_area;
bool can_grow_square;
bool can_move;
bool can_grow;
bool complete;
bool can_grow_region() const
{
bool ret = can_grow;
if (remains_area <= 0)
ret = false;
return ret;
}
bool update_region_size(RegionRect2i &mrect)
{
bool ret = false;
int old_area = rect.get_area();
int new_area = mrect.get_area();
int area_diff = new_area - old_area;
if (area_diff > 0) {
rect = mrect;
remains_area -= area_diff;
ret = true;
}
if (remains_area <= 0) {
can_grow_square = false;
can_grow = false;
}
flecs::log::dbg("update_region_size %d -> %d", area_diff, ret);
return ret;
}
};
struct growth_regions {
List<struct grow_job> job_list;
bool complete;
};
#endif