njin
Engine 2D gọn nhẹ để tự tay làm game theo ý mình. Vibe coding cũng ổn luôn
Loading...
Searching...
No Matches
njin_spatial.h
1#pragma once
2#include "_math.h"
3#include "_types.h"
4#include <memory>
5#include <vector>
6
7namespace njin {
8
11
22
27 f32 radius = 0.0f;
33 bool fixed = false;
34};
35
49
50struct spatial_impl;
51
64 spatial_index &operator=(spatial_index &&) noexcept;
65 std::unique_ptr<spatial_impl> impl;
66};
67
73void spatial_build(spatial_index &index, const spatial_desc &desc, const spatial_item *items, u32 count);
74
79inline void spatial_build(spatial_index &index, const spatial_desc &desc, const std::vector<spatial_item> &items) {
80 spatial_build(index, desc, items.data(), (u32)items.size());
81}
82
87
90 vec2 at{};
93 f32 radius = 0.0f;
97 bool touching = false;
98 u32 skip = 0xFFFFFFFFu;
99 u32 group = 0;
102 bool (*filter)(u32 item, void *user) = nullptr;
103 void *user = nullptr;
104};
105
108 u32 item = 0;
110};
111
123
130inline u32 spatial_nearest(const spatial_index &index, const spatial_query &q, std::vector<spatial_hit> &out, u32 k) {
131 out.resize(k);
132 const u32 n = spatial_nearest(index, q, out.data(), k);
133 out.resize(n);
134 return n;
135}
136
152u32 spatial_separate(const spatial_index &index, std::vector<vec2> &push, u32 k = 6);
154} // namespace njin
spatial_kind
Cấu trúc bên dưới một njin::spatial_index.
Definition njin_spatial.h:14
void spatial_build(spatial_index &index, const spatial_desc &desc, const spatial_item *items, u32 count)
Dựng (lại) index từ count vật.
u32 spatial_separate(const spatial_index &index, std::vector< vec2 > &push, u32 k=6)
Tính độ đẩy để các vật chồng nhau tách ra: va chạm mềm cho đám đông.
u32 spatial_size(const spatial_index &index)
Số vật trong index.
u32 spatial_nearest(const spatial_index &index, const spatial_query &q, spatial_hit *out, u32 k)
Tìm tối đa k vật gần q.at nhất thỏa q, gần nhất trước.
@ spatial_grid
Lưới đều.
Definition njin_spatial.h:17
@ spatial_quadtree
Quadtree: chia nhỏ chỗ đông, bỏ qua chỗ trống.
Definition njin_spatial.h:20
std::uint8_t u8
Số nguyên không dấu 8 bit.
Definition _types.h:20
float f32
Số thực 32 bit.
Definition _types.h:28
std::uint32_t u32
Số nguyên không dấu 32 bit.
Definition _types.h:22
Hình chữ nhật thẳng trục: pos là góc trên trái, size là rộng và cao.
Definition _math.h:13
Cách dựng một njin::spatial_index.
Definition njin_spatial.h:37
rect bounds
Vùng chứa các vật.
Definition njin_spatial.h:41
u32 max_depth
Quadtree: độ sâu tối đa, để nhiều vật trùng chỗ không chia mãi.
Definition njin_spatial.h:47
f32 cell_size
Lưới: cỡ ô, đơn vị thế giới.
Definition njin_spatial.h:45
spatial_kind kind
Lưới hay quadtree.
Definition njin_spatial.h:38
u32 leaf_size
Quadtree: một lá có hơn chừng này vật thì chia bốn.
Definition njin_spatial.h:46
Một vật tìm thấy.
Definition njin_spatial.h:107
u32 item
Tên của vật: số thứ tự trong mảng đã dựng.
Definition njin_spatial.h:108
f32 distance_sq
Bình phương khoảng cách từ at tới tâm của nó.
Definition njin_spatial.h:109
Index không gian cho hàng nghìn hình tròn: tìm k vật gần nhất và đẩy các vật chồng nhau ra,...
Definition njin_spatial.h:58
spatial_index()
Index rỗng; dựng bằng spatial_build().
spatial_index(spatial_index &&) noexcept
Chuyển index, không chép.
std::unique_ptr< spatial_impl > impl
Bên trong, không đụng tới.
Definition njin_spatial.h:65
~spatial_index()
Giải phóng bộ nhớ của index.
Một vật trong index: hình tròn tâm pos.
Definition njin_spatial.h:25
u32 group
Nhóm, 0 là không nhóm.
Definition njin_spatial.h:30
vec2 pos
Tâm, trong thế giới.
Definition njin_spatial.h:26
bool fixed
spatial_separate() không dời vật này; vật khác chồng lên nó thì tự lùi hết phần chồng: người đang ngồ...
Definition njin_spatial.h:33
f32 radius
Bán kính.
Definition njin_spatial.h:27
Một câu hỏi cho spatial_nearest().
Definition njin_spatial.h:89
u32 skip
Tên một vật bỏ qua, thường là chính người hỏi.
Definition njin_spatial.h:98
u32 group
Khác 0: bỏ qua vật cùng nhóm này.
Definition njin_spatial.h:99
vec2 at
Điểm hỏi.
Definition njin_spatial.h:90
bool(*) filter(u32 item, void *user)
Lọc thêm: trả về false để bỏ qua vật item.
Definition njin_spatial.h:102
bool touching
false: vật được tính khi tâm của nó cách at dưới radius.
Definition njin_spatial.h:97
void * user
Truyền nguyên cho filter.
Definition njin_spatial.h:103
f32 radius
Bán kính tìm quanh at.
Definition njin_spatial.h:93
Vector 2 chiều. Dùng cho vị trí, kích thước, độ dời.
Definition _types.h:39