| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*  shape_bullet.h                                                       */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-01 14:40:08 +01:00
										 |  |  | /* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2018 Godot Engine contributors (cf. AUTHORS.md)    */ | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef SHAPE_BULLET_H
 | 
					
						
							|  |  |  | #define SHAPE_BULLET_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/math/geometry.h"
 | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | #include "core/variant.h"
 | 
					
						
							|  |  |  | #include "rid_bullet.h"
 | 
					
						
							|  |  |  | #include "servers/physics_server.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | #include <LinearMath/btAlignedObjectArray.h>
 | 
					
						
							|  |  |  | #include <LinearMath/btScalar.h>
 | 
					
						
							|  |  |  | #include <LinearMath/btVector3.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  | 	@author AndreaCatania | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | class ShapeBullet; | 
					
						
							|  |  |  | class btCollisionShape; | 
					
						
							|  |  |  | class ShapeOwnerBullet; | 
					
						
							|  |  |  | class btBvhTriangleMeshShape; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ShapeBullet : public RIDBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Map<ShapeOwnerBullet *, int> owners; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	real_t margin; | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  | 	/// return self
 | 
					
						
							|  |  |  | 	btCollisionShape *prepare(btCollisionShape *p_btShape) const; | 
					
						
							|  |  |  | 	void notifyShapeChanged(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	ShapeBullet(); | 
					
						
							|  |  |  | 	virtual ~ShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	btCollisionShape *create_bt_shape(const Vector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							|  |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0) = 0; | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	void add_owner(ShapeOwnerBullet *p_owner); | 
					
						
							|  |  |  | 	void remove_owner(ShapeOwnerBullet *p_owner, bool p_permanentlyFromThisBody = false); | 
					
						
							|  |  |  | 	bool is_owner(ShapeOwnerBullet *p_owner) const; | 
					
						
							|  |  |  | 	const Map<ShapeOwnerBullet *, int> &get_owners() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	void set_margin(real_t p_margin); | 
					
						
							|  |  |  | 	real_t get_margin() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 	/// Setup the shape
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data) = 0; | 
					
						
							|  |  |  | 	virtual Variant get_data() const = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	static class btEmptyShape *create_shape_empty(); | 
					
						
							|  |  |  | 	static class btStaticPlaneShape *create_shape_plane(const btVector3 &planeNormal, btScalar planeConstant); | 
					
						
							|  |  |  | 	static class btSphereShape *create_shape_sphere(btScalar radius); | 
					
						
							|  |  |  | 	static class btBoxShape *create_shape_box(const btVector3 &boxHalfExtents); | 
					
						
							|  |  |  | 	static class btCapsuleShapeZ *create_shape_capsule(btScalar radius, btScalar height); | 
					
						
							| 
									
										
										
										
											2018-06-13 00:53:28 +02:00
										 |  |  | 	static class btCylinderShape *create_shape_cylinder(btScalar radius, btScalar height); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 	/// IMPORTANT: Remember to delete the shape interface by calling: delete my_shape->getMeshInterface();
 | 
					
						
							|  |  |  | 	static class btConvexPointCloudShape *create_shape_convex(btAlignedObjectArray<btVector3> &p_vertices, const btVector3 &p_local_scaling = btVector3(1, 1, 1)); | 
					
						
							|  |  |  | 	static class btScaledBvhTriangleMeshShape *create_shape_concave(btBvhTriangleMeshShape *p_mesh_shape, const btVector3 &p_local_scaling = btVector3(1, 1, 1)); | 
					
						
							| 
									
										
										
										
											2018-03-27 21:45:27 +02:00
										 |  |  | 	static class btHeightfieldTerrainShape *create_shape_height_field(PoolVector<real_t> &p_heights, int p_width, int p_depth, real_t p_min_height, real_t p_max_height); | 
					
						
							| 
									
										
										
										
											2018-02-19 20:59:57 +01:00
										 |  |  | 	static class btRayShape *create_shape_ray(real_t p_length, bool p_slips_on_slope); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class PlaneShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Plane plane; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	PlaneShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(const Plane &p_plane); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SphereShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	real_t radius; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	SphereShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ real_t get_radius() { return radius; } | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(real_t p_radius); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class BoxShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	btVector3 half_extents; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	BoxShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ const btVector3 &get_half_extents() { return half_extents; } | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(const Vector3 &p_half_extents); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CapsuleShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	real_t height; | 
					
						
							|  |  |  | 	real_t radius; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	CapsuleShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ real_t get_height() { return height; } | 
					
						
							|  |  |  | 	_FORCE_INLINE_ real_t get_radius() { return radius; } | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2018-06-13 00:53:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(real_t p_height, real_t p_radius); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CylinderShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	real_t height; | 
					
						
							|  |  |  | 	real_t radius; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	CylinderShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_FORCE_INLINE_ real_t get_height() { return height; } | 
					
						
							|  |  |  | 	_FORCE_INLINE_ real_t get_radius() { return radius; } | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							|  |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_margin = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(real_t p_height, real_t p_radius); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ConvexPolygonShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	btAlignedObjectArray<btVector3> vertices; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ConvexPolygonShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	void get_vertices(Vector<Vector3> &out_vertices); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(const Vector<Vector3> &p_vertices); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ConcavePolygonShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 	class btBvhTriangleMeshShape *meshShape; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	PoolVector<Vector3> faces; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ConcavePolygonShapeBullet(); | 
					
						
							|  |  |  | 	virtual ~ConcavePolygonShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 	void setup(PoolVector<Vector3> p_faces); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HeightMapShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	PoolVector<real_t> heights; | 
					
						
							|  |  |  | 	int width; | 
					
						
							|  |  |  | 	int depth; | 
					
						
							| 
									
										
										
										
											2018-03-27 21:45:27 +02:00
										 |  |  | 	real_t min_height; | 
					
						
							|  |  |  | 	real_t max_height; | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	HeightMapShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2018-03-27 21:45:27 +02:00
										 |  |  | 	void setup(PoolVector<real_t> &p_heights, int p_width, int p_depth, real_t p_min_height, real_t p_max_height); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class RayShapeBullet : public ShapeBullet { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 	real_t length; | 
					
						
							| 
									
										
										
										
											2018-02-19 20:59:57 +01:00
										 |  |  | 	bool slips_on_slope; | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RayShapeBullet(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	virtual void set_data(const Variant &p_data); | 
					
						
							|  |  |  | 	virtual Variant get_data() const; | 
					
						
							|  |  |  | 	virtual PhysicsServer::ShapeType get_type() const; | 
					
						
							| 
									
										
										
										
											2018-07-10 12:50:14 +00:00
										 |  |  | 	virtual btCollisionShape *create_bt_shape(const btVector3 &p_implicit_scale, real_t p_extra_edge = 0); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2018-02-19 20:59:57 +01:00
										 |  |  | 	void setup(real_t p_length, bool p_slips_on_slope); | 
					
						
							| 
									
										
										
										
											2017-11-04 20:52:59 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | #endif
 |