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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use objc2_foundation::*;
use crate::*;
extern_class!(
/// A collection of GKGraphNodes that are governed by a set of extruded GKPolygonObstacles
///
/// See also [Apple's documentation](https://developer.apple.com/documentation/gameplaykit/gkobstaclegraph?language=objc)
#[unsafe(super(GKGraph, NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
pub struct GKObstacleGraph<NodeType: ?Sized = AnyObject>;
);
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
impl<NodeType: ?Sized + Message + AsRef<GKGraphNode2D>> GKObstacleGraph<NodeType> {
/// Unchecked conversion of the generic parameter.
///
/// # Safety
///
/// The generic must be valid to reinterpret as the given type.
#[inline]
pub unsafe fn cast_unchecked<NewNodeType: ?Sized + Message + AsRef<GKGraphNode2D>>(
&self,
) -> &GKObstacleGraph<NewNodeType> {
unsafe { &*((self as *const Self).cast()) }
}
}
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
extern_conformance!(
unsafe impl<NodeType: ?Sized + NSCoding + AsRef<GKGraphNode2D>> NSCoding
for GKObstacleGraph<NodeType>
{
}
);
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
extern_conformance!(
unsafe impl<NodeType: ?Sized + AsRef<GKGraphNode2D>> NSCopying for GKObstacleGraph<NodeType> {}
);
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
unsafe impl<NodeType: ?Sized + Message + AsRef<GKGraphNode2D>> CopyingHelper
for GKObstacleGraph<NodeType>
{
type Result = Self;
}
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
extern_conformance!(
unsafe impl<NodeType: ?Sized + AsRef<GKGraphNode2D>> NSObjectProtocol
for GKObstacleGraph<NodeType>
{
}
);
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
extern_conformance!(
unsafe impl<NodeType: ?Sized + NSSecureCoding + AsRef<GKGraphNode2D>> NSSecureCoding
for GKObstacleGraph<NodeType>
{
}
);
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
impl<NodeType: Message + AsRef<GKGraphNode2D>> GKObstacleGraph<NodeType> {
extern_methods!(
#[cfg(feature = "GKObstacle")]
#[unsafe(method(obstacles))]
#[unsafe(method_family = none)]
pub unsafe fn obstacles(&self) -> Retained<NSArray<GKPolygonObstacle>>;
#[unsafe(method(bufferRadius))]
#[unsafe(method_family = none)]
pub unsafe fn bufferRadius(&self) -> c_float;
#[cfg(feature = "GKObstacle")]
/// Creates an optimal bidirectional graph based on a list of obstacles.
/// Each vertex of each obstacle is extruded and a connection is made between each vertex that does not intersect an obstacle
/// Guaranteed not to have any edges which intersect obstacles.
/// Same effect as [[GKObstacleGraph alloc] init], setting bufferRadius, and then calling addObstacles.
///
/// Parameter `obstacles`: a list of obstacles to create the graph from
///
/// Parameter `bufferRadius`: the circular radius of a potential agent that will navigate this graph. Obstacles are extruded by this amount to create the graph. Must be positive. Negative values are clipped to 0.0f
#[unsafe(method(graphWithObstacles:bufferRadius:))]
#[unsafe(method_family = none)]
pub unsafe fn graphWithObstacles_bufferRadius(
obstacles: &NSArray<GKPolygonObstacle>,
buffer_radius: c_float,
) -> Retained<Self>;
#[cfg(feature = "GKObstacle")]
#[unsafe(method(initWithObstacles:bufferRadius:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithObstacles_bufferRadius(
this: Allocated<Self>,
obstacles: &NSArray<GKPolygonObstacle>,
buffer_radius: c_float,
) -> Retained<Self>;
#[cfg(feature = "GKObstacle")]
/// Creates an optimal bidirectional graph based on a list of obstacles.
/// Each vertex of each obstacle is extruded and a connection is made between each vertex that does not intersect an obstacle
/// Guaranteed not to have any edges which intersect obstacles.
/// Same effect as [[GKObstacleGraph alloc] init], setting bufferRadius, and then calling addObstacles.
///
/// Parameter `obstacles`: a list of obstacles to create the graph from
///
/// Parameter `bufferRadius`: the circular radius of a potential agent that will navigate this graph. Obstacles are extruded by this amount to create the graph. Must be positive. Negative values are clipped to 0.0f
///
/// Parameter `nodeClass`: the class of the nodes that this graph should create. Must descend from GKGraphNode2D
///
/// # Safety
///
/// `node_class` probably has further requirements.
#[unsafe(method(graphWithObstacles:bufferRadius:nodeClass:))]
#[unsafe(method_family = none)]
pub unsafe fn graphWithObstacles_bufferRadius_nodeClass(
obstacles: &NSArray<GKPolygonObstacle>,
buffer_radius: c_float,
node_class: &AnyClass,
) -> Retained<Self>;
#[cfg(feature = "GKObstacle")]
/// # Safety
///
/// `node_class` probably has further requirements.
#[unsafe(method(initWithObstacles:bufferRadius:nodeClass:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithObstacles_bufferRadius_nodeClass(
this: Allocated<Self>,
obstacles: &NSArray<GKPolygonObstacle>,
buffer_radius: c_float,
node_class: &AnyClass,
) -> Retained<Self>;
/// Connects the node to this graph by testing edge intersection with existing obstacles.
/// Same behavior as if this node had been present during initWithObstacles.
///
/// Parameter `node`: the node to connect
#[unsafe(method(connectNodeUsingObstacles:))]
#[unsafe(method_family = none)]
pub unsafe fn connectNodeUsingObstacles(&self, node: &NodeType);
#[cfg(feature = "GKObstacle")]
/// Same behavior as connectNodeUsingObstacles: except you can optionally ignore certain obstacles from being tested for intersection.
#[unsafe(method(connectNodeUsingObstacles:ignoringObstacles:))]
#[unsafe(method_family = none)]
pub unsafe fn connectNodeUsingObstacles_ignoringObstacles(
&self,
node: &NodeType,
obstacles_to_ignore: &NSArray<GKPolygonObstacle>,
);
#[cfg(feature = "GKObstacle")]
/// Same behavior as connectNodeUsingObstacles: except you can optionally ignore the bounding radius of certain obstacles from being tested for intersection
#[unsafe(method(connectNodeUsingObstacles:ignoringBufferRadiusOfObstacles:))]
#[unsafe(method_family = none)]
pub unsafe fn connectNodeUsingObstacles_ignoringBufferRadiusOfObstacles(
&self,
node: &NodeType,
obstacles_buffer_radius_to_ignore: &NSArray<GKPolygonObstacle>,
);
#[cfg(feature = "GKObstacle")]
/// Adds obstacles to this graph.
/// Obstacle is extruded and graph nodes are generated from its vertices and then connected to this graph
/// Nothing is done if an obstacle is already present in this graph
/// Any existing connections that intersect the new obstacles are destroyed unless they are protected with [GKObstacleGraph lockConnection:]
///
/// Parameter `obstacles`: an array of obstacles to be added
///
/// See: lockConnection
#[unsafe(method(addObstacles:))]
#[unsafe(method_family = none)]
pub unsafe fn addObstacles(&self, obstacles: &NSArray<GKPolygonObstacle>);
#[cfg(feature = "GKObstacle")]
/// Removes obstacles from this graph.
/// All associated graph nodes are removed and their connections are bidirectionally removed.
/// Connections between obstacle nodes that were previously invalidated by any of these obstacles are restored.
/// Nothing is done if an obstacle is already present in this graph
///
/// Parameter `obstacles`: an array of obstacles to be removed
#[unsafe(method(removeObstacles:))]
#[unsafe(method_family = none)]
pub unsafe fn removeObstacles(&self, obstacles: &NSArray<GKPolygonObstacle>);
/// Removes all obstacles from this graph.
#[unsafe(method(removeAllObstacles))]
#[unsafe(method_family = none)]
pub unsafe fn removeAllObstacles(&self);
#[cfg(feature = "GKObstacle")]
/// Returns an array of the graph nodes associated with a given obstacle
///
/// Parameter `obstacle`: the obstacle who's nodes are to be retrieved
#[unsafe(method(nodesForObstacle:))]
#[unsafe(method_family = none)]
pub unsafe fn nodesForObstacle(
&self,
obstacle: &GKPolygonObstacle,
) -> Retained<NSArray<NodeType>>;
/// Marks a connection as "locked", preventing this connection from being destroyed when you add obstacles that would intersect it
///
/// Parameter `startNode`: startNode of the connection to lock
///
/// Parameter `endNode`: endNode of the connection to lock
#[unsafe(method(lockConnectionFromNode:toNode:))]
#[unsafe(method_family = none)]
pub unsafe fn lockConnectionFromNode_toNode(
&self,
start_node: &NodeType,
end_node: &NodeType,
);
/// "Unlocks" a connection, removing its protection from being destroyed when you add obstacles that would intersect it
///
/// Parameter `startNode`: startNode of the connection to unlock
///
/// Parameter `endNode`: endNode of the connection to unlock
///
/// See: lockConnection
#[unsafe(method(unlockConnectionFromNode:toNode:))]
#[unsafe(method_family = none)]
pub unsafe fn unlockConnectionFromNode_toNode(
&self,
start_node: &NodeType,
end_node: &NodeType,
);
/// Query if a given connection is locked
///
/// Parameter `startNode`: startNode of the connection to query
///
/// Parameter `endNode`: endNode of the connection to query
///
/// See: lockConnection
///
/// See: unlockConnection
///
/// Returns: YES if the connection was locked with lockConnection, NO if it was never locked or was unlocked via unlockConnection
#[unsafe(method(isConnectionLockedFromNode:toNode:))]
#[unsafe(method_family = none)]
pub unsafe fn isConnectionLockedFromNode_toNode(
&self,
start_node: &NodeType,
end_node: &NodeType,
) -> bool;
/// Returns the class of the specified generic index
#[unsafe(method(classForGenericArgumentAtIndex:))]
#[unsafe(method_family = none)]
pub unsafe fn classForGenericArgumentAtIndex(&self, index: NSUInteger)
-> &'static AnyClass;
);
}
/// Methods declared on superclass `GKGraph`.
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
impl<NodeType: Message + AsRef<GKGraphNode2D>> GKObstacleGraph<NodeType> {
extern_methods!(
/// Creates a graph with the provided array of nodes.
///
/// Parameter `nodes`: the nodes to create the graph with
#[unsafe(method(graphWithNodes:))]
#[unsafe(method_family = none)]
pub unsafe fn graphWithNodes(nodes: &NSArray<GKGraphNode>) -> Retained<Self>;
#[unsafe(method(initWithNodes:))]
#[unsafe(method_family = init)]
pub unsafe fn initWithNodes(
this: Allocated<Self>,
nodes: &NSArray<GKGraphNode>,
) -> Retained<Self>;
);
}
/// Methods declared on superclass `NSObject`.
#[cfg(all(feature = "GKGraph", feature = "GKGraphNode"))]
impl<NodeType: Message + AsRef<GKGraphNode2D>> GKObstacleGraph<NodeType> {
extern_methods!(
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub unsafe fn new() -> Retained<Self>;
);
}