path finding task setup

spacial set wip
This commit is contained in:
2024-09-30 22:14:57 -04:00
parent 47c0732f23
commit 5adfbd5de5
5 changed files with 127 additions and 29 deletions

View File

@@ -1,15 +1,16 @@
use bevy::prelude::*;
use quadtree_rs::{point::Point, Quadtree};
use quadtree_rs::{area::AreaBuilder, point::Point, Quadtree};
use shared::tags::Faction;
use world_generation::hex_utils::HexCoord;
use crate::components::UnitDomain;
use crate::{components::UnitDomain, UnitType};
#[derive(Clone, Copy)]
pub struct UnitEntity {
pub entity: Entity,
pub domain: UnitDomain,
pub unitType: (),
pub unit_type: UnitType,
pub faction: Faction,
pub position: Vec3,
}
pub struct UnitSpacialSet {
@@ -25,17 +26,57 @@ impl UnitSpacialSet {
}
pub fn add_unit(&mut self, unit: UnitEntity, pos: Vec3) -> Option<u64> {
let p = pos.xz().as_uvec2();
return self.tree.insert_pt(
Point {
x: p.x as usize,
y: p.y as usize,
},
unit,
);
return self.tree.insert_pt(convert_to_point(pos.xz()), unit);
}
pub fn move_unit(&mut self, handle: u64) {
todo!();
pub fn move_unit(&mut self, handle: u64, pos: Vec3) -> Option<u64> {
if let Some(existing) = self.tree.get(handle) {
if existing.anchor() == convert_to_point(pos.xz()) {
return None;
}
} else {
return None;
}
if let Some(entry) = self.tree.delete_by_handle(handle) {
let p = convert_to_point(pos.xz());
let mut entry = *entry.value_ref();
entry.position = pos;
return self.tree.insert_pt(p, entry);
}
return None;
}
pub fn get_units_in_circle(self, center: Vec3, radius: f32) -> Vec<Entity> {
let anchor = center.xz() - Vec2::new(radius, radius);
let d = (radius * 2.0) as usize;
let area = AreaBuilder::default()
.anchor(convert_to_point(anchor))
.dimensions((d, d))
.build()
.unwrap();
let query = self.tree.query(area);
return query
.filter(|e| e.value_ref().position.distance(center) <= radius)
.map(|e| e.value_ref().entity)
.collect();
}
pub fn get_units_in_rect(self, anchor: Vec2, size: Vec2) -> Vec<Entity> {
let area = AreaBuilder::default()
.anchor(convert_to_point(anchor))
.dimensions((size.x as usize, size.y as usize))
.build()
.unwrap();
let query = self.tree.query(area);
return query.map(|e| e.value_ref().entity).collect();
}
}
fn convert_to_point(pos: Vec2) -> Point<usize> {
let p = pos.as_uvec2();
return Point {
x: p.x as usize,
y: p.y as usize,
};
}