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_nav3d.h
1#pragma once
2#include "_math.h"
3#include "_types.h"
4#include <vector>
5
6namespace njin {
7struct context;
8
11
27 f32 max_slope = 45.0f;
30 f32 cell_size = 0.15f;
32 f32 tile_size = 16.0f;
33 f32 region_min = 8.0f;
37 vec3 bounds_min{0.0f, 0.0f, 0.0f};
38 vec3 bounds_max{0.0f, 0.0f, 0.0f};
43};
44
47constexpr i32 nav3d_max_areas = 16;
48
57 f32 cost[nav3d_max_areas]{1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
58 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
59
61};
62
69navmesh3d_handle navmesh3d_create(context &ctx, const navmesh3d_desc &desc = {});
70
74void navmesh3d_destroy(context &ctx, navmesh3d_handle handle);
75
86void navmesh3d_add_mesh(context &ctx, navmesh3d_handle handle, const vec3 *positions, u32 vertex_count,
87 const u32 *indices = nullptr, u32 index_count = 0, u8 area = 0);
88
98void navmesh3d_add_model(context &ctx, navmesh3d_handle handle, model_handle model, vec3 position,
99 vec3 rotation = {0.0f, 0.0f, 0.0f}, vec3 scale = {1.0f, 1.0f, 1.0f}, u8 area = 0);
100
108void navmesh3d_add_box(context &ctx, navmesh3d_handle handle, vec3 center, vec3 size,
109 vec3 rotation = {0.0f, 0.0f, 0.0f}, u8 area = 0);
110
118void navmesh3d_add_terrain(context &ctx, navmesh3d_handle handle, terrain3d_handle terrain, u8 area = 0);
119
130void navmesh3d_add_link(context &ctx, navmesh3d_handle handle, vec3 from, vec3 to, bool both_ways = true,
131 f32 radius = 0.5f, u8 area = 0);
132
143i32 navmesh3d_add_area(context &ctx, navmesh3d_handle handle, vec3 center, vec3 size, f32 yaw, u8 area);
144
150void navmesh3d_remove_area(context &ctx, navmesh3d_handle handle, i32 id);
151
156
162bool navmesh3d_build(context &ctx, navmesh3d_handle handle);
163
172i32 navmesh3d_rebuild(context &ctx, navmesh3d_handle handle, vec3 min, vec3 max);
173
190
198void navmesh3d_set_filter(context &ctx, navmesh3d_handle handle, i32 index, const nav3d_filter &filter);
199
205nav3d_filter navmesh3d_filter(const context &ctx, navmesh3d_handle handle, i32 index);
206
211 vec3 size{1.0f, 2.0f, 1.0f};
212 f32 yaw = 0.0f;
213 f32 radius = 0.0f;
214};
215
223
231bool navmesh3d_move_obstacle(context &ctx, navmesh3d_handle handle, i32 id, vec3 position, f32 yaw = 0.0f);
232
237void navmesh3d_remove_obstacle(context &ctx, navmesh3d_handle handle, i32 id);
238
243i32 navmesh3d_pending_tiles(const context &ctx, navmesh3d_handle handle);
244
256bool navmesh3d_path(const context &ctx, navmesh3d_handle handle, vec3 from, vec3 to, std::vector<vec3> &out);
257
267bool navmesh3d_path(const context &ctx, navmesh3d_handle handle, vec3 from, vec3 to, std::vector<vec3> &out,
268 i32 filter);
269
277bool navmesh3d_nearest(const context &ctx, navmesh3d_handle handle, vec3 p, vec3 &out,
278 vec3 extents = {2.0f, 4.0f, 2.0f});
279
281struct nav3d_ray {
282 bool hit = false;
285 f32 fraction = 1.0f;
286};
287
295nav3d_ray navmesh3d_raycast(const context &ctx, navmesh3d_handle handle, vec3 from, vec3 to);
296
302bool navmesh3d_random_point(context &ctx, navmesh3d_handle handle, vec3 &out);
303
312bool navmesh3d_random_point_near(context &ctx, navmesh3d_handle handle, vec3 center, f32 radius, vec3 &out);
313
319void navmesh3d_draw_debug(context &ctx, navmesh3d_handle handle, rgba color = {0.2f, 0.8f, 1.0f, 1.0f});
320
342
351
355void nav3d_agent_remove(context &ctx, nav3d_agent_handle agent);
356
364bool nav3d_agent_set_target(context &ctx, nav3d_agent_handle agent, vec3 target);
365
371void nav3d_agent_set_filter(context &ctx, nav3d_agent_handle agent, i32 filter);
372
376void nav3d_agent_stop(context &ctx, nav3d_agent_handle agent);
377
383bool nav3d_agent_teleport(context &ctx, nav3d_agent_handle agent, vec3 position);
384
390
396
401bool nav3d_agent_arrived(const context &ctx, nav3d_agent_handle agent);
402
407i32 nav3d_agent_count(const context &ctx, navmesh3d_handle navmesh);
409} // namespace njin
void navmesh3d_remove_obstacle(context &ctx, navmesh3d_handle handle, i32 id)
Bỏ một vật cản: chỗ đó đi được lại sau khi các ô vuông được dựng lại.
bool navmesh3d_path(const context &ctx, navmesh3d_handle handle, vec3 from, vec3 to, std::vector< vec3 > &out)
Tìm đường từ from đến to: các điểm gấp khúc, đầu là điểm gần from nhất trên navmesh,...
void navmesh3d_set_filter(context &ctx, navmesh3d_handle handle, i32 index, const nav3d_filter &filter)
Đặt bộ lọc số index (0..15) của navmesh.
i32 navmesh3d_add_obstacle(context &ctx, navmesh3d_handle handle, const nav3d_obstacle_desc &desc)
Thêm một vật cản.
void navmesh3d_add_model(context &ctx, navmesh3d_handle handle, model_handle model, vec3 position, vec3 rotation={0.0f, 0.0f, 0.0f}, vec3 scale={1.0f, 1.0f, 1.0f}, u8 area=0)
Thêm các tam giác của một model, đặt ở vị trí, góc xoay (độ) và tỉ lệ như draw_model().
void navmesh3d_add_link(context &ctx, navmesh3d_handle handle, vec3 from, vec3 to, bool both_ways=true, f32 radius=0.5f, u8 area=0)
Thêm một lối tắt mà tác tử đi được dù không liền mặt đất: nhảy qua khe, leo thang,...
vec3 nav3d_agent_position(const context &ctx, nav3d_agent_handle agent)
Vị trí hiện tại của tác tử (trên mặt navmesh).
bool navmesh3d_nearest(const context &ctx, navmesh3d_handle handle, vec3 p, vec3 &out, vec3 extents={2.0f, 4.0f, 2.0f})
Điểm gần p nhất trên navmesh, tìm trong hộp nửa cỡ extents quanh p.
void nav3d_agent_set_filter(context &ctx, nav3d_agent_handle agent, i32 filter)
Đổi bộ lọc tác tử tìm đường theo (người lính có chìa khóa đi được qua cửa khóa).
void navmesh3d_clear_geometry(context &ctx, navmesh3d_handle handle)
Bỏ mọi hình học và lối tắt đã thêm (navmesh đã dựng vẫn giữ đến lần dựng sau).
bool navmesh3d_random_point_near(context &ctx, navmesh3d_handle handle, vec3 center, f32 radius, vec3 &out)
Một điểm ngẫu nhiên trên navmesh, cách center không quá radius và đi tới được từ đó: chỗ quái đi lang...
bool nav3d_agent_set_target(context &ctx, nav3d_agent_handle agent, vec3 target)
Đặt đích: tác tử tìm đường và đi tới đó (đích được kéo về chỗ gần nhất trên navmesh).
i32 nav3d_agent_count(const context &ctx, navmesh3d_handle navmesh)
Số tác tử đang có trên một navmesh.
void navmesh3d_draw_debug(context &ctx, navmesh3d_handle handle, rgba color={0.2f, 0.8f, 1.0f, 1.0f})
Vẽ các đa giác của navmesh bằng gizmo (njin_gizmo.h) trong frame này: mép đa giác,...
void navmesh3d_add_mesh(context &ctx, navmesh3d_handle handle, const vec3 *positions, u32 vertex_count, const u32 *indices=nullptr, u32 index_count=0, u8 area=0)
Thêm một lưới tam giác (trong thế giới) làm hình học: sàn, tường, cầu thang.
vec3 nav3d_agent_velocity(const context &ctx, nav3d_agent_handle agent)
Vận tốc hiện tại của tác tử: hướng nó đang đi, để quay mặt và chọn animation.
void navmesh3d_remove_area(context &ctx, navmesh3d_handle handle, i32 id)
Bỏ một khối đã đánh dấu (chỗ đó trở về vùng của hình học bên dưới) và dựng lại các ô vuông nó chạm và...
nav3d_agent_handle nav3d_agent_add(context &ctx, navmesh3d_handle navmesh, const nav3d_agent_desc &desc)
Thêm một tác tử.
constexpr i32 nav3d_max_areas
Số loại vùng: vùng 0 đến 15.
Definition njin_nav3d.h:47
i32 navmesh3d_add_area(context &ctx, navmesh3d_handle handle, vec3 center, vec3 size, f32 yaw, u8 area)
Đánh dấu một khối đứng là một vùng (0..15): mọi chỗ đi được bên trong hộp xoay quanh trục đứng (đường...
navmesh3d_handle navmesh3d_clone(context &ctx, navmesh3d_handle source, const navmesh3d_desc &desc)
Một navmesh mới cùng hình học, vùng đánh dấu, lối tắt, vật cản và bộ lọc với source,...
i32 navmesh3d_pending_tiles(const context &ctx, navmesh3d_handle handle)
Số ô vuông còn chờ dựng lại vì vật cản.
bool navmesh3d_random_point(context &ctx, navmesh3d_handle handle, vec3 &out)
Một điểm ngẫu nhiên trên navmesh (các chỗ đi được có xác suất theo diện tích).
void nav3d_agent_stop(context &ctx, nav3d_agent_handle agent)
Bỏ đích: tác tử dừng lại (vẫn tách khỏi tác tử khác).
bool nav3d_agent_arrived(const context &ctx, nav3d_agent_handle agent)
Tác tử đã tới đích chưa (cách đích không quá arrive_distance).
i32 navmesh3d_rebuild(context &ctx, navmesh3d_handle handle, vec3 min, vec3 max)
Dựng lại các ô vuông chạm vào vùng [min, max], từ hình học hiện tại: sau khi sửa địa hình,...
void navmesh3d_add_box(context &ctx, navmesh3d_handle handle, vec3 center, vec3 size, vec3 rotation={0.0f, 0.0f, 0.0f}, u8 area=0)
Thêm một hình hộp: bục, bàn, vật cản, tường.
nav3d_ray navmesh3d_raycast(const context &ctx, navmesh3d_handle handle, vec3 from, vec3 to)
Đi thẳng trên mặt navmesh từ from về phía to và dừng ở mép đầu tiên: có nhìn thấy nhau theo mặt đất k...
nav3d_filter navmesh3d_filter(const context &ctx, navmesh3d_handle handle, i32 index)
Bộ lọc số index của navmesh.
bool navmesh3d_build(context &ctx, navmesh3d_handle handle)
Dựng toàn bộ navmesh từ hình học đã thêm.
bool nav3d_agent_teleport(context &ctx, nav3d_agent_handle agent, vec3 position)
Đặt tác tử sang chỗ khác ngay (dịch chuyển tức thời), bỏ đích.
navmesh3d_handle navmesh3d_create(context &ctx, const navmesh3d_desc &desc={})
Tạo một navmesh trống.
void navmesh3d_add_terrain(context &ctx, navmesh3d_handle handle, terrain3d_handle terrain, u8 area=0)
Thêm một địa hình (njin_world3d.h).
void nav3d_agent_remove(context &ctx, nav3d_agent_handle agent)
Bỏ một tác tử.
bool navmesh3d_move_obstacle(context &ctx, navmesh3d_handle handle, i32 id, vec3 position, f32 yaw=0.0f)
Dời một vật cản: dựng lại các ô vuông chỗ cũ và chỗ mới.
void navmesh3d_destroy(context &ctx, navmesh3d_handle handle)
Hủy navmesh cùng mọi tác tử của nó.
std::uint8_t u8
Số nguyên không dấu 8 bit.
Definition _types.h:20
std::int32_t i32
Số nguyên có dấu 32 bit.
Definition _types.h:14
std::uint16_t u16
Số nguyên không dấu 16 bit.
Definition _types.h:21
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
Định danh của một nhân vật vật lý 3D, tạo bởi character3d_create().
Definition _types.h:167
Định danh của một model 3D, tạo bởi model_load().
Definition _types.h:153
Một tác tử đi trên navmesh cùng các tác tử khác: tự tìm đường, tránh nhau, tách nhau ra khi đứng sát.
Definition njin_nav3d.h:323
character3d_handle character
Nhân vật (njin_physics3d.h) do tác tử này lái: mỗi frame vận tốc của tác tử thành vận tốc ngang của n...
Definition njin_nav3d.h:338
f32 arrive_distance
Tới cách đích bấy nhiêu mét là đã đến (nav3d_agent_arrived()). 0 là bằng radius.
Definition njin_nav3d.h:332
i32 filter
Số bộ lọc (navmesh3d_set_filter()) tác tử tìm đường theo, 0..15.
Definition njin_nav3d.h:340
f32 height
Chiều cao, mét.
Definition njin_nav3d.h:326
f32 separation
Độ mạnh của việc tách khỏi tác tử bên cạnh. 0 là tắt.
Definition njin_nav3d.h:329
bool avoid
Né tác tử khác trên đường đi.
Definition njin_nav3d.h:330
f32 max_speed
Tốc độ tối đa, mét mỗi giây.
Definition njin_nav3d.h:327
f32 max_accel
Gia tốc tối đa, mét mỗi giây bình phương.
Definition njin_nav3d.h:328
f32 radius
Bán kính, mét.
Definition njin_nav3d.h:325
vec3 position
Chỗ đặt (được kéo về navmesh).
Definition njin_nav3d.h:324
Định danh của một tác tử đi trên navmesh, tạo bởi nav3d_agent_add().
Definition _types.h:286
Cách tìm đường đánh giá các vùng: chi phí đi qua mỗi vùng và vùng nào cấm.
Definition njin_nav3d.h:55
f32 cost[nav3d_max_areas]
Chi phí mỗi mét của từng vùng, chỉ số là số vùng. Phải lớn hơn 0.
Definition njin_nav3d.h:57
u16 excluded
Các vùng cấm, bit 1 << vùng. 0 (mặc định) là không cấm vùng nào.
Definition njin_nav3d.h:60
Một vật cản di động trên navmesh: thùng bị đẩy, xe đậu, cửa đóng.
Definition njin_nav3d.h:209
f32 radius
Lớn hơn 0 là hình trụ bán kính này thay vì hộp.
Definition njin_nav3d.h:213
vec3 position
Tâm.
Definition njin_nav3d.h:210
f32 yaw
Góc xoay quanh trục đứng, độ.
Definition njin_nav3d.h:212
vec3 size
Cỡ hộp; với hình trụ chỉ dùng y (chiều cao).
Definition njin_nav3d.h:211
Kết quả của navmesh3d_raycast().
Definition njin_nav3d.h:281
bool hit
Gặp mép navmesh (tường) trước khi tới đích.
Definition njin_nav3d.h:282
f32 fraction
Phần đường đi được, 0..1.
Definition njin_nav3d.h:285
vec3 point
Chỗ dừng: chỗ gặp mép, hoặc đích nếu không gặp.
Definition njin_nav3d.h:283
vec3 normal
Pháp tuyến ngang của mép gặp phải.
Definition njin_nav3d.h:284
Cách dựng một navmesh 3D bằng navmesh3d_create(): cỡ của tác tử đi trên nó và độ mịn khi dựng.
Definition njin_nav3d.h:23
f32 cell_height
Cỡ ô khi dựng theo chiều đứng, mét.
Definition njin_nav3d.h:31
vec3 bounds_min
Góc (x, y, z nhỏ nhất) và góc kia của vùng dựng.
Definition njin_nav3d.h:37
f32 agent_climb
Bậc cao nhất bước lên được, mét.
Definition njin_nav3d.h:26
f32 tile_size
Cạnh mỗi ô vuông của navmesh, mét.
Definition njin_nav3d.h:32
f32 region_min
Mảng đi được nhỏ hơn (tính bằng ô, theo cạnh) bị bỏ: chỗ đứng lọt thỏm trên bàn.
Definition njin_nav3d.h:33
f32 agent_height
Chiều cao tác tử: chui được qua chỗ trần cao hơn số này.
Definition njin_nav3d.h:25
f32 edge_max_error
Mép đa giác lệch khỏi mép thật tối đa bấy nhiêu ô.
Definition njin_nav3d.h:34
i32 max_agents
Số tác tử tối đa đi cùng lúc (nav3d_agent_add()).
Definition njin_nav3d.h:39
f32 agent_radius
Bán kính tác tử, mét: chỗ đi được cách tường bấy nhiêu.
Definition njin_nav3d.h:24
i32 obstacle_tiles_per_frame
Số ô vuông tối đa được dựng lại mỗi frame khi vật cản (navmesh3d_add_obstacle()) thêm,...
Definition njin_nav3d.h:42
vec3 bounds_max
Xem bounds_min.
Definition njin_nav3d.h:38
f32 max_slope
Dốc nhất đi được, độ.
Definition njin_nav3d.h:27
f32 cell_size
Cỡ ô khi dựng, mét, theo chiều ngang: nhỏ thì mép đa giác sát tường hơn nhưng dựng lâu hơn.
Definition njin_nav3d.h:30
Định danh của một navmesh 3D, tạo bởi navmesh3d_create().
Definition _types.h:278
Màu gồm đỏ, xanh lá, xanh dương và alpha.
Definition _types.h:64
Định danh của một địa hình, tạo bởi terrain3d_create().
Definition _types.h:229
Vector 3 chiều.
Definition _types.h:47