NSUNI/NSLAR Library a250670
Loading...
Searching...
No Matches
collision.hpp
Go to the documentation of this file.
1
12
13#pragma once
14
17#include "NNL/common/io.hpp"
20namespace nnl {
31namespace collision {
37
49 kNone = 0,
50 kDirt = 0b0000'0001,
51 kDirt2 = 0b0000'0010,
52 kSand = 0b0000'0011,
53 kStone = 0b0000'0100,
54 kGrass = 0b0000'0101,
55 kWater = 0b0000'0110,
56 kWood = 0b0000'0111,
57 kStone2 = 0b0000'1000,
58 kMetal = 0b0000'1001,
59 // flags
60 kShadow = 0b0001'0000,
62 kPassThrowables = 0b010'0000'0000,
64 kPassCamera = 0b100'0000'0000
65};
66
77 kNone = 0,
78 kPushBack = 0b01,
82};
83
102
112struct Edge {
113 std::array<u16, 2> indices_vertices{0};
119 SurfaceFeatures surface_features{};
120};
121
130 std::vector<u16> triangle_indices;
132 std::vector<u16> triangle_wall_indices;
134 std::vector<u16> edge_wall_indices;
136};
137
154struct Collision {
159 glm::vec3 origin_point{0.0f};
162 std::vector<glm::vec3> vertices;
164 std::vector<glm::vec3> normals;
165 std::vector<Triangle> triangles;
166 std::vector<Edge> edges;
170};
171
188 PushFeatures push_features{};
189 SurfaceFeatures surface_features{};
190};
191
192Collision Convert(SModel&& smodel, const ConvertParam& mesh_params = {}, bool auto_wall = true, u32 shift = 5);
208Collision Convert(SModel&& smodel, const std::vector<ConvertParam>& mesh_params, bool auto_wall = true, u32 shift = 5);
209
221bool IsOfType(BufferView buffer);
222
223bool IsOfType(const std::filesystem::path& path);
224
225bool IsOfType(Reader& f);
226
241
242Collision Import(const std::filesystem::path& path);
243
245
255[[nodiscard]] Buffer Export(const Collision& collision);
256
257void Export(const Collision& collision, const std::filesystem::path& path);
258
259void Export(const Collision& collision, Writer& f);
261
277std::vector<ConvertParam> GenerateConvertParam(const Collision& collision);
279
280namespace raw {
286
287NNL_PACK(struct RHeader {
288 Vec4<f32> origin_point{0, 0, 0, 1.0f}; // 0x0
289 Vec3<u32> bbox_dimension{0}; // 0x10 width, height, depth shifted by shift_value
290 u32 offset_coordinate_map = 0; // 0x1C
291 u32 offset_vertex_table = 0; // 0x20
292 u32 offset_normal_table = 0; // 0x24
293 u32 offset_triangles = 0; // 0x28
294 u32 offset_edges = 0; // 0x2C
295 u32 offset_collision_tests = 0; // 0x30
296 u32 file_size = 0; // 0x34
297 u32 unknown = 0; // 0x38 always 0; offset to
298 // unused indices_triangles_edges?
299 u16 shift_value = 0; // 0x3C
300 u16 num_triangles = 0; // 0x3E 0 in NUC2
301});
302
303static_assert(sizeof(RHeader) == 0x40);
304
305NNL_PACK(struct RTriangle {
306 u32 calculation = 0; // 0x0
307 u16 index_vertex_0 = 0; // 0x4
308 u16 index_vertex_1 = 0; // 0x6
309 u16 index_vertex_2 = 0; // 0x8
310 u16 index_normal = 0; // 0xA
311 u16 index_vertex_min = 0; // 0xC
312 u16 index_vertex_max = 0; // 0xE
313 u16 push_features = 0; // 0x10
314 u16 surface_features = 0; // 0x12
315});
316
317static_assert(sizeof(RTriangle) == 0x14); // In NUC2 the size is 0x18(?)
318
319NNL_PACK(struct REdge {
320 u32 calculation = 0; // 0x0
321 u16 index_vertex_0 = 0; // 0x4
322 u16 index_vertex_1 = 0; // 0x6
323 u16 index_vertex_min = 0; // 0x8 //MIN point line
324 u16 index_vertex_max = 0; // 0xA //max point line
325 u16 index_normal = 0; // 0xC
326 u16 mask = 0; // 0xE
327});
328
329static_assert(sizeof(REdge) == 0x10);
330
331NNL_PACK(struct RCollisionTest {
332 u32 offset_triangle_indices = 0; // 0x0
333 u32 offset_triangle_wall_indices = 0; // 0x4
334 u32 offset_edge_indices = 0; // 0x8
335 u16 num_triangle_indices = 0; // 0xC
336 u16 num_triangle_wall_indices = 0; // 0xE
337 u16 num_edge_indices = 0; // 0x10
338 u16 padding = 0; // 0x12
339});
340
341static_assert(sizeof(RCollisionTest) == 0x14);
342
343struct RCollision {
344 RHeader header;
345 std::vector<Vec4<f32>> vertices;
346 std::vector<Vec4<f32>> normals;
347 std::vector<RTriangle> triangles;
348 std::vector<REdge> edges;
349 std::vector<RCollisionTest> collision_tests;
350 std::vector<u16> indices_triangles_edges; // indices to geometric shapes for collision tests
351 std::vector<u16> coordinate_map; // array[z][y][x]
352};
353
354RCollision Parse(Reader& f);
355
356Collision Convert(const RCollision& rcollision);
358} // namespace raw
359
360} // namespace collision
361
362} // namespace nnl
Defines a 3d array class with a linear storage.
Contains macros for defining flag enums.
Contains macros and definitions for fixed-width types.
std::vector< ConvertParam > GenerateConvertParam(const Collision &collision)
Generates conversion parameters for SMesh objects to achieve a similar in-game collision config when ...
std::vector< u16 > edge_wall_indices
Definition collision.hpp:134
u16 index_vertex_max
Definition collision.hpp:116
std::vector< glm::vec3 > normals
Normal vectors associated with the geometric shapes.
Definition collision.hpp:164
std::vector< u16 > triangle_indices
Definition collision.hpp:130
u16 index_vertex_min
Definition collision.hpp:114
std::vector< u16 > triangle_wall_indices
Definition collision.hpp:132
glm::vec3 origin_point
Definition collision.hpp:159
std::array< u16, 3 > indices_vertices
Indices of the triangle's vertices.
Definition collision.hpp:93
u16 index_vertex_max
Definition collision.hpp:97
std::vector< Edge > edges
List of wall edges.
Definition collision.hpp:166
std::vector< Triangle > triangles
List of triangles.
Definition collision.hpp:165
PushFeatures push_features
Push behavior flags.
Definition collision.hpp:99
std::array< u16, 2 > indices_vertices
Indices of the edge's vertices.
Definition collision.hpp:113
u16 index_vertex_min
Definition collision.hpp:95
u16 index_normal
Index of the triangle's normal.
Definition collision.hpp:94
std::vector< glm::vec3 > vertices
Definition collision.hpp:162
u16 index_normal
Index of the flipped triangle's normal.
Definition collision.hpp:118
utl::Array3D< CollisionTest > coordinate_map
Definition collision.hpp:167
SurfaceFeatures surface_features
Surface behavior flags.
Definition collision.hpp:100
u16 shift_value
Definition collision.hpp:155
Struct defining a wall edge used in collision detection.
Definition collision.hpp:112
Struct representing a set of geometric shapes for collision testing.
Definition collision.hpp:129
Parameters for converting a simplified mesh to the in-game collision format.
Definition collision.hpp:187
Struct defining a single triangle used in collision detection.
Definition collision.hpp:92
Struct that contains all necessary information for collision detection.
Definition collision.hpp:154
PushFeatures
Enum representing different push behaviors for entities.
Definition collision.hpp:76
bool IsOfType(BufferView buffer)
Tests if the provided file is a collision config.
SModel Convert(const Collision &collision)
Converts collision data from the in-game format to a simplified model representation.
SurfaceFeatures
Enum representing different settings for surfaces.
Definition collision.hpp:48
Collision Import(BufferView buffer)
Parses a binary file and converts it to a structured collision.
Buffer Export(const Collision &collision)
Converts a collision config to a binary file representation.
@ kPushIfStuck
This flag should be used for meshes that act as ceilings.
Definition collision.hpp:81
@ kPushBack
Definition collision.hpp:78
@ kDirt
Dirt.
Definition collision.hpp:50
@ kShadow
Definition collision.hpp:60
@ kDirt2
Another type of dirt.
Definition collision.hpp:51
@ kNone
Default, same as kDirt.
Definition collision.hpp:49
@ kMetal
Metal.
Definition collision.hpp:58
@ kStone2
Another type of stone.
Definition collision.hpp:57
@ kStone
Stone or gravel.
Definition collision.hpp:53
@ kSand
Sand.
Definition collision.hpp:52
@ kWater
Water.
Definition collision.hpp:55
@ kWood
Wood.
Definition collision.hpp:56
@ kPassCamera
Allows the camera to pass through the surface.
Definition collision.hpp:64
@ kPassThrowables
Definition collision.hpp:62
@ kGrass
Grass.
Definition collision.hpp:54
4D vector template with packed storage
Definition fixed_type.hpp:116
3D vector template with packed storage
Definition fixed_type.hpp:163
std::uint16_t u16
16-bit unsigned integer
Definition fixed_type.hpp:62
std::uint32_t u32
32-bit unsigned integer
Definition fixed_type.hpp:60
#define NNL_PACK(...)
A structure packing directive.
Definition fixed_type.hpp:41
#define NNL_DEFINE_ENUM_OPERATORS(ENUMTYPE)
Macro to define bitwise operators for enum types.
Definition enum_flag.hpp:36
#define NNL_FLAG_ENUM
An attribute for defining flag enums.
Definition enum_flag.hpp:28
Reader implementation for read-only memory buffers.
Definition io.hpp:598
Abstract class for writing data.
Definition io.hpp:136
Abstract class for reading data.
Definition io.hpp:78
std::vector< u8 > Buffer
A type alias for std::vector<u8> that denotes a raw, contiguous memory region that may be interpreted...
Definition io.hpp:40
Represents a simple model.
Definition smodel.hpp:654
A 3-dimensional array template class.
Definition array3d.hpp:29
Provides classes for reading and writing binary data to and from various sources.
Contains structures and functions for working with static collisions.
Definition collision.hpp:31
Definition exception.hpp:56
Provides data structures and functions for managing essential components of a 3D model.