-
Notifications
You must be signed in to change notification settings - Fork 0
/
model_geometry_info.inc
137 lines (129 loc) · 3.54 KB
/
model_geometry_info.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#if !defined __MODELGEOMETRY_INCLUDED__
#define __MODELGEOMETRY_INCLUDED__
#define MODELGEOMETRY_MODELS (20000)
// AABB3 - Axis Aligned Bounding Box in 3 dimensions.
// Visual - in function name stands for information about visible model.
// Col - in function name stands for information about collision model.
enum e_modelsize_aabb3_info {
Float:E_MIN_X,
Float:E_MIN_Y,
Float:E_MIN_Z,
Float:E_MAX_X,
Float:E_MAX_Y,
Float:E_MAX_Z,
};
enum e_modelsize_aabb3_line {
E_MODELID,
Float:E_MIN_X,
Float:E_MIN_Y,
Float:E_MIN_Z,
Float:E_MAX_X,
Float:E_MAX_Y,
Float:E_MAX_Z,
};
static stock ModelVisual_AABB3[MODELGEOMETRY_MODELS][e_modelsize_aabb3_info];
// Load information about visible part of objects (AABB3).
stock ModelGeom_initVisual_AABB3(const filepath[]) {
new File:f = fopen(filepath, io_read),
line_info[e_modelsize_aabb3_line],
modelid
;
if( f ) {
while( fblockread(f, line_info, sizeof(line_info)) == sizeof(line_info) ) {
modelid = line_info[E_MODELID];
if( modelid > 0 && modelid < MODELGEOMETRY_MODELS ) {
memcpy(ModelVisual_AABB3[modelid], line_info[e_modelsize_aabb3_line:1], 0, 4 * sizeof(line_info), sizeof(line_info));
}
}
fclose(f);
} else {
printf("ModelSize_init: cant load from (%s).", filepath);
}
}
stock ModelGeom_parseBoxBounds(
const aabb_info[e_modelsize_aabb3_info],
&Float:min_x,
&Float:min_y,
&Float:min_z,
&Float:max_x,
&Float:max_y,
&Float:max_z
) {
min_x = aabb_info[E_MIN_X];
min_y = aabb_info[E_MIN_Y];
min_z = aabb_info[E_MIN_Z];
max_x = aabb_info[E_MAX_X];
max_y = aabb_info[E_MAX_Y];
max_z = aabb_info[E_MAX_Z];
}
// Get bounds as AABB3 of visible object.
stock ModelGeom_getVisualBoxBounds(
const modelid,
&Float:min_x,
&Float:min_y,
&Float:min_z,
&Float:max_x,
&Float:max_y,
&Float:max_z
) {
if( modelid > 0 && modelid < MODELGEOMETRY_MODELS ) {
ModelGeom_parseBoxBounds(ModelVisual_AABB3[modelid], min_x, min_y, min_z, max_x, max_y, max_z);
} else {
min_x = min_y = min_z = max_x = max_y = max_z = 0.0;
}
}
// Get size of AABB3 of visible object.
stock ModelGeom_getVisualBoxSize(
const modelid,
&Float:size_x,
&Float:size_y,
&Float:size_z
) {
new Float:min_x, Float:min_y, Float:min_z,
Float:max_x, Float:max_y, Float:max_z
;
ModelGeom_parseBoxBounds(ModelVisual_AABB3[modelid], min_x, min_y, min_z, max_x, max_y, max_z);
size_x = max_x - min_x;
size_y = max_y - min_y;
size_z = max_z - min_z;
}
// Get center position of AABB3 of visible object.
stock ModelGeom_getVisualCenter(
const modelid,
&Float:pos_x,
&Float:pos_y,
&Float:pos_z
) {
new Float:min_x, Float:min_y, Float:min_z,
Float:max_x, Float:max_y, Float:max_z
;
ModelGeom_parseBoxBounds(ModelVisual_AABB3[modelid], min_x, min_y, min_z, max_x, max_y, max_z);
pos_x = 0.5 * (max_x - min_x);
pos_y = 0.5 * (max_y - min_y);
pos_z = 0.5 * (max_z - min_z);
}
// Get lowest X of object.
stock Float:ModelGeom_getVisualMinX(const modelid) {
return ModelVisual_AABB3[modelid][E_MIN_X];
}
// Get highest X of object.
stock Float:ModelGeom_getVisualMaxX(const modelid) {
return ModelVisual_AABB3[modelid][E_MAX_X];
}
// Get lowest Y of object.
stock Float:ModelGeom_getVisualMinY(const modelid) {
return ModelVisual_AABB3[modelid][E_MIN_Y];
}
// Get highest Y of object.
stock Float:ModelGeom_getVisualMaxY(const modelid) {
return ModelVisual_AABB3[modelid][E_MAX_Y];
}
// Get lowest Z of object.
stock Float:ModelGeom_getVisualMinZ(const modelid) {
return ModelVisual_AABB3[modelid][E_MIN_Z];
}
// Get highest Z of object.
stock Float:ModelGeom_getVisualMaxZ(const modelid) {
return ModelVisual_AABB3[modelid][E_MAX_Z];
}
#endif