1 /*************************************************************************/
2 /*  broad_phase_basic.h                                                  */
3 /*************************************************************************/
4 /*                       This file is part of:                           */
5 /*                           GODOT ENGINE                                */
6 /*                      https://godotengine.org                          */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */
9 /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */
10 /*                                                                       */
11 /* Permission is hereby granted, free of charge, to any person obtaining */
12 /* a copy of this software and associated documentation files (the       */
13 /* "Software"), to deal in the Software without restriction, including   */
14 /* without limitation the rights to use, copy, modify, merge, publish,   */
15 /* distribute, sublicense, and/or sell copies of the Software, and to    */
16 /* permit persons to whom the Software is furnished to do so, subject to */
17 /* the following conditions:                                             */
18 /*                                                                       */
19 /* The above copyright notice and this permission notice shall be        */
20 /* included in all copies or substantial portions of the Software.       */
21 /*                                                                       */
22 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
23 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
24 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
25 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
26 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
27 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
28 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
29 /*************************************************************************/
30 
31 #ifndef BROAD_PHASE_BASIC_H
32 #define BROAD_PHASE_BASIC_H
33 
34 #include "broad_phase_sw.h"
35 #include "core/map.h"
36 
37 class BroadPhaseBasic : public BroadPhaseSW {
38 
39 	struct Element {
40 
41 		CollisionObjectSW *owner;
42 		bool _static;
43 		AABB aabb;
44 		int subindex;
45 	};
46 
47 	Map<ID, Element> element_map;
48 
49 	ID current;
50 
51 	struct PairKey {
52 
53 		union {
54 			struct {
55 				ID a;
56 				ID b;
57 			};
58 			uint64_t key;
59 		};
60 
61 		_FORCE_INLINE_ bool operator<(const PairKey &p_key) const {
62 			return key < p_key.key;
63 		}
64 
PairKeyPairKey65 		PairKey() { key = 0; }
PairKeyPairKey66 		PairKey(ID p_a, ID p_b) {
67 			if (p_a > p_b) {
68 				a = p_b;
69 				b = p_a;
70 			} else {
71 				a = p_a;
72 				b = p_b;
73 			}
74 		}
75 	};
76 
77 	Map<PairKey, void *> pair_map;
78 
79 	PairCallback pair_callback;
80 	void *pair_userdata;
81 	UnpairCallback unpair_callback;
82 	void *unpair_userdata;
83 
84 public:
85 	// 0 is an invalid ID
86 	virtual ID create(CollisionObjectSW *p_object, int p_subindex = 0);
87 	virtual void move(ID p_id, const AABB &p_aabb);
88 	virtual void set_static(ID p_id, bool p_static);
89 	virtual void remove(ID p_id);
90 
91 	virtual CollisionObjectSW *get_object(ID p_id) const;
92 	virtual bool is_static(ID p_id) const;
93 	virtual int get_subindex(ID p_id) const;
94 
95 	virtual int cull_point(const Vector3 &p_point, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
96 	virtual int cull_segment(const Vector3 &p_from, const Vector3 &p_to, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
97 	virtual int cull_aabb(const AABB &p_aabb, CollisionObjectSW **p_results, int p_max_results, int *p_result_indices = NULL);
98 
99 	virtual void set_pair_callback(PairCallback p_pair_callback, void *p_userdata);
100 	virtual void set_unpair_callback(UnpairCallback p_unpair_callback, void *p_userdata);
101 
102 	virtual void update();
103 
104 	static BroadPhaseSW *_create();
105 	BroadPhaseBasic();
106 };
107 
108 #endif // BROAD_PHASE_BASIC_H
109